From eef04429ee92b5bd57deaccfabd0602c6ae8d0ae Mon Sep 17 00:00:00 2001 From: afornerot Date: Thu, 16 Feb 2023 17:03:53 +0100 Subject: [PATCH] svg --- .env | 22 +- assets/styles/app.css | 457 +++------ config/packages/oneup_uploader.yaml | 21 +- config/routes.yaml | 950 ++++------------- config/services.yaml | 6 - .../{nineskeletor.json => nineblog.json} | 4 +- docker-compose.yml | 34 +- migrations/Version20230201080252.php | 298 ------ migrations/Version20230203163146.php | 245 +++++ migrations/Version20230203164540.php | 32 + public/medias/header/body.jpg | Bin 0 -> 257739 bytes public/medias/logo/logo.png | Bin 14180 -> 5424 bytes public/themes/ninefulldark/style.css | 4 +- src/Command/InitCommand.php | 548 +++------- src/Controller/AlertController.php | 175 ---- src/Controller/AlertcategoryController.php | 124 --- src/Controller/BlogController.php | 175 ++++ src/Controller/BlogtypeController.php | 172 ++++ src/Controller/BookmarkController.php | 236 ----- src/Controller/ChildController.php | 829 +++++++++++++++ src/Controller/ChildheaderController.php | 161 +++ src/Controller/ConfigController.php | 5 + src/Controller/CropController.php | 122 +++ src/Controller/FileController.php | 721 ------------- src/Controller/HomeController.php | 36 +- src/Controller/IconController.php | 180 ---- src/Controller/ItemController.php | 160 --- src/Controller/ItemcategoryController.php | 129 --- src/Controller/MenuController.php | 192 ++++ src/Controller/MinioController.php | 29 +- src/Controller/PageController.php | 561 ++-------- src/Controller/PagetemplateController.php | 286 ------ src/Controller/PagetypeController.php | 174 ++++ src/Controller/PagewidgetController.php | 958 ------------------ src/Controller/PagewidgetslideController.php | 223 ---- src/Controller/PinController.php | 187 ++++ src/Controller/TagController.php | 137 +++ src/Entity/Alert.php | 413 -------- src/Entity/Alertcategory.php | 175 ---- src/Entity/Audit.php | 1 + src/Entity/Blog.php | 201 ++++ src/Entity/Blogtype.php | 180 ++++ src/Entity/Bookmark.php | 337 ------ src/Entity/Child.php | 404 ++++++++ src/Entity/Childheader.php | 94 ++ src/Entity/Childtype.php | 216 ++++ src/Entity/Config.php | 1 + src/Entity/Cron.php | 1 + src/Entity/Group.php | 117 +-- src/Entity/Icon.php | 400 -------- src/Entity/Item.php | 359 ------- src/Entity/Itemcategory.php | 213 ---- src/Entity/Menu.php | 93 ++ src/Entity/Menuchild.php | 145 +++ src/Entity/Niveau01.php | 1 + src/Entity/Niveau02.php | 1 + src/Entity/Niveau03.php | 1 + src/Entity/Niveau04.php | 1 + src/Entity/Page.php | 659 ++---------- src/Entity/Pagecategory.php | 119 --- src/Entity/Pagetype.php | 180 ++++ src/Entity/Pagewidget.php | 420 -------- src/Entity/Pagewidgetslide.php | 158 --- src/Entity/Pin.php | 161 +++ src/Entity/Registration.php | 1 + src/Entity/Tag.php | 74 ++ src/Entity/User.php | 34 +- src/Entity/UserGroup.php | 1 + src/Entity/Widget.php | 385 ------- src/EventListener/PurgefileSubscriber.php | 73 -- src/Form/AlertType.php | 117 --- src/Form/AlertcategoryType.php | 47 - src/Form/{IconType.php => BlogType.php} | 31 +- src/Form/BlogtypeType.php | 53 + src/Form/BookmarkType.php | 64 -- src/Form/ChildType.php | 100 ++ ...emcategoryType.php => ChildheaderType.php} | 21 +- src/Form/ItemType.php | 128 --- src/Form/MenuchildType.php | 104 ++ src/Form/PageSubmitType.php | 148 --- ...agetemplateSubmitType.php => PageType.php} | 28 +- src/Form/PageUpdateWidgetType.php | 114 --- ...idgetckeditorType.php => PagetypeType.php} | 31 +- src/Form/PagewidgetType.php | 247 ----- .../{PagewidgetslideType.php => PinType.php} | 40 +- src/Form/TagType.php | 51 + src/Form/Type/FaChoiceType.php | 74 -- src/Repository/AlertRepository.php | 114 --- src/Repository/BlogRepository.php | 50 + src/Repository/BlogtypeRepository.php | 50 + src/Repository/ChildRepository.php | 173 ++++ src/Repository/ChildheaderRepository.php | 41 + src/Repository/ChildtypeRepository.php | 15 + src/Repository/ItemRepository.php | 196 ---- src/Repository/MenuRepository.php | 66 ++ src/Repository/MenuchildRepository.php | 66 ++ src/Repository/PageRepository.php | 426 +------- src/Repository/PagetypeRepository.php | 50 + src/Repository/PagewidgetRepository.php | 110 -- src/Repository/PinRepository.php | 50 + src/Repository/TagRepository.php | 50 + src/Repository/WidgetRepository.php | 51 - src/Service/AppSession.php | 7 + src/Service/ToolService.php | 37 + src/Service/UploadListener.php | 138 ++- templates/Alert/edit.html.twig | 78 -- templates/Alert/list.html.twig | 431 -------- templates/Alertcategory/edit.html.twig | 91 -- templates/Blog/edit.html.twig | 83 ++ templates/Blog/home.html.twig | 150 +++ templates/Blog/list.html.twig | 58 ++ templates/Blogtype/edit.html.twig | 76 ++ templates/Blogtype/home.html.twig | 63 ++ templates/Blogtype/list.html.twig | 53 + .../upload.html.twig | 15 +- templates/Bookmark/edit.html.twig | 126 --- templates/Child/edit.html.twig | 222 ++++ templates/Child/file.html.twig | 134 +++ .../view.html.twig => Child/image.html.twig} | 70 +- templates/Child/list.html.twig | 141 +++ templates/Child/search.html.twig | 387 +++++++ templates/Child/upload.html.twig | 80 ++ templates/Child/video.html.twig | 115 +++ templates/Child/view.html.twig | 240 +++++ .../edit.html.twig | 40 +- templates/Childheader/image.html.twig | 64 ++ templates/Config/edit.html.twig | 7 +- .../image.html.twig} | 10 +- templates/Config/render.html.twig | 7 + templates/Crop/crop01.html.twig | 14 +- templates/Crop/crop02.html.twig | 54 +- templates/File/folder.html.twig | 50 - templates/File/list.html.twig | 346 ------- templates/File/redirect.html.twig | 22 - templates/File/upload.html.twig | 74 -- templates/Home/home.html.twig | 93 +- templates/Icon/edit.html.twig | 78 -- templates/Icon/list.html.twig | 25 - templates/Icon/select.html.twig | 70 -- templates/Include/sidebaradmin.html.twig | 50 +- templates/Include/style.css.twig | 3 + templates/Item/edit.html.twig | 142 --- templates/Item/list.html.twig | 230 ----- templates/Menu/edit.html.twig | 103 ++ templates/Menu/list.html.twig | 62 ++ templates/Page/application.html.twig | 334 ------ templates/Page/default.html.twig | 141 --- templates/Page/edit.html.twig | 83 ++ templates/Page/home.html.twig | 204 ++++ templates/Page/list.html.twig | 86 +- templates/Page/menugroupe.html.twig | 69 -- templates/Page/pages.html.twig | 461 --------- templates/Page/submit.html.twig | 88 -- templates/Page/updateeditor.html.twig | 72 -- templates/Page/updatetool.html.twig | 66 -- templates/Page/updateurl.html.twig | 76 -- templates/Page/updatewidget.html.twig | 552 ---------- templates/Page/vieweditor.html.twig | 23 - templates/Page/viewurl.html.twig | 59 -- templates/Page/viewwidget.html.twig | 598 ----------- templates/Pagetemplate/list.html.twig | 58 -- templates/Pagetype/edit.html.twig | 108 ++ templates/Pagetype/home.html.twig | 55 + templates/Pagetype/list.html.twig | 52 + templates/Pagetype/upload.html.twig | 38 + templates/Pagewidget/ckeditor.html.twig | 115 --- templates/Pagewidget/edit.html.twig | 172 ---- templates/Pagewidget/viewalert.html.twig | 42 - templates/Pagewidget/viewblog.html.twig | 101 -- templates/Pagewidget/viewbookmark.html.twig | 90 -- templates/Pagewidget/viewcalendar.html.twig | 100 -- templates/Pagewidget/vieweditor.html.twig | 28 - templates/Pagewidget/viewfile.html.twig | 15 - templates/Pagewidget/viewflux.html.twig | 141 --- templates/Pagewidget/viewframe.html.twig | 77 -- templates/Pagewidget/viewgalery.html.twig | 23 - templates/Pagewidget/viewinfo.html.twig | 64 -- templates/Pagewidget/viewitem.html.twig | 174 ---- .../Pagewidget/viewitemessential.html.twig | 131 --- templates/Pagewidget/viewlink.html.twig | 23 - templates/Pagewidget/viewproject.html.twig | 133 --- templates/Pagewidget/viewslide.html.twig | 52 - templates/Pagewidget/viewurl.html.twig | 11 - templates/Pagewidget/widget.twig | 101 -- templates/Pagewidgetslide/edit.html.twig | 67 -- templates/Pagewidgetslide/list.html.twig | 18 - templates/Pin/edit.html.twig | 71 ++ templates/Pin/list.html.twig | 55 + templates/Pin/view.html.twig | 13 + .../submit.html.twig => Tag/edit.html.twig} | 35 +- templates/Tag/list.html.twig | 52 + templates/base.html.twig | 205 +++- 192 files changed, 9375 insertions(+), 17414 deletions(-) rename containers/hydra/clients.d/{nineskeletor.json => nineblog.json} (86%) delete mode 100644 migrations/Version20230201080252.php create mode 100644 migrations/Version20230203163146.php create mode 100644 migrations/Version20230203164540.php create mode 100644 public/medias/header/body.jpg mode change 100755 => 100644 public/medias/logo/logo.png delete mode 100644 src/Controller/AlertController.php delete mode 100644 src/Controller/AlertcategoryController.php create mode 100644 src/Controller/BlogController.php create mode 100644 src/Controller/BlogtypeController.php delete mode 100644 src/Controller/BookmarkController.php create mode 100644 src/Controller/ChildController.php create mode 100644 src/Controller/ChildheaderController.php delete mode 100644 src/Controller/FileController.php delete mode 100644 src/Controller/IconController.php delete mode 100644 src/Controller/ItemController.php delete mode 100644 src/Controller/ItemcategoryController.php create mode 100644 src/Controller/MenuController.php delete mode 100644 src/Controller/PagetemplateController.php create mode 100644 src/Controller/PagetypeController.php delete mode 100644 src/Controller/PagewidgetController.php delete mode 100644 src/Controller/PagewidgetslideController.php create mode 100644 src/Controller/PinController.php create mode 100644 src/Controller/TagController.php delete mode 100755 src/Entity/Alert.php delete mode 100755 src/Entity/Alertcategory.php create mode 100644 src/Entity/Blog.php create mode 100644 src/Entity/Blogtype.php delete mode 100755 src/Entity/Bookmark.php create mode 100644 src/Entity/Child.php create mode 100644 src/Entity/Childheader.php create mode 100644 src/Entity/Childtype.php delete mode 100755 src/Entity/Icon.php delete mode 100755 src/Entity/Item.php delete mode 100755 src/Entity/Itemcategory.php create mode 100644 src/Entity/Menu.php create mode 100644 src/Entity/Menuchild.php mode change 100755 => 100644 src/Entity/Page.php delete mode 100755 src/Entity/Pagecategory.php create mode 100644 src/Entity/Pagetype.php delete mode 100755 src/Entity/Pagewidget.php delete mode 100644 src/Entity/Pagewidgetslide.php create mode 100644 src/Entity/Pin.php create mode 100644 src/Entity/Tag.php delete mode 100755 src/Entity/Widget.php delete mode 100755 src/EventListener/PurgefileSubscriber.php delete mode 100644 src/Form/AlertType.php delete mode 100644 src/Form/AlertcategoryType.php rename src/Form/{IconType.php => BlogType.php} (53%) create mode 100644 src/Form/BlogtypeType.php delete mode 100755 src/Form/BookmarkType.php create mode 100644 src/Form/ChildType.php rename src/Form/{ItemcategoryType.php => ChildheaderType.php} (64%) delete mode 100644 src/Form/ItemType.php create mode 100644 src/Form/MenuchildType.php delete mode 100644 src/Form/PageSubmitType.php rename src/Form/{PagetemplateSubmitType.php => PageType.php} (52%) delete mode 100644 src/Form/PageUpdateWidgetType.php rename src/Form/{PagewidgetckeditorType.php => PagetypeType.php} (54%) delete mode 100644 src/Form/PagewidgetType.php rename src/Form/{PagewidgetslideType.php => PinType.php} (51%) create mode 100644 src/Form/TagType.php delete mode 100644 src/Form/Type/FaChoiceType.php delete mode 100644 src/Repository/AlertRepository.php create mode 100644 src/Repository/BlogRepository.php create mode 100644 src/Repository/BlogtypeRepository.php create mode 100644 src/Repository/ChildRepository.php create mode 100644 src/Repository/ChildheaderRepository.php create mode 100644 src/Repository/ChildtypeRepository.php delete mode 100644 src/Repository/ItemRepository.php create mode 100644 src/Repository/MenuRepository.php create mode 100644 src/Repository/MenuchildRepository.php create mode 100644 src/Repository/PagetypeRepository.php delete mode 100644 src/Repository/PagewidgetRepository.php create mode 100644 src/Repository/PinRepository.php create mode 100644 src/Repository/TagRepository.php delete mode 100644 src/Repository/WidgetRepository.php create mode 100644 src/Service/ToolService.php delete mode 100755 templates/Alert/edit.html.twig delete mode 100644 templates/Alert/list.html.twig delete mode 100755 templates/Alertcategory/edit.html.twig create mode 100644 templates/Blog/edit.html.twig create mode 100644 templates/Blog/home.html.twig create mode 100644 templates/Blog/list.html.twig create mode 100644 templates/Blogtype/edit.html.twig create mode 100755 templates/Blogtype/home.html.twig create mode 100644 templates/Blogtype/list.html.twig rename templates/{Pagewidgetslide => Blogtype}/upload.html.twig (57%) delete mode 100755 templates/Bookmark/edit.html.twig create mode 100644 templates/Child/edit.html.twig create mode 100644 templates/Child/file.html.twig rename templates/{File/view.html.twig => Child/image.html.twig} (58%) create mode 100644 templates/Child/list.html.twig create mode 100644 templates/Child/search.html.twig create mode 100644 templates/Child/upload.html.twig create mode 100644 templates/Child/video.html.twig create mode 100644 templates/Child/view.html.twig rename templates/{Itemcategory => Childheader}/edit.html.twig (65%) mode change 100755 => 100644 create mode 100644 templates/Childheader/image.html.twig rename templates/{Icon/upload.html.twig => Config/image.html.twig} (70%) delete mode 100644 templates/File/folder.html.twig delete mode 100644 templates/File/list.html.twig delete mode 100644 templates/File/redirect.html.twig delete mode 100644 templates/File/upload.html.twig delete mode 100755 templates/Icon/edit.html.twig delete mode 100644 templates/Icon/list.html.twig delete mode 100644 templates/Icon/select.html.twig delete mode 100755 templates/Item/edit.html.twig delete mode 100644 templates/Item/list.html.twig create mode 100644 templates/Menu/edit.html.twig create mode 100644 templates/Menu/list.html.twig delete mode 100644 templates/Page/application.html.twig delete mode 100644 templates/Page/default.html.twig create mode 100644 templates/Page/edit.html.twig create mode 100644 templates/Page/home.html.twig delete mode 100644 templates/Page/menugroupe.html.twig delete mode 100644 templates/Page/pages.html.twig delete mode 100644 templates/Page/submit.html.twig delete mode 100644 templates/Page/updateeditor.html.twig delete mode 100644 templates/Page/updatetool.html.twig delete mode 100644 templates/Page/updateurl.html.twig delete mode 100644 templates/Page/updatewidget.html.twig delete mode 100644 templates/Page/vieweditor.html.twig delete mode 100644 templates/Page/viewurl.html.twig delete mode 100644 templates/Page/viewwidget.html.twig delete mode 100644 templates/Pagetemplate/list.html.twig create mode 100644 templates/Pagetype/edit.html.twig create mode 100755 templates/Pagetype/home.html.twig create mode 100644 templates/Pagetype/list.html.twig create mode 100755 templates/Pagetype/upload.html.twig delete mode 100644 templates/Pagewidget/ckeditor.html.twig delete mode 100644 templates/Pagewidget/edit.html.twig delete mode 100644 templates/Pagewidget/viewalert.html.twig delete mode 100644 templates/Pagewidget/viewblog.html.twig delete mode 100644 templates/Pagewidget/viewbookmark.html.twig delete mode 100644 templates/Pagewidget/viewcalendar.html.twig delete mode 100644 templates/Pagewidget/vieweditor.html.twig delete mode 100644 templates/Pagewidget/viewfile.html.twig delete mode 100644 templates/Pagewidget/viewflux.html.twig delete mode 100644 templates/Pagewidget/viewframe.html.twig delete mode 100644 templates/Pagewidget/viewgalery.html.twig delete mode 100644 templates/Pagewidget/viewinfo.html.twig delete mode 100644 templates/Pagewidget/viewitem.html.twig delete mode 100644 templates/Pagewidget/viewitemessential.html.twig delete mode 100644 templates/Pagewidget/viewlink.html.twig delete mode 100644 templates/Pagewidget/viewproject.html.twig delete mode 100644 templates/Pagewidget/viewslide.html.twig delete mode 100644 templates/Pagewidget/viewurl.html.twig delete mode 100644 templates/Pagewidget/widget.twig delete mode 100755 templates/Pagewidgetslide/edit.html.twig delete mode 100644 templates/Pagewidgetslide/list.html.twig create mode 100644 templates/Pin/edit.html.twig create mode 100644 templates/Pin/list.html.twig create mode 100644 templates/Pin/view.html.twig rename templates/{Pagetemplate/submit.html.twig => Tag/edit.html.twig} (61%) create mode 100644 templates/Tag/list.html.twig diff --git a/.env b/.env index 8d812d1..2db0757 100755 --- a/.env +++ b/.env @@ -7,7 +7,7 @@ APP_SESSIONTIME=1440 MESSENGER_TRANSPORT_DSN=doctrine://default?auto_setup=0 # Database -DATABASE_URL="postgresql://symfony:ChangeMe@127.0.0.1:5432/ninegate?serverVersion=13&charset=utf8" +DATABASE_URL="postgresql://symfony:ChangeMe@127.0.0.1:5432/nineblog?serverVersion=13&charset=utf8" # Redis Session REDIS_HOST=127.0.0.1 @@ -23,7 +23,7 @@ APP_WEBURL=127.0.0.1:8000 APP_MASTERIDENTITY=SQL # SQL | SSO | LDAP APP_AUTH=SQL # SQL | CAS | LDAP | OPENID | à faire SAML APP_ALIAS=/ -APP_NAME=Nineskeletor +APP_NAME=Nineblog APP_MODEREGISTRATION= # null | BYADMIN | BYUSER APP_ADMINS='["admin"]' @@ -76,13 +76,13 @@ LDAP_USERWRITER=0 # LDAP_USER compte writer ? 0/1 LDAP_USER= # DN compte access ldap LDAP_PASSWORD= # Password comte access ldap LDAP_BASEDN= # Base DN ex:dc=nine,dc=fr -LDAP_BASEORGANISATION= # Base Organisation ex:ou=nineskeletor,dc=nine,dc=fr -LDAP_BASENIVEAU01= # Base Niveau01 ex:ou=niveau01,ou=nineskeletor,dc=nine,dc=fr -LDAP_BASENIVEAU02= # Base Niveau02 ex:ou=niveau02,ou=nineskeletor,dc=nine,dc=fr -LDAP_BASENIVEAU03= # Base Niveau03 ex:ou=niveau03,ou=nineskeletor,dc=nine,dc=fr -LDAP_BASENIVEAU04= # Base Niveau04 ex:ou=niveau04,ou=nineskeletor,dc=nine,dc=fr -LDAP_BASEGROUP= # Base Group ex:ou=groups,ou=nineskeletor,dc=nine,dc=fr -LDAP_BASEUSER= # Base User ex:ou=users,ou=nineskeletor,dc=nine,dc=fr +LDAP_BASEORGANISATION= # Base Organisation ex:ou=nineblog,dc=nine,dc=fr +LDAP_BASENIVEAU01= # Base Niveau01 ex:ou=niveau01,ou=nineblog,dc=nine,dc=fr +LDAP_BASENIVEAU02= # Base Niveau02 ex:ou=niveau02,ou=nineblog,dc=nine,dc=fr +LDAP_BASENIVEAU03= # Base Niveau03 ex:ou=niveau03,ou=nineblog,dc=nine,dc=fr +LDAP_BASENIVEAU04= # Base Niveau04 ex:ou=niveau04,ou=nineblog,dc=nine,dc=fr +LDAP_BASEGROUP= # Base Group ex:ou=groups,ou=nineblog,dc=nine,dc=fr +LDAP_BASEUSER= # Base User ex:ou=users,ou=nineblog,dc=nine,dc=fr LDAP_USERNAME=uid # Attribut id d'un user LDAP_FIRSTNAME=givenname # Attribut firstname d'un user LDAP_LASTNAME=sn # Attribut lastname d'un user @@ -157,7 +157,7 @@ MERCURE_JWT_SECRET="!changeme!changeme!changeme!changeme!changeme!changeme!" MINIO_URL=http://127.0.0.1:9000 MINIO_KEY=minio MINIO_SECRET=changeme -MINIO_BUCKET=ninegate +MINIO_BUCKET=nineblog MINIO_ROOT= MINIO_PATH_STYLE=1 MINIO_SECURE=0 @@ -169,7 +169,7 @@ HYDRA_CONSENTCHALLENGE="http://127.0.0.1:4445/oauth2/auth/requests/consent?conse HYDRA_CONSENTCHALLENGEACCEPT="http://127.0.0.1:4445/oauth2/auth/requests/consent/accept?consent_challenge=" # Lock -LOCK_DSN="postgresql://symfony:ChangeMe@127.0.0.1:5432/ninegate?serverVersion=13&charset=utf8" +LOCK_DSN="postgresql://symfony:ChangeMe@127.0.0.1:5432/nineblog?serverVersion=13&charset=utf8" # Sentry SENTRY_DSN= diff --git a/assets/styles/app.css b/assets/styles/app.css index 271a6af..6c784b1 100755 --- a/assets/styles/app.css +++ b/assets/styles/app.css @@ -26,6 +26,9 @@ body { color: var(--colorftbodylight); } + + + /* FONT */ body { font-family: var(--fontbody); @@ -61,6 +64,16 @@ a:hover { color: var(--colorfttitlelight-darker); } +.btn-link { + text-decoration: none; + cursor: pointer; + color: var(--colorfttitlelight); +} + +.btn-link:hover { + color: var(--colorfttitlelight-darker); +} + main { display:flex; overflow:hidden; @@ -99,6 +112,24 @@ border-width: 1px; padding:0.5rem; } +#page { + overflow-y: auto; + width:100%; +} + +.ckeditor-content img { + max-width:100%; + height:auto !important; +} + +.hide { + display: none !important; +} + +.card-body .form-group:first-child { + margin-top: 0px !important; +} + @media (max-width: 991px) { #header { display:none !important; @@ -274,318 +305,138 @@ border-width: 1px; } } -/* PAGE */ -#page { - overflow-y: auto; - width:100%; -} +/*== CHILD ======================================================================================================================================= */ -.ckeditor-content img { - max-width:100%; - height:auto !important; -} - -.hide { - display: none !important; -} - -.card-body .form-group:first-child { - margin-top: 0px !important; -} - - -/* ITEM */ -.itemframe { - width: 100% -} - -.items-list { - display:flex; - flex-wrap: wrap; - margin-bottom: 5px; -} - -.item { - padding:10px; - display:flex; - text-align: center; - justify-content: center; - margin-right:5px; - margin-bottom:5px; - flex-wrap: wrap; - color: var(--colorftbodydark) !important; -} - -.item-action { - width: 100%; - color: var(--colorftbodydark) !important; - padding-top:10px; - height:35px; -} - -.item-action i { - font-size: 22px; -} - -.item-container { - display:flex; - flex-wrap: nowrap; - justify-content: space-around; -} - -.item-content { - display: flex; - flex-wrap: wrap; - justify-content: space-between; - flex-direction: column; -} - -.item img { - margin:0px auto 10px auto; - -} - -.item h3 { - margin:0px; +.child-sidebar { + background-color: var(--colorbgbodyimportant); color: var(--colorftbodydark); } -.item-subtitle { - font-size: 10px; - margin:0px; +.child-sidebar h3 { color: var(--colorftbodydark); } -.item-description { - color: var(--colorftbodydark); - text-align: left; - padding: 0px 5px; -} - -.item-description img { - max-width: 100% !important; - height: auto !important; -} -.item-description p:last-child { - margin-bottom: 0px; -} - -.item-verysmall { - width: 80px; - padding:5px 2px 2px 2px; -} -.item-verysmall .item-link { - width: 76px; -} -.item-verysmall img { - height:40px; -} -.item-verysmall h3{ - font-size: 10px; - font-family: var(--fontbody); - text-transform: uppercase; - white-space: nowrap; - overflow: hidden; - text-overflow: ellipsis; -} -.item-verysmall .item-subtitle{ - display:none; -} -.item-verysmall .item-action { - padding-top:0px; - height:25px; -} -.item-verysmall .item-action i { - font-size: 14px; -} - -.item-small { - width: 100px; - padding:10px 5px; -} -.item-small .item-link { - width: 90px; -} -.item-small img { - height:60px; -} -.item-small h3{ - font-size: 12px; - font-family: var(--fontbody); - text-transform: uppercase; - white-space: nowrap; - overflow: hidden; - text-overflow: ellipsis; -} -.item-small .item-subtitle{ - display:none; -} -.item-small .item-action i { - font-size: 16px; -} - - -.item-medium { - width: 150px; -} -.item-medium .item-link { - width: 130px; -} -.item-medium img { - height:90px; -} -.item-medium h3{ - font-size: 18px; -} - - -.item-large { - width:300px; - justify-content: left; -} -.item-large .item-link { - display: flex; -} -.item-large img { - height:120px; -} -.item-large .item-title { - text-align:left; - padding-left:10px; -} -.item-large h3{ - font-size: 25px; - border-bottom: 1px solid var(--colorftbodydark); -} -.item-large .item-container { - flex-direction: column; -} -.item-large .item-action { - text-align: left; -} -.item-large .item-description { - margin-top:15px; -} - -.item-list { - width:100%; - justify-content: left; - margin-right: 0px; - -} -.item-list .item-container { - flex-direction: column; - width:100%; -} -.item-list .item-content { - flex-wrap: nowrap; - flex-direction: row; -} -.item-list .item-link { - display:flex; - align-items: center; -} -.item-list img { - height:40px; - margin:0px; -} -.item-list .item-title { - text-align:left; - padding-left:10px; -} -.item-list h3{ - font-size: 18px; - font-family: var(--fontbody); - text-transform: uppercase; -} -.item-list .item-subtitle{ - display:none; -} -.item-list .item-action { - width:auto; -} - -.item-list .item-description { - padding:10px 0px 5px 0px; -} - -/* WIDGET */ -.widget{ - margin-bottom:30px; -} -.widget-bordered { - border:1px solid; -} -.widget-menu { - float: right; - color: #fff; - margin: 10px 5px 0px 0px; - display:none; -} -.widget-menu i { - cursor:pointer; -} -.widget-header { - padding:10px 10px 5px 10px; - font-family: var(--fonttitle); - font-size: 25px; -} -.widget-logo { - height:40px; - margin-right:5px; - margin-top:-5px; - cursor: pointer; - -} -.widget-title { - cursor: pointer; -} -.widget-body { - padding: 5px 0px 0px 0px; -} -.widget-bordered .widget-body { - padding: 5px; -} - -.widget-body .items-list { - margin-bottom: 5px; -} -.widget-body .item-list:first-child { - margin-top: 0px; -} -.widget-body .items-list:last-child { - margin-bottom: -5px; -} -.widget-body .item-description { - padding:10px 0px 0px 0px; -} - -.widget-body .slick { - min-height: 200px; -} -.widget-body .slick-slide { - min-height: 200px; -} -.widget-body .slick-arrow { - display: none !important; -} - -.widget-body .slick-dots { - bottom: 5px; - color: var(--colorftbodydark); -} - -.widgetplaceholder { - background-color: var(--colorbgbodydark); -} - -.cat-list { +.child-sidebar a { color: var(--colorfttitledark); - background-color: var(--colorbgbodydark); - padding: 5px 10px; - display: inline-block; - cursor: pointer; +} + +.child-sidebar a:hover { + color: var(--colorfttitledark-lighter); +} + +/*== GRID ======================================================================================================================================= */ + + +.gutter-sizer { width: 0%;float:left; } + +.grid-sizer { + width: 0.1%; + margin-bottom: 0%; + float:left; +} + +.grid-item { + background-color:var(--colorbgbodydark); + color: var(--colorfttitledark); + overflow:hidden; +} + +.grid-image { + width:100%; + transition: transform 0.3s; + background-position: center; + background-size: cover; +} + +.grid-item-title { + background-color:var(--colorbgbodyimportant); + color: var(--colorfttitledark); + width:auto; + padding:15px; + text-align:center; + margin:auto; } +.grid-item-size-1 { width: 100% } +.grid-item-size-2 { width: 50% } +.grid-item-size-3 { width: 33.3% } +.grid-item-size-4 { width: 25% } +.grid-item-size-5 { width: 20% } +.grid-item-full { width: 100%; margin-bottom: 0%; font-size:20px;float:left; } +.grid-item-full h1 {margin: 0; border:none; padding: 20px 0px 0px 10px; } + +.grid-tag {font-style:italic} +.grid-image {cursor: pointer;} + +@media (max-width: 980px) { + .grid-item-size-1 { width: 30% } + .grid-item-size-2 { width: 50% } + .grid-item-size-3 { width: 50% } + .grid-item-size-4 { width: 50% } + .grid-item-size-5 { width: 50% } +} + + +/*== HERO ======================================================================================================================================= */ + + +.herobody { + min-height:500px; + width:100%; + padding:0px 100px; +} + +.herobody .title { + height: auto; + position: relative; + top: 5%; + left: 5%; + font-size: 20px; + width:40%; + float: left; +} + +.heroheader span { + color: var(--colorftbodydark); + text-shadow: 1px 1px 2px black; +} + +.herobody .title h1, .heroheader h1, .heroheader h1 { + color: var(--colorftbodydark); + font-size: 50px; + margin:0px; + text-shadow: 1px 1px 2px black; +} + +.herobody .navigation { + width:45%; + position: relative; + right: 5%; + top: 5%; + float: right; +} + +@media (max-width: 1099px) { + .herobody { + padding:0px 50px; + } + + .herobody .title { + width:90%; + } + + .herobody .navigation { + width:90%; + } +} + +.herobody .grid-item { + padding: 5px; + background-color: transparent; + height: 200px; +} +.herobody .grid-image { + background-color: var(--colorbgbodydark); +} diff --git a/config/packages/oneup_uploader.yaml b/config/packages/oneup_uploader.yaml index a58840f..6a5410c 100755 --- a/config/packages/oneup_uploader.yaml +++ b/config/packages/oneup_uploader.yaml @@ -8,20 +8,23 @@ oneup_uploader: frontend: dropzone storage: directory: "%kernel.project_dir%/var/tmp/logo" - icon: + image: frontend: dropzone storage: - directory: "%kernel.project_dir%/var/tmp/icon" - slide: - frontend: dropzone - storage: - directory: "%kernel.project_dir%/var/tmp/slide" + directory: "%kernel.project_dir%/var/tmp/image" header: frontend: dropzone storage: directory: "%kernel.project_dir%/var/tmp/header" - file: - frontend: dropzone + childheader: + frontend: dropzone + storage: + directory: "%kernel.project_dir%/var/tmp/childheader" + child: + frontend: dropzone namer: App\Service\UploadSamename storage: - directory: "%kernel.project_dir%/var/tmp/file" + directory: "%kernel.project_dir%/var/tmp/child" + + + \ No newline at end of file diff --git a/config/routes.yaml b/config/routes.yaml index 9ad23c9..33c3135 100755 --- a/config/routes.yaml +++ b/config/routes.yaml @@ -98,6 +98,11 @@ app_admin_config_logo: controller: App\Controller\ConfigController::logo defaults: { access: admin } +app_admin_config_image: + path: /admin/admin/image + controller: App\Controller\ConfigController::image + defaults: { access: admin } + #== Theme ======================================================================================================= #-- Access admin app_admin_theme: @@ -158,6 +163,14 @@ app_all_crop02: path: /all/crop02/{type}/{reportinput} controller: App\Controller\CropController::crop02 +app_cropentity01: + path: /admin/cropentity01/{type}/{idparent} + defaults: { _controller: App\Controller\CropController::cropentity01 } + +app_cropentity02: + path: /admin/cropentity02/{type}/{idparent} + defaults: { _controller: App\Controller\CropController::cropentity02 } + #== Minio ======================================================================================================= #-- Access public app_minio_logo: @@ -168,9 +181,13 @@ app_minio_image: path: /minio/image controller: App\Controller\MinioController::image -app_minio_document: - path: /minio/document - controller: App\Controller\MinioController::document +app_minio_show: + path: /minio/show + controller: App\Controller\MinioController::show + +app_minio_download: + path: /minio/download + controller: App\Controller\MinioController::download #== Hydra ======================================================================================================= #-- Access public @@ -195,11 +212,11 @@ app_hydra_consent: controller: App\Controller\HydraController::consent #== Ckeditor ==================================================================================================== -#-- Access all +#-- Access admin app_ckeditor_upload: - path: /all/upload/{{category}}/{{id}}/{{usage}} + path: /admin/upload controller: App\Controller\MinioController::ckupload - defaults: { access: all, category: all, id: 0, usage: all } + defaults: { access: admin } #== Audit ======================================================================================================= #--Access admin @@ -821,800 +838,257 @@ app_all_preference: controller: App\Controller\UserController::preference defaults: { access: all } -#== ICON ================================================================================================================================================= +#== Menu ==================================================================================================== +app_menu: + path: /admin/menu + defaults: { _controller: App\Controller\MenuController::list } -#-- Access admin -app_admin_icon: - path: /admin/icon - controller: App\Controller\IconController::list - defaults: { access: admin } +app_menu_submit: + path: /admin/menu/submit/{id} + defaults: { _controller: App\Controller\MenuController::submit } -app_admin_icon_submit: - path: /admin/icon/submit - controller: App\Controller\IconController::submit - defaults: { access: admin } +app_menu_delete: + path: /admin/menu/delete/{id} + defaults: { _controller: App\Controller\MenuController::delete } -app_admin_icon_update: - path: /admin/icon/update/{id} - controller: App\Controller\IconController::update - defaults: { access: admin } +app_menu_order: + path: /admin/menu/order/{id}/{order} + defaults: { _controller: App\Controller\MenuController::order } -app_admin_icon_delete: - path: /admin/icon/delete/{id} - controller: App\Controller\IconController::delete - defaults: { access: admin } -app_admin_icon_select: - path: /admin/icon/select - controller: App\Controller\IconController::select - defaults: { access: admin } +#== Blogtype ==================================================================================================== +app_typeblog: + path: /admin/blogtype + defaults: { _controller: App\Controller\BlogtypeController::list } -app_admin_icon_upload: - path: /admin/icon/upload - controller: App\Controller\IconController::upload - defaults: { access: admin } +app_typeblog_submit: + path: /admin/blogtype/submit + defaults: { _controller: App\Controller\BlogtypeController::submit } -#-- Access all -app_all_icon: - path: /all/icon - controller: App\Controller\IconController::list - defaults: { access: all } +app_typeblog_update: + path: /admin/blogtype/update/{id} + defaults: { _controller: App\Controller\BlogtypeController::update } -app_all_icon_submit: - path: /all/icon/submit - controller: App\Controller\IconController::submit - defaults: { access: all } +app_typeblog_delete: + path: /admin/blogtype/delete/{id} + defaults: { _controller: App\Controller\BlogtypeController::delete } -app_all_icon_update: - path: /all/icon/update/{id} - controller: App\Controller\IconController::update - defaults: { access: all } +app_typeblog_upload: + path: /admin/blogtype/upload + defaults: { _controller: App\Controller\BlogtypeController::upload } -app_all_icon_delete: - path: /all/icon/delete/{id} - controller: App\Controller\IconController::delete - defaults: { access: all } +app_typeblog_selectlist: + path: /admin/blogtype/select + defaults: { _controller: App\Controller\BlogtypeController::select } -app_all_icon_select: - path: /all/icon/select - controller: App\Controller\IconController::select - defaults: { access: all } +app_typeblog_home: + path: /blogtype/{id} + defaults: { _controller: App\Controller\BlogtypeController::home } -app_all_icon_upload: - path: /all/icon/upload - controller: App\Controller\IconController::upload - defaults: { access: all } +#== Blog ==================================================================================================== +app_blog: + path: /admin/blog + defaults: { _controller: App\Controller\BlogController::list } -#== ALERT ================================================================================================================================================ +app_blog_submit: + path: /admin/blog/submit + defaults: { _controller: App\Controller\BlogController::submit } -#-- Access admin -app_admin_alert: - path: /admin/alert - controller: App\Controller\AlertController::list - defaults: { access: admin } +app_blog_update: + path: /admin/blog/update/{id} + defaults: { _controller: App\Controller\BlogController::update } -app_admin_alert_submit: - path: /admin/alert/submit - controller: App\Controller\AlertController::submit - defaults: { access: admin } +app_blog_delete: + path: /admin/blog/delete/{id} + defaults: { _controller: App\Controller\BlogController::delete } -app_admin_alert_update: - path: /admin/alert/update/{id} - controller: App\Controller\AlertController::update - defaults: { access: admin } +app_blog_selectlist: + path: /admin/blog/select + defaults: { _controller: App\Controller\BlogController::select } -app_admin_alert_delete: - path: /admin/alert/delete/{id} - controller: App\Controller\AlertController::delete - defaults: { access: admin } +#== Pagetype ==================================================================================================== +app_typepage: + path: /admin/pagetype + defaults: { _controller: App\Controller\PagetypeController::list } -app_admin_alert_order: - path: /admin/alert/order - controller: App\Controller\AlertController::order - defaults: { access: admin } +app_typepage_submit: + path: /admin/pagetype/submit + defaults: { _controller: App\Controller\PagetypeController::submit } -#-- Access all -app_all_alert_read: - path: /all/alert/read - controller: App\Controller\AlertController::read - defaults: { access: all } +app_typepage_update: + path: /admin/pagetype/update/{id} + defaults: { _controller: App\Controller\PagetypeController::update } -#== ALERT CATEGORY ======================================================================================================================================= +app_typepage_delete: + path: /admin/pagetype/delete/{id} + defaults: { _controller: App\Controller\PagetypeController::delete } -#-- Access admin -app_admin_alertcategory_submit: - path: /admin/alertcategory/submit - controller: App\Controller\AlertcategoryController::submit - defaults: { access: admin } - -app_admin_alertcategory_update: - path: /admin/alertcategory/update/{id} - controller: App\Controller\AlertcategoryController::update - defaults: { access: admin } +app_typepage_upload: + path: /admin/pagetype/upload + defaults: { _controller: App\Controller\PagetypeController::upload } -app_admin_alertcategory_delete: - path: /admin/alertcategory/delete/{id} - controller: App\Controller\AlertcategoryController::delete - defaults: { access: admin } +app_typepage_selectlist: + path: /admin/pagetype/select + defaults: { _controller: App\Controller\PagetypeController::select } -#== ITEM ================================================================================================================================================= +app_typepage_home: + path: /pagetype/{id} + defaults: { _controller: App\Controller\PagetypeController::home } -#-- Access admin -app_admin_item: - path: /admin/item - controller: App\Controller\ItemController::list - defaults: { access: admin } +#== Page ==================================================================================================== +app_page: + path: /admin/page + defaults: { _controller: App\Controller\PageController::list } -app_admin_item_submit: - path: /admin/item/submit - controller: App\Controller\ItemController::submit - defaults: { access: admin } - -app_admin_item_update: - path: /admin/item/update/{id} - controller: App\Controller\ItemController::update - defaults: { access: admin } - -app_admin_item_delete: - path: /admin/item/delete/{id} - controller: App\Controller\ItemController::delete - defaults: { access: admin } - -app_admin_item_order: - path: /admin/item/order - controller: App\Controller\ItemController::order - defaults: { access: admin } - - -#== ITEM CATEGORY ======================================================================================================================================== - -#-- Access admin -app_admin_itemcategory_submit: - path: /admin/itemcategory/submit - controller: App\Controller\ItemcategoryController::submit - defaults: { access: admin } - -app_admin_itemcategory_update: - path: /admin/itemcategory/update/{id} - controller: App\Controller\ItemcategoryController::update - defaults: { access: admin } - -app_admin_itemcategory_delete: - path: /admin/itemcategory/delete/{id} - controller: App\Controller\ItemcategoryController::delete - defaults: { access: admin } - -app_admin_itemcategory_order: - path: /admin/itemcategory/order - controller: App\Controller\ItemcategoryController::order - defaults: { access: admin } - -#== BOOKMARK ============================================================================================================================================= - -#-- Access config -app_admin_bookmark_submit: - path: /admin/bookmark/submit/{idpage}/{idwidget}/{touser} - controller: App\Controller\BookmarkController::submit - defaults: { access: admin } - -app_admin_bookmark_update: - path: /admin/bookmark/update/{id}/{idpage}/{idwidget}/{touser} - controller: App\Controller\BookmarkController::update - defaults: { access: admin } - -app_admin_bookmark_delete: - path: /admin/bookmark/delete/{id}/{idpage}/{idwidget}/{touser} - controller: App\Controller\BookmarkController::delete - defaults: { access: admin } - -app_admin_bookmark_heart: - path: /admin/bookmark/heart - controller: App\Controller\BookmarkController::heart - defaults: { access: admin } - -#-- Access all -app_all_bookmark_submit: - path: /all/bookmark/submit/{idpage}/{idwidget}/{touser} - controller: App\Controller\BookmarkController::submit - defaults: { access: all } - -app_all_bookmark_update: - path: /all/bookmark/update/{id}/{idpage}/{idwidget}/{touser} - controller: App\Controller\BookmarkController::update - defaults: { access: all } - -app_all_bookmark_delete: - path: /all/bookmark/delete/{id}/{idpage}/{idwidget}/{touser} - controller: App\Controller\BookmarkController::delete - defaults: { access: all } - -app_all_bookmark_heart: - path: /all/bookmark/heart - controller: App\Controller\BookmarkController::heart - defaults: { access: all } - - -#== FILE ================================================================================================================= - -#-- Access admin -app_admin_file_list: - path: /admin/file/list/{category}/{id} - controller: App\Controller\FileController::list - defaults: { access: admin } - -app_admin_file_upload: - path: /admin/file/upload/{category}/{id}/{type} - controller: App\Controller\FileController::upload - defaults: { access: admin } - -app_admin_file_folder: - path: /admin/file/folder/{category}/{id} - controller: App\Controller\FileController::folder - defaults: { access: admin } - -app_admin_file_rename: - path: /admin/file/rename/{category}/{id} - controller: App\Controller\FileController::rename - defaults: { access: admin } - -app_admin_file_trash: - path: /admin/file/trash/{category}/{id} - controller: App\Controller\FileController::trash - defaults: { access: admin } - -app_admin_file_restaure: - path: /admin/file/restaure/{category}/{id} - controller: App\Controller\FileController::restaure - defaults: { access: admin } - -app_admin_file_purgetrash: - path: /admin/file/purgetrash/{category}/{id} - controller: App\Controller\FileController::purgetrash - defaults: { access: admin } - -app_admin_file_delete: - path: /admin/file/delete/{category}/{id} - controller: App\Controller\FileController::delete - defaults: { access: admin } - -app_admin_file_move: - path: /admin/file/move/{category}/{id} - controller: App\Controller\FileController::move - defaults: { access: admin } - -app_admin_file_view: - path: /admin/file/view/{category}/{id} - controller: App\Controller\FileController::view - defaults: { access: all } - -app_admin_file_show: - path: /admin/file/show/{category}/{id} - controller: App\Controller\FileController::show - defaults: { access: all } - -app_admin_file_download: - path: /admin/file/download/{category}/{id} - controller: App\Controller\FileController::download - defaults: { access: all } - -#-- Access all -app_all_file_list: - path: /file/list/{category}/{id} - controller: App\Controller\FileController::list - defaults: { access: all } - -app_all_file_upload: - path: /all/file/upload/{category}/{id}/{type} - controller: App\Controller\FileController::upload - defaults: { access: all } - -app_all_file_folder: - path: /all/file/folder/{category}/{id} - controller: App\Controller\FileController::folder - defaults: { access: all } - -app_all_file_rename: - path: /all/file/rename/{category}/{id} - controller: App\Controller\FileController::rename - defaults: { access: all } - -app_all_file_trash: - path: /all/file/trash/{category}/{id} - controller: App\Controller\FileController::trash - defaults: { access: all } - -app_all_file_restaure: - path: /all/file/restaure/{category}/{id} - controller: App\Controller\FileController::restaure - defaults: { access: all } - -app_all_file_purgetrash: - path: /all/file/purgetrash/{category}/{id} - controller: App\Controller\FileController::purgetrash - defaults: { access: all } - -app_all_file_delete: - path: /all/file/delete/{category}/{id} - controller: App\Controller\FileController::delete - defaults: { access: all } - -app_all_file_move: - path: /all/file/move/{category}/{id} - controller: App\Controller\FileController::move - defaults: { access: all } - -app_all_file_view: - path: /file/view/{category}/{id} - controller: App\Controller\FileController::view - defaults: { access: all } - -app_all_file_show: - path: /file/show/{category}/{id} - controller: App\Controller\FileController::show - defaults: { access: all } - -app_all_file_download: - path: /file/download/{category}/{id} - controller: App\Controller\FileController::download - defaults: { access: all } - - - -#== PAGEWIDGETSLIDE ================================================================================================================================================ - -#-- Access admin -app_admin_pagewidgetslide_upload: - path: /admin/pagewidgetslide/upload/{idwidget} - controller: App\Controller\PagewidgetslideController::upload - defaults: { access: admin } - -app_admin_pagewidgetslide_list: - path: /admin/pagewidgetslide/{idwidget} - controller: App\Controller\PagewidgetslideController::list - defaults: { access: admin } - -app_admin_pagewidgetslide_submit: - path: /config/pagewidgetslide/submit/{idwidget} - controller: App\Controller\PagewidgetslideController::submit - defaults: { access: admin } - -app_admin_pagewidgetslide_update: - path: /admin/pagewidgetslide/update/{idwidget}/{id} - controller: App\Controller\PagewidgetslideController::update - defaults: { access: admin } - -app_admin_pagewidgetslide_delete: - path: /admin/pagewidgetslide/delete/{idwidget}/{id} - controller: App\Controller\PagewidgetslideController::delete - defaults: { access: admin } - -#-- Access all -app_all_pagewidgetslide_upload: - path: /all/pagewidgetslide/upload/{idwidget} - controller: App\Controller\PagewidgetslideController::upload - defaults: { access: all } - -app_all_pagewidgetslide_list: - path: /all/pagewidgetslide/{idwidget} - controller: App\Controller\PagewidgetslideController::list - defaults: { access: all } - -app_all_pagewidgetslide_submit: - path: /all/pagewidgetslide/submit/{idwidget} - controller: App\Controller\PagewidgetslideController::submit - defaults: { access: all } - -app_all_pagewidgetslide_update: - path: /all/pagewidgetslide/update/{idwidget}/{id} - controller: App\Controller\PagewidgetslideController::update - defaults: { access: all } - -app_all_pagewidgetslide_delete: - path: /all/pagewidgetslide/delete/{idwidget}/{id} - controller: App\Controller\PagewidgetslideController::delete - defaults: { access: all } - - - -#== PAGE TEMPLATE ======================================================================================================================================== - -#-- Access admin -app_admin_page_template: - path: /admin/template - controller: App\Controller\PagetemplateController::list - defaults: { access: admin, usage: template } - -app_admin_page_template_tablelist: - path: /admin/template/tablelist - controller: App\Controller\PagetemplateController::tablelist - defaults: { access: admin, usage: template } - -app_admin_template_submit: - path: /admin/template/submit - controller: App\Controller\PagetemplateController::submit - defaults: { access: admin, usage: template } - -app_admin_page_template_update: - path: /admin/template/update/{id} - controller: App\Controller\PagetemplateController::update - defaults: { access: admin, usage: template } - -app_admin_page_template_delete: - path: /admin/template/delete/{id} - controller: App\Controller\PagetemplateController::delete - defaults: { access: admin, usage: template } - -app_admin_page_template_view: - path: /admin/template/view/{id} - controller: App\Controller\PagetemplateController::view - defaults: { access: admin, usage: template } - -#-- Access all -app_all_page_template_selectlist: - path: /all/template/selectlist - controller: App\Controller\PagetemplateController::selectlist - defaults: { access: admin, usage: template } - - -#== PAGE ================================================================================================================================================= - -#-- Access admin -app_admin_page_portal: - path: /admin/page/ - controller: App\Controller\PageController::list - defaults: { access: admin, usage: portal } - -app_admin_page_portal_tablelist: - path: /admin/page/tablelist - controller: App\Controller\PageController::tablelist - defaults: { access: admin, usage: portal } - -app_admin_page_portal_submit: +app_page_submit: path: /admin/page/submit - controller: App\Controller\PageController::submit - defaults: { access: admin, usage: portal } + defaults: { _controller: App\Controller\PageController::submit } -app_admin_page_portal_update: +app_page_update: path: /admin/page/update/{id} - controller: App\Controller\PageController::update - defaults: { access: admin, usage: portal } + defaults: { _controller: App\Controller\PageController::update } -app_admin_page_portal_delete: +app_page_delete: path: /admin/page/delete/{id} - controller: App\Controller\PageController::delete - defaults: { access: admin, usage: portal } + defaults: { _controller: App\Controller\PageController::delete } -app_admin_page_portal_view: - path: /admin/page/view/{id} - controller: App\Controller\PageController::view - defaults: { access: admin, usage: portal } +app_page_selectlist: + path: /admin/page/select + defaults: { _controller: App\Controller\PageController::select } -app_admin_page_portal_order: - path: /admin/page/order - controller: App\Controller\PageController::order - defaults: { access: admin, usage: portal } +app_page_home: + path: /page + defaults: { _controller: App\Controller\PageController::home } -#-- Access all -# usage=user -app_all_page_user_submit: - path: /all/page/user/submit - controller: App\Controller\PageController::submit - defaults: { access: all, usage: user } +#== Pin ==================================================================================================== +app_pin: + path: /admin/pin + defaults: { _controller: App\Controller\PinController::list } -app_all_page_user_update: - path: /all/page/user/update/{id} - controller: App\Controller\PageController::update - defaults: { access: all, usage: user } +app_pin_submit: + path: /admin/pin/submit + defaults: { _controller: App\Controller\PinController::submit } -app_all_page_user_delete: - path: /all/page/user/delete/{id} - controller: App\Controller\PageController::delete - defaults: { access: all, usage: user } +app_pin_update: + path: /admin/pin/update/{id} + defaults: { _controller: App\Controller\PinController::update } -app_all_page_user_order: - path: /all/page/user/order - controller: App\Controller\PageController::order - defaults: { access: all, usage: user } +app_pin_delete: + path: /admin/pin/delete/{id} + defaults: { _controller: App\Controller\PinController::delete } -# usage=group -app_all_page_group_submit: - path: /all/page/group/submit - controller: App\Controller\PageController::submit - defaults: { access: all, usage: group } +app_pin_view: + path: /pin/{id} + defaults: { _controller: App\Controller\PinController::view } -app_all_page_group_update: - path: /all/page/group/update/{id} - controller: App\Controller\PageController::update - defaults: { access: all, usage: group } +app_pin_select: + path: /admin/pin/select + defaults: { _controller: App\Controller\PinController::select } -app_all_page_group_delete: - path: /all/page/group/delete/{id} - controller: App\Controller\PageController::delete - defaults: { access: all, usage: group } - -app_all_page_group_order: - path: /all/page/group/order - controller: App\Controller\PageController::order - defaults: { access: all, usage: group } - -#-- Access visitor -# usage=portal -app_all_page_portal_view: - path: /page/portal/view/{id} - controller: App\Controller\PageController::view - defaults: { access: all, usage: portal } -# usage=user -app_all_page_user_view: - path: /page/user/view/{id} - controller: App\Controller\PageController::view - defaults: { access: all, usage: user } +#== Child ======================================================================================================== +app_child_select: + path: /admin/child/select + defaults: { _controller: App\Controller\ChildController::select } -# usage=group -app_all_page_group_view: - path: /page/group/view/{id} - controller: App\Controller\PageController::view - defaults: { access: all, usage: group } +app_child: + path: /admin/child/{catparent}/{idparent} + defaults: { _controller: App\Controller\ChildController::list } -#-- Page spécifique -app_all_page_application: - path: /page/application - controller: App\Controller\PageController::application - defaults: { access: all } +app_child_submit: + path: /admin/child/submit/{catparent}/{idparent}/{idchildtype} + defaults: { _controller: App\Controller\ChildController::submit } +app_child_submit_image: + path: /admin/child/submit/{catparent}/{idparent}/{idchildtype}/image + defaults: { _controller: App\Controller\ChildController::submitimage } +app_child_submit_video: + path: /admin/child/submit/{catparent}/{idparent}/{idchildtype}/video + defaults: { _controller: App\Controller\ChildController::submitvideo } -#== PAGE WIDGET ========================================================================================================================================== +app_child_submit_file: + path: /admin/child/submit/{catparent}/{idparent}/{idchildtype}/file + defaults: { _controller: App\Controller\ChildController::submitfile } -#-- Access admin -app_admin_pagewidget_widget_sumbit: - path: /admin/pagewidget/submit/{idpage}/{idwidgettype} - controller: App\Controller\PagewidgetController::submit - defaults: { access: admin } +app_child_update: + path: /admin/child/update/{catparent}/{idparent}/{idchild} + defaults: { _controller: App\Controller\ChildController::update } -app_admin_pagewidget_widget_update: - path: /admin/pagewidget/update/{idpage}/{idwidget} - controller: App\Controller\PagewidgetController::update - defaults: { access: admin } +app_child_bind: + path: /admin/child/bind/{catparent}/{idparent} + defaults: { _controller: App\Controller\ChildController::bind } -app_admin_pagewidget_delete: - path: /admin/pagewidget/delete/{idwidget} - controller: App\Controller\PagewidgetController::delete - defaults: { access: admin } +app_child_ajaxbind: + path: /admin/child/ajaxbind/{catparent}/{idparent} + defaults: { _controller: App\Controller\ChildController::ajaxbind } -app_admin_pagewidget_order: - path: /admin/pagewidget/order - controller: App\Controller\PagewidgetController::order - defaults: { access: admin } +app_child_addbind: + path: /admin/child/addbind/{catparent}/{idparent} + defaults: { _controller: App\Controller\ChildController::addbind } -app_admin_pagewidget_ckeditor: - path: /admin/pagewidget/ckeditor/{idwidget} - controller: App\Controller\PagewidgetController::ckeditor - defaults: { access: admin } +app_child_delete: + path: /admin/child/delete/{catparent}/{idparent}/{idchild} + defaults: { _controller: App\Controller\ChildController::delete } -app_admin_pagewidget_view_url: - path: /admin/pagewidget/view/url/{id} - controller: App\Controller\PagewidgetController::viewurl - defaults: { access: admin } +app_child_upload: + path: /admin/child/upload/{catparent}/{idparent}/{idchild}/{type} + defaults: { _controller: App\Controller\ChildController::upload } -app_admin_pagewidget_view_urlfixe: - path: /admin/pagewidget/view/urlfixe/{id} - controller: App\Controller\PagewidgetController::viewurlfixe - defaults: { access: admin } +app_child_order: + path: /admin/child/order/{catparent}/{idparent} + defaults: { _controller: App\Controller\ChildController::order } -app_admin_pagewidget_view_item: - path: /admin/pagewidget/view/item/{id} - controller: App\Controller\PagewidgetController::viewitem - defaults: { access: admin } +app_child_search: + path: /search + defaults: { _controller: App\Controller\ChildController::search } -app_admin_pagewidget_view_itemessential: - path: /admin/pagewidget/view/itemessential/{id} - controller: App\Controller\PagewidgetController::viewitemessential - defaults: { access: admin } +app_child_json: + path: /child/json/{catparent}/{idparent}/{idchild} + defaults: { _controller: App\Controller\ChildController::restjson } -app_admin_pagewidget_view_alert: - path: /admin/pagewidget/view/alert/{id} - controller: App\Controller\PagewidgetController::viewalert - defaults: { access: admin } +app_child_view: + path: /child/{catparent}/{idparent}/{idchild} + defaults: { _controller: App\Controller\ChildController::view } -app_admin_pagewidget_view_flux: - path: /admin/pagewidget/view/flux/{id} - controller: App\Controller\PagewidgetController::viewflux - defaults: { access: admin } +#== Childheader ==================================================================================================== +app_childheader_submit: + path: /admin/childheader/submit/{idchild} + defaults: { _controller: App\Controller\ChildheaderController::submit } -app_admin_pagewidget_view_rss: - path: /admin/pagewidget/view/rss/{id} - controller: App\Controller\PagewidgetController::viewrss - defaults: { access: admin } +app_childheader_update: + path: /admin/childheader/update/{catparent}/{idparent}/{id} + defaults: { _controller: App\Controller\ChildheaderController::update } -app_admin_pagewidget_view_bookmark: - path: /admin/pagewidget/view/bookmark/{id} - controller: App\Controller\PagewidgetController::viewbookmark - defaults: { access: admin } +app_childheader_delete: + path: /admin/childheader/delete/{catparent}/{idparent}/{id} + defaults: { _controller: App\Controller\ChildheaderController::delete } -app_admin_pagewidget_view_link: - path: /admin/pagewidget/view/link/{id} - controller: App\Controller\PagewidgetController::viewlink - defaults: { access: admin } +app_childheader_select: + path: /admin/childheader/select/{idchild} + defaults: { _controller: App\Controller\ChildheaderController::select } -app_admin_pagewidget_view_editor: - path: /admin/pagewidget/view/editor/{id} - controller: App\Controller\PagewidgetController::vieweditor - defaults: { access: admin } +app_childheader_order: + path: /admin/childheader/order/{idchild} + defaults: { _controller: App\Controller\ChildheaderController::order } -app_admin_pagewidget_view_slide: - path: /admin/pagewidget/view/pagewidgetslide/{id} - controller: App\Controller\PagewidgetController::viewslide - defaults: { access: admin } +app_childheader_view: + path: /childheader/view/{id} + defaults: { _controller: App\Controller\ChildheaderController::view } -app_admin_pagewidget_view_file: - path: /admin/pagewidget/view/file/{id} - controller: App\Controller\PagewidgetController::viewfile - defaults: { access: admin } +#== Tag ==================================================================================================== +app_tag: + path: /admin/tag + defaults: { _controller: App\Controller\TagController::list } -app_admin_pagewidget_view_galery: - path: /admin/pagewidget/view/galery/{id} - controller: App\Controller\PagewidgetController::viewgalery - defaults: { access: admin } +app_tag_submit: + path: /admin/tag/submit + defaults: { _controller: App\Controller\TagController::submit } -app_admin_pagewidget_view_calendar: - path: /admin/pagewidget/view/calendar/{id} - controller: App\Controller\PagewidgetController::viewcalendar - defaults: { access: admin } +app_tag_delete: + path: /admin/tag/delete/{id} + defaults: { _controller: App\Controller\TagController::delete } -app_admin_pagewidget_view_blog: - path: /admin/pagewidget/view/blog/{id} - controller: App\Controller\PagewidgetController::viewblog - defaults: { access: admin } - -app_admin_pagewidget_view_project: - path: /admin/pagewidget/view/project/{id} - controller: App\Controller\PagewidgetController::viewproject - defaults: { access: admin } - -app_admin_pagewidget_view_info: - path: /admin/pagewidget/view/info/{id} - controller: App\Controller\PagewidgetController::viewinfo - defaults: { access: admin } - -app_admin_pagewidget_view_chat: - path: /admin/pagewidget/view/chat/{id} - controller: App\Controller\PagewidgetController::viewchat - defaults: { access: admin } - -app_admin_pagewidget_view_group: - path: /admin/pagewidget/view/group/{id} - controller: App\Controller\PagewidgetController::viewgroup - defaults: { access: admin } - -app_admin_pagewidget_view_groupmessage: - path: /admin/pagewidget/view/groupmessage/{id} - controller: App\Controller\PagewidgetController::viewgroupmessage - defaults: { access: admin } - -#-- Access all -app_all_pagewidget_widget_sumbit: - path: /all/pagewidget/submit/{idpage}/{idwidgettype} - controller: App\Controller\PagewidgetController::submit - defaults: { access: all } - -app_all_pagewidget_widget_update: - path: /all/pagewidget/update/{idpage}/{idwidget} - controller: App\Controller\PagewidgetController::update - defaults: { access: all } - -app_all_pagewidget_delete: - path: /all/pagewidget/delete/{idwidget} - controller: App\Controller\PagewidgetController::delete - defaults: { access: all } - -app_all_pagewidget_order: - path: /all/pagewidget/order - controller: App\Controller\PagewidgetController::order - defaults: { access: all } - -app_all_pagewidget_ckeditor: - path: /all/pagewidget/ckeditor/{idwidget} - controller: App\Controller\PagewidgetController::ckeditor - defaults: { access: all } - -app_all_pagewidget_view_url: - path: /pagewidget/view/url/{id} - controller: App\Controller\PagewidgetController::viewurl - defaults: { access: all } - -app_all_pagewidget_view_urlfixe: - path: /pagewidget/view/urlfixe/{id} - controller: App\Controller\PagewidgetController::viewurlfixe - defaults: { access: all } - -app_all_pagewidget_view_item: - path: /pagewidget/view/item/{id} - controller: App\Controller\PagewidgetController::viewitem - defaults: { access: all } - -app_all_pagewidget_view_itemessential: - path: /pagewidget/view/itemessential/{id} - controller: App\Controller\PagewidgetController::viewitemessential - defaults: { access: all } - -app_all_pagewidget_view_alert: - path: /pagewidget/view/alert/{id} - controller: App\Controller\PagewidgetController::viewalert - defaults: { access: all } - -app_all_pagewidget_view_flux: - path: /pagewidget/view/flux/{id} - controller: App\Controller\PagewidgetController::viewflux - defaults: { access: all } - -app_all_pagewidget_view_rss: - path: /pagewidget/view/rss/{id} - controller: App\Controller\PagewidgetController::viewrss - defaults: { access: all } - -app_all_pagewidget_view_bookmark: - path: /pagewidget/view/bookmark/{id} - controller: App\Controller\PagewidgetController::viewbookmark - defaults: { access: all } - -app_all_pagewidget_view_link: - path: /pagewidget/view/link/{id} - controller: App\Controller\PagewidgetController::viewlink - defaults: { access: all } - -app_all_pagewidget_view_editor: - path: /pagewidget/view/editor/{id} - controller: App\Controller\PagewidgetController::vieweditor - defaults: { access: all } - -app_all_pagewidget_view_slide: - path: /pagewidget/view/pagewidgetslide/{id} - controller: App\Controller\PagewidgetController::viewslide - defaults: { access: all } - -app_all_pagewidget_view_file: - path: /pagewidget/view/file/{id} - controller: App\Controller\PagewidgetController::viewfile - defaults: { access: all } - -app_all_pagewidget_view_galery: - path: /pagewidget/view/galery/{id} - controller: App\Controller\PagewidgetController::viewgalery - defaults: { access: all } - -app_all_pagewidget_view_calendar: - path: /pagewidget/view/calendar/{id} - controller: App\Controller\PagewidgetController::viewcalendar - defaults: { access: all } - -app_all_pagewidget_view_blog: - path: /pagewidget/view/blog/{id} - controller: App\Controller\PagewidgetController::viewblog - defaults: { access: all } - -app_all_pagewidget_view_project: - path: /pagewidget/view/project/{id} - controller: App\Controller\PagewidgetController::viewproject - defaults: { access: all } - -app_all_pagewidget_view_info: - path: /pagewidget/view/info/{id} - controller: App\Controller\PagewidgetController::viewinfo - defaults: { access: all } - -app_all_pagewidget_view_chat: - path: /pagewidget/view/chat/{id} - controller: App\Controller\PagewidgetController::viewchat - defaults: { access: all } - -app_all_pagewidget_view_group: - path: /pagewidget/view/group/{id} - controller: App\Controller\PagewidgetController::viewgroup - defaults: { access: all } - -app_all_pagewidget_view_groupmessage: - path: /pagewidget/view/groupmessage/{id} - controller: App\Controller\PagewidgetController::viewgroupmessage - defaults: { access: all } - \ No newline at end of file +app_tag_select: + path: /admin/tag/select + defaults: { _controller: App\Controller\TagController::select } \ No newline at end of file diff --git a/config/services.yaml b/config/services.yaml index 16ade73..59aa561 100755 --- a/config/services.yaml +++ b/config/services.yaml @@ -174,12 +174,6 @@ services: tags: - name: 'doctrine.event_subscriber' - App\EventListener\PurgefileSubscriber: - public: true - arguments: ['@App\Service\MinioService'] - tags: - - name: 'doctrine.event_subscriber' - App\EventListener\Niveau01Subscriber: public: true arguments: ['@doctrine.orm.entity_manager','@App\Service\LdapService'] diff --git a/containers/hydra/clients.d/nineskeletor.json b/containers/hydra/clients.d/nineblog.json similarity index 86% rename from containers/hydra/clients.d/nineskeletor.json rename to containers/hydra/clients.d/nineblog.json index 4e66d72..e21c07b 100755 --- a/containers/hydra/clients.d/nineskeletor.json +++ b/containers/hydra/clients.d/nineblog.json @@ -1,6 +1,6 @@ { - "client_id": "nineskeletor", - "client_name": "Nineskeletor", + "client_id": "nineblog", + "client_name": "Nineblog", "client_secret": "changeme", "grant_types": [ "authorization_code", diff --git a/docker-compose.yml b/docker-compose.yml index 4a6a916..504b075 100755 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -17,7 +17,7 @@ services: # Service redis pour le stockage des sessions redis: image: redis:4.0 - container_name: ninegate-redis + container_name: nineblog-redis ports: - 6379:6379 environment: @@ -28,10 +28,10 @@ services: # Service postgresql pour le stockage de la bdd applicative postgresql: image: postgres:13-alpine - container_name: ninegate-postgresql - hostname: ninegate-postgresql + container_name: nineblog-postgresql + hostname: nineblog-postgresql environment: - POSTGRES_MULTIPLE_DATABASES: ninegate,hydra + POSTGRES_MULTIPLE_DATABASES: nineblog,hydra POSTGRES_PASSWORD: ChangeMe POSTGRES_USER: symfony ports: @@ -43,7 +43,7 @@ services: # Service websocket mercure: image: dunglas/mercure - container_name: ninegate-mercure + container_name: nineblog-mercure restart: unless-stopped ports: - "80" @@ -62,7 +62,7 @@ services: # Service de stockage Minio minio1: image: minio/minio:RELEASE.2021-01-16T02-19-44Z - container_name: ninegate-minio1 + container_name: nineblog-minio1 volumes: - data1-1:/data1 - data1-2:/data2 @@ -81,7 +81,7 @@ services: # Service de stockage Minio minio2: image: minio/minio:RELEASE.2021-01-16T02-19-44Z - container_name: ninegate-minio2 + container_name: nineblog-minio2 volumes: - data2-1:/data1 - data2-2:/data2 @@ -100,7 +100,7 @@ services: # Service de stockage Minio minio3: image: minio/minio:RELEASE.2021-01-16T02-19-44Z - container_name: ninegate-minio3 + container_name: nineblog-minio3 volumes: - data3-1:/data1 - data3-2:/data2 @@ -119,7 +119,7 @@ services: # Service de stockage Minio minio4: image: minio/minio:RELEASE.2021-01-16T02-19-44Z - container_name: ninegate-minio4 + container_name: nineblog-minio4 volumes: - data4-1:/data1 - data4-2:/data2 @@ -138,7 +138,7 @@ services: # Service nginx orchestrateur des minio nginx: image: nginx:1.19.2-alpine - container_name: ninegate-nginx + container_name: nineblog-nginx volumes: - ./containers/minio/nginx.conf:/etc/nginx/nginx.conf:ro ports: @@ -152,7 +152,7 @@ services: # Service hydra hydra: image: cadoles/hydra-v1 - container_name: ninegate-hydra + container_name: nineblog-hydra volumes: - ./containers/hydra/clients.d:/etc/hydra/clients.d ports: @@ -178,7 +178,7 @@ services: hydra-dispatcher: build: context: ./containers/hydra-dispatcher - container_name: ninegate-hydra-dispatcher + container_name: nineblog-hydra-dispatcher links: - hydra ports: @@ -202,15 +202,15 @@ services: # Service fake smtp = optionnel mailer: image: schickling/mailcatcher - container_name: ninegate-mailer + container_name: nineblog-mailer ports: - 1025:1025 - 1080:1080 - # Service fake openldap = optionnel si ninegate a une synchronisation avec un annuaire + # Service fake openldap = optionnel si nineblog a une synchronisation avec un annuaire openldap: image: osixia/openldap:1.5.0 - container_name: ninegate-openldap + container_name: nineblog-openldap environment: LDAP_LOG_LEVEL: "256" LDAP_ORGANISATION: "nine" @@ -232,7 +232,7 @@ services: # Service tool phpldapadmin = optionnel dans le cas de la présence d'un fake openldap phpldapadmin: image: osixia/phpldapadmin:latest - container_name: ninegate-phpldapadmin + container_name: nineblog-phpldapadmin environment: PHPLDAPADMIN_LDAP_HOSTS: "openldap" PHPLDAPADMIN_HTTPS: "false" @@ -244,7 +244,7 @@ services: # Service tool adminer = optionnel adminer: image: adminer - container_name: ninegate-adminer + container_name: nineblog-adminer restart: always ports: - 6081:8080 diff --git a/migrations/Version20230201080252.php b/migrations/Version20230201080252.php deleted file mode 100644 index 45f1554..0000000 --- a/migrations/Version20230201080252.php +++ /dev/null @@ -1,298 +0,0 @@ -addSql('CREATE SEQUENCE alert_id_seq INCREMENT BY 1 MINVALUE 1 START 1'); - $this->addSql('CREATE SEQUENCE alertcategory_id_seq INCREMENT BY 1 MINVALUE 1 START 1'); - $this->addSql('CREATE SEQUENCE audit_id_seq INCREMENT BY 1 MINVALUE 1 START 1'); - $this->addSql('CREATE SEQUENCE bookmark_id_seq INCREMENT BY 1 MINVALUE 1 START 1'); - $this->addSql('CREATE SEQUENCE cron_id_seq INCREMENT BY 1 MINVALUE 1 START 1'); - $this->addSql('CREATE SEQUENCE groupe_id_seq INCREMENT BY 1 MINVALUE 1 START 1'); - $this->addSql('CREATE SEQUENCE icon_id_seq INCREMENT BY 1 MINVALUE 1 START 1'); - $this->addSql('CREATE SEQUENCE item_id_seq INCREMENT BY 1 MINVALUE 1 START 1'); - $this->addSql('CREATE SEQUENCE itemcategory_id_seq INCREMENT BY 1 MINVALUE 1 START 1'); - $this->addSql('CREATE SEQUENCE niveau01_id_seq INCREMENT BY 1 MINVALUE 1 START 1'); - $this->addSql('CREATE SEQUENCE niveau02_id_seq INCREMENT BY 1 MINVALUE 1 START 1'); - $this->addSql('CREATE SEQUENCE niveau03_id_seq INCREMENT BY 1 MINVALUE 1 START 1'); - $this->addSql('CREATE SEQUENCE niveau04_id_seq INCREMENT BY 1 MINVALUE 1 START 1'); - $this->addSql('CREATE SEQUENCE page_id_seq INCREMENT BY 1 MINVALUE 1 START 1'); - $this->addSql('CREATE SEQUENCE pagecategory_id_seq INCREMENT BY 1 MINVALUE 1 START 1'); - $this->addSql('CREATE SEQUENCE pagewidget_id_seq INCREMENT BY 1 MINVALUE 1 START 1'); - $this->addSql('CREATE SEQUENCE pagewidgetslide_id_seq INCREMENT BY 1 MINVALUE 1 START 1'); - $this->addSql('CREATE SEQUENCE registration_id_seq INCREMENT BY 1 MINVALUE 1 START 1'); - $this->addSql('CREATE SEQUENCE useraccount_id_seq INCREMENT BY 1 MINVALUE 1 START 1'); - $this->addSql('CREATE SEQUENCE usergroupe_id_seq INCREMENT BY 1 MINVALUE 1 START 1'); - $this->addSql('CREATE SEQUENCE usermodo_id_seq INCREMENT BY 1 MINVALUE 1 START 1'); - $this->addSql('CREATE SEQUENCE whitelist_id_seq INCREMENT BY 1 MINVALUE 1 START 1'); - $this->addSql('CREATE SEQUENCE widget_id_seq INCREMENT BY 1 MINVALUE 1 START 1'); - $this->addSql('CREATE TABLE alert (id INT NOT NULL, category INT NOT NULL, title VARCHAR(100) NOT NULL, content TEXT DEFAULT NULL, rowOrder INT DEFAULT NULL, publishedat DATE NOT NULL, unpublishedat DATE DEFAULT NULL, fghideable BOOLEAN NOT NULL, roles TEXT DEFAULT NULL, PRIMARY KEY(id))'); - $this->addSql('CREATE INDEX IDX_17FD46C164C19C1 ON alert (category)'); - $this->addSql('COMMENT ON COLUMN alert.roles IS \'(DC2Type:array)\''); - $this->addSql('CREATE TABLE alertgroupe (alert INT NOT NULL, groupe INT NOT NULL, PRIMARY KEY(alert, groupe))'); - $this->addSql('CREATE INDEX IDX_64DB975617FD46C1 ON alertgroupe (alert)'); - $this->addSql('CREATE INDEX IDX_64DB97564B98C21 ON alertgroupe (groupe)'); - $this->addSql('CREATE TABLE alertuserread (alert INT NOT NULL, useraccount INT NOT NULL, PRIMARY KEY(alert, useraccount))'); - $this->addSql('CREATE INDEX IDX_D4317FA917FD46C1 ON alertuserread (alert)'); - $this->addSql('CREATE INDEX IDX_D4317FA9E157AA1A ON alertuserread (useraccount)'); - $this->addSql('CREATE TABLE alertcategory (id INT NOT NULL, icon_id INT DEFAULT NULL, label VARCHAR(100) NOT NULL, color VARCHAR(255) DEFAULT NULL, PRIMARY KEY(id))'); - $this->addSql('CREATE INDEX IDX_EC575F7E54B9D732 ON alertcategory (icon_id)'); - $this->addSql('CREATE TABLE audit (id INT NOT NULL, entityname VARCHAR(250) NOT NULL, entityid VARCHAR(250) NOT NULL, datesubmit TIMESTAMP(0) WITHOUT TIME ZONE NOT NULL, username VARCHAR(250) NOT NULL, description TEXT DEFAULT NULL, detail TEXT DEFAULT NULL, PRIMARY KEY(id))'); - $this->addSql('CREATE INDEX search_idx ON audit (entityname, entityid, datesubmit)'); - $this->addSql('COMMENT ON COLUMN audit.detail IS \'(DC2Type:array)\''); - $this->addSql('CREATE TABLE bookmark (id INT NOT NULL, icon_id INT DEFAULT NULL, user_id INT DEFAULT NULL, pagewidget_id INT DEFAULT NULL, item_id INT DEFAULT NULL, title VARCHAR(100) NOT NULL, subtitle VARCHAR(250) DEFAULT NULL, url VARCHAR(500) NOT NULL, target VARCHAR(32) NOT NULL, rowOrder INT DEFAULT NULL, color VARCHAR(24) DEFAULT NULL, PRIMARY KEY(id))'); - $this->addSql('CREATE INDEX IDX_DA62921D54B9D732 ON bookmark (icon_id)'); - $this->addSql('CREATE INDEX IDX_DA62921DA76ED395 ON bookmark (user_id)'); - $this->addSql('CREATE INDEX IDX_DA62921D55B7C7A2 ON bookmark (pagewidget_id)'); - $this->addSql('CREATE INDEX IDX_DA62921D126F525E ON bookmark (item_id)'); - $this->addSql('CREATE TABLE config (id VARCHAR(255) NOT NULL, title VARCHAR(250) NOT NULL, value TEXT DEFAULT NULL, defaultvalue TEXT NOT NULL, roworder VARCHAR(255) NOT NULL, visible BOOLEAN NOT NULL, changeable BOOLEAN NOT NULL, required BOOLEAN NOT NULL, type VARCHAR(255) NOT NULL, grouped VARCHAR(255) NOT NULL, category VARCHAR(255) NOT NULL, help TEXT NOT NULL, PRIMARY KEY(id))'); - $this->addSql('CREATE TABLE cron (id INT NOT NULL, command VARCHAR(255) NOT NULL, description TEXT DEFAULT NULL, statut INT DEFAULT NULL, submitdate TIMESTAMP(0) WITHOUT TIME ZONE NOT NULL, startexecdate TIMESTAMP(0) WITHOUT TIME ZONE DEFAULT NULL, endexecdate TIMESTAMP(0) WITHOUT TIME ZONE DEFAULT NULL, nextexecdate TIMESTAMP(0) WITHOUT TIME ZONE DEFAULT NULL, repeatinterval INT DEFAULT NULL, jsonargument TEXT DEFAULT NULL, PRIMARY KEY(id))'); - $this->addSql('CREATE TABLE groupe (id INT NOT NULL, owner_id INT DEFAULT NULL, pagetemplate_id INT DEFAULT NULL, label VARCHAR(250) NOT NULL, description TEXT DEFAULT NULL, email VARCHAR(250) DEFAULT NULL, isopen BOOLEAN DEFAULT false NOT NULL, isworkgroup BOOLEAN DEFAULT false NOT NULL, apikey VARCHAR(255) NOT NULL, ldapfilter TEXT DEFAULT NULL, attributes TEXT DEFAULT NULL, idexternal TEXT DEFAULT NULL, PRIMARY KEY(id))'); - $this->addSql('CREATE UNIQUE INDEX UNIQ_4B98C21EA750E8 ON groupe (label)'); - $this->addSql('CREATE INDEX IDX_4B98C217E3C61F9 ON groupe (owner_id)'); - $this->addSql('CREATE INDEX IDX_4B98C216D71CE5E ON groupe (pagetemplate_id)'); - $this->addSql('CREATE TABLE icon (id INT NOT NULL, user_id INT DEFAULT NULL, label VARCHAR(250) NOT NULL, tags VARCHAR(250) DEFAULT NULL, PRIMARY KEY(id))'); - $this->addSql('CREATE UNIQUE INDEX UNIQ_659429DBEA750E8 ON icon (label)'); - $this->addSql('CREATE INDEX IDX_659429DBA76ED395 ON icon (user_id)'); - $this->addSql('CREATE TABLE item (id INT NOT NULL, icon_id INT DEFAULT NULL, category INT NOT NULL, title VARCHAR(100) NOT NULL, subtitle VARCHAR(250) DEFAULT NULL, slug VARCHAR(128) DEFAULT NULL, url VARCHAR(500) NOT NULL, target VARCHAR(32) NOT NULL, content TEXT DEFAULT NULL, rowOrder INT DEFAULT NULL, essential BOOLEAN DEFAULT false, protected BOOLEAN DEFAULT false, color VARCHAR(24) DEFAULT NULL, roles TEXT DEFAULT NULL, PRIMARY KEY(id))'); - $this->addSql('CREATE UNIQUE INDEX UNIQ_1F1B251E989D9B62 ON item (slug)'); - $this->addSql('CREATE INDEX IDX_1F1B251E54B9D732 ON item (icon_id)'); - $this->addSql('CREATE INDEX IDX_1F1B251E64C19C1 ON item (category)'); - $this->addSql('COMMENT ON COLUMN item.roles IS \'(DC2Type:array)\''); - $this->addSql('CREATE TABLE itemgroupe (item INT NOT NULL, groupe INT NOT NULL, PRIMARY KEY(item, groupe))'); - $this->addSql('CREATE INDEX IDX_A4267B6D1F1B251E ON itemgroupe (item)'); - $this->addSql('CREATE INDEX IDX_A4267B6D4B98C21 ON itemgroupe (groupe)'); - $this->addSql('CREATE TABLE itemcategory (id INT NOT NULL, icon_id INT DEFAULT NULL, label VARCHAR(100) NOT NULL, color VARCHAR(24) DEFAULT NULL, rowOrder INT DEFAULT NULL, PRIMARY KEY(id))'); - $this->addSql('CREATE INDEX IDX_7959DEE854B9D732 ON itemcategory (icon_id)'); - $this->addSql('CREATE TABLE niveau01 (id INT NOT NULL, label VARCHAR(250) NOT NULL, code TEXT DEFAULT NULL, postaladress TEXT DEFAULT NULL, telephonenumber VARCHAR(60) DEFAULT NULL, email VARCHAR(60) DEFAULT NULL, apikey VARCHAR(255) NOT NULL, ldapfilter TEXT DEFAULT NULL, attributes TEXT DEFAULT NULL, idexternal TEXT DEFAULT NULL, PRIMARY KEY(id))'); - $this->addSql('CREATE UNIQUE INDEX UNIQ_6DFC7E23EA750E8 ON niveau01 (label)'); - $this->addSql('CREATE TABLE niveau02 (id INT NOT NULL, niveau01_id INT NOT NULL, label VARCHAR(250) NOT NULL, code TEXT DEFAULT NULL, postaladress TEXT DEFAULT NULL, telephonenumber VARCHAR(60) DEFAULT NULL, email VARCHAR(60) DEFAULT NULL, apikey VARCHAR(255) NOT NULL, PRIMARY KEY(id))'); - $this->addSql('CREATE UNIQUE INDEX UNIQ_F4F52F99EA750E8 ON niveau02 (label)'); - $this->addSql('CREATE INDEX IDX_F4F52F9959FDD7AB ON niveau02 (niveau01_id)'); - $this->addSql('CREATE TABLE niveau03 (id INT NOT NULL, niveau02_id INT NOT NULL, label VARCHAR(250) NOT NULL, code TEXT DEFAULT NULL, postaladress TEXT DEFAULT NULL, telephonenumber VARCHAR(60) DEFAULT NULL, email VARCHAR(60) DEFAULT NULL, apikey VARCHAR(255) NOT NULL, PRIMARY KEY(id))'); - $this->addSql('CREATE UNIQUE INDEX UNIQ_83F21F0FEA750E8 ON niveau03 (label)'); - $this->addSql('CREATE INDEX IDX_83F21F0F4B487845 ON niveau03 (niveau02_id)'); - $this->addSql('CREATE TABLE niveau04 (id INT NOT NULL, niveau03_id INT NOT NULL, label VARCHAR(250) NOT NULL, code TEXT DEFAULT NULL, postaladress TEXT DEFAULT NULL, telephonenumber VARCHAR(60) DEFAULT NULL, email VARCHAR(60) DEFAULT NULL, apikey VARCHAR(255) NOT NULL, PRIMARY KEY(id))'); - $this->addSql('CREATE UNIQUE INDEX UNIQ_1D968AACEA750E8 ON niveau04 (label)'); - $this->addSql('CREATE INDEX IDX_1D968AACF3F41F20 ON niveau04 (niveau03_id)'); - $this->addSql('CREATE TABLE page (id INT NOT NULL, pagecategory_id INT DEFAULT NULL, user_id INT DEFAULT NULL, page_id INT DEFAULT NULL, name VARCHAR(100) NOT NULL, roworder INT NOT NULL, maxwidth INT NOT NULL, fonticon VARCHAR(255) DEFAULT NULL, url TEXT DEFAULT NULL, toreload BOOLEAN DEFAULT NULL, html TEXT DEFAULT NULL, template TEXT DEFAULT NULL, parentfor VARCHAR(255) DEFAULT NULL, roles TEXT DEFAULT NULL, PRIMARY KEY(id))'); - $this->addSql('CREATE INDEX IDX_140AB6207AED5C04 ON page (pagecategory_id)'); - $this->addSql('CREATE INDEX IDX_140AB620A76ED395 ON page (user_id)'); - $this->addSql('CREATE INDEX IDX_140AB620C4663E4 ON page (page_id)'); - $this->addSql('COMMENT ON COLUMN page.template IS \'(DC2Type:array)\''); - $this->addSql('COMMENT ON COLUMN page.roles IS \'(DC2Type:array)\''); - $this->addSql('CREATE TABLE pagegroupe (page INT NOT NULL, groupe INT NOT NULL, PRIMARY KEY(page, groupe))'); - $this->addSql('CREATE INDEX IDX_E8009F6B140AB620 ON pagegroupe (page)'); - $this->addSql('CREATE INDEX IDX_E8009F6B4B98C21 ON pagegroupe (groupe)'); - $this->addSql('CREATE TABLE pagecategory (id INT NOT NULL, name VARCHAR(100) NOT NULL, PRIMARY KEY(id))'); - $this->addSql('CREATE TABLE pagewidget (id INT NOT NULL, page_id INT DEFAULT NULL, widget_id INT DEFAULT NULL, icon_id INT DEFAULT NULL, name VARCHAR(100) NOT NULL, loc VARCHAR(255) NOT NULL, roworder INT NOT NULL, height INT NOT NULL, autoajust BOOLEAN DEFAULT false NOT NULL, border BOOLEAN DEFAULT true NOT NULL, opened BOOLEAN DEFAULT true NOT NULL, viewheader BOOLEAN DEFAULT true NOT NULL, colorheaderback VARCHAR(255) DEFAULT NULL, colorheaderfont VARCHAR(255) DEFAULT NULL, colorbodyback VARCHAR(255) DEFAULT NULL, colorbodyfont VARCHAR(255) DEFAULT NULL, parameter TEXT DEFAULT NULL, PRIMARY KEY(id))'); - $this->addSql('CREATE INDEX IDX_69400D9AC4663E4 ON pagewidget (page_id)'); - $this->addSql('CREATE INDEX IDX_69400D9AFBE885E2 ON pagewidget (widget_id)'); - $this->addSql('CREATE INDEX IDX_69400D9A54B9D732 ON pagewidget (icon_id)'); - $this->addSql('COMMENT ON COLUMN pagewidget.parameter IS \'(DC2Type:array)\''); - $this->addSql('CREATE TABLE pagewidgetslide (id INT NOT NULL, pagewidget_id INT DEFAULT NULL, title VARCHAR(100) DEFAULT NULL, subtitle VARCHAR(250) DEFAULT NULL, url VARCHAR(500) DEFAULT NULL, target VARCHAR(32) NOT NULL, roworder INT DEFAULT NULL, image VARCHAR(100) DEFAULT NULL, PRIMARY KEY(id))'); - $this->addSql('CREATE INDEX IDX_DF96542055B7C7A2 ON pagewidgetslide (pagewidget_id)'); - $this->addSql('CREATE TABLE registration (id INT NOT NULL, niveau01_id INT NOT NULL, niveau02_id INT DEFAULT NULL, niveau03_id INT DEFAULT NULL, niveau04_id INT DEFAULT NULL, username VARCHAR(128) NOT NULL, firstname VARCHAR(250) DEFAULT NULL, lastname VARCHAR(250) DEFAULT NULL, password VARCHAR(250) NOT NULL, salt VARCHAR(250) NOT NULL, email VARCHAR(128) NOT NULL, isvisible BOOLEAN NOT NULL, postaladress VARCHAR(250) DEFAULT NULL, telephonenumber VARCHAR(60) DEFAULT NULL, job VARCHAR(250) DEFAULT NULL, position VARCHAR(250) DEFAULT NULL, motivation TEXT DEFAULT NULL, note TEXT DEFAULT NULL, keyexpire TIMESTAMP(0) WITHOUT TIME ZONE DEFAULT NULL, keyvalue VARCHAR(60) DEFAULT NULL, statut INT NOT NULL, PRIMARY KEY(id))'); - $this->addSql('CREATE UNIQUE INDEX UNIQ_62A8A7A7F85E0677 ON registration (username)'); - $this->addSql('CREATE UNIQUE INDEX UNIQ_62A8A7A7E7927C74 ON registration (email)'); - $this->addSql('CREATE INDEX IDX_62A8A7A759FDD7AB ON registration (niveau01_id)'); - $this->addSql('CREATE INDEX IDX_62A8A7A74B487845 ON registration (niveau02_id)'); - $this->addSql('CREATE INDEX IDX_62A8A7A7F3F41F20 ON registration (niveau03_id)'); - $this->addSql('CREATE INDEX IDX_62A8A7A76E232799 ON registration (niveau04_id)'); - $this->addSql('CREATE TABLE useraccount (id INT NOT NULL, niveau01_id INT NOT NULL, niveau02_id INT DEFAULT NULL, niveau03_id INT DEFAULT NULL, niveau04_id INT DEFAULT NULL, username VARCHAR(128) NOT NULL, apikey VARCHAR(255) NOT NULL, firstname VARCHAR(250) DEFAULT NULL, lastname VARCHAR(250) DEFAULT NULL, roles TEXT NOT NULL, password VARCHAR(250) NOT NULL, salt VARCHAR(250) NOT NULL, isactive BOOLEAN NOT NULL, email VARCHAR(128) NOT NULL, avatar VARCHAR(250) DEFAULT \'0\', isvisible BOOLEAN NOT NULL, postaladress TEXT DEFAULT NULL, telephonenumber VARCHAR(60) DEFAULT NULL, job VARCHAR(250) DEFAULT NULL, position VARCHAR(250) DEFAULT NULL, motivation TEXT DEFAULT NULL, note TEXT DEFAULT NULL, preference TEXT DEFAULT NULL, keyexpire TIMESTAMP(0) WITHOUT TIME ZONE DEFAULT NULL, keyvalue VARCHAR(60) DEFAULT NULL, visitedate TIMESTAMP(0) WITHOUT TIME ZONE DEFAULT NULL, visitecpt INT DEFAULT NULL, PRIMARY KEY(id))'); - $this->addSql('CREATE UNIQUE INDEX UNIQ_E157AA1AF85E0677 ON useraccount (username)'); - $this->addSql('CREATE UNIQUE INDEX UNIQ_E157AA1AE7927C74 ON useraccount (email)'); - $this->addSql('CREATE INDEX IDX_E157AA1A59FDD7AB ON useraccount (niveau01_id)'); - $this->addSql('CREATE INDEX IDX_E157AA1A4B487845 ON useraccount (niveau02_id)'); - $this->addSql('CREATE INDEX IDX_E157AA1AF3F41F20 ON useraccount (niveau03_id)'); - $this->addSql('CREATE INDEX IDX_E157AA1A6E232799 ON useraccount (niveau04_id)'); - $this->addSql('COMMENT ON COLUMN useraccount.roles IS \'(DC2Type:array)\''); - $this->addSql('COMMENT ON COLUMN useraccount.preference IS \'(DC2Type:array)\''); - $this->addSql('CREATE TABLE usergroupe (id INT NOT NULL, user_id INT DEFAULT NULL, group_id INT DEFAULT NULL, rolegroup INT NOT NULL, apikey VARCHAR(60) NOT NULL, visitedate TIMESTAMP(0) WITHOUT TIME ZONE DEFAULT NULL, visitecpt INT DEFAULT NULL, PRIMARY KEY(id))'); - $this->addSql('CREATE INDEX IDX_6C439BE5A76ED395 ON usergroupe (user_id)'); - $this->addSql('CREATE INDEX IDX_6C439BE5FE54D947 ON usergroupe (group_id)'); - $this->addSql('CREATE UNIQUE INDEX UNIQ_6C439BE5A76ED395FE54D947 ON usergroupe (user_id, group_id)'); - $this->addSql('CREATE TABLE usermodo (id INT NOT NULL, user_id INT NOT NULL, niveau01_id INT NOT NULL, PRIMARY KEY(id))'); - $this->addSql('CREATE INDEX IDX_D162D6C4A76ED395 ON usermodo (user_id)'); - $this->addSql('CREATE INDEX IDX_D162D6C459FDD7AB ON usermodo (niveau01_id)'); - $this->addSql('CREATE TABLE whitelist (id INT NOT NULL, label VARCHAR(250) NOT NULL, PRIMARY KEY(id))'); - $this->addSql('CREATE UNIQUE INDEX UNIQ_CB069864EA750E8 ON whitelist (label)'); - $this->addSql('CREATE TABLE widget (id INT NOT NULL, icon_id INT DEFAULT NULL, roworder INT NOT NULL, name VARCHAR(100) NOT NULL, description TEXT DEFAULT NULL, routeview VARCHAR(255) NOT NULL, height INT NOT NULL, autoajust BOOLEAN DEFAULT false NOT NULL, border BOOLEAN DEFAULT true NOT NULL, opened BOOLEAN DEFAULT true NOT NULL, viewheader BOOLEAN DEFAULT true NOT NULL, colorheaderback VARCHAR(255) DEFAULT NULL, colorheaderfont VARCHAR(255) DEFAULT NULL, colorbodyback VARCHAR(255) DEFAULT NULL, colorbodyfont VARCHAR(255) DEFAULT NULL, access TEXT DEFAULT NULL, parameter TEXT DEFAULT NULL, PRIMARY KEY(id))'); - $this->addSql('CREATE INDEX IDX_85F91ED054B9D732 ON widget (icon_id)'); - $this->addSql('COMMENT ON COLUMN widget.access IS \'(DC2Type:array)\''); - $this->addSql('COMMENT ON COLUMN widget.parameter IS \'(DC2Type:array)\''); - $this->addSql('CREATE TABLE messenger_messages (id BIGSERIAL NOT NULL, body TEXT NOT NULL, headers TEXT NOT NULL, queue_name VARCHAR(190) NOT NULL, created_at TIMESTAMP(0) WITHOUT TIME ZONE NOT NULL, available_at TIMESTAMP(0) WITHOUT TIME ZONE NOT NULL, delivered_at TIMESTAMP(0) WITHOUT TIME ZONE DEFAULT NULL, PRIMARY KEY(id))'); - $this->addSql('CREATE INDEX IDX_75EA56E0FB7336F0 ON messenger_messages (queue_name)'); - $this->addSql('CREATE INDEX IDX_75EA56E0E3BD61CE ON messenger_messages (available_at)'); - $this->addSql('CREATE INDEX IDX_75EA56E016BA31DB ON messenger_messages (delivered_at)'); - $this->addSql('CREATE OR REPLACE FUNCTION notify_messenger_messages() RETURNS TRIGGER AS $$ - BEGIN - PERFORM pg_notify(\'messenger_messages\', NEW.queue_name::text); - RETURN NEW; - END; - $$ LANGUAGE plpgsql;'); - $this->addSql('DROP TRIGGER IF EXISTS notify_trigger ON messenger_messages;'); - $this->addSql('CREATE TRIGGER notify_trigger AFTER INSERT OR UPDATE ON messenger_messages FOR EACH ROW EXECUTE PROCEDURE notify_messenger_messages();'); - $this->addSql('ALTER TABLE alert ADD CONSTRAINT FK_17FD46C164C19C1 FOREIGN KEY (category) REFERENCES alertcategory (id) ON DELETE CASCADE NOT DEFERRABLE INITIALLY IMMEDIATE'); - $this->addSql('ALTER TABLE alertgroupe ADD CONSTRAINT FK_64DB975617FD46C1 FOREIGN KEY (alert) REFERENCES alert (id) NOT DEFERRABLE INITIALLY IMMEDIATE'); - $this->addSql('ALTER TABLE alertgroupe ADD CONSTRAINT FK_64DB97564B98C21 FOREIGN KEY (groupe) REFERENCES groupe (id) NOT DEFERRABLE INITIALLY IMMEDIATE'); - $this->addSql('ALTER TABLE alertuserread ADD CONSTRAINT FK_D4317FA917FD46C1 FOREIGN KEY (alert) REFERENCES alert (id) NOT DEFERRABLE INITIALLY IMMEDIATE'); - $this->addSql('ALTER TABLE alertuserread ADD CONSTRAINT FK_D4317FA9E157AA1A FOREIGN KEY (useraccount) REFERENCES useraccount (id) NOT DEFERRABLE INITIALLY IMMEDIATE'); - $this->addSql('ALTER TABLE alertcategory ADD CONSTRAINT FK_EC575F7E54B9D732 FOREIGN KEY (icon_id) REFERENCES icon (id) ON DELETE SET NULL NOT DEFERRABLE INITIALLY IMMEDIATE'); - $this->addSql('ALTER TABLE bookmark ADD CONSTRAINT FK_DA62921D54B9D732 FOREIGN KEY (icon_id) REFERENCES icon (id) ON DELETE SET NULL NOT DEFERRABLE INITIALLY IMMEDIATE'); - $this->addSql('ALTER TABLE bookmark ADD CONSTRAINT FK_DA62921DA76ED395 FOREIGN KEY (user_id) REFERENCES useraccount (id) NOT DEFERRABLE INITIALLY IMMEDIATE'); - $this->addSql('ALTER TABLE bookmark ADD CONSTRAINT FK_DA62921D55B7C7A2 FOREIGN KEY (pagewidget_id) REFERENCES pagewidget (id) NOT DEFERRABLE INITIALLY IMMEDIATE'); - $this->addSql('ALTER TABLE bookmark ADD CONSTRAINT FK_DA62921D126F525E FOREIGN KEY (item_id) REFERENCES item (id) NOT DEFERRABLE INITIALLY IMMEDIATE'); - $this->addSql('ALTER TABLE groupe ADD CONSTRAINT FK_4B98C217E3C61F9 FOREIGN KEY (owner_id) REFERENCES useraccount (id) ON DELETE SET NULL NOT DEFERRABLE INITIALLY IMMEDIATE'); - $this->addSql('ALTER TABLE groupe ADD CONSTRAINT FK_4B98C216D71CE5E FOREIGN KEY (pagetemplate_id) REFERENCES page (id) NOT DEFERRABLE INITIALLY IMMEDIATE'); - $this->addSql('ALTER TABLE icon ADD CONSTRAINT FK_659429DBA76ED395 FOREIGN KEY (user_id) REFERENCES useraccount (id) NOT DEFERRABLE INITIALLY IMMEDIATE'); - $this->addSql('ALTER TABLE item ADD CONSTRAINT FK_1F1B251E54B9D732 FOREIGN KEY (icon_id) REFERENCES icon (id) ON DELETE SET NULL NOT DEFERRABLE INITIALLY IMMEDIATE'); - $this->addSql('ALTER TABLE item ADD CONSTRAINT FK_1F1B251E64C19C1 FOREIGN KEY (category) REFERENCES itemcategory (id) ON DELETE CASCADE NOT DEFERRABLE INITIALLY IMMEDIATE'); - $this->addSql('ALTER TABLE itemgroupe ADD CONSTRAINT FK_A4267B6D1F1B251E FOREIGN KEY (item) REFERENCES item (id) NOT DEFERRABLE INITIALLY IMMEDIATE'); - $this->addSql('ALTER TABLE itemgroupe ADD CONSTRAINT FK_A4267B6D4B98C21 FOREIGN KEY (groupe) REFERENCES groupe (id) NOT DEFERRABLE INITIALLY IMMEDIATE'); - $this->addSql('ALTER TABLE itemcategory ADD CONSTRAINT FK_7959DEE854B9D732 FOREIGN KEY (icon_id) REFERENCES icon (id) ON DELETE SET NULL NOT DEFERRABLE INITIALLY IMMEDIATE'); - $this->addSql('ALTER TABLE niveau02 ADD CONSTRAINT FK_F4F52F9959FDD7AB FOREIGN KEY (niveau01_id) REFERENCES niveau01 (id) NOT DEFERRABLE INITIALLY IMMEDIATE'); - $this->addSql('ALTER TABLE niveau03 ADD CONSTRAINT FK_83F21F0F4B487845 FOREIGN KEY (niveau02_id) REFERENCES niveau02 (id) NOT DEFERRABLE INITIALLY IMMEDIATE'); - $this->addSql('ALTER TABLE niveau04 ADD CONSTRAINT FK_1D968AACF3F41F20 FOREIGN KEY (niveau03_id) REFERENCES niveau03 (id) NOT DEFERRABLE INITIALLY IMMEDIATE'); - $this->addSql('ALTER TABLE page ADD CONSTRAINT FK_140AB6207AED5C04 FOREIGN KEY (pagecategory_id) REFERENCES pagecategory (id) NOT DEFERRABLE INITIALLY IMMEDIATE'); - $this->addSql('ALTER TABLE page ADD CONSTRAINT FK_140AB620A76ED395 FOREIGN KEY (user_id) REFERENCES useraccount (id) NOT DEFERRABLE INITIALLY IMMEDIATE'); - $this->addSql('ALTER TABLE page ADD CONSTRAINT FK_140AB620C4663E4 FOREIGN KEY (page_id) REFERENCES page (id) ON DELETE SET NULL NOT DEFERRABLE INITIALLY IMMEDIATE'); - $this->addSql('ALTER TABLE pagegroupe ADD CONSTRAINT FK_E8009F6B140AB620 FOREIGN KEY (page) REFERENCES page (id) NOT DEFERRABLE INITIALLY IMMEDIATE'); - $this->addSql('ALTER TABLE pagegroupe ADD CONSTRAINT FK_E8009F6B4B98C21 FOREIGN KEY (groupe) REFERENCES groupe (id) NOT DEFERRABLE INITIALLY IMMEDIATE'); - $this->addSql('ALTER TABLE pagewidget ADD CONSTRAINT FK_69400D9AC4663E4 FOREIGN KEY (page_id) REFERENCES page (id) NOT DEFERRABLE INITIALLY IMMEDIATE'); - $this->addSql('ALTER TABLE pagewidget ADD CONSTRAINT FK_69400D9AFBE885E2 FOREIGN KEY (widget_id) REFERENCES widget (id) NOT DEFERRABLE INITIALLY IMMEDIATE'); - $this->addSql('ALTER TABLE pagewidget ADD CONSTRAINT FK_69400D9A54B9D732 FOREIGN KEY (icon_id) REFERENCES icon (id) ON DELETE SET NULL NOT DEFERRABLE INITIALLY IMMEDIATE'); - $this->addSql('ALTER TABLE pagewidgetslide ADD CONSTRAINT FK_DF96542055B7C7A2 FOREIGN KEY (pagewidget_id) REFERENCES pagewidget (id) NOT DEFERRABLE INITIALLY IMMEDIATE'); - $this->addSql('ALTER TABLE registration ADD CONSTRAINT FK_62A8A7A759FDD7AB FOREIGN KEY (niveau01_id) REFERENCES niveau01 (id) NOT DEFERRABLE INITIALLY IMMEDIATE'); - $this->addSql('ALTER TABLE registration ADD CONSTRAINT FK_62A8A7A74B487845 FOREIGN KEY (niveau02_id) REFERENCES niveau02 (id) NOT DEFERRABLE INITIALLY IMMEDIATE'); - $this->addSql('ALTER TABLE registration ADD CONSTRAINT FK_62A8A7A7F3F41F20 FOREIGN KEY (niveau03_id) REFERENCES niveau03 (id) NOT DEFERRABLE INITIALLY IMMEDIATE'); - $this->addSql('ALTER TABLE registration ADD CONSTRAINT FK_62A8A7A76E232799 FOREIGN KEY (niveau04_id) REFERENCES niveau04 (id) NOT DEFERRABLE INITIALLY IMMEDIATE'); - $this->addSql('ALTER TABLE useraccount ADD CONSTRAINT FK_E157AA1A59FDD7AB FOREIGN KEY (niveau01_id) REFERENCES niveau01 (id) NOT DEFERRABLE INITIALLY IMMEDIATE'); - $this->addSql('ALTER TABLE useraccount ADD CONSTRAINT FK_E157AA1A4B487845 FOREIGN KEY (niveau02_id) REFERENCES niveau02 (id) NOT DEFERRABLE INITIALLY IMMEDIATE'); - $this->addSql('ALTER TABLE useraccount ADD CONSTRAINT FK_E157AA1AF3F41F20 FOREIGN KEY (niveau03_id) REFERENCES niveau03 (id) NOT DEFERRABLE INITIALLY IMMEDIATE'); - $this->addSql('ALTER TABLE useraccount ADD CONSTRAINT FK_E157AA1A6E232799 FOREIGN KEY (niveau04_id) REFERENCES niveau04 (id) NOT DEFERRABLE INITIALLY IMMEDIATE'); - $this->addSql('ALTER TABLE usergroupe ADD CONSTRAINT FK_6C439BE5A76ED395 FOREIGN KEY (user_id) REFERENCES useraccount (id) NOT DEFERRABLE INITIALLY IMMEDIATE'); - $this->addSql('ALTER TABLE usergroupe ADD CONSTRAINT FK_6C439BE5FE54D947 FOREIGN KEY (group_id) REFERENCES groupe (id) NOT DEFERRABLE INITIALLY IMMEDIATE'); - $this->addSql('ALTER TABLE usermodo ADD CONSTRAINT FK_D162D6C4A76ED395 FOREIGN KEY (user_id) REFERENCES useraccount (id) NOT DEFERRABLE INITIALLY IMMEDIATE'); - $this->addSql('ALTER TABLE usermodo ADD CONSTRAINT FK_D162D6C459FDD7AB FOREIGN KEY (niveau01_id) REFERENCES niveau01 (id) NOT DEFERRABLE INITIALLY IMMEDIATE'); - $this->addSql('ALTER TABLE widget ADD CONSTRAINT FK_85F91ED054B9D732 FOREIGN KEY (icon_id) REFERENCES icon (id) ON DELETE SET NULL NOT DEFERRABLE INITIALLY IMMEDIATE'); - } - - public function down(Schema $schema): void - { - // this down() migration is auto-generated, please modify it to your needs - $this->addSql('CREATE SCHEMA public'); - $this->addSql('DROP SEQUENCE alert_id_seq CASCADE'); - $this->addSql('DROP SEQUENCE alertcategory_id_seq CASCADE'); - $this->addSql('DROP SEQUENCE audit_id_seq CASCADE'); - $this->addSql('DROP SEQUENCE bookmark_id_seq CASCADE'); - $this->addSql('DROP SEQUENCE cron_id_seq CASCADE'); - $this->addSql('DROP SEQUENCE groupe_id_seq CASCADE'); - $this->addSql('DROP SEQUENCE icon_id_seq CASCADE'); - $this->addSql('DROP SEQUENCE item_id_seq CASCADE'); - $this->addSql('DROP SEQUENCE itemcategory_id_seq CASCADE'); - $this->addSql('DROP SEQUENCE niveau01_id_seq CASCADE'); - $this->addSql('DROP SEQUENCE niveau02_id_seq CASCADE'); - $this->addSql('DROP SEQUENCE niveau03_id_seq CASCADE'); - $this->addSql('DROP SEQUENCE niveau04_id_seq CASCADE'); - $this->addSql('DROP SEQUENCE page_id_seq CASCADE'); - $this->addSql('DROP SEQUENCE pagecategory_id_seq CASCADE'); - $this->addSql('DROP SEQUENCE pagewidget_id_seq CASCADE'); - $this->addSql('DROP SEQUENCE pagewidgetslide_id_seq CASCADE'); - $this->addSql('DROP SEQUENCE registration_id_seq CASCADE'); - $this->addSql('DROP SEQUENCE useraccount_id_seq CASCADE'); - $this->addSql('DROP SEQUENCE usergroupe_id_seq CASCADE'); - $this->addSql('DROP SEQUENCE usermodo_id_seq CASCADE'); - $this->addSql('DROP SEQUENCE whitelist_id_seq CASCADE'); - $this->addSql('DROP SEQUENCE widget_id_seq CASCADE'); - $this->addSql('ALTER TABLE alert DROP CONSTRAINT FK_17FD46C164C19C1'); - $this->addSql('ALTER TABLE alertgroupe DROP CONSTRAINT FK_64DB975617FD46C1'); - $this->addSql('ALTER TABLE alertgroupe DROP CONSTRAINT FK_64DB97564B98C21'); - $this->addSql('ALTER TABLE alertuserread DROP CONSTRAINT FK_D4317FA917FD46C1'); - $this->addSql('ALTER TABLE alertuserread DROP CONSTRAINT FK_D4317FA9E157AA1A'); - $this->addSql('ALTER TABLE alertcategory DROP CONSTRAINT FK_EC575F7E54B9D732'); - $this->addSql('ALTER TABLE bookmark DROP CONSTRAINT FK_DA62921D54B9D732'); - $this->addSql('ALTER TABLE bookmark DROP CONSTRAINT FK_DA62921DA76ED395'); - $this->addSql('ALTER TABLE bookmark DROP CONSTRAINT FK_DA62921D55B7C7A2'); - $this->addSql('ALTER TABLE bookmark DROP CONSTRAINT FK_DA62921D126F525E'); - $this->addSql('ALTER TABLE groupe DROP CONSTRAINT FK_4B98C217E3C61F9'); - $this->addSql('ALTER TABLE groupe DROP CONSTRAINT FK_4B98C216D71CE5E'); - $this->addSql('ALTER TABLE icon DROP CONSTRAINT FK_659429DBA76ED395'); - $this->addSql('ALTER TABLE item DROP CONSTRAINT FK_1F1B251E54B9D732'); - $this->addSql('ALTER TABLE item DROP CONSTRAINT FK_1F1B251E64C19C1'); - $this->addSql('ALTER TABLE itemgroupe DROP CONSTRAINT FK_A4267B6D1F1B251E'); - $this->addSql('ALTER TABLE itemgroupe DROP CONSTRAINT FK_A4267B6D4B98C21'); - $this->addSql('ALTER TABLE itemcategory DROP CONSTRAINT FK_7959DEE854B9D732'); - $this->addSql('ALTER TABLE niveau02 DROP CONSTRAINT FK_F4F52F9959FDD7AB'); - $this->addSql('ALTER TABLE niveau03 DROP CONSTRAINT FK_83F21F0F4B487845'); - $this->addSql('ALTER TABLE niveau04 DROP CONSTRAINT FK_1D968AACF3F41F20'); - $this->addSql('ALTER TABLE page DROP CONSTRAINT FK_140AB6207AED5C04'); - $this->addSql('ALTER TABLE page DROP CONSTRAINT FK_140AB620A76ED395'); - $this->addSql('ALTER TABLE page DROP CONSTRAINT FK_140AB620C4663E4'); - $this->addSql('ALTER TABLE pagegroupe DROP CONSTRAINT FK_E8009F6B140AB620'); - $this->addSql('ALTER TABLE pagegroupe DROP CONSTRAINT FK_E8009F6B4B98C21'); - $this->addSql('ALTER TABLE pagewidget DROP CONSTRAINT FK_69400D9AC4663E4'); - $this->addSql('ALTER TABLE pagewidget DROP CONSTRAINT FK_69400D9AFBE885E2'); - $this->addSql('ALTER TABLE pagewidget DROP CONSTRAINT FK_69400D9A54B9D732'); - $this->addSql('ALTER TABLE pagewidgetslide DROP CONSTRAINT FK_DF96542055B7C7A2'); - $this->addSql('ALTER TABLE registration DROP CONSTRAINT FK_62A8A7A759FDD7AB'); - $this->addSql('ALTER TABLE registration DROP CONSTRAINT FK_62A8A7A74B487845'); - $this->addSql('ALTER TABLE registration DROP CONSTRAINT FK_62A8A7A7F3F41F20'); - $this->addSql('ALTER TABLE registration DROP CONSTRAINT FK_62A8A7A76E232799'); - $this->addSql('ALTER TABLE useraccount DROP CONSTRAINT FK_E157AA1A59FDD7AB'); - $this->addSql('ALTER TABLE useraccount DROP CONSTRAINT FK_E157AA1A4B487845'); - $this->addSql('ALTER TABLE useraccount DROP CONSTRAINT FK_E157AA1AF3F41F20'); - $this->addSql('ALTER TABLE useraccount DROP CONSTRAINT FK_E157AA1A6E232799'); - $this->addSql('ALTER TABLE usergroupe DROP CONSTRAINT FK_6C439BE5A76ED395'); - $this->addSql('ALTER TABLE usergroupe DROP CONSTRAINT FK_6C439BE5FE54D947'); - $this->addSql('ALTER TABLE usermodo DROP CONSTRAINT FK_D162D6C4A76ED395'); - $this->addSql('ALTER TABLE usermodo DROP CONSTRAINT FK_D162D6C459FDD7AB'); - $this->addSql('ALTER TABLE widget DROP CONSTRAINT FK_85F91ED054B9D732'); - $this->addSql('DROP TABLE alert'); - $this->addSql('DROP TABLE alertgroupe'); - $this->addSql('DROP TABLE alertuserread'); - $this->addSql('DROP TABLE alertcategory'); - $this->addSql('DROP TABLE audit'); - $this->addSql('DROP TABLE bookmark'); - $this->addSql('DROP TABLE config'); - $this->addSql('DROP TABLE cron'); - $this->addSql('DROP TABLE groupe'); - $this->addSql('DROP TABLE icon'); - $this->addSql('DROP TABLE item'); - $this->addSql('DROP TABLE itemgroupe'); - $this->addSql('DROP TABLE itemcategory'); - $this->addSql('DROP TABLE niveau01'); - $this->addSql('DROP TABLE niveau02'); - $this->addSql('DROP TABLE niveau03'); - $this->addSql('DROP TABLE niveau04'); - $this->addSql('DROP TABLE page'); - $this->addSql('DROP TABLE pagegroupe'); - $this->addSql('DROP TABLE pagecategory'); - $this->addSql('DROP TABLE pagewidget'); - $this->addSql('DROP TABLE pagewidgetslide'); - $this->addSql('DROP TABLE registration'); - $this->addSql('DROP TABLE useraccount'); - $this->addSql('DROP TABLE usergroupe'); - $this->addSql('DROP TABLE usermodo'); - $this->addSql('DROP TABLE whitelist'); - $this->addSql('DROP TABLE widget'); - $this->addSql('DROP TABLE messenger_messages'); - } -} diff --git a/migrations/Version20230203163146.php b/migrations/Version20230203163146.php new file mode 100644 index 0000000..0768ec3 --- /dev/null +++ b/migrations/Version20230203163146.php @@ -0,0 +1,245 @@ +addSql('CREATE SEQUENCE Blog_id_seq INCREMENT BY 1 MINVALUE 1 START 1'); + $this->addSql('CREATE SEQUENCE Page_id_seq INCREMENT BY 1 MINVALUE 1 START 1'); + $this->addSql('CREATE SEQUENCE audit_id_seq INCREMENT BY 1 MINVALUE 1 START 1'); + $this->addSql('CREATE SEQUENCE blogtype_id_seq INCREMENT BY 1 MINVALUE 1 START 1'); + $this->addSql('CREATE SEQUENCE child_id_seq INCREMENT BY 1 MINVALUE 1 START 1'); + $this->addSql('CREATE SEQUENCE childheader_id_seq INCREMENT BY 1 MINVALUE 1 START 1'); + $this->addSql('CREATE SEQUENCE cron_id_seq INCREMENT BY 1 MINVALUE 1 START 1'); + $this->addSql('CREATE SEQUENCE groupe_id_seq INCREMENT BY 1 MINVALUE 1 START 1'); + $this->addSql('CREATE SEQUENCE menu_id_seq INCREMENT BY 1 MINVALUE 1 START 1'); + $this->addSql('CREATE SEQUENCE menuchild_id_seq INCREMENT BY 1 MINVALUE 1 START 1'); + $this->addSql('CREATE SEQUENCE niveau01_id_seq INCREMENT BY 1 MINVALUE 1 START 1'); + $this->addSql('CREATE SEQUENCE niveau02_id_seq INCREMENT BY 1 MINVALUE 1 START 1'); + $this->addSql('CREATE SEQUENCE niveau03_id_seq INCREMENT BY 1 MINVALUE 1 START 1'); + $this->addSql('CREATE SEQUENCE niveau04_id_seq INCREMENT BY 1 MINVALUE 1 START 1'); + $this->addSql('CREATE SEQUENCE pagetype_id_seq INCREMENT BY 1 MINVALUE 1 START 1'); + $this->addSql('CREATE SEQUENCE pin_id_seq INCREMENT BY 1 MINVALUE 1 START 1'); + $this->addSql('CREATE SEQUENCE registration_id_seq INCREMENT BY 1 MINVALUE 1 START 1'); + $this->addSql('CREATE SEQUENCE useraccount_id_seq INCREMENT BY 1 MINVALUE 1 START 1'); + $this->addSql('CREATE SEQUENCE usergroupe_id_seq INCREMENT BY 1 MINVALUE 1 START 1'); + $this->addSql('CREATE SEQUENCE usermodo_id_seq INCREMENT BY 1 MINVALUE 1 START 1'); + $this->addSql('CREATE SEQUENCE whitelist_id_seq INCREMENT BY 1 MINVALUE 1 START 1'); + $this->addSql('CREATE TABLE Blog (id INT NOT NULL, blogtype_id INT DEFAULT NULL, name VARCHAR(255) NOT NULL, submitdate TIMESTAMP(0) WITHOUT TIME ZONE NOT NULL, externalcode VARCHAR(255) DEFAULT NULL, externalid VARCHAR(255) DEFAULT NULL, PRIMARY KEY(id))'); + $this->addSql('CREATE INDEX IDX_6027FE7DA930CED1 ON Blog (blogtype_id)'); + $this->addSql('CREATE TABLE Page (id INT NOT NULL, pagetype_id INT DEFAULT NULL, name VARCHAR(255) NOT NULL, submitdate TIMESTAMP(0) WITHOUT TIME ZONE NOT NULL, externalcode VARCHAR(255) DEFAULT NULL, externalid VARCHAR(255) DEFAULT NULL, PRIMARY KEY(id))'); + $this->addSql('CREATE INDEX IDX_B438191E53A99D0E ON Page (pagetype_id)'); + $this->addSql('CREATE TABLE audit (id INT NOT NULL, entityname VARCHAR(250) NOT NULL, entityid VARCHAR(250) NOT NULL, datesubmit TIMESTAMP(0) WITHOUT TIME ZONE NOT NULL, username VARCHAR(250) NOT NULL, description TEXT DEFAULT NULL, detail TEXT DEFAULT NULL, PRIMARY KEY(id))'); + $this->addSql('CREATE INDEX search_idx ON audit (entityname, entityid, datesubmit)'); + $this->addSql('COMMENT ON COLUMN audit.detail IS \'(DC2Type:array)\''); + $this->addSql('CREATE TABLE blogtype (id INT NOT NULL, name VARCHAR(255) NOT NULL, description TEXT DEFAULT NULL, sortby VARCHAR(255) NOT NULL, image VARCHAR(255) DEFAULT NULL, PRIMARY KEY(id))'); + $this->addSql('CREATE TABLE child (id INT NOT NULL, blog_id INT DEFAULT NULL, page_id INT DEFAULT NULL, childtype_id INT DEFAULT NULL, name VARCHAR(255) NOT NULL, subname VARCHAR(255) DEFAULT NULL, description TEXT DEFAULT NULL, submitdate TIMESTAMP(0) WITHOUT TIME ZONE NOT NULL, filename VARCHAR(255) DEFAULT NULL, fileextention VARCHAR(255) DEFAULT NULL, fileminetype VARCHAR(255) DEFAULT NULL, url VARCHAR(255) DEFAULT NULL, externalcode VARCHAR(255) DEFAULT NULL, externalid VARCHAR(255) DEFAULT NULL, externalscript VARCHAR(255) DEFAULT NULL, PRIMARY KEY(id))'); + $this->addSql('CREATE INDEX IDX_22B35429DAE07E97 ON child (blog_id)'); + $this->addSql('CREATE INDEX IDX_22B35429C4663E4 ON child (page_id)'); + $this->addSql('CREATE INDEX IDX_22B35429552AAF4C ON child (childtype_id)'); + $this->addSql('CREATE TABLE childtag (child INT NOT NULL, tag VARCHAR(255) NOT NULL, PRIMARY KEY(child, tag))'); + $this->addSql('CREATE INDEX IDX_B8AAB0A822B35429 ON childtag (child)'); + $this->addSql('CREATE INDEX IDX_B8AAB0A8389B783 ON childtag (tag)'); + $this->addSql('CREATE TABLE childpin (child INT NOT NULL, pin INT NOT NULL, PRIMARY KEY(child, pin))'); + $this->addSql('CREATE INDEX IDX_EA62AD822B35429 ON childpin (child)'); + $this->addSql('CREATE INDEX IDX_EA62AD8B5852DF3 ON childpin (pin)'); + $this->addSql('CREATE TABLE childheader (id INT NOT NULL, child_id INT DEFAULT NULL, filename VARCHAR(255) NOT NULL, roworder INT NOT NULL, credit VARCHAR(255) DEFAULT NULL, PRIMARY KEY(id))'); + $this->addSql('CREATE INDEX IDX_B74CE6CEDD62C21B ON childheader (child_id)'); + $this->addSql('CREATE TABLE childtype (id INT NOT NULL, name VARCHAR(255) NOT NULL, roworder INT NOT NULL, submitroute VARCHAR(255) NOT NULL, havechildheader BOOLEAN NOT NULL, havefile BOOLEAN NOT NULL, haveurl BOOLEAN NOT NULL, havepin BOOLEAN NOT NULL, PRIMARY KEY(id))'); + $this->addSql('CREATE TABLE config (id VARCHAR(255) NOT NULL, title VARCHAR(250) NOT NULL, value TEXT DEFAULT NULL, defaultvalue TEXT NOT NULL, roworder VARCHAR(255) NOT NULL, visible BOOLEAN NOT NULL, changeable BOOLEAN NOT NULL, required BOOLEAN NOT NULL, type VARCHAR(255) NOT NULL, grouped VARCHAR(255) NOT NULL, category VARCHAR(255) NOT NULL, help TEXT NOT NULL, PRIMARY KEY(id))'); + $this->addSql('CREATE TABLE cron (id INT NOT NULL, command VARCHAR(255) NOT NULL, description TEXT DEFAULT NULL, statut INT DEFAULT NULL, submitdate TIMESTAMP(0) WITHOUT TIME ZONE NOT NULL, startexecdate TIMESTAMP(0) WITHOUT TIME ZONE DEFAULT NULL, endexecdate TIMESTAMP(0) WITHOUT TIME ZONE DEFAULT NULL, nextexecdate TIMESTAMP(0) WITHOUT TIME ZONE DEFAULT NULL, repeatinterval INT DEFAULT NULL, jsonargument TEXT DEFAULT NULL, PRIMARY KEY(id))'); + $this->addSql('CREATE TABLE groupe (id INT NOT NULL, owner_id INT DEFAULT NULL, label VARCHAR(250) NOT NULL, description TEXT DEFAULT NULL, email VARCHAR(250) DEFAULT NULL, isopen BOOLEAN DEFAULT false NOT NULL, isworkgroup BOOLEAN DEFAULT false NOT NULL, apikey VARCHAR(255) NOT NULL, ldapfilter TEXT DEFAULT NULL, attributes TEXT DEFAULT NULL, idexternal TEXT DEFAULT NULL, PRIMARY KEY(id))'); + $this->addSql('CREATE UNIQUE INDEX UNIQ_4B98C21EA750E8 ON groupe (label)'); + $this->addSql('CREATE INDEX IDX_4B98C217E3C61F9 ON groupe (owner_id)'); + $this->addSql('CREATE TABLE menu (id INT NOT NULL, name VARCHAR(255) NOT NULL, PRIMARY KEY(id))'); + $this->addSql('CREATE TABLE menuchild (id INT NOT NULL, menu_id INT DEFAULT NULL, blog_id INT DEFAULT NULL, page_id INT DEFAULT NULL, blogtype_id INT DEFAULT NULL, pagetype_id INT DEFAULT NULL, childtype VARCHAR(255) NOT NULL, roworder INT NOT NULL, PRIMARY KEY(id))'); + $this->addSql('CREATE INDEX IDX_B7D9D47CCCD7E912 ON menuchild (menu_id)'); + $this->addSql('CREATE INDEX IDX_B7D9D47CDAE07E97 ON menuchild (blog_id)'); + $this->addSql('CREATE INDEX IDX_B7D9D47CC4663E4 ON menuchild (page_id)'); + $this->addSql('CREATE INDEX IDX_B7D9D47CA930CED1 ON menuchild (blogtype_id)'); + $this->addSql('CREATE INDEX IDX_B7D9D47C53A99D0E ON menuchild (pagetype_id)'); + $this->addSql('CREATE TABLE niveau01 (id INT NOT NULL, label VARCHAR(250) NOT NULL, code TEXT DEFAULT NULL, postaladress TEXT DEFAULT NULL, telephonenumber VARCHAR(60) DEFAULT NULL, email VARCHAR(60) DEFAULT NULL, apikey VARCHAR(255) NOT NULL, ldapfilter TEXT DEFAULT NULL, attributes TEXT DEFAULT NULL, idexternal TEXT DEFAULT NULL, PRIMARY KEY(id))'); + $this->addSql('CREATE UNIQUE INDEX UNIQ_6DFC7E23EA750E8 ON niveau01 (label)'); + $this->addSql('CREATE TABLE niveau02 (id INT NOT NULL, niveau01_id INT NOT NULL, label VARCHAR(250) NOT NULL, code TEXT DEFAULT NULL, postaladress TEXT DEFAULT NULL, telephonenumber VARCHAR(60) DEFAULT NULL, email VARCHAR(60) DEFAULT NULL, apikey VARCHAR(255) NOT NULL, PRIMARY KEY(id))'); + $this->addSql('CREATE UNIQUE INDEX UNIQ_F4F52F99EA750E8 ON niveau02 (label)'); + $this->addSql('CREATE INDEX IDX_F4F52F9959FDD7AB ON niveau02 (niveau01_id)'); + $this->addSql('CREATE TABLE niveau03 (id INT NOT NULL, niveau02_id INT NOT NULL, label VARCHAR(250) NOT NULL, code TEXT DEFAULT NULL, postaladress TEXT DEFAULT NULL, telephonenumber VARCHAR(60) DEFAULT NULL, email VARCHAR(60) DEFAULT NULL, apikey VARCHAR(255) NOT NULL, PRIMARY KEY(id))'); + $this->addSql('CREATE UNIQUE INDEX UNIQ_83F21F0FEA750E8 ON niveau03 (label)'); + $this->addSql('CREATE INDEX IDX_83F21F0F4B487845 ON niveau03 (niveau02_id)'); + $this->addSql('CREATE TABLE niveau04 (id INT NOT NULL, niveau03_id INT NOT NULL, label VARCHAR(250) NOT NULL, code TEXT DEFAULT NULL, postaladress TEXT DEFAULT NULL, telephonenumber VARCHAR(60) DEFAULT NULL, email VARCHAR(60) DEFAULT NULL, apikey VARCHAR(255) NOT NULL, PRIMARY KEY(id))'); + $this->addSql('CREATE UNIQUE INDEX UNIQ_1D968AACEA750E8 ON niveau04 (label)'); + $this->addSql('CREATE INDEX IDX_1D968AACF3F41F20 ON niveau04 (niveau03_id)'); + $this->addSql('CREATE TABLE pagetype (id INT NOT NULL, name VARCHAR(255) NOT NULL, description TEXT DEFAULT NULL, sortby VARCHAR(255) NOT NULL, image VARCHAR(255) DEFAULT NULL, PRIMARY KEY(id))'); + $this->addSql('CREATE TABLE pin (id INT NOT NULL, name VARCHAR(255) NOT NULL, subname VARCHAR(255) DEFAULT NULL, description TEXT DEFAULT NULL, image VARCHAR(255) DEFAULT NULL, submitdate TIMESTAMP(0) WITHOUT TIME ZONE NOT NULL, PRIMARY KEY(id))'); + $this->addSql('CREATE TABLE registration (id INT NOT NULL, niveau01_id INT NOT NULL, niveau02_id INT DEFAULT NULL, niveau03_id INT DEFAULT NULL, niveau04_id INT DEFAULT NULL, username VARCHAR(128) NOT NULL, firstname VARCHAR(250) DEFAULT NULL, lastname VARCHAR(250) DEFAULT NULL, password VARCHAR(250) NOT NULL, salt VARCHAR(250) NOT NULL, email VARCHAR(128) NOT NULL, isvisible BOOLEAN NOT NULL, postaladress VARCHAR(250) DEFAULT NULL, telephonenumber VARCHAR(60) DEFAULT NULL, job VARCHAR(250) DEFAULT NULL, position VARCHAR(250) DEFAULT NULL, motivation TEXT DEFAULT NULL, note TEXT DEFAULT NULL, keyexpire TIMESTAMP(0) WITHOUT TIME ZONE DEFAULT NULL, keyvalue VARCHAR(60) DEFAULT NULL, statut INT NOT NULL, PRIMARY KEY(id))'); + $this->addSql('CREATE UNIQUE INDEX UNIQ_62A8A7A7F85E0677 ON registration (username)'); + $this->addSql('CREATE UNIQUE INDEX UNIQ_62A8A7A7E7927C74 ON registration (email)'); + $this->addSql('CREATE INDEX IDX_62A8A7A759FDD7AB ON registration (niveau01_id)'); + $this->addSql('CREATE INDEX IDX_62A8A7A74B487845 ON registration (niveau02_id)'); + $this->addSql('CREATE INDEX IDX_62A8A7A7F3F41F20 ON registration (niveau03_id)'); + $this->addSql('CREATE INDEX IDX_62A8A7A76E232799 ON registration (niveau04_id)'); + $this->addSql('CREATE TABLE tag (id VARCHAR(255) NOT NULL, PRIMARY KEY(id))'); + $this->addSql('CREATE TABLE useraccount (id INT NOT NULL, niveau01_id INT NOT NULL, niveau02_id INT DEFAULT NULL, niveau03_id INT DEFAULT NULL, niveau04_id INT DEFAULT NULL, username VARCHAR(128) NOT NULL, apikey VARCHAR(255) NOT NULL, firstname VARCHAR(250) DEFAULT NULL, lastname VARCHAR(250) DEFAULT NULL, roles TEXT NOT NULL, password VARCHAR(250) NOT NULL, salt VARCHAR(250) NOT NULL, isactive BOOLEAN NOT NULL, email VARCHAR(128) NOT NULL, avatar VARCHAR(250) DEFAULT \'0\', isvisible BOOLEAN NOT NULL, postaladress TEXT DEFAULT NULL, telephonenumber VARCHAR(60) DEFAULT NULL, job VARCHAR(250) DEFAULT NULL, position VARCHAR(250) DEFAULT NULL, motivation TEXT DEFAULT NULL, note TEXT DEFAULT NULL, preference TEXT DEFAULT NULL, keyexpire TIMESTAMP(0) WITHOUT TIME ZONE DEFAULT NULL, keyvalue VARCHAR(60) DEFAULT NULL, visitedate TIMESTAMP(0) WITHOUT TIME ZONE DEFAULT NULL, visitecpt INT DEFAULT NULL, PRIMARY KEY(id))'); + $this->addSql('CREATE UNIQUE INDEX UNIQ_E157AA1AF85E0677 ON useraccount (username)'); + $this->addSql('CREATE UNIQUE INDEX UNIQ_E157AA1AE7927C74 ON useraccount (email)'); + $this->addSql('CREATE INDEX IDX_E157AA1A59FDD7AB ON useraccount (niveau01_id)'); + $this->addSql('CREATE INDEX IDX_E157AA1A4B487845 ON useraccount (niveau02_id)'); + $this->addSql('CREATE INDEX IDX_E157AA1AF3F41F20 ON useraccount (niveau03_id)'); + $this->addSql('CREATE INDEX IDX_E157AA1A6E232799 ON useraccount (niveau04_id)'); + $this->addSql('COMMENT ON COLUMN useraccount.roles IS \'(DC2Type:array)\''); + $this->addSql('COMMENT ON COLUMN useraccount.preference IS \'(DC2Type:array)\''); + $this->addSql('CREATE TABLE usergroupe (id INT NOT NULL, user_id INT DEFAULT NULL, group_id INT DEFAULT NULL, rolegroup INT NOT NULL, apikey VARCHAR(60) NOT NULL, visitedate TIMESTAMP(0) WITHOUT TIME ZONE DEFAULT NULL, visitecpt INT DEFAULT NULL, PRIMARY KEY(id))'); + $this->addSql('CREATE INDEX IDX_6C439BE5A76ED395 ON usergroupe (user_id)'); + $this->addSql('CREATE INDEX IDX_6C439BE5FE54D947 ON usergroupe (group_id)'); + $this->addSql('CREATE UNIQUE INDEX UNIQ_6C439BE5A76ED395FE54D947 ON usergroupe (user_id, group_id)'); + $this->addSql('CREATE TABLE usermodo (id INT NOT NULL, user_id INT NOT NULL, niveau01_id INT NOT NULL, PRIMARY KEY(id))'); + $this->addSql('CREATE INDEX IDX_D162D6C4A76ED395 ON usermodo (user_id)'); + $this->addSql('CREATE INDEX IDX_D162D6C459FDD7AB ON usermodo (niveau01_id)'); + $this->addSql('CREATE TABLE whitelist (id INT NOT NULL, label VARCHAR(250) NOT NULL, PRIMARY KEY(id))'); + $this->addSql('CREATE UNIQUE INDEX UNIQ_CB069864EA750E8 ON whitelist (label)'); + $this->addSql('CREATE TABLE messenger_messages (id BIGSERIAL NOT NULL, body TEXT NOT NULL, headers TEXT NOT NULL, queue_name VARCHAR(190) NOT NULL, created_at TIMESTAMP(0) WITHOUT TIME ZONE NOT NULL, available_at TIMESTAMP(0) WITHOUT TIME ZONE NOT NULL, delivered_at TIMESTAMP(0) WITHOUT TIME ZONE DEFAULT NULL, PRIMARY KEY(id))'); + $this->addSql('CREATE INDEX IDX_75EA56E0FB7336F0 ON messenger_messages (queue_name)'); + $this->addSql('CREATE INDEX IDX_75EA56E0E3BD61CE ON messenger_messages (available_at)'); + $this->addSql('CREATE INDEX IDX_75EA56E016BA31DB ON messenger_messages (delivered_at)'); + $this->addSql('CREATE OR REPLACE FUNCTION notify_messenger_messages() RETURNS TRIGGER AS $$ + BEGIN + PERFORM pg_notify(\'messenger_messages\', NEW.queue_name::text); + RETURN NEW; + END; + $$ LANGUAGE plpgsql;'); + $this->addSql('DROP TRIGGER IF EXISTS notify_trigger ON messenger_messages;'); + $this->addSql('CREATE TRIGGER notify_trigger AFTER INSERT OR UPDATE ON messenger_messages FOR EACH ROW EXECUTE PROCEDURE notify_messenger_messages();'); + $this->addSql('ALTER TABLE Blog ADD CONSTRAINT FK_6027FE7DA930CED1 FOREIGN KEY (blogtype_id) REFERENCES blogtype (id) NOT DEFERRABLE INITIALLY IMMEDIATE'); + $this->addSql('ALTER TABLE Page ADD CONSTRAINT FK_B438191E53A99D0E FOREIGN KEY (pagetype_id) REFERENCES pagetype (id) NOT DEFERRABLE INITIALLY IMMEDIATE'); + $this->addSql('ALTER TABLE child ADD CONSTRAINT FK_22B35429DAE07E97 FOREIGN KEY (blog_id) REFERENCES Blog (id) NOT DEFERRABLE INITIALLY IMMEDIATE'); + $this->addSql('ALTER TABLE child ADD CONSTRAINT FK_22B35429C4663E4 FOREIGN KEY (page_id) REFERENCES Page (id) NOT DEFERRABLE INITIALLY IMMEDIATE'); + $this->addSql('ALTER TABLE child ADD CONSTRAINT FK_22B35429552AAF4C FOREIGN KEY (childtype_id) REFERENCES childtype (id) NOT DEFERRABLE INITIALLY IMMEDIATE'); + $this->addSql('ALTER TABLE childtag ADD CONSTRAINT FK_B8AAB0A822B35429 FOREIGN KEY (child) REFERENCES child (id) NOT DEFERRABLE INITIALLY IMMEDIATE'); + $this->addSql('ALTER TABLE childtag ADD CONSTRAINT FK_B8AAB0A8389B783 FOREIGN KEY (tag) REFERENCES tag (id) NOT DEFERRABLE INITIALLY IMMEDIATE'); + $this->addSql('ALTER TABLE childpin ADD CONSTRAINT FK_EA62AD822B35429 FOREIGN KEY (child) REFERENCES child (id) NOT DEFERRABLE INITIALLY IMMEDIATE'); + $this->addSql('ALTER TABLE childpin ADD CONSTRAINT FK_EA62AD8B5852DF3 FOREIGN KEY (pin) REFERENCES pin (id) NOT DEFERRABLE INITIALLY IMMEDIATE'); + $this->addSql('ALTER TABLE childheader ADD CONSTRAINT FK_B74CE6CEDD62C21B FOREIGN KEY (child_id) REFERENCES child (id) NOT DEFERRABLE INITIALLY IMMEDIATE'); + $this->addSql('ALTER TABLE groupe ADD CONSTRAINT FK_4B98C217E3C61F9 FOREIGN KEY (owner_id) REFERENCES useraccount (id) ON DELETE SET NULL NOT DEFERRABLE INITIALLY IMMEDIATE'); + $this->addSql('ALTER TABLE menuchild ADD CONSTRAINT FK_B7D9D47CCCD7E912 FOREIGN KEY (menu_id) REFERENCES menu (id) NOT DEFERRABLE INITIALLY IMMEDIATE'); + $this->addSql('ALTER TABLE menuchild ADD CONSTRAINT FK_B7D9D47CDAE07E97 FOREIGN KEY (blog_id) REFERENCES Blog (id) NOT DEFERRABLE INITIALLY IMMEDIATE'); + $this->addSql('ALTER TABLE menuchild ADD CONSTRAINT FK_B7D9D47CC4663E4 FOREIGN KEY (page_id) REFERENCES Page (id) NOT DEFERRABLE INITIALLY IMMEDIATE'); + $this->addSql('ALTER TABLE menuchild ADD CONSTRAINT FK_B7D9D47CA930CED1 FOREIGN KEY (blogtype_id) REFERENCES blogtype (id) NOT DEFERRABLE INITIALLY IMMEDIATE'); + $this->addSql('ALTER TABLE menuchild ADD CONSTRAINT FK_B7D9D47C53A99D0E FOREIGN KEY (pagetype_id) REFERENCES pagetype (id) NOT DEFERRABLE INITIALLY IMMEDIATE'); + $this->addSql('ALTER TABLE niveau02 ADD CONSTRAINT FK_F4F52F9959FDD7AB FOREIGN KEY (niveau01_id) REFERENCES niveau01 (id) NOT DEFERRABLE INITIALLY IMMEDIATE'); + $this->addSql('ALTER TABLE niveau03 ADD CONSTRAINT FK_83F21F0F4B487845 FOREIGN KEY (niveau02_id) REFERENCES niveau02 (id) NOT DEFERRABLE INITIALLY IMMEDIATE'); + $this->addSql('ALTER TABLE niveau04 ADD CONSTRAINT FK_1D968AACF3F41F20 FOREIGN KEY (niveau03_id) REFERENCES niveau03 (id) NOT DEFERRABLE INITIALLY IMMEDIATE'); + $this->addSql('ALTER TABLE registration ADD CONSTRAINT FK_62A8A7A759FDD7AB FOREIGN KEY (niveau01_id) REFERENCES niveau01 (id) NOT DEFERRABLE INITIALLY IMMEDIATE'); + $this->addSql('ALTER TABLE registration ADD CONSTRAINT FK_62A8A7A74B487845 FOREIGN KEY (niveau02_id) REFERENCES niveau02 (id) NOT DEFERRABLE INITIALLY IMMEDIATE'); + $this->addSql('ALTER TABLE registration ADD CONSTRAINT FK_62A8A7A7F3F41F20 FOREIGN KEY (niveau03_id) REFERENCES niveau03 (id) NOT DEFERRABLE INITIALLY IMMEDIATE'); + $this->addSql('ALTER TABLE registration ADD CONSTRAINT FK_62A8A7A76E232799 FOREIGN KEY (niveau04_id) REFERENCES niveau04 (id) NOT DEFERRABLE INITIALLY IMMEDIATE'); + $this->addSql('ALTER TABLE useraccount ADD CONSTRAINT FK_E157AA1A59FDD7AB FOREIGN KEY (niveau01_id) REFERENCES niveau01 (id) NOT DEFERRABLE INITIALLY IMMEDIATE'); + $this->addSql('ALTER TABLE useraccount ADD CONSTRAINT FK_E157AA1A4B487845 FOREIGN KEY (niveau02_id) REFERENCES niveau02 (id) NOT DEFERRABLE INITIALLY IMMEDIATE'); + $this->addSql('ALTER TABLE useraccount ADD CONSTRAINT FK_E157AA1AF3F41F20 FOREIGN KEY (niveau03_id) REFERENCES niveau03 (id) NOT DEFERRABLE INITIALLY IMMEDIATE'); + $this->addSql('ALTER TABLE useraccount ADD CONSTRAINT FK_E157AA1A6E232799 FOREIGN KEY (niveau04_id) REFERENCES niveau04 (id) NOT DEFERRABLE INITIALLY IMMEDIATE'); + $this->addSql('ALTER TABLE usergroupe ADD CONSTRAINT FK_6C439BE5A76ED395 FOREIGN KEY (user_id) REFERENCES useraccount (id) NOT DEFERRABLE INITIALLY IMMEDIATE'); + $this->addSql('ALTER TABLE usergroupe ADD CONSTRAINT FK_6C439BE5FE54D947 FOREIGN KEY (group_id) REFERENCES groupe (id) NOT DEFERRABLE INITIALLY IMMEDIATE'); + $this->addSql('ALTER TABLE usermodo ADD CONSTRAINT FK_D162D6C4A76ED395 FOREIGN KEY (user_id) REFERENCES useraccount (id) NOT DEFERRABLE INITIALLY IMMEDIATE'); + $this->addSql('ALTER TABLE usermodo ADD CONSTRAINT FK_D162D6C459FDD7AB FOREIGN KEY (niveau01_id) REFERENCES niveau01 (id) NOT DEFERRABLE INITIALLY IMMEDIATE'); + } + + public function down(Schema $schema): void + { + // this down() migration is auto-generated, please modify it to your needs + $this->addSql('CREATE SCHEMA public'); + $this->addSql('DROP SEQUENCE Blog_id_seq CASCADE'); + $this->addSql('DROP SEQUENCE Page_id_seq CASCADE'); + $this->addSql('DROP SEQUENCE audit_id_seq CASCADE'); + $this->addSql('DROP SEQUENCE blogtype_id_seq CASCADE'); + $this->addSql('DROP SEQUENCE child_id_seq CASCADE'); + $this->addSql('DROP SEQUENCE childheader_id_seq CASCADE'); + $this->addSql('DROP SEQUENCE cron_id_seq CASCADE'); + $this->addSql('DROP SEQUENCE groupe_id_seq CASCADE'); + $this->addSql('DROP SEQUENCE menu_id_seq CASCADE'); + $this->addSql('DROP SEQUENCE menuchild_id_seq CASCADE'); + $this->addSql('DROP SEQUENCE niveau01_id_seq CASCADE'); + $this->addSql('DROP SEQUENCE niveau02_id_seq CASCADE'); + $this->addSql('DROP SEQUENCE niveau03_id_seq CASCADE'); + $this->addSql('DROP SEQUENCE niveau04_id_seq CASCADE'); + $this->addSql('DROP SEQUENCE pagetype_id_seq CASCADE'); + $this->addSql('DROP SEQUENCE pin_id_seq CASCADE'); + $this->addSql('DROP SEQUENCE registration_id_seq CASCADE'); + $this->addSql('DROP SEQUENCE useraccount_id_seq CASCADE'); + $this->addSql('DROP SEQUENCE usergroupe_id_seq CASCADE'); + $this->addSql('DROP SEQUENCE usermodo_id_seq CASCADE'); + $this->addSql('DROP SEQUENCE whitelist_id_seq CASCADE'); + $this->addSql('ALTER TABLE Blog DROP CONSTRAINT FK_6027FE7DA930CED1'); + $this->addSql('ALTER TABLE Page DROP CONSTRAINT FK_B438191E53A99D0E'); + $this->addSql('ALTER TABLE child DROP CONSTRAINT FK_22B35429DAE07E97'); + $this->addSql('ALTER TABLE child DROP CONSTRAINT FK_22B35429C4663E4'); + $this->addSql('ALTER TABLE child DROP CONSTRAINT FK_22B35429552AAF4C'); + $this->addSql('ALTER TABLE childtag DROP CONSTRAINT FK_B8AAB0A822B35429'); + $this->addSql('ALTER TABLE childtag DROP CONSTRAINT FK_B8AAB0A8389B783'); + $this->addSql('ALTER TABLE childpin DROP CONSTRAINT FK_EA62AD822B35429'); + $this->addSql('ALTER TABLE childpin DROP CONSTRAINT FK_EA62AD8B5852DF3'); + $this->addSql('ALTER TABLE childheader DROP CONSTRAINT FK_B74CE6CEDD62C21B'); + $this->addSql('ALTER TABLE groupe DROP CONSTRAINT FK_4B98C217E3C61F9'); + $this->addSql('ALTER TABLE menuchild DROP CONSTRAINT FK_B7D9D47CCCD7E912'); + $this->addSql('ALTER TABLE menuchild DROP CONSTRAINT FK_B7D9D47CDAE07E97'); + $this->addSql('ALTER TABLE menuchild DROP CONSTRAINT FK_B7D9D47CC4663E4'); + $this->addSql('ALTER TABLE menuchild DROP CONSTRAINT FK_B7D9D47CA930CED1'); + $this->addSql('ALTER TABLE menuchild DROP CONSTRAINT FK_B7D9D47C53A99D0E'); + $this->addSql('ALTER TABLE niveau02 DROP CONSTRAINT FK_F4F52F9959FDD7AB'); + $this->addSql('ALTER TABLE niveau03 DROP CONSTRAINT FK_83F21F0F4B487845'); + $this->addSql('ALTER TABLE niveau04 DROP CONSTRAINT FK_1D968AACF3F41F20'); + $this->addSql('ALTER TABLE registration DROP CONSTRAINT FK_62A8A7A759FDD7AB'); + $this->addSql('ALTER TABLE registration DROP CONSTRAINT FK_62A8A7A74B487845'); + $this->addSql('ALTER TABLE registration DROP CONSTRAINT FK_62A8A7A7F3F41F20'); + $this->addSql('ALTER TABLE registration DROP CONSTRAINT FK_62A8A7A76E232799'); + $this->addSql('ALTER TABLE useraccount DROP CONSTRAINT FK_E157AA1A59FDD7AB'); + $this->addSql('ALTER TABLE useraccount DROP CONSTRAINT FK_E157AA1A4B487845'); + $this->addSql('ALTER TABLE useraccount DROP CONSTRAINT FK_E157AA1AF3F41F20'); + $this->addSql('ALTER TABLE useraccount DROP CONSTRAINT FK_E157AA1A6E232799'); + $this->addSql('ALTER TABLE usergroupe DROP CONSTRAINT FK_6C439BE5A76ED395'); + $this->addSql('ALTER TABLE usergroupe DROP CONSTRAINT FK_6C439BE5FE54D947'); + $this->addSql('ALTER TABLE usermodo DROP CONSTRAINT FK_D162D6C4A76ED395'); + $this->addSql('ALTER TABLE usermodo DROP CONSTRAINT FK_D162D6C459FDD7AB'); + $this->addSql('DROP TABLE Blog'); + $this->addSql('DROP TABLE Page'); + $this->addSql('DROP TABLE audit'); + $this->addSql('DROP TABLE blogtype'); + $this->addSql('DROP TABLE child'); + $this->addSql('DROP TABLE childtag'); + $this->addSql('DROP TABLE childpin'); + $this->addSql('DROP TABLE childheader'); + $this->addSql('DROP TABLE childtype'); + $this->addSql('DROP TABLE config'); + $this->addSql('DROP TABLE cron'); + $this->addSql('DROP TABLE groupe'); + $this->addSql('DROP TABLE menu'); + $this->addSql('DROP TABLE menuchild'); + $this->addSql('DROP TABLE niveau01'); + $this->addSql('DROP TABLE niveau02'); + $this->addSql('DROP TABLE niveau03'); + $this->addSql('DROP TABLE niveau04'); + $this->addSql('DROP TABLE pagetype'); + $this->addSql('DROP TABLE pin'); + $this->addSql('DROP TABLE registration'); + $this->addSql('DROP TABLE tag'); + $this->addSql('DROP TABLE useraccount'); + $this->addSql('DROP TABLE usergroupe'); + $this->addSql('DROP TABLE usermodo'); + $this->addSql('DROP TABLE whitelist'); + $this->addSql('DROP TABLE messenger_messages'); + } +} diff --git a/migrations/Version20230203164540.php b/migrations/Version20230203164540.php new file mode 100644 index 0000000..4c385ee --- /dev/null +++ b/migrations/Version20230203164540.php @@ -0,0 +1,32 @@ +addSql('ALTER TABLE child ADD roworder INT NOT NULL'); + } + + public function down(Schema $schema): void + { + // this down() migration is auto-generated, please modify it to your needs + $this->addSql('CREATE SCHEMA public'); + $this->addSql('ALTER TABLE child DROP roworder'); + } +} diff --git a/public/medias/header/body.jpg b/public/medias/header/body.jpg new file mode 100644 index 0000000000000000000000000000000000000000..1d46ae7969f9c8a17bd223bfd937700287ae248c GIT binary patch literal 257739 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

    -WcFG(+*NBXyF{HC-2#VOy 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

    dC8#3lBY_1MR5#Qf_ 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%0DPPo&HI+L%*;UWVo}vN(cEMIp>2 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 literal 0 HcmV?d00001 diff --git a/public/medias/logo/logo.png b/public/medias/logo/logo.png old mode 100755 new mode 100644 index db76093055bcd4b7e2f9fb368d162216628c540c..7a707471b5da0b0233f44ef31650b2e403e2cad8 GIT binary patch literal 5424 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::GENERATOR_TYPE_NONE); $metadata->setIdGenerator(new AssignedGenerator()); - $metadata = $this->em->getClassMetaData('App\Entity\Page'); - $metadata->setIdGeneratorType(ClassMetadata::GENERATOR_TYPE_NONE); - $metadata->setIdGenerator(new AssignedGenerator()); - - $metadata = $this->em->getClassMetaData('App\Entity\Pagecategory'); - $metadata->setIdGeneratorType(ClassMetadata::GENERATOR_TYPE_NONE); - $metadata->setIdGenerator(new AssignedGenerator()); - - $metadata = $this->em->getClassMetaData('App\Entity\Pagewidget'); - $metadata->setIdGeneratorType(ClassMetadata::GENERATOR_TYPE_NONE); - $metadata->setIdGenerator(new AssignedGenerator()); - - $metadata = $this->em->getClassMetaData('App\Entity\Widget'); + $metadata = $this->em->getClassMetaData('App\Entity\Menu'); $metadata->setIdGeneratorType(ClassMetadata::GENERATOR_TYPE_NONE); $metadata->setIdGenerator(new AssignedGenerator()); @@ -190,6 +176,21 @@ class InitCommand extends Command 'Description de votre site' ); + $this->insertConfig( + 10, // order + 'site', // category + 'appimage', // id + 'Image home de votre site', // title + '', // value + 'header/body.jpg', // default + 'image', // type, + true, // visible + true, // changeable + false, // required + '', // grouped + 'Image home de votre site' + ); + $this->insertConfig( 100, // order 'site', // category @@ -250,6 +251,21 @@ class InitCommand extends Command '', // grouped "La couleur de fond quand le site a besoin d'avoir une couleur de fond claire" ); + + $this->insertConfig( + 3, // order + 'colorbgbody', // category + 'colorbgbodyimportant', // id + 'Couleur de fond important', // title + '', // value + '#078eb5', // default + 'color', // type, + true, // visible + true, // changeable + false, // required + '', // grouped + "La couleur de fond quand le site a besoin d'avoir une couleur de fond important" + ); // colorfttitle = Couleur des fontes titre $this->insertConfig( @@ -497,413 +513,27 @@ class InitCommand extends Command } $this->em->flush(); - - // == ICON ================================================================================================================================================ - - $finder = new Finder(); - $finder->in('public/medias/icon/'); - $finder->name('icon_*'); - foreach ($finder as $file) { - $image = 'icon/'.$file->getRelativePathname(); - $icon = $this->em->getRepository('App\Entity\Icon')->findoneby(['label' => $image]); - if (!$icon) { - $icon = new Icon(); - $icon->setLabel($image); - $this->em->persist($icon); - } - } - $this->em->flush(); - - // == FILES ================================================================================================================================================ - - $finder = new Finder(); - $finder->in('public/medias/file/'); - $finder->name('*.png'); - $files = []; - foreach ($finder as $file) { - $path = $this->container->getParameter('appAlias').'medias/file/'.$file->getRelativePathname(); - $key = pathinfo($file, PATHINFO_FILENAME); - $files[$key] = $path; - } - - $this->filesystem->dumpFile($this->rootmedias.'/file/files.json', json_encode($files)); - - // == PAGECATEGORY ======================================================================================================================================== - - $entityPagecategory = $this->em->getRepository('App\Entity\Pagecategory')->find(1); - if (!$entityPagecategory) { - $entityPagecategory = new Pagecategory(); - $entityPagecategory->setId(1); - $entityPagecategory->setName('URL'); - $this->em->persist($entityPagecategory); - } - - $entityPagecategory = $this->em->getRepository('App\Entity\Pagecategory')->find(2); - if (!$entityPagecategory) { - $entityPagecategory = new Pagecategory(); - $entityPagecategory->setId(2); - $entityPagecategory->setName('Widget'); - $this->em->persist($entityPagecategory); - } - - $entityPagecategory = $this->em->getRepository('App\Entity\Pagecategory')->find(3); - if (!$entityPagecategory) { - $entityPagecategory = new Pagecategory(); - $entityPagecategory->setId(3); - $entityPagecategory->setName('Editeur'); - $this->em->persist($entityPagecategory); - } - - // == WIDGET ============================================================================================================================================== - // Widget Page web - $entityWidget = $this->em->getRepository('App\Entity\Widget')->find(-2000); - if (!$entityWidget) { - $entityWidget = new Widget(); - } - $entityicon = $this->em->getRepository('App\Entity\Icon')->findoneby(['label' => 'icon/icon_ribbon.png']); - $entityWidget->setId(-2000); - $entityWidget->setRoworder(0); - $entityWidget->setIcon($entityicon); - $entityWidget->setName('Page web'); - $entityWidget->setDescription("Affiche le contenu d'une page web"); - $entityWidget->setRouteview('app_admin_pagewidget_view_url'); - $entityWidget->setHeight('630'); - $entityWidget->setAutoajust(false); - $entityWidget->setBorder(true); - $entityWidget->setOpened(true); - $entityWidget->setViewheader(true); - $entityWidget->setAccess(['admin', 'all', 'group']); - $parameter = ['fields' => [['id' => 'url', 'loc' => 'col1', 'type' => 'string', 'label' => 'URL', 'value' => '', 'mandatory' => 'true']]]; - $entityWidget->setParameter($parameter); - $this->em->persist($entityWidget); - - // Widget Bureau - $entityWidget = $this->em->getRepository('App\Entity\Widget')->find(-1990); - if (!$entityWidget) { - $entityWidget = new Widget(); - } - $entityicon = $this->em->getRepository('App\Entity\Icon')->findoneby(['label' => 'icon/icon_computer.png']); - $entityWidget->setId(-1990); - $entityWidget->setRoworder(0); - $entityWidget->setIcon($entityicon); - $entityWidget->setName('Bureau'); - $entityWidget->setDescription('Affiche vos items de bureau'); - $entityWidget->setRouteview('app_admin_pagewidget_view_item'); - $entityWidget->setHeight('630'); - $entityWidget->setAutoajust(true); - $entityWidget->setBorder(false); - $entityWidget->setOpened(true); - $entityWidget->setViewheader(true); - $entityWidget->setAccess(['admin', 'all', 'group']); - $parameter = ['fields' => [['id' => 'modedesktop', 'loc' => 'col1', 'type' => 'desktopmode', 'label' => 'Mode Affichage', 'value' => '2', 'mandatory' => 'true'], ['id' => 'withbookmark', 'loc' => 'col1', 'type' => 'withbookmark', 'label' => 'Avec Favoris', 'value' => '0', 'mandatory' => 'true'], ['id' => 'itemcategory', 'loc' => 'col1', 'type' => 'itemcategory', 'label' => 'Catégorie Affichée', 'value' => '', 'mandatory' => 'false'], ['id' => 'search', 'loc' => 'col4', 'type' => 'boolean', 'label' => 'Zone de Recherche', 'value' => '0', 'mandatory' => 'true'], ['id' => 'menu', 'loc' => 'col4', 'type' => 'boolean', 'label' => 'Menu des Catégories', 'value' => '0', 'mandatory' => 'true'], ['id' => 'menuall', 'loc' => 'col4', 'type' => 'boolean', 'label' => 'Menu toutes les Catégories', 'value' => '1', 'mandatory' => 'true']]]; - $entityWidget->setParameter($parameter); - $this->em->persist($entityWidget); - - // Widget Bureau Essentiel - $entityWidget = $this->em->getRepository('App\Entity\Widget')->find(-1850); - if (!$entityWidget) { - $entityWidget = new Widget(); - } - $entityicon = $this->em->getRepository('App\Entity\Icon')->findoneby(['label' => 'icon/icon_computer.png']); - $entityWidget->setId(-1850); - $entityWidget->setRoworder(0); - $entityWidget->setIcon($entityicon); - $entityWidget->setName('Bureau Essentiel'); - $entityWidget->setDescription('Affiche les items de bureau essentiel'); - $entityWidget->setRouteview('app_admin_pagewidget_view_itemessential'); - $entityWidget->setHeight('630'); - $entityWidget->setAutoajust(true); - $entityWidget->setBorder(false); - $entityWidget->setOpened(true); - $entityWidget->setViewheader(true); - $entityWidget->setAccess(['admin', 'all', 'group']); - $parameter = ['fields' => [['id' => 'modedesktop', 'loc' => 'col1', 'type' => 'desktopmode', 'label' => 'Mode Affichage', 'value' => '2', 'mandatory' => 'true']]]; - $entityWidget->setParameter($parameter); - $this->em->persist($entityWidget); - - // Widget Liens - $entityWidget = $this->em->getRepository('App\Entity\Widget')->find(-1960); - if (!$entityWidget) { - $entityWidget = new Widget(); - } - $entityicon = $this->em->getRepository('App\Entity\Icon')->findoneby(['label' => 'icon/icon_star.png']); - $entityWidget->setId(-1960); - $entityWidget->setRoworder(0); - $entityWidget->setIcon($entityicon); - $entityWidget->setName('Liens'); - $entityWidget->setDescription('Bibliothèque de Liens'); - $entityWidget->setRouteview('app_admin_pagewidget_view_bookmark'); - $entityWidget->setHeight('630'); - $entityWidget->setAutoajust(true); - $entityWidget->setBorder(false); - $entityWidget->setOpened(true); - $entityWidget->setViewheader(true); - $entityWidget->setAccess(['admin', 'all', 'group']); - $parameter = ['fields' => [['id' => 'modedesktop', 'loc' => 'col1', 'type' => 'desktopmode', 'label' => 'Mode Affichage', 'value' => '2', 'mandatory' => 'true']]]; - $entityWidget->setParameter($parameter); - $this->em->persist($entityWidget); - - // Widget Lien - $entityWidget = $this->em->getRepository('App\Entity\Widget')->find(-1950); - if (!$entityWidget) { - $entityWidget = new Widget(); - } - $entityicon = $this->em->getRepository('App\Entity\Icon')->findoneby(['label' => 'icon/icon_bolt.png']); - $entityWidget->setId(-1950); - $entityWidget->setRoworder(0); - $entityWidget->setIcon($entityicon); - $entityWidget->setName('Lien'); - $entityWidget->setDescription("Création d'un Lien unique"); - $entityWidget->setRouteview('app_admin_pagewidget_view_link'); - $entityWidget->setHeight('200'); - $entityWidget->setAutoajust(true); - $entityWidget->setBorder(false); - $entityWidget->setOpened(true); - $entityWidget->setViewheader(false); - $entityWidget->setAccess(['admin', 'all', 'group']); - $parameter = ['fields' => [['id' => 'url', 'loc' => 'col1', 'type' => 'string', 'label' => 'URL', 'value' => '', 'mandatory' => 'true'], ['id' => 'target', 'loc' => 'col1', 'type' => 'target', 'label' => 'Ouvrir le lien dans', 'value' => '0', 'mandatory' => 'true']]]; - $entityWidget->setParameter($parameter); - $this->em->persist($entityWidget); - - // Widget Annonce - $entityWidget = $this->em->getRepository('App\Entity\Widget')->find(-1980); - if (!$entityWidget) { - $entityWidget = new Widget(); - } - $entityicon = $this->em->getRepository('App\Entity\Icon')->findoneby(['label' => 'icon/icon_megaphone.png']); - $entityWidget->setId(-1980); - $entityWidget->setRoworder(0); - $entityWidget->setIcon($entityicon); - $entityWidget->setName('Annonces'); - $entityWidget->setDescription('Affiche vos annonces'); - $entityWidget->setRouteview('app_admin_pagewidget_view_alert'); - $entityWidget->setHeight('630'); - $entityWidget->setAutoajust(true); - $entityWidget->setBorder(false); - $entityWidget->setOpened(true); - $entityWidget->setViewheader(false); - $entityWidget->setAccess(['admin', 'all', 'group']); - $parameter = ['fields' => [['id' => 'alertcategory', 'loc' => 'col1', 'type' => 'alertcategory', 'label' => 'Catégorie Affichée', 'value' => '', 'mandatory' => 'false']]]; - $entityWidget->setParameter($parameter); - $this->em->persist($entityWidget); - - // Widget Informations - $entityWidget = $this->em->getRepository('App\Entity\Widget')->find(-1860); - if (!$entityWidget) { - $entityWidget = new Widget(); - } - $entityicon = $this->em->getRepository('App\Entity\Icon')->findoneby(['label' => 'icon/icon_info.png']); - $entityWidget->setId(-1860); - $entityWidget->setRoworder(0); - $entityWidget->setIcon($entityicon); - $entityWidget->setName('Informations'); - $entityWidget->setDescription('Afficher les informations associées à la page'); - $entityWidget->setRouteview('app_admin_pagewidget_view_info'); - $entityWidget->setHeight('630'); - $entityWidget->setAutoajust(true); - $entityWidget->setBorder(true); - $entityWidget->setOpened(false); - $entityWidget->setViewheader(true); - $entityWidget->setViewheader(true); - $entityWidget->setColorheaderback('#5b5b5b'); - $entityWidget->setColorheaderfont('#ffffff'); - $entityWidget->setColorbodyback('#5b5b5b'); - $entityWidget->setColorbodyfont('#ffffff'); - $entityWidget->setAccess(['admin', 'all', 'group']); - $parameter = ['fields' => []]; - $entityWidget->setParameter($parameter); - $this->em->persist($entityWidget); - - // Widget Carrousel - $entityWidget = $this->em->getRepository('App\Entity\Widget')->find(-1930); - if (!$entityWidget) { - $entityWidget = new Widget(); - } - $entityicon = $this->em->getRepository('App\Entity\Icon')->findoneby(['label' => 'icon/icon_easel.png']); - $entityWidget->setId(-1930); - $entityWidget->setRoworder(0); - $entityWidget->setIcon($entityicon); - $entityWidget->setName('Carrousel'); - $entityWidget->setDescription("Carrousel d'images"); - $entityWidget->setRouteview('app_admin_pagewidget_view_slide'); - $entityWidget->setHeight('400'); - $entityWidget->setAutoajust(false); - $entityWidget->setBorder(false); - $entityWidget->setOpened(true); - $entityWidget->setViewheader(false); - $entityWidget->setColorheaderback('#5b5b5b'); - $entityWidget->setColorheaderfont('#ffffff'); - $entityWidget->setColorbodyback('#5b5b5b'); - $entityWidget->setColorbodyfont('#ffffff'); - $entityWidget->setAccess(['admin', 'all', 'group']); - $parameter = ['fields' => [['id' => 'interval', 'loc' => 'col1', 'type' => 'integer', 'label' => 'Interval en seconde entre 2 images', 'value' => '5', 'mandatory' => 'false']]]; - $entityWidget->setParameter($parameter); - $this->em->persist($entityWidget); - - // Widget File - $entityWidget = $this->em->getRepository('App\Entity\Widget')->find(-1920); - if (!$entityWidget) { - $entityWidget = new Widget(); - } - $entityicon = $this->em->getRepository('App\Entity\Icon')->findoneby(['label' => 'icon/icon_folder.png']); - $entityWidget->setId(-1920); - $entityWidget->setRoworder(0); - $entityWidget->setIcon($entityicon); - $entityWidget->setName('Fichiers'); - $entityWidget->setDescription('Répertoire de fichiers'); - $entityWidget->setRouteview('app_admin_pagewidget_view_file'); - $entityWidget->setHeight('630'); - $entityWidget->setAutoajust(true); - $entityWidget->setBorder(false); - $entityWidget->setOpened(true); - $entityWidget->setViewheader(true); - $entityWidget->setAccess(['admin', 'all', 'group']); - $parameter = ['fields' => [['id' => 'modelist', 'loc' => 'col1', 'type' => 'modelist', 'label' => 'Mode Affichage', 'value' => '0', 'mandatory' => 'true']]]; - $entityWidget->setParameter($parameter); - $this->em->persist($entityWidget); - - // Widget Galery - $entityWidget = $this->em->getRepository('App\Entity\Widget')->find(-1910); - if (!$entityWidget) { - $entityWidget = new Widget(); - } - $entityicon = $this->em->getRepository('App\Entity\Icon')->findoneby(['label' => 'icon/icon_image.png']); - $entityWidget->setId(-1910); - $entityWidget->setRoworder(0); - $entityWidget->setIcon($entityicon); - $entityWidget->setName('Galerie'); - $entityWidget->setDescription("Galerie d'images"); - $entityWidget->setRouteview('app_admin_pagewidget_view_galery'); - $entityWidget->setHeight('630'); - $entityWidget->setAutoajust(true); - $entityWidget->setBorder(false); - $entityWidget->setOpened(true); - $entityWidget->setViewheader(true); - $entityWidget->setAccess(['admin', 'all', 'group']); - $parameter = ['fields' => []]; - $entityWidget->setParameter($parameter); - $this->em->persist($entityWidget); - - // Widget Texte - $entityWidget = $this->em->getRepository('App\Entity\Widget')->find(-1940); - if (!$entityWidget) { - $entityWidget = new Widget(); - } - $entityicon = $this->em->getRepository('App\Entity\Icon')->findoneby(['label' => 'icon/icon_compose.png']); - $entityWidget->setId(-1940); - $entityWidget->setRoworder(0); - $entityWidget->setIcon($entityicon); - $entityWidget->setName('Texte'); - $entityWidget->setDescription('Votre propre texte à éditer'); - $entityWidget->setRouteview('app_admin_pagewidget_view_editor'); - $entityWidget->setHeight('630'); - $entityWidget->setAutoajust(true); - $entityWidget->setBorder(true); - $entityWidget->setViewheader(true); - $entityWidget->setOpened(true); - $entityWidget->setAccess(['admin', 'all', 'group']); - $parameter = ['fields' => [['id' => 'html', 'loc' => 'col5', 'type' => 'hidden', 'label' => 'Texte', 'value' => '', 'mandatory' => 'false']]]; - $entityWidget->setParameter($parameter); - $this->em->persist($entityWidget); - - $this->em->flush(); - - // == PAGETEMPALTE ======================================================================================================================================= - // Template app - $entityPage = $this->em->getRepository('App\Entity\Page')->find(-100); - if (!$entityPage) { - $entityPagecategory = $this->em->getRepository('App\Entity\Pagecategory')->find(2); - $entityGroup = $this->em->getRepository("App\Entity\Group")->find(-1); - - $entityPage = new Page(); - $entityPage->setId(-100); - $entityPage->setRowOrder(0); - $entityPage->setName('Applications'); - $entityPage->setParentfor('app'); - $entityPage->setMaxwidth(1000); - $entityPage->setPagecategory($entityPagecategory); - $entityPage->addGroup($entityGroup); - $entityPage->setTemplate('{"rows":[{"id":0,"cols":[{"id":0,"size": 12,"rows":[]}]}]}'); - - $this->em->persist($entityPage); - $this->em->flush(); - - $entityPagewidget = $this->em->getRepository('App\Entity\Pagewidget')->find(-110); - if (!$entityPagewidget) { - $entityWidget = $this->em->getRepository('App\Entity\Widget')->find(-1990); - - $entityPagewidget = new Pagewidget(); - $entityPagewidget->setId(-110); - $entityPagewidget->setLoc('R1C1'); - $entityPagewidget->setRoworder(0); - $entityPagewidget->setName('Applications'); - $entityPagewidget->setHeight($entityWidget->getHeight()); - $entityPagewidget->setAutoajust($entityWidget->isAutoajust()); - $entityPagewidget->setBorder($entityWidget->isBorder()); - $entityPagewidget->setOpened($entityWidget->isOpened()); - $entityPagewidget->setViewheader($entityWidget->isViewheader()); - $entityPagewidget->setIcon($entityWidget->getIcon()); - $entityPagewidget->setPage($entityPage); - $entityPagewidget->setWidget($entityWidget); - - $param['fields'] = ['fields' => [['id' => 'modedesktop', 'value' => 2], ['id' => 'withbookmark', 'value' => 0], ['id' => 'itemcategory', 'value' => null], ['id' => 'menu', 'value' => 1], ['id' => 'search', 'value' => 1], ['id' => 'menuall', 'value' => 1]]]; - $entityPagewidget->setParameter($param['fields']); - - $this->em->persist($entityPagewidget); - $this->em->flush(); - } - } - - // Template Group - $entityPage = $this->em->getRepository('App\Entity\Page')->find(-110); - if (!$entityPage) { - $entityPagecategory = $this->em->getRepository('App\Entity\Pagecategory')->find(2); - $entityPage = new Page(); - $entityPage->setId(-110); - $entityPage->setRowOrder(0); - $entityPage->setName('Groupe Template'); - $entityPage->setParentfor('group'); - $entityPage->setMaxwidth(0); - $entityPage->setPagecategory($entityPagecategory); - $entityPage->setTemplate('{"rows":[{"id":0,"cols":[{"id":0,"size": 3,"rows":[]},{"id":1,"size": 6,"rows":[{"id":0,"cols":[{"id":0,"size": 6},{"id":1,"size": 6}]}]},{"id":2,"size": 3,"rows":[]}]}]}'); - - $this->em->persist($entityPage); - $this->em->flush(); - - // Widget Nos Liens - /* - $fields = ['fields' => [['id' => 'modedesktop', 'value' => 2]]]; - $this->addWidget(-120, $entityPage, -1960, 'R1C2R1C1', 0, 'Nos Liens', true, $fields); - - // Widget Nos Fichiers - - $fields=["fields"=>[]]; - $this->addWidget(-130,$entityPage,-1920,"R1C2R1C2",0,"Nos Fichiers",true,$fields); - - // Widget Info Page - $fields=["fields"=>[]]; - $this->addWidget(-140,$entityPage,-1860,"R1C1",0,"Information Page",true,$fields); - - // Widget Tâche - $fields=["fields"=>[]]; - $this->addWidget(-145,$entityPage,-1800,"R1C1",1,"Taches du groupe",true,$fields); - - // Widget Notre Blog - $fields=["fields"=>[["id"=>"nbarticle","value"=>5]]]; - $this->addWidget(-150,$entityPage,-1890,"R1C2",0,"Notre Blog",false,$fields); - - // Widget Notre Calendrier - $fields=["fields"=>[["id"=>"nbday","value"=>30]]]; - $this->addWidget(-160,$entityPage,-1900,"R1C2R1C1",1,"Notre Calendrier",true,$fields); - - // Chat - $fields=["fields"=>[]]; - $this->addWidget(-170,$entityPage,-1840,"R1C3",0,"Chat",false,$fields); - */ - } - $output->writeln(''); + // == CHILDTYPE ============================================================================================================================================== + + // Création des childtypes + $this->insertChildtype(1, 'Articles', 1, 'app_child_submit', true, false, false, false); + + $this->insertChildtype(12, 'Images', 12, 'app_child_submit_image', false, true, false, false); + $this->insertChildtype(13, 'Embed Images', 13, 'app_child_submit', false, false, true, false); + $this->insertChildtype(14, 'Vidéos', 14, 'app_child_submit_video', false, true, false, false); + $this->insertChildtype(15, 'Embed Vidéos', 15, 'app_child_submit', false, false, true, false); + $this->insertChildtype(16, 'Ressources', 16, 'app_child_submit_file', true, true, false, false); + $this->insertChildtype(17, 'Embed Ressources', 17, 'app_child_submit', true, false, true, false); + + $this->insertChildtype(21, 'Liens Externes', 21, 'app_child_submit', false, false, true, false); + $this->insertChildtype(22, 'Bibliographies', 22, 'app_child_submit', false, false, true, false); + + // == MENU ============================================================================================================================================== + $this->insertMenu(-1, 'Entête'); + $this->insertMenu(-2, 'Accueil'); + return Command::SUCCESS; } @@ -933,6 +563,76 @@ class InitCommand extends Command $this->em->flush(); } + protected function insertChildtype($id, $name, $roworder, $submitroute, $havechildheader, $havefile, $haveurl, $havepin) + { + $entity = $this->em->getRepository("App\Entity\Childtype")->find($id); + if (!$entity) { + $entity = new Childtype(); + $entity->setId($id); + } + + $entity->setName($name); + $entity->setRoworder($roworder); + $entity->setSubmitroute($submitroute); + $entity->setHavechildheader($havechildheader); + $entity->setHavefile($havefile); + $entity->setHaveurl($haveurl); + $entity->setHavepin($havepin); + + $this->em->persist($entity); + $this->em->flush(); + } + + protected function insertChildattribut($id, $name, $label, $required, $type, $extra = []) + { + $entity = $this->em->getRepository("App\Entity\Childattribut")->find($id); + if (!$entity) { + $entity = new Childattribut(); + $entity->setId($id); + } + + $entity->setName($name); + $entity->setLabel($label); + $entity->setRequired($required); + $entity->setType($type); + $entity->setExtra($extra); + + $this->em->persist($entity); + $this->em->flush(); + } + + protected function insertChildtypeattribut($id, $name, $roworder) + { + $type = $this->em->getRepository("App\Entity\Childtype")->find($id); + $attribut = $this->em->getRepository("App\Entity\Childattribut")->findOneBy(['name' => $name]); + + $entity = $this->em->getRepository("App\Entity\Childtypeattribut")->findOneBy(['childtype' => $type, 'childattribut' => $attribut]); + if (!$entity) { + $entity = new Childtypeattribut(); + } + + $entity->setChildtype($type); + $entity->setChildattribut($attribut); + $entity->setRoworder($roworder); + + $this->em->persist($entity); + $this->em->flush(); + } + + private function insertMenu($id, $name) + { + $entity = $this->em->getRepository("App\Entity\Menu")->find($id); + if (!$entity) { + $entity = new Menu(); + $entity->setId($id); + } + + $entity->setName($name); + + $this->em->persist($entity); + $this->em->flush(); + } + private function writelnred($string) { $this->output->writeln(''.$string.''); diff --git a/src/Controller/AlertController.php b/src/Controller/AlertController.php deleted file mode 100644 index 57753fd..0000000 --- a/src/Controller/AlertController.php +++ /dev/null @@ -1,175 +0,0 @@ -getRepository($this->entity)->findBy([], ['rowOrder' => 'asc']); - $alertcategorys = $em->getRepository('App\Entity\Alertcategory')->findAll(); - $groups = $em->getRepository('App\Entity\Group')->findBy([], ['label' => 'asc']); - - return $this->render($this->twig.'list.html.twig', [ - 'useheader' => true, - 'usemenu' => false, - 'usesidebar' => true, - 'access' => $access, - $this->data.'s' => $alerts, - 'alertcategorys' => $alertcategorys, - 'groups' => $groups, - 'access' => $access, - ]); - } - - public function submit($access, Request $request, ManagerRegistry $em): Response - { - // Initialisation de l'enregistrement - $data = new Alert(); - - // Création du formulaire - $form = $this->createForm(AlertType::class, $data, ['mode' => 'submit', 'access' => $access]); - - // Récupération des data du formulaire - $form->handleRequest($request); - - // Sur validation - if ($form->get('submit')->isClicked() && $form->isValid()) { - $data = $form->getData(); - - // Sauvegarde - $em->getManager()->persist($data); - $em->getManager()->flush(); - - // Retour à la liste - return $this->redirectToRoute(str_replace('_admin_', '_'.$access.'_', $this->route)); - } - - // Affichage du formulaire - return $this->render($this->twig.'edit.html.twig', [ - 'useheader' => true, - 'usemenu' => false, - 'usesidebar' => true, - 'access' => $access, - $this->data => $data, - 'mode' => 'submit', - 'icons' => $em->getRepository('App\Entity\Icon')->findAll(), - 'form' => $form->createView(), - ]); - } - - public function update($id, $access, Request $request, ManagerRegistry $em): Response - { - // Initialisation de l'enregistrement - $data = $em->getRepository($this->entity)->find($id); - if (!$data) { - throw $this->createNotFoundException('Unable to find entity.'); - } - - // Création du formulaire - $form = $this->createForm(AlertType::class, $data, ['mode' => 'update', 'access' => $access]); - - // Récupération des data du formulaire - $form->handleRequest($request); - - // Sur validation - if ($form->get('submit')->isClicked() && $form->isValid()) { - $data = $form->getData(); - - // Si non masquable on s'assure qu'il n'y a pas de reader - if (!$data->getFghideable()) { - $readers = $data->getReaders(); - foreach ($readers as $reader) { - $data->removeReader($reader); - } - } - - // Sauvegarde - $em->getManager()->flush(); - - // Retour à la liste - return $this->redirectToRoute(str_replace('_admin_', '_'.$access.'_', $this->route)); - } - - // Affichage du formulaire - return $this->render($this->twig.'edit.html.twig', [ - 'useheader' => true, - 'usemenu' => false, - 'usesidebar' => true, - 'access' => $access, - $this->data => $data, - 'mode' => 'update', - 'form' => $form->createView(), - ]); - } - - public function delete($id, $access, Request $request, ManagerRegistry $em): Response - { - // Initialisation de l'enregistrement - $data = $em->getRepository($this->entity)->find($id); - if (!$data) { - throw $this->createNotFoundException('Unable to find entity.'); - } - - // Tentative de suppression - try { - $em->getManager()->remove($data); - $em->getManager()->flush(); - } catch (\Exception $e) { - $request->getSession()->getFlashBag()->add('error', $e->getMessage()); - - return $this->redirectToRoute(str_replace('_admin_', '_'.$access.'_', $this->route).'_update', ['id' => $id]); - } - - return $this->redirectToRoute(str_replace('_admin_', '_'.$access.'_', $this->route)); - } - - public function order($access, Request $request, ManagerRegistry $em): Response - { - $output = []; - $id = $request->request->get('id'); - $order = $request->request->get('order'); - - $data = $em->getRepository($this->entity)->find($id); - if (!$data) { - throw $this->createNotFoundException('Unable to find entity.'); - } - - $data->setRoworder($order); - $em->getManager()->flush(); - - return new JsonResponse($output); - } - - public function read($access, Request $request, ManagerRegistry $em): Response - { - $output = []; - $id = $request->request->get('id'); - - // Initialisation de l'enregistrement - $data = $em->getRepository($this->entity)->find($id); - if (!$data) { - throw $this->createNotFoundException('Unable to find entity.'); - } - - if (!$data->getReaders()->contains($this->getUser())) { - $data->addReader($this->getUser()); - $em->getManager()->flush(); - } - - return new JsonResponse($output); - } -} diff --git a/src/Controller/AlertcategoryController.php b/src/Controller/AlertcategoryController.php deleted file mode 100644 index eead12b..0000000 --- a/src/Controller/AlertcategoryController.php +++ /dev/null @@ -1,124 +0,0 @@ -createForm(AlertcategoryType::class, $data, ['mode' => 'submit', 'access' => $access]); - - // Récupération des data du formulaire - $form->handleRequest($request); - - // Sur validation - if ($form->get('submit')->isClicked() && $form->isValid()) { - $data = $form->getData(); - - $idicon = $form->get('idicon')->getData(); - $icon = $em->getRepository('App\Entity\Icon')->findoneby(['id' => $idicon]); - $data->setIcon($icon); - - // Sauvegarde - $em->getManager()->persist($data); - $em->getManager()->flush(); - - // Retour à la liste - return $this->redirectToRoute(str_replace('_admin_', '_'.$access.'_', 'app_admin_alert')); - } - - // Affichage du formulaire - return $this->render($this->twig.'edit.html.twig', [ - 'useheader' => true, - 'usemenu' => false, - 'usesidebar' => true, - 'access' => $access, - $this->data => $data, - 'mode' => 'submit', - 'icons' => $em->getRepository('App\Entity\Icon')->findAll(), - 'form' => $form->createView(), - ]); - } - - public function update($id, $access, Request $request, ManagerRegistry $em): Response - { - // Initialisation de l'enregistrement - $data = $em->getRepository($this->entity)->find($id); - if (!$data) { - throw $this->createNotFoundException('Unable to find entity.'); - } - - // Création du formulaire - $form = $this->createForm(AlertcategoryType::class, $data, [ - 'mode' => 'update', - 'idicon' => ($data->getIcon() ? $data->getIcon()->getId() : null), - ]); - - // Récupération des data du formulaire - $form->handleRequest($request); - - // Sur validation - if ($form->get('submit')->isClicked() && $form->isValid()) { - $data = $form->getData(); - - $idicon = $form->get('idicon')->getData(); - $icon = $em->getRepository('App\Entity\Icon')->findoneby(['id' => $idicon]); - $data->setIcon($icon); - - // Sauvegarde - $em->getManager()->flush(); - - // Retour à la liste - return $this->redirectToRoute(str_replace('_admin_', '_'.$access.'_', 'app_admin_alert')); - } - - // Affichage du formulaire - return $this->render($this->twig.'edit.html.twig', [ - 'useheader' => true, - 'usemenu' => false, - 'usesidebar' => true, - 'access' => $access, - $this->data => $data, - 'mode' => 'update', - 'icons' => $em->getRepository('App\Entity\Icon')->findAll(), - 'form' => $form->createView(), - ]); - } - - public function delete($id, $access, Request $request, ManagerRegistry $em): Response - { - // Initialisation de l'enregistrement - $data = $em->getRepository($this->entity)->find($id); - if (!$data) { - throw $this->createNotFoundException('Unable to find entity.'); - } - - // Tentative de suppression - try { - $em->getManager()->remove($data); - $em->getManager()->flush(); - } catch (\Exception $e) { - $request->getSession()->getFlashBag()->add('error', $e->getMessage()); - - return $this->redirectToRoute($this->route.'_update', ['id' => $id]); - } - - return $this->redirectToRoute(str_replace('_admin_', '_'.$access.'_', 'app_admin_alert')); - } -} diff --git a/src/Controller/BlogController.php b/src/Controller/BlogController.php new file mode 100644 index 0000000..813f110 --- /dev/null +++ b/src/Controller/BlogController.php @@ -0,0 +1,175 @@ +getRepository($this->entity)->findAll(); + + return $this->render($this->render.'list.html.twig', [ + $this->data.'s' => $datas, + 'useheader' => true, + 'usesidebar' => true, + ]); + } + + public function submit(Request $request, ManagerRegistry $em) + { + // Initialisation de l'enregistrement + $data = new Entity(); + + // Création du formulaire + $form = $this->createForm(Form::class, $data, ['mode' => 'submit']); + + // Récupération des data du formulaire + $form->handleRequest($request); + + // Sur erreur + $this->getErrorForm(null, $form, $request, $data, 'submit'); + + // Sur validation + if ($form->get('submit')->isClicked() && $form->isValid()) { + $data = $form->getData(); + + $em->getManager()->persist($data); + $em->getManager()->flush(); + + // Retour à la liste + return $this->redirectToRoute('app_child', ['catparent' => 'blog', 'idparent' => $data->getId()]); + } + + // Affichage du formulaire + return $this->render($this->render.'edit.html.twig', [ + 'useheader' => true, + 'usesidebar' => true, + $this->data => $data, + 'mode' => 'submit', + 'form' => $form->createView(), + 'from' => 'blog', + ]); + } + + public function update($id, Request $request, ManagerRegistry $em) + { + // Initialisation de l'enregistrement + $data = $em->getRepository($this->entity)->find($id); + $from = $request->get('from'); + + // Création du formulaire + $form = $this->createForm(Form::class, $data, ['mode' => 'update']); + + // Récupération des data du formulaire + $form->handleRequest($request); + + // Sur erreur + $this->getErrorForm(null, $form, $request, $data, 'update'); + + // Sur validation + if ($form->get('submit')->isClicked() && $form->isValid()) { + $data = $form->getData(); + $em->getManager()->flush(); + + // Retour à la liste + if ('child' == $from) { + return $this->redirectToRoute('app_child', ['catparent' => 'blog', 'idparent' => $data->getId()]); + } else { + return $this->redirectToRoute($this->route); + } + } + + // Affichage du formulaire + return $this->render($this->render.'edit.html.twig', [ + 'useheader' => true, + 'usesidebar' => true, + $this->data => $data, + 'mode' => 'update', + 'form' => $form->createView(), + 'from' => $from, + ]); + } + + public function delete($id, Request $request, ManagerRegistry $em) + { + // Initialisation de l'enregistrement + $data = $em->getRepository($this->entity)->find($id); + + try { + $em->getManager()->remove($data); + $em->getManager()->flush(); + } catch (\Exception $e) { + $request->getSession()->getFlashBag()->add('error', $e->getMessage()); + + return $this->redirectToRoute($this->route.'_update', ['id' => $id]); + } + + return $this->redirectToRoute($this->route); + } + + public function home(ManagerRegistry $em) + { + $heros = $em->getRepository("App\Entity\Child")->findHeads('blog'); + $blogs = $em->getRepository($this->entity)->findBy([], ['submitdate' => 'DESC']); + + return $this->render($this->render.'home.html.twig', [ + 'useheader' => true, + 'usesidebar' => false, + 'heros' => $heros, + 'blogs' => $blogs, + ]); + } + + public function select(Request $request, ManagerRegistry $em) + { + $output = []; + $page_limit = $request->query->get('page_limit'); + $q = $request->query->get('q'); + + $qb = $em->getManager()->createQueryBuilder(); + $qb->select('table')->from($this->entity, 'table') + ->where('table.name LIKE :value') + ->setParameter('value', '%'.$q.'%') + ->orderBy('table.name'); + + $datas = $qb->setFirstResult(0)->setMaxResults($page_limit)->getQuery()->getResult(); + foreach ($datas as $data) { + array_push($output, ['id' => $data->getId(), 'text' => $data->getName()]); + } + + $ret_string['results'] = $output; + + return new JsonResponse($ret_string); + } + + protected function getErrorForm($id, $form, $request, $data, $mode) + { + if ($form->get('submit')->isClicked() && 'delete' == $mode) { + } + + if ($form->get('submit')->isClicked() && ('submit' == $mode || 'update' == $mode)) { + } + + if ($form->get('submit')->isClicked() && !$form->isValid()) { + $this->get('session')->getFlashBag()->clear(); + + $errors = $form->getErrors(); + foreach ($errors as $error) { + $request->getSession()->getFlashBag()->add('error', $error->getMessage()); + } + } + } +} diff --git a/src/Controller/BlogtypeController.php b/src/Controller/BlogtypeController.php new file mode 100644 index 0000000..8b8e972 --- /dev/null +++ b/src/Controller/BlogtypeController.php @@ -0,0 +1,172 @@ +getRepository($this->entity)->find($id); + + return $this->render($this->render.'home.html.twig', [ + 'useheader' => false, + 'usemenu' => true, + 'usesidebar' => false, + $this->data => $data, + ]); + } + + public function list(ManagerRegistry $em) + { + // Récupérer les blogtypes + $datas = $em->getRepository($this->entity)->findAll(); + + return $this->render($this->render.'list.html.twig', [ + $this->data.'s' => $datas, + 'useheader' => true, + 'usesidebar' => true, + ]); + } + + public function submit(Request $request, ManagerRegistry $em) + { + // Initialisation de l'enregistrement + $data = new Entity(); + + // Création du formulaire + $form = $this->createForm(Form::class, $data, ['mode' => 'submit']); + + // Récupération des data du formulaire + $form->handleRequest($request); + + // Sur erreur + $this->getErrorForm(null, $form, $request, $data, 'submit'); + + // Sur validation + if ($form->get('submit')->isClicked() && $form->isValid()) { + $data = $form->getData(); + + $em->getManager()->persist($data); + $em->getManager()->flush(); + + // Retour à la liste + return $this->redirectToRoute($this->route); + } + + // Affichage du formulaire + return $this->render($this->render.'edit.html.twig', [ + 'useheader' => true, + 'usesidebar' => true, + $this->data => $data, + 'mode' => 'submit', + 'form' => $form->createView(), + ]); + } + + public function update($id, Request $request, ManagerRegistry $em) + { + // Initialisation de l'enregistrement + $data = $em->getRepository($this->entity)->find($id); + + // Création du formulaire + $form = $this->createForm(Form::class, $data, ['mode' => 'update']); + + // Récupération des data du formulaire + $form->handleRequest($request); + + // Sur erreur + $this->getErrorForm(null, $form, $request, $data, 'update'); + + // Sur validation + if ($form->get('submit')->isClicked() && $form->isValid()) { + $data = $form->getData(); + $em->getManager()->flush(); + + // Retour à la liste + return $this->redirectToRoute($this->route); + } + + // Affichage du formulaire + return $this->render($this->render.'edit.html.twig', [ + 'useheader' => true, + 'usesidebar' => true, + $this->data => $data, + 'mode' => 'update', + 'form' => $form->createView(), + ]); + } + + public function delete($id, Request $request, ManagerRegistry $em) + { + // Initialisation de l'enregistrement + $data = $em->getRepository($this->entity)->find($id); + + try { + $em->getManager()->remove($data); + $em->getManager()->flush(); + } catch (\Exception $e) { + $request->getSession()->getFlashBag()->add('error', $e->getMessage()); + + return $this->redirectToRoute($this->route.'_update', ['id' => $id]); + } + + return $this->redirectToRoute($this->route); + } + + public function upload() + { + return $this->render($this->render.'upload.html.twig'); + } + + public function select(Request $request, ManagerRegistry $em) + { + $output = []; + $page_limit = $request->query->get('page_limit'); + $q = $request->query->get('q'); + + $qb = $em->getManager()->createQueryBuilder(); + $qb->select('table')->from($this->entity, 'table') + ->where('table.name LIKE :value') + ->setParameter('value', '%'.$q.'%') + ->orderBy('table.name'); + + $datas = $qb->setFirstResult(0)->setMaxResults($page_limit)->getQuery()->getResult(); + foreach ($datas as $data) { + array_push($output, ['id' => $data->getId(), 'text' => $data->getName()]); + } + + $ret_string['results'] = $output; + + return new JsonResponse($ret_string); + } + + protected function getErrorForm($id, $form, $request, $data, $mode) + { + if ($form->get('submit')->isClicked() && 'delete' == $mode) { + } + + if ($form->get('submit')->isClicked() && 'submit' == $mode) { + } + + if ($form->get('submit')->isClicked() && !$form->isValid()) { + $this->get('session')->getFlashBag()->clear(); + + $errors = $form->getErrors(); + foreach ($errors as $error) { + $request->getSession()->getFlashBag()->add('error', $error->getMessage()); + } + } + } +} diff --git a/src/Controller/BookmarkController.php b/src/Controller/BookmarkController.php deleted file mode 100644 index ee9e300..0000000 --- a/src/Controller/BookmarkController.php +++ /dev/null @@ -1,236 +0,0 @@ -query->get('usage'); - - // Initialisation de l'enregistrement - $data = new Bookmark(); - - $pagewidget = null; - if ('false' == $touser) { - // On s'assure que le widget existe - $pagewidget = $em->getRepository("App\Entity\Pagewidget")->find($idwidget); - if (!$pagewidget) { - throw $this->createNotFoundException('Unable to find entity.'); - } - - // Vérifier que l'on peut générer un pagewidgetslide - if ('all' == $access) { - if (!$em->getRepository("App\Entity\Pagewidget")->getCanadd($this->getUser(), $pagewidget, $usage)) { - throw $this->createAccessDeniedException('Permission denied'); - } - } - } - - // Création du formulaire - $form = $this->createForm(BookmarkType::class, $data, ['mode' => 'submit']); - - // Récupération des data du formulaire - $form->handleRequest($request); - - // Sur validation - if ($form->get('submit')->isClicked() && $form->isValid()) { - $data = $form->getData(); - - // Bookmark widget ou desktop - if ('true' == $touser) { - $data->setUser($this->getUser()); - } else { - $data->setPagewidget($pagewidget); - } - - // Icon - $idicon = $form->get('idicon')->getData(); - $icon = $em->getRepository('App\Entity\Icon')->findoneby(['id' => $idicon]); - $data->setIcon($icon); - - // Sauvegarde - $em->getManager()->persist($data); - $em->getManager()->flush(); - - // Retour à la page - return $this->redirect($this->generateUrl('app_'.$access.'_page_'.$usage.'_view', ['id' => $idpage])); - } - - $icons = $em->getRepository('App\Entity\Icon')->findBy(['user' => null]); - $iconsuser = null; - if ('all' == $access) { - $iconsuser = $em->getRepository('App\Entity\Icon')->findBy(['user' => $this->getUser()]); - } - - return $this->render($this->twig.'edit.html.twig', [ - 'useheader' => ('admin' == $access), - 'usemenu' => false, - 'usesidebar' => ('admin' == $access), - 'entity' => $data, - 'icons' => $icons, - 'iconsuser' => $iconsuser, - 'mode' => 'submit', - 'access' => $access, - 'idpage' => $idpage, - 'idwidget' => $idwidget, - 'touser' => $touser, - 'form' => $form->createView(), - 'usage' => $usage, - ]); - } - - public function update($id, $access, $idpage, $idwidget, $touser, Request $request, ManagerRegistry $em): Response - { - $usage = $request->query->get('usage'); - - // Récupération de l'enregistrement courant - $data = $em->getRepository($this->entity)->find($id); - if (!$data) { - throw $this->createNotFoundException('Unable to find entity.'); - } - - if ('false' == $touser) { - // On s'assure que le widget existe - $pagewidget = $em->getRepository("App\Entity\Pagewidget")->find($idwidget); - if (!$pagewidget) { - throw $this->createNotFoundException('Unable to find entity.'); - } - - // Vérifier que l'on peut générer un pagewidgetslide - if ('all' == $access) { - if (!$em->getRepository("App\Entity\Pagewidget")->getCanadd($this->getUser(), $pagewidget, $usage)) { - throw $this->createAccessDeniedException('Permission denied'); - } - } - } - - // Création du formulaire - $form = $this->createForm(BookmarkType::class, $data, [ - 'mode' => 'update', - 'idicon' => ($data->getIcon() ? $data->getIcon()->getId() : null), - ]); - - // Récupération des data du formulaire - $form->handleRequest($request); - - // Sur validation - if ($form->get('submit')->isClicked() && $form->isValid()) { - $data = $form->getData(); - - // Icon - $idicon = $form->get('idicon')->getData(); - $icon = $em->getRepository('App\Entity\Icon')->findoneby(['id' => $idicon]); - $data->setIcon($icon); - - // Sauvegarde - $em->getManager()->flush(); - - // Retour à la page - return $this->redirect($this->generateUrl('app_'.$access.'_page_'.$usage.'_view', ['id' => $idpage])); - } - - $icons = $em->getRepository('App\Entity\Icon')->findBy(['user' => null]); - $iconsuser = null; - if ('all' == $access) { - $iconsuser = $em->getRepository('App\Entity\Icon')->findBy(['user' => $this->getUser()]); - } - - // Affichage du formulaire - return $this->render($this->twig.'edit.html.twig', [ - 'useheader' => ('admin' == $access), - 'usemenu' => false, - 'usesidebar' => ('admin' == $access), - 'entity' => $data, - 'icons' => $icons, - 'iconsuser' => $iconsuser, - 'mode' => 'update', - 'access' => $access, - 'idpage' => $idpage, - 'idwidget' => $idwidget, - 'touser' => $touser, - 'form' => $form->createView(), - 'usage' => $usage, - ]); - } - - public function delete($id, $access, $idpage, $idwidget, $touser, Request $request, ManagerRegistry $em): Response - { - $usage = $request->query->get('usage'); - - // Récupération de l'enregistrement courant - $data = $em->getRepository($this->entity)->find($id); - if (!$data) { - throw $this->createNotFoundException('Unable to find entity.'); - } - - if ('false' == $touser) { - // On s'assure que le widget existe - $pagewidget = $em->getRepository("App\Entity\Pagewidget")->find($idwidget); - if (!$pagewidget) { - throw $this->createNotFoundException('Unable to find entity.'); - } - - // Vérifier que l'on peut générer un pagewidgetslide - if ('all' == $access) { - if (!$em->getRepository("App\Entity\Pagewidget")->getCanadd($this->getUser(), $pagewidget, $usage)) { - throw $this->createAccessDeniedException('Permission denied'); - } - } - } - - // Supprimer la donnée - $em->getManager()->remove($data); - $em->getManager()->flush(); - - // Retour à la page - return $this->redirect($this->generateUrl('app_'.$access.'_page_'.$usage.'_view', ['id' => $idpage])); - } - - public function heart(Request $request, ManagerRegistry $em): Response - { - $output = []; - $iditem = $request->request->get('iditem'); - - // On s'assure que l'item existe - $item = $em->getRepository("App\Entity\Item")->find($iditem); - if (!$item) { - throw $this->createNotFoundException('Unable to find entity.'); - } - - // On s'assure que l'item n'existe pas déjà dans les bookmark de l'utilisateur - $user = $this->getUser(); - $bookmark = $em->getRepository($this->entity)->findOneBy(['user' => $user, 'item' => $item]); - if (!$bookmark) { - $bookmark = new Bookmark(); - $bookmark->setTitle($item->getTitle()); - $bookmark->setSubtitle($item->getSubtitle()); - $bookmark->setUrl($item->getUrl()); - $bookmark->setIcon($item->getIcon()); - $bookmark->setColor($item->getColor()); - $bookmark->setTarget($item->getTarget()); - $bookmark->setItem($item); - $bookmark->setUser($user); - - $em->getManager()->persist($bookmark); - $em->getManager()->flush(); - } - - $output = $bookmark->getId(); - - return new JsonResponse($output); - } -} diff --git a/src/Controller/ChildController.php b/src/Controller/ChildController.php new file mode 100644 index 0000000..d56f4f3 --- /dev/null +++ b/src/Controller/ChildController.php @@ -0,0 +1,829 @@ +appKernel = $appKernel; + $this->tool = $tool; + } + + public function search(Request $request, ManagerRegistry $em) + { + $alpha = $request->get('alpha'); + $query = $request->get('query'); + $catparents = ($request->get('catparents') ? explode(',', $request->get('catparents')) : null); + $childtypes = ($request->get('childtypes') ? $request->get('childtypes') : '1'); + $tags = ($request->get('tags') ? $request->get('tags') : null); + $first = ($request->get('first') ? $request->get('first') : 1); + $maxresult = 50; + $nopagination = in_array(30, explode(',', $childtypes)); + // $nopagination = true; + + if (!$catparents) { + $catparents = ['map']; + } + if (!$alpha) { + $alpha = 'a'; + } + + $childmaps = []; + $childblogs = []; + $childpages = []; + + foreach ($catparents as $catparent) { + switch ($catparent) { + case 'blog': + $q = $em->createQueryBuilder(); + $q->select('child'); + $q->from("App\Entity\Blog", 'parent'); + $q->from("App\Entity\Childblog", 'relation'); + $q->from('App:Child', 'child'); + $q->from("App\Entity\Childtype", 'childtype'); + $q->andwhere('parent=relation.blog'); + $q->andwhere('relation.child=child'); + $q->andwhere('child.childtype=childtype'); + + // Si childtype = photoaerienn = filtre alpha + if (!$query && in_array(30, explode(',', $childtypes))) { + $q->andWhere('parent.name LIKE :alpha OR parent.name LIKE :alphaupper'); + $q->setParameter('alpha', $alpha.'%'); + $q->setParameter('alphaupper', strtoupper($alpha).'%'); + } + + // Si filtre par childtype + if ($childtypes) { + $q->andWhere('childtype.id IN(:childtypes)'); + $q->setParameter('childtypes', explode(',', $childtypes)); + } + + // Si filtre par query + if ($query) { + $q->andWhere('LOWER(child.name) LIKE :query OR LOWER(child.subname) LIKE :query'); + $q->setParameter('query', strtolower('%'.$query.'%')); + } + + // Si filtre par tags + if ($tags) { + $q->from('App:Tag', 'tag'); + $q->andWhere('tag.id IN(:tags)'); + $q->andWhere('tag MEMBER OF child.tags'); + $q->setParameter('tags', explode(',', $tags)); + } + + $c = $q; + $c->select('count(child.id)'); + $count = $c->getQuery()->getSingleScalarResult(); + + $q->select('child'); + $q->addOrderBy('parent.name', 'ASC'); + $q->addOrderBy('relation.roworder', 'ASC'); + if (!$nopagination) { + $q->setMaxResults($maxresult); + $q->setFirstResult(0 + (($first - 1) * $maxresult)); + } + + $childblogs = $q->getQuery()->getResult(); + + foreach ($childblogs as $relation) { + $relation->setCatparent('blog'); + $relation->setIdparent($relation->getChildblogs()[0]->getBlog()->getId()); + $relation->setNameparent($relation->getChildblogs()[0]->getBlog()->getName()); + } + break; + + case 'page': + $q = $em->createQueryBuilder(); + $q->select('child'); + $q->from("App\Entity\Page", 'parent'); + $q->from("App\Entity\Childpage", 'relation'); + $q->from('App:Child', 'child'); + $q->from("App\Entity\Childtype", 'childtype'); + $q->andwhere('parent=relation.page'); + $q->andwhere('relation.child=child'); + $q->andwhere('child.childtype=childtype'); + + // Si childtype = photoaerienn = filtre alpha + if (!$query && in_array(30, explode(',', $childtypes))) { + $q->andWhere('parent.name LIKE :alpha OR parent.name LIKE :alphaupper'); + $q->setParameter('alpha', $alpha.'%'); + $q->setParameter('alphaupper', strtoupper($alpha).'%'); + } + + // Si filtre par childtype + if ($childtypes) { + $q->andWhere('childtype.id IN(:childtypes)'); + $q->setParameter('childtypes', explode(',', $childtypes)); + } + + // Si filtre par query + if ($query) { + $q->andWhere('LOWER(child.name) LIKE :query OR LOWER(child.subname) LIKE :query'); + $q->setParameter('query', strtolower('%'.$query.'%')); + } + + // Si filtre par tags + if ($tags) { + $q->from('App:Tag', 'tag'); + $q->andWhere('tag.id IN(:tags)'); + $q->andWhere('tag MEMBER OF child.tags'); + $q->setParameter('tags', explode(',', $tags)); + } + + $c = $q; + $c->select('count(child.id)'); + $count = $c->getQuery()->getSingleScalarResult(); + + $q->select('child'); + $q->addOrderBy('parent.name', 'ASC'); + $q->addOrderBy('relation.roworder', 'ASC'); + if (!$nopagination) { + $q->setMaxResults($maxresult); + $q->setFirstResult(0 + (($first - 1) * $maxresult)); + } + + $childpages = $q->getQuery()->getResult(); + foreach ($childpages as $relation) { + $relation->setCatparent('page'); + $relation->setIdparent($relation->getChildpages()[0]->getPage()->getId()); + $relation->setNameparent($relation->getChildpages()[0]->getPage()->getName()); + } + break; + } + } + + $childs = array_merge($childmaps, $childblogs, $childpages); + + return $this->render($this->render.'search.html.twig', [ + 'childs' => $childs, + 'catparents' => $catparents, + 'lsttags' => $em->getRepository('App:Tag')->findAll(), + 'lsttypes' => $em->getRepository("App\Entity\Childtype")->findAll(), + 'tags' => explode(',', $tags), + 'query' => $query, + 'childtypes' => $childtypes, + 'isalpha' => (!$query && in_array(30, explode(',', $childtypes))), + 'useheader' => true, + 'usesidebar' => false, + 'maxwidth' => true, + 'nopagination' => $nopagination, + 'count' => $count, + 'first' => $first, + 'maxresult' => $maxresult, + ]); + } + + public function list($catparent, $idparent, ManagerRegistry $em) + { + // En fonction du parent + switch ($catparent) { + case 'blog': + $parent = $em->getRepository("App\Entity\Blog")->find($idparent); + if (!$parent) { + throw $this->createNotFoundException('Not exist'); + } + + // Récupérer les childtypes + $childtypes = $em->getRepository("App\Entity\Childtype")->findBy([], ['roworder' => 'ASC']); + + // Récupérer les childs + $datas = $em->getRepository($this->entity)->findBy(["blog"=>$parent]); + break; + + case 'page': + $parent = $em->getRepository("App\Entity\Page")->find($idparent); + if (!$parent) { + throw $this->createNotFoundException('Not exist'); + } + + // Récupérer les childtypes + $childtypes = $em->getRepository("App\Entity\Childtype")->findBy([], ['roworder' => 'ASC']); + + // Récupérer les childs + $datas = $em->getRepository($this->entity)->findBy(["page"=>$parent]); + break; + } + + return $this->render($this->render.'list.html.twig', [ + 'catparent' => $catparent, + 'parent' => $parent, + 'childtypes' => $childtypes, + $this->data.'s' => $datas, + 'useheader' => true, + 'usesidebar' => true, + ]); + } + + public function submit($catparent, $idparent, $idchildtype, Request $request, ManagerRegistry $em) + { + // Récupérer le parent + switch ($catparent) { + case 'blog': + $parent = $em->getRepository("App\Entity\Blog")->find($idparent); + if (!$parent) { + throw $this->createNotFoundException('Not exist'); + } + break; + + case 'page': + $parent = $em->getRepository("App\Entity\Page")->find($idparent); + if (!$parent) { + throw $this->createNotFoundException('Not exist'); + } + break; + } + + // Récupérer du childtype + $childtype = $em->getRepository("App\Entity\Childtype")->find($idchildtype); + if (!$childtype) { + throw $this->createNotFoundException('Not exist'); + } + + // Redirige vers la submitroute + if ('app_child_submit' != $childtype->getSubmitroute()) { + return $this->redirectToRoute($childtype->getSubmitroute(), ['catparent' => $catparent, 'idparent' => $parent->getId(), 'idchildtype' => $idchildtype]); + } + + // Récupérer le roworder + switch ($catparent) { + case 'blog': + $last = $em->getRepository("App\Entity\Child")->findOneBy(['blog' => $parent], ['roworder' => 'DESC']); + $lastorder = ($last ? $last->getRoworder() + 1 : 1); + + // Initialisation de l'enregistrement + $data = new Entity(); + $data->setChildtype($childtype); + $data->setBlog($parent); + $data->setRoworder($lastorder); + if (1 == $childtype->getId()) { + $data->setName($parent->getName()); + } + break; + + case 'page': + $last = $em->getRepository("App\Entity\Child")->findOneBy(['page' => $parent], ['roworder' => 'DESC']); + $lastorder = ($last ? $last->getRoworder() + 1 : 1); + + // Initialisation de l'enregistrement + $data = new Entity(); + $data->setChildtype($childtype); + $data->setPage($parent); + $data->setRoworder($lastorder); + if (1 == $childtype->getId()) { + $data->setName($parent->getName()); + } + break; + } + + // Création du formulaire + $form = $this->createForm(Form::class, $data, ['mode' => 'submit', 'childtype' => $childtype]); + + // Récupération des data du formulaire + $form->handleRequest($request); + + // Sur erreur + $this->getErrorForm(null, $form, $request, $data, 'submit'); + + // Sur validation + if ($form->get('submit')->isClicked() && $form->isValid()) { + $data = $form->getData(); + $data->setUrl($this->formatEmbed($data->getUrl())); + + $em->getManager()->persist($data); + $em->getManager()->flush(); + + // Retour à la liste + return $this->redirectToRoute($this->route, ['catparent' => $catparent, 'idparent' => $parent->getId()]); + } + + // Affichage du formulaire + return $this->render($this->render.'edit.html.twig', [ + 'useheader' => true, + 'usesidebar' => true, + 'catparent' => $catparent, + 'parent' => $parent, + 'childtype' => $childtype, + $this->data => $data, + 'mode' => 'submit', + 'form' => $form->createView(), + ]); + } + + public function submitimage($catparent, $idparent, $idchildtype, Request $request, ManagerRegistry $em) + { + // Récupérer le parent + switch ($catparent) { + case 'blog': + $parent = $em->getRepository("App\Entity\Blog")->find($idparent); + if (!$parent) { + throw $this->createNotFoundException('Not exist'); + } + break; + + case 'page': + $parent = $em->getRepository("App\Entity\Page")->find($idparent); + if (!$parent) { + throw $this->createNotFoundException('Not exist'); + } + break; + } + + // Récupérer du childtype + $childtype = $em->getRepository("App\Entity\Childtype")->find($idchildtype); + if (!$childtype) { + throw $this->createNotFoundException('Not exist'); + } + + // Rendu + return $this->render($this->render.'upload.html.twig', [ + 'useheader' => true, + 'usesidebar' => true, + 'type' => 'child', + 'catparent' => $catparent, + 'idparent' => $idparent, + 'idchildtype' => $childtype->getId(), + 'typeupload' => 'image', + ]); + } + + public function submitvideo($catparent, $idparent, $idchildtype, Request $request, ManagerRegistry $em) + { + // Récupérer le parent + switch ($catparent) { + case 'blog': + $parent = $em->getRepository("App\Entity\Blog")->find($idparent); + if (!$parent) { + throw $this->createNotFoundException('Not exist'); + } + break; + + case 'page': + $parent = $em->getRepository("App\Entity\Page")->find($idparent); + if (!$parent) { + throw $this->createNotFoundException('Not exist'); + } + break; + } + + // Récupérer du childtype + $childtype = $em->getRepository("App\Entity\Childtype")->find($idchildtype); + if (!$childtype) { + throw $this->createNotFoundException('Not exist'); + } + + // Rendu + return $this->render($this->render.'upload.html.twig', [ + 'useheader' => true, + 'usesidebar' => true, + 'type' => 'child', + 'catparent' => $catparent, + 'idparent' => $idparent, + 'idchildtype' => $childtype->getId(), + 'typeupload' => 'video', + ]); + } + + public function submitfile($catparent, $idparent, $idchildtype, Request $request, ManagerRegistry $em) + { + // Récupérer le parent + switch ($catparent) { + case 'blog': + $parent = $em->getRepository("App\Entity\Blog")->find($idparent); + if (!$parent) { + throw $this->createNotFoundException('Not exist'); + } + break; + + case 'page': + $parent = $em->getRepository("App\Entity\Page")->find($idparent); + if (!$parent) { + throw $this->createNotFoundException('Not exist'); + } + break; + } + + // Récupérer du childtype + $childtype = $em->getRepository("App\Entity\Childtype")->find($idchildtype); + if (!$childtype) { + throw $this->createNotFoundException('Not exist'); + } + + // Rendu + return $this->render($this->render.'upload.html.twig', [ + 'useheader' => true, + 'usesidebar' => true, + 'type' => 'child', + 'catparent' => $catparent, + 'idparent' => $idparent, + 'idchildtype' => $childtype->getId(), + 'typeupload' => 'all', + ]); + } + + public function update($catparent, $idparent, $idchild, Request $request, ManagerRegistry $em) + { + // Récupérer le parent + switch ($catparent) { + case 'blog': + $parent = $em->getRepository("App\Entity\Blog")->find($idparent); + if (!$parent) { + throw $this->createNotFoundException('Not exist'); + } + break; + + case 'page': + $parent = $em->getRepository("App\Entity\Page")->find($idparent); + if (!$parent) { + throw $this->createNotFoundException('Not exist'); + } + break; + } + + $data = $em->getRepository($this->entity)->find($idchild); + $data->setUrl($this->formatEmbed($data->getUrl())); + + // Création du formulaire + $form = $this->createForm(Form::class, $data, ['mode' => 'update', 'childtype' => $data->getChildtype()]); + + // Récupération des data du formulaire + $form->handleRequest($request); + + // Sur erreur + $this->getErrorForm(null, $form, $request, $data, 'update'); + + // Sur validation + if ($form->get('submit')->isClicked() && $form->isValid()) { + $data = $form->getData(); + $em->getManager()->flush(); + + // Retour à la liste + return $this->redirectToRoute($this->route, ['catparent' => $catparent, 'idparent' => $idparent]); + } + + // Affichage du formulaire + return $this->render($this->render.'edit.html.twig', [ + 'useheader' => true, + 'usesidebar' => true, + 'catparent' => $catparent, + 'parent' => $parent, + 'childtype' => $data->getChildtype(), + $this->data => $data, + 'mode' => 'update', + 'form' => $form->createView(), + ]); + } + + public function delete($catparent, $idparent, $idchild, Request $request, ManagerRegistry $em) + { + $child = $em->getRepository($this->entity)->find($idchild); + + // Récupérer le parent et la relation + switch ($catparent) { + case 'blog': + $parent = $em->getRepository("App\Entity\Blog")->find($idparent); + break; + + case 'page': + $parent = $em->getRepository("App\Entity\Page")->find($idparent); + break; + } + + // Controle avant suppression + $error = false; + if (!$parent || !$child ) { + $error = true; + } + + if ($error) { + return $this->redirectToRoute($this->route.'_update', ['catparent' => $catparent, 'idparent' => $idparent, 'idchild' => $idchild]); + } else { + $em->getManager()->remove($child); + $em->getManager()->flush(); + + // Retour à la liste + return $this->redirectToRoute($this->route, ['catparent' => $catparent, 'idparent' => $idparent]); + } + } + + + public function upload($catparent, $idparent, $idchild, $type, Request $request, ManagerRegistry $em) + { + // Récupérer la map + $data = $em->getRepository($this->entity)->find($idchild); + if (!$data) { + throw $this->createNotFoundException('Not exist'); + } + + // Rendu + return $this->render($this->render.'upload.html.twig', [ + 'useheader' => true, + 'usesidebar' => true, + 'type' => 'child', + 'catparent' => $catparent, + 'idparent' => $idparent, + 'idchild' => $idchild, + 'idchildtype' => $data->getChildtype()->getId(), + 'typeupload' => $type, + ]); + } + + public function order($catparent, $idparent, Request $request, ManagerRegistry $em) + { + // Récupérer le parent + switch ($catparent) { + case 'blog': + $parent = $em->getRepository("App\Entity\Blog")->find($idparent); + break; + + case 'page': + $parent = $em->getRepository("App\Entity\Page")->find($idparent); + break; + } + + if ($parent) { + $childids = explode(',', $request->request->get('lstordered')); + $i = 1; + foreach ($childids as $id) { + $child = $em->getRepository($this->entity)->find($id); + $child->setRoworder($i); + if ($child) { + $child->setRoworder($i); + $em->getManager()->flush(); + } + ++$i; + } + } + + return new JsonResponse([]); + } + + public function select(Request $request, ManagerRegistry $em) + { + // S'assurer que c'est un appel ajax + if (!$request->isXmlHttpRequest()) { + return new JsonResponse(['message' => 'Interdit'], 400); + } + + $output = []; + $page_limit = $request->query->get('page_limit'); + $q = $request->query->get('q'); + + $qb = $em->createQueryBuilder(); + $qb->select('table')->from($this->entity, 'table') + ->where('table.name LIKE :value') + ->setParameter('value', '%'.$q.'%') + ->orderBy('table.name'); + + $datas = $qb->setFirstResult(0)->setMaxResults($page_limit)->getQuery()->getResult(); + foreach ($datas as $data) { + array_push($output, ['id' => $data->getId(), 'text' => $data->getName()]); + } + + $ret_string['results'] = $output; + + return new JsonResponse($ret_string); + } + + public function view($catparent, $idparent, $idchild, Request $request, ManagerRegistry $em) + { + $framed = boolval($request->get('framed')); + $size = intval($request->get('size')); + + // Récupérer le parent + switch ($catparent) { + case 'blog': + $parent = $em->getRepository("App\Entity\Blog")->find($idparent); + break; + case 'page': + $parent = $em->getRepository("App\Entity\Page")->find($idparent); + break; + } + if (!$parent) { + throw $this->createNotFoundException('Not exist'); + } + + // Récupérer le type de parent + switch ($catparent) { + case 'blog': + $typeparent = $parent->getBlogtype()->getName(); + break; + case 'page': + $typeparent = $parent->getPagetype()->getName(); + break; + } + + // Récupérer le child + $child = $em->getRepository("App\Entity\Child")->find($idchild); + $firstchild = $em->getRepository("App\Entity\Child")->findFirstchild($catparent, $idparent); + if (!$child) { + $child = $firstchild; + } + if (!$child) { + throw $this->createNotFoundException('Not exist'); + } + + switch ($child->getChildtype()->getId()) { + // Image / Image embed + case 12: + case 13: + $imageprev = $em->getRepository($this->entity)->findPrev($catparent, $idparent, [12, 13], $relation->getRoworder()); + $imagenext = $em->getRepository($this->entity)->findNext($catparent, $idparent, [12, 13], $relation->getRoworder()); + + return $this->render($this->render.'image.html.twig', [ + 'catparent' => $catparent, + 'parent' => $parent, + 'typeparent' => $typeparent, + 'firstchild' => $firstchild, + $this->data => $child, + 'useheader' => false, + 'usesidebar' => false, + 'maxwidth' => true, + 'imageprev' => $imageprev, + 'imagenext' => $imagenext, + ]); + break; + + // Video / Video embed + case 14: + case 15: + return $this->render($this->render.'video.html.twig', [ + 'catparent' => $catparent, + 'parent' => $parent, + 'typeparent' => $typeparent, + 'firstchild' => $firstchild, + $this->data => $child, + 'useheader' => (!$framed), + 'usesidebar' => false, + 'maxwidth' => true, + 'framed' => $framed, + 'size' => $size, + ]); + break; + + // Ressource / Ressource embed / Lien externe / Biblio + case 16: + case 17: + case 21: + case 22: + return $this->render($this->render.'file.html.twig', [ + 'catparent' => $catparent, + 'parent' => $parent, + 'typeparent' => $typeparent, + 'firstchild' => $firstchild, + $this->data => $child, + 'useheader' => (!$framed), + 'usesidebar' => false, + 'maxwidth' => true, + 'framed' => $framed, + 'size' => $size, + ]); + break; + + // Lien externe / Bibliographie + case 21: + case 12: + $size = 2; + + // no break + default: + $images = $em->getRepository($this->entity)->findOtherchilds($catparent, $idparent, [12, 13], $idchild); + $videos = $em->getRepository($this->entity)->findOtherchilds($catparent, $idparent, [14, 15], $idchild); + $contacts = $em->getRepository($this->entity)->findOtherchilds($catparent, $idparent, [20], $idchild); + $ressources = $em->getRepository($this->entity)->findOtherchilds($catparent, $idparent, [16, 17], $idchild); + $links = $em->getRepository($this->entity)->findOtherchilds($catparent, $idparent, [21], $idchild); + $bibliographys = $em->getRepository($this->entity)->findOtherchilds($catparent, $idparent, [22], $idchild); + + return $this->render($this->render.'view.html.twig', [ + 'useheader' => false, + 'usemenu' => true, + 'maxsize' => ($catparent=="page" ? 900 : 1200), + 'catparent' => $catparent, + 'parent' => $parent, + 'typeparent' => $typeparent, + 'firstchild' => $firstchild, + $this->data => $child, + + 'usesidebar' => false, + 'maxwidth' => true, + 'framed' => $framed, + 'size' => $size, + 'pages' => $em->getRepository($this->entity)->findPages($catparent, $idparent), + 'images' => $images, + 'videos' => $videos, + 'contacts' => $contacts, + 'ressources' => $ressources, + 'links' => $links, + 'bibliographys' => $bibliographys, + ]); + break; + } + } + + public function restjson($catparent, $idparent, $idchild, Request $request, ManagerRegistry $em) + { + // S'assurer que l'on doit ou non configurer le proxy + $url = 'https://'.$this->getParameter('appWeburl').'/'.$this->getParameter('appAlias'); + $clientguzzle = new \GuzzleHttp\Client(['timeout' => 3, 'verify' => false]); + $token = $this->getParameter('appSecret'); + + try { + $response = $clientguzzle->request('GET', $url); + } catch (RequestException $e) { + if ($e->hasResponse()) { + return 0; + } + } + + // Entete + $headers = [ + 'Accept' => 'application/json', + 'Content-Type' => 'application/json', + ]; + if ($token) { + $headers['Authorization'] = 'token '.$token; + } + + // Paramétrage unirest + \Unirest\Request::verifyPeer(false); + \Unirest\Request::verifyHost(false); + \Unirest\Request::timeout(5); + + $query = ['key' => $token, 'parentcat' => $catparent, 'parentid' => $idparent, 'childid' => $idchild, 'refreshcache' => true]; + $query = json_encode($query); + try { + $response = \Unirest\Request::post($url.'/rest/getChild', $headers, $query); + } catch (\Exception $e) { + return false; + } + + return new JsonResponse([]); + } + + protected function formatEmbed($url) + { + // Formatage youtube + if (false === stripos($url, 'https://www.youtube.com/embed') && false !== stripos($url, 'youtube')) { + $url = str_replace('http://www.youtube.com', 'https://www.youtube.com', $url); + $url = str_replace('https://www.youtube.com/watch?v=', '', $url); + $tmp = explode('&', $url); + $url = 'https://www.youtube.com/embed/'.$tmp[0]; + } + if (false === stripos($url, 'https://www.youtube.com/embed') && false !== stripos($url, 'youtu.be')) { + $url = str_replace('http://youtu.be/', 'https://www.youtube.com/embed/', $url); + $url = str_replace('https://youtu.be/', 'https://www.youtube.com/embed/', $url); + } + + // Formatage Dalymotion + if (false === stripos($url, 'https://www.dailymotion.com/embed') && false !== stripos($url, 'dailymotion')) { + $url = str_replace('http://www.dailymotion.com', 'https://www.dailymotion.com', $url); + $url = str_replace('https://www.dailymotion.com/video/', '', $url); + $tmp = explode('?', $url); + $url = 'https://www.dailymotion.com/embed/video/'.$tmp[0]; + } + + // Formatage Peertube + if (false !== stripos($url, '/watch/')) { + $url = str_replace('/watch/', '/embed/', $url); + } + + return $url; + } + + protected function getErrorForm($id, $form, $request, $data, $mode) + { + if ($form->get('submit')->isClicked() && 'delete' == $mode) { + } + + if ($form->get('submit')->isClicked() && 'submit' == $mode) { + } + + if ($form->get('submit')->isClicked() && !$form->isValid()) { + $this->get('session')->getFlashBag()->clear(); + + $errors = $form->getErrors(); + foreach ($errors as $error) { + $request->getSession()->getFlashBag()->add('error', $error->getMessage()); + } + } + } +} diff --git a/src/Controller/ChildheaderController.php b/src/Controller/ChildheaderController.php new file mode 100644 index 0000000..f72a4c0 --- /dev/null +++ b/src/Controller/ChildheaderController.php @@ -0,0 +1,161 @@ +getRepository("App\Entity\Child")->find($idchild); + if (!$child) { + throw $this->createNotFoundException('Not exist'); + } + + $modal = $request->get('modal'); + + return $this->render($this->render.'upload.html.twig', [ + 'useheader' => false, + 'usesidebar' => false, + 'idchild' => $idchild, + 'modal' => $modal, + ]); + } + + public function update($catparent, $idparent, $id, Request $request, ManagerRegistry $em) + { + // Initialisation de l'enregistrement + $data = $em->getRepository($this->entity)->find($id); + $idchild = $data->getChild()->getId(); + + // Création du formulaire + $form = $this->createForm(Form::class, $data, ['mode' => 'update']); + + // Récupération des data du formulaire + $form->handleRequest($request); + + // Sur erreur + $this->getErrorForm(null, $form, $request, $data, 'update'); + + // Sur validation + if ($form->get('submit')->isClicked() && $form->isValid()) { + $data = $form->getData(); + $em->getManager()->flush(); + + // Retour à la liste + return $this->redirectToRoute('app_child_update', ['catparent' => $catparent, 'idparent' => $idparent, 'idchild' => $idchild]); + } + + // Affichage du formulaire + return $this->render($this->render.'edit.html.twig', [ + 'useheader' => true, + 'usesidebar' => true, + 'catparent' => $catparent, + 'idparent' => $idparent, + 'idchild' => $idchild, + $this->data => $data, + 'mode' => 'update', + 'form' => $form->createView(), + ]); + } + + public function delete($catparent, $idparent, $id, Request $request, ManagerRegistry $em) + { + // Initialisation de l'enregistrement + $data = $em->getRepository($this->entity)->find($id); + $idchild = $data->getChild()->getId(); + + try { + $em->getManager()->remove($data); + $em->getManager()->flush(); + } catch (\Exception $e) { + $request->getSession()->getFlashBag()->add('error', $e->getMessage()); + } + + return $this->redirectToRoute('app_child_update', ['catparent' => $catparent, 'idparent' => $idparent, 'idchild' => $idchild]); + } + + public function view($id, Request $request, ManagerRegistry $em) + { + // Récupérer le childheader + $data = $em->getRepository("App\Entity\Childheader")->find($id); + if (!$data) { + throw $this->createNotFoundException('Not exist'); + } + + $imageprev = $em->getRepository($this->entity)->findPrev($data->getChild()->getId(), $data->getRoworder()); + $imagenext = $em->getRepository($this->entity)->findNext($data->getChild()->getId(), $data->getRoworder()); + + return $this->render($this->render.'image.html.twig', [ + $this->data => $data, + 'useheader' => false, + 'usesidebar' => false, + 'maxwidth' => true, + 'imageprev' => $imageprev, + 'imagenext' => $imagenext, + ]); + } + + public function select($idchild, Request $request, ManagerRegistry $em) + { + // S'assurer que c'est un appel ajax + if (!$request->isXmlHttpRequest()) { + return new JsonResponse(['message' => 'Interdit'], 400); + } + + $child = $em->getRepository("App\Entity\Child")->find($idchild); + + $childheaders = $child->getChildheaders(); + $output = []; + foreach ($childheaders as $childheader) { + array_push($output, ['id' => $childheader->getId(), 'filename' => $childheader->getFilename(), 'credit' => $childheader->getCredit()]); + } + + return new JsonResponse($output); + } + + public function order($idchild, Request $request, ManagerRegistry $em) + { + $childheaderids = explode(',', $request->get('lstordered')); + $i = 1; + foreach ($childheaderids as $id) { + $childheader = $em->getRepository($this->entity)->find($id); + if ($childheader) { + $childheader->setRoworder($i); + $em->getManager()->flush(); + } + ++$i; + } + + return new JsonResponse([]); + } + + protected function getErrorForm($id, $form, $request, $data, $mode) + { + if ($form->get('submit')->isClicked() && 'delete' == $mode) { + } + + if ($form->get('submit')->isClicked() && 'submit' == $mode) { + } + + if ($form->get('submit')->isClicked() && !$form->isValid()) { + $this->get('session')->getFlashBag()->clear(); + + $errors = $form->getErrors(); + foreach ($errors as $error) { + $request->getSession()->getFlashBag()->add('error', $error->getMessage()); + } + } + } +} diff --git a/src/Controller/ConfigController.php b/src/Controller/ConfigController.php index 9ab4249..d05e14f 100755 --- a/src/Controller/ConfigController.php +++ b/src/Controller/ConfigController.php @@ -84,4 +84,9 @@ class ConfigController extends AbstractController { return $this->render($this->twig.'logo.html.twig'); } + + public function image($access): Response + { + return $this->render($this->twig.'image.html.twig'); + } } diff --git a/src/Controller/CropController.php b/src/Controller/CropController.php index b25a67a..f5c66fc 100755 --- a/src/Controller/CropController.php +++ b/src/Controller/CropController.php @@ -2,7 +2,9 @@ namespace App\Controller; +use App\Entity\Childheader; use App\Service\MinioService; +use Doctrine\Persistence\ManagerRegistry; use Symfony\Bundle\FrameworkBundle\Controller\AbstractController; use Symfony\Component\Filesystem\Filesystem; use Symfony\Component\Form\Extension\Core\Type\HiddenType; @@ -130,6 +132,126 @@ class CropController extends AbstractController ]); } + // Etape 01 - Téléchargement de l'image associé à un entity + public function cropentity01($type, $idparent) + { + return $this->render('Crop/crop01.html.twig', [ + 'useheader' => false, + 'usesidebar' => false, + 'type' => $type, + 'idparent' => $idparent, + ]); + } + + // Etape 02 - Couper votre l'image + public function cropentity02($type, $idparent, Request $request, ManagerRegistry $em) + { + // Récupération de l'image à cropper + $file = $request->query->get('file'); + $large_image_location = $this->minio->download($type.'/'.$file, $type.'/'.$file, true); + + // Récupérer les tailles de l'image + $width = $this->getWidth($large_image_location); + $height = $this->getHeight($large_image_location); + + // Définir le pourcentage de réduction de l'image + switch ($type) { + case 'childheader': + $max_height = 1600; + $max_width = 1600; + $parent = $em->getRepository("App\Entity\Child")->find($idparent); + if (!$parent) { + throw $this->createNotFoundException('Not exist'); + } + + switch ($parent->getChildtype()->getId()) { + case 1: $ratio = '16:4'; + break; + case 16: $ratio = '4:6'; + break; + case 17: $ratio = '4:6'; + break; + default: $ratio = 'none'; + break; + } + break; + } + + if ($max_height > 0) { + $scale = $max_height / $height; + if (($width * $scale) > $max_width) { + $scale = $max_width / $width; + } + $this->resizeImage($large_image_location, $width, $height, $scale); + $this->minio->upload($large_image_location, $type.'/'.$file, false); + } else { + $scale = 1; + } + + // Construction du formulaire + $submited = false; + $form = $this->createFormBuilder() + ->add('submit', SubmitType::class, ['label' => 'Valider', 'attr' => ['class' => 'btn btn-success']]) + ->add('x', HiddenType::class) + ->add('y', HiddenType::class) + ->add('w', HiddenType::class) + ->add('h', HiddenType::class) + ->add('xs', HiddenType::class) + ->add('ys', HiddenType::class) + ->add('ws', HiddenType::class) + ->add('hs', HiddenType::class) + ->getForm(); + + // Récupération des data du formulaire + $form->handleRequest($request); + + // Sur validation on généère la miniature croppée + if ($form->get('submit')->isClicked() && $form->isValid()) { + // Récupération des valeurs du formulaire + $data = $form->getData(); + // Récupération des valeurs du formulaire + $data = $form->getData(); + $tmpdir = $this->appKernel->getProjectDir().'/var/tmp'; + $thumb_image_location = "$tmpdir/$type/".dirname($file).'/thumb_'.basename($file); + $cropped = $this->resizeThumbnailImage($thumb_image_location, $large_image_location, $data['ws'], $data['hs'], $data['xs'], $data['ys'], $scale); + + // Dépot des fichiers sur minio + $this->minio->upload($thumb_image_location, $type.'/'.dirname($file).'/thumb_'.basename($file), false); + + $submited = true; + + switch ($type) { + case 'childheader': + $parent = $em->getRepository("App\Entity\Child")->find($idparent); + if (!$parent) { + throw $this->createNotFoundException('Not exist'); + } + $last = $em->getRepository("App\Entity\Childheader")->findOneBy(['child' => $parent], ['roworder' => 'DESC']); + $lastorder = ($last ? $last->getRoworder() + 1 : 1); + $data = new Childheader(); + $data->setChild($parent); + $data->setFilename($type.'/'.dirname($file).'/thumb_'.basename($file)); + $data->setRoworder($lastorder); + $em->getManager()->persist($data); + $em->getManager()->flush(); + break; + } + + $submited = true; + } + + return $this->render('Crop/crop02.html.twig', [ + 'useheader' => false, + 'usesidebar' => false, + 'form' => $form->createView(), + 'type' => $type, + 'file' => $file, + 'ratio' => $ratio, + 'idparent' => $idparent, + 'submited' => $submited, + ]); + } + // Calcul de la hauteur protected function getHeight($image) { diff --git a/src/Controller/FileController.php b/src/Controller/FileController.php deleted file mode 100644 index 0d94f55..0000000 --- a/src/Controller/FileController.php +++ /dev/null @@ -1,721 +0,0 @@ -minio = $minio; - } - - public function list($access, $category, $id, Request $request, ManagerRegistry $em): Response - { - // Récupération des paramètres - $folder = $request->query->get('folder'); - $usage = $request->query->get('usage'); - $view = $request->get('view'); - $sort = $request->get('sort'); - $order = $request->get('order'); - - // Permission - $canadd = $this->getPermission($em, $access, $category, $id, $usage); - - // Récupérer les files icons - $tbicons = json_decode(file_get_contents($this->getParameter('kernel.project_dir').'/public/medias/file/files.json'), true); - - // Récupérer les préférences utilisateur - if (!$this->getUser()) { - $preference['widgetfolder'][$id] = ['folder' => null, 'sort' => null, 'order' => null, 'view' => null]; - } else { - $preference = $this->getUser()->getPreference(); - if (is_null($preference)) { - $preference = []; - } - - // Initalisation des préférences si aucune - if (!array_key_exists('widgetfolder', $preference) || !array_key_exists($id, $preference['widgetfolder'])) { - $preference['widgetfolder'][$id] = ['folder' => null, 'sort' => null, 'order' => null, 'view' => null]; - } - } - - // Si aucun folder on récupére la preference - if (!$folder && $preference['widgetfolder'][$id]['folder']) { - $folder = $preference['widgetfolder'][$id]['folder']; - } - - // On s'assure que le folder existe toujours - if ($folder && 0 == $this->minio->countKeys($folder)) { - $folder = null; - } - - // On s'assure qu'il est bien dans le folder de base - if (false === stripos($folder, 'file/pagewidget/'.$id.'/')) { - $folder = null; - } - - // Si pas de folder on est sur la racine - if (!$folder) { - $folder = 'file/pagewidget/'.$id.'/'; - } - - // Trie - if (!$order) { - $order = $preference['widgetfolder'][$id]['order']; - } - if (!$order) { - $order = 'SORT_ASC'; - } - if (!$sort) { - $sort = $preference['widgetfolder'][$id]['sort']; - } - if (!$sort) { - $sort = 'name'; - } - - // View - if (!$view) { - $view = $preference['widgetfolder'][$id]['view']; - } - - // Récuperer les files et folders du folder en cours - $files = $this->minio->listFiles($folder, '/'); - $folders = $this->minio->listFolders($folder, '/'); - - // Ajouter basename et thumb des entrées récupérées - if ($files) { - foreach ($files as $key => $value) { - if ('.dir' == pathinfo($value['Key'], PATHINFO_BASENAME)) { - unset($files[$key]); - continue; - } - $files[$key]['basename'] = pathinfo($value['Key'], PATHINFO_BASENAME); - $files[$key]['dirname'] = pathinfo($value['Key'], PATHINFO_DIRNAME); - $files[$key]['extention'] = pathinfo($value['Key'], PATHINFO_EXTENSION); - - // thumb ? - if (1 == $this->minio->countKeys($files[$key]['dirname'].'/.thumb/'.$files[$key]['basename'])) { - $files[$key]['thumb'] = $this->generateUrl('app_minio_image', ['file' => $files[$key]['dirname'].'/.thumb/'.$files[$key]['basename']]); - } - // file icon ? - elseif (array_key_exists($files[$key]['extention'], $tbicons)) { - $files[$key]['thumb'] = $tbicons[$files[$key]['extention']]; - } - // blank file icon - else { - $files[$key]['thumb'] = $tbicons['blank']; - } - } - - $filesdate = array_column($files, 'LastModified'); - $filesname = array_column($files, 'basename'); - - switch ($sort) { - case 'name': - array_multisort($filesname, 'SORT_ASC' == $order ? SORT_ASC : SORT_DESC, $files); - break; - case 'date': - array_multisort($filesdate, 'SORT_ASC' == $order ? SORT_ASC : SORT_DESC, $files); - break; - } - } - - if ($folders) { - foreach ($folders as $key => $value) { - if ('.thumb' == pathinfo($value['Prefix'], PATHINFO_BASENAME) || '.trash' == pathinfo($value['Prefix'], PATHINFO_BASENAME)) { - unset($folders[$key]); - continue; - } - - $folders[$key]['basename'] = pathinfo($value['Prefix'], PATHINFO_BASENAME); - $folders[$key]['thumb'] = $tbicons['dir']; - } - - $foldersname = array_column($folders, 'basename'); - array_multisort($foldersname, 'SORT_ASC' == $order ? SORT_ASC : SORT_DESC, $folders); - } - - // Mise à jour des préférences - $preference['widgetfolder'][$id] = ['folder' => $folder, 'sort' => $sort, 'order' => $order, 'view' => $view]; - if ($this->getUser()) { - $this->getUser()->setPreference($preference); - $em->getManager()->flush(); - } - - // Construction de la navigation des folers - $basefolder = 'file/pagewidget/'.$id; - $parents = [['basename' => 'Home', 'folder' => $basefolder.'/']]; - $tmp = explode('/', $folder); - unset($tmp[0]); - unset($tmp[1]); - unset($tmp[2]); - array_pop($tmp); - - foreach ($tmp as $value) { - $basefolder = $basefolder.'/'.$value; - array_push($parents, ['basename' => $value, 'folder' => $basefolder.'/']); - } - - // Flag poubelle - $fgtrash = false; - if (stripos($folder, '.trash') >= 1) { - $fgtrash = true; - } - - return $this->render('File\list.html.twig', [ - 'useheader' => false, - 'usemenu' => false, - 'usesidebar' => false, - 'access' => $access, - 'category' => $category, - 'id' => $id, - 'folder' => $folder, - 'usage' => $usage, - 'view' => $view, - 'sort' => $sort, - 'order' => $order, - 'canadd' => $canadd, - 'fgtrash' => $fgtrash, - 'parents' => $parents, - 'folders' => $folders, - 'files' => $files, - ]); - } - - public function upload($access, $category, $id, $type, Request $request, ManagerRegistry $em): Response - { - $usage = $request->query->get('usage'); - $folder = urldecode($request->get('folder')); - if (!$folder) { - $folder = 'file/'.$category.'/'.$id.'/'; - } - - // Permission - $canadd = $this->getPermission($em, $access, $category, $id, $usage); - if (!$canadd) { - throw $this->createAccessDeniedException('Permission denied'); - } - $basefolder = 'file/'.$category.'/'.$id.'/'; - if (false === stripos($folder, $basefolder)) { - throw $this->createAccessDeniedException('Permission denied'); - } - - return $this->render('File\upload.html.twig', [ - 'useheader' => false, - 'usemenu' => false, - 'usesidebar' => false, - 'maxsize' => ('all' == $access ? 1200 : null), - 'access' => $access, - 'category' => $category, - 'id' => $id, - 'type' => $type, - 'folder' => $folder, - 'forcereload' => ('pagewidget' == $category), - ]); - } - - public function folder($access, $category, $id, Request $request, ManagerRegistry $em): Response - { - $usage = $request->query->get('usage'); - $infolder = $usage = $request->query->get('folder'); - - // Permission - $canadd = $this->getPermission($em, $access, $category, $id, $usage); - if (!$canadd) { - throw $this->createAccessDeniedException('Permission denied'); - } - $basefolder = 'file/'.$category.'/'.$id.'/'; - if (false === stripos($infolder, $basefolder)) { - throw $this->createAccessDeniedException('Permission denied'); - } - - $folder = $request->get('folder'); - $form = $this->createFormBuilder() - ->add('folder', TextType::class, ['label' => 'Répertoire']) - ->add('submit', SubmitType::class, ['label' => 'Valider', 'attr' => ['class' => 'btn btn-success']]) - ->getForm(); - - $form->handleRequest($request); - $toclose = false; - - if ($form->isSubmitted() && $form->isValid()) { - $data = $form->getData(); - if ('.thumb' == $data['folder'] || '.dir' == $data['folder'] || '.trash' == $data['folder']) { - $form->addError(new FormError('Nom de répertoire réservé, merci de choisir un autre nom de répertoire')); - $request->getSession()->getFlashBag()->clear(); - $request->getSession()->getFlashBag()->add('error', 'Nom de répertoire réservé, merci de choisir un autre nom de répertoire'); - } else { - $filesystem = new Filesystem(); - $filesystem->dumpFile($this->getParameter('kernel.project_dir').'/var/tmp/.dir', ''); - $this->minio->upload($this->getParameter('kernel.project_dir').'/var/tmp/.dir', $infolder.$data['folder'].'/.dir'); - $toclose = true; - } - } - - return $this->render('File\folder.html.twig', [ - 'useheader' => false, - 'usemenu' => false, - 'usesidebar' => false, - 'access' => $access, - 'id' => $id, - 'folder' => $folder, - 'form' => $form->createView(), - 'toclose' => $toclose, - ]); - } - - public function rename($access, $category, $id, Request $request, ManagerRegistry $em): Response - { - $usage = $request->query->get('usage'); - $oldfile = $usage = $request->query->get('file'); - - // Permission - $canadd = $this->getPermission($em, $access, $category, $id, $usage); - if (!$canadd) { - throw $this->createAccessDeniedException('Permission denied'); - } - $basefolder = 'file/'.$category.'/'.$id.'/'; - if (false === stripos($oldfile, $basefolder)) { - throw $this->createAccessDeniedException('Permission denied'); - } - - $form = $this->createFormBuilder() - ->add('folder', TextType::class, ['label' => 'Renommer']) - ->add('submit', SubmitType::class, ['label' => 'Valider', 'attr' => ['class' => 'btn btn-success']]) - ->getForm(); - $form->handleRequest($request); - $toclose = false; - - if ($form->isSubmitted() && $form->isValid()) { - $data = $form->getData(); - if ('.thumb' == $data['folder'] || '.dir' == $data['folder'] || '.trash' == $data['folder']) { - $form->addError(new FormError('Nom réservé, merci de choisir un autre nom')); - $this->get('session')->getFlashBag()->clear(); - $request->getSession()->getFlashBag()->add('error', 'Nom réservé, merci de choisir un autre nom'); - } else { - $newfile = pathinfo($oldfile, PATHINFO_DIRNAME).'/'.$data['folder']; - if ('/' == substr($oldfile, -1)) { - $newfile = $newfile.'/'; - } - - $files = $this->minio->listFiles($oldfile); - foreach ($files as $tbfile) { - $file = $tbfile['Key']; - - // Déplacer le fichier dans .trash - try { - $this->minio->move($file, str_replace($oldfile, $newfile, $file), true); - } catch (\Exception $e) { - } - - // Déplacer le thumb dans .trash - try { - $oldthumb = pathinfo($oldfile, PATHINFO_DIRNAME).'/.thumb/'.pathinfo($oldfile, PATHINFO_BASENAME); - $newthumb = pathinfo($newfile, PATHINFO_DIRNAME).'/.thumb/'.pathinfo($newfile, PATHINFO_BASENAME); - $this->minio->move($oldthumb, $newthumb, true); - } catch (\Exception $e) { - } - } - $toclose = true; - } - } else { - $form->get('folder')->setData(basename($oldfile)); - } - - return $this->render('File\folder.html.twig', [ - 'useheader' => false, - 'usemenu' => false, - 'usesidebar' => false, - 'access' => $access, - 'id' => $id, - 'folder' => $oldfile, - 'form' => $form->createView(), - 'toclose' => $toclose, - ]); - } - - public function trash($access, $category, $id, Request $request, ManagerRegistry $em): Response - { - $usage = $request->query->get('usage'); - $file = $usage = $request->query->get('file'); - - // Permission - $canadd = $this->getPermission($em, $access, $category, $id, $usage); - if (!$canadd) { - throw $this->createAccessDeniedException('Permission denied'); - } - $basefolder = 'file/'.$category.'/'.$id.'/'; - if (false === stripos($file, $basefolder)) { - throw $this->createAccessDeniedException('Permission denied'); - } - - $files = $this->minio->listFiles($file); - - foreach ($files as $tbfile) { - $file = $tbfile['Key']; - - // Déplacer le fichier dans .trash - try { - $this->minio->move($file, str_replace($basefolder, $basefolder.'.trash/', $file), true); - } catch (\Exception $e) { - } - - // Déplacer le thumb dans .trash - try { - $thumb = pathinfo($file, PATHINFO_DIRNAME).'/.thumb/'.pathinfo($file, PATHINFO_BASENAME); - $this->minio->move($thumb, str_replace($basefolder, $basefolder.'.trash/', $thumb), true); - } catch (\Exception $e) { - } - } - - return new JsonResponse(); - } - - public function restaure($access, $category, $id, Request $request, ManagerRegistry $em): Response - { - $usage = $request->query->get('usage'); - $file = $usage = $request->query->get('file'); - - // Permission - $canadd = $this->getPermission($em, $access, $category, $id, $usage); - if (!$canadd) { - throw $this->createAccessDeniedException('Permission denied'); - } - $basefolder = 'file/'.$category.'/'.$id.'/'; - if (false === stripos($file, $basefolder)) { - throw $this->createAccessDeniedException('Permission denied'); - } - - $files = $this->minio->listFiles($file); - - foreach ($files as $tbfile) { - $file = $tbfile['Key']; - - // Déplacer le fichier de .trash vers sa cible d'origine - try { - $this->minio->move($file, str_replace('/.trash/', '/', $file), true); - } catch (\Exception $e) { - } - - // Déplacer le thumb dans .trash - try { - $thumb = pathinfo($file, PATHINFO_DIRNAME).'/.thumb/'.pathinfo($file, PATHINFO_BASENAME); - $this->minio->move($thumb, str_replace('/.trash/', '/', $thumb), true); - } catch (\Exception $e) { - } - } - - return new JsonResponse(); - } - - public function purgetrash($access, $category, $id, Request $request, ManagerRegistry $em): Response - { - $usage = $request->query->get('usage'); - - // Permission - $canadd = $this->getPermission($em, $access, $category, $id, $usage); - if (!$canadd) { - throw $this->createAccessDeniedException('Permission denied'); - } - $basefolder = 'file/'.$category.'/'.$id.'/.trash'; - - $files = $this->minio->listFiles($basefolder); - - foreach ($files as $tbfile) { - $file = $tbfile['Key']; - try { - $this->minio->delete($file); - } catch (\Exception $e) { - } - } - - return $this->redirectToRoute('app_'.$access.'_file_list', ['category' => $category, 'id' => $id]); - } - - public function delete($access, $category, $id, Request $request, ManagerRegistry $em): Response - { - $usage = $request->query->get('usage'); - $file = $usage = $request->query->get('file'); - - // Permission - $canadd = $this->getPermission($em, $access, $category, $id, $usage); - if (!$canadd) { - throw $this->createAccessDeniedException('Permission denied'); - } - $basefolder = 'file/'.$category.'/'.$id.'/'; - if (false === stripos($file, $basefolder)) { - throw $this->createAccessDeniedException('Permission denied'); - } - - // Si en mode naviation rechercher le prochain fichier à afficher - if (!$request->isXmlHttpRequest()) { - $files = $this->minio->listFiles(dirname($file).'/', '/'); - dump($files); - if ($files) { - $basename = basename($file); - $date = array_column($files, 'LastModified'); - array_multisort($date, SORT_DESC, $files); - - foreach ($files as $key => $tbfile) { - if ($basename == basename($tbfile['Key'])) { - $next = (array_key_exists($key + 1, $files) ? $files[$key + 1] : $files[0]); - if ($next['Key'] == $file) { - unset($next); - } - } - } - } - } - - $files = $this->minio->listFiles($file); - - foreach ($files as $tbfile) { - $file = $tbfile['Key']; - - // Supprimer le fichier - try { - $this->minio->delete($file); - } catch (\Exception $e) { - } - - // Supprimer le thumb - try { - $thumb = pathinfo($file, PATHINFO_DIRNAME).'/.thumb/'.pathinfo($file, PATHINFO_BASENAME); - $this->minio->delete($thumb); - } catch (\Exception $e) { - } - } - - // Appel ajax - if ($request->isXmlHttpRequest()) { - return new JsonResponse(); - } else { - if (isset($next)) { - return $this->redirectToRoute(str_replace('_admin_', '_'.$access.'_', 'app_admin_file_view'), ['category' => $category, 'id' => $id, 'usage' => $usage, 'file' => $next['Key']]); - } else { - return $this->render('File\redirect.html.twig'); - } - } - } - - public function move($access, $category, $id, Request $request, ManagerRegistry $em): Response - { - $usage = $request->query->get('usage'); - $source = $usage = $request->query->get('source'); - $destination = $usage = $request->query->get('destination'); - - // Permission - $canadd = $this->getPermission($em, $access, $category, $id, $usage); - if (!$canadd) { - throw $this->createAccessDeniedException('Permission denied'); - } - $basefolder = 'file/'.$category.'/'.$id.'/'; - if (false === stripos($source, $basefolder)) { - throw $this->createAccessDeniedException('Permission denied'); - } - if (false === stripos($destination, $basefolder)) { - throw $this->createAccessDeniedException('Permission denied'); - } - - $isdirdest = false; - if ('/' == substr($source, -1)) { - $isdirdest = true; - $destination = $destination.basename($source).'/'; - // On ne peut déplacer un répertoire vers un répertoire enfant - if (0 === stripos($destination, $source)) { - return new JsonResponse(); - } - } - - $files = $this->minio->listFiles($source); - foreach ($files as $tbfile) { - $file = $tbfile['Key']; - if ($isdirdest) { - $dest = str_replace($source, $destination, $file); - } else { - $dest = str_replace(pathinfo($source, PATHINFO_DIRNAME).'/', $destination, $file); - } - - // Déplacer le fichier - try { - $this->minio->move($file, $dest, true); - } catch (\Exception $e) { - } - - // Thumb - if (!$isdirdest) { - $oldthumb = pathinfo($source, PATHINFO_DIRNAME).'/.thumb/'.pathinfo($source, PATHINFO_BASENAME); - $newthumb = pathinfo($dest, PATHINFO_DIRNAME).'/.thumb/'.pathinfo($dest, PATHINFO_BASENAME); - - // Déplacer le thumb - try { - $this->minio->move($oldthumb, $newthumb, true); - } catch (\Exception $e) { - } - } - } - exit; - - return new JsonResponse(); - } - - public function view($access, $category, $id, Request $request, ManagerRegistry $em): Response - { - $file = $request->query->get('file'); - $basename = basename($file); - $path = dirname($file); - $usage = $request->query->get('usage'); - $navigation = boolval($request->query->get('navigation')); - - $canadd = $this->getPermission($em, $access, $category, $id, $usage); - - // Si en mode navigation on recherche le fichier précédent ou suivant - $next = []; - $prev = []; - - if ($navigation) { - $files = $this->minio->listFiles($path.'/', '/'); - if ($files) { - $date = array_column($files, 'LastModified'); - array_multisort($date, SORT_DESC, $files); - foreach ($files as $key => $value) { - if ($basename == basename($value['Key'])) { - $next = (array_key_exists($key + 1, $files) ? $files[$key + 1] : $files[0]); - $prev = (array_key_exists($key - 1, $files) ? $files[$key - 1] : end($files)); - } - } - } - } - - $tmpfile = $this->minio->download($file, basename($file)); - if (str_starts_with(mime_content_type($tmpfile), 'image/') || 'application/pdf' == mime_content_type($tmpfile) || 'text/plain' == mime_content_type($tmpfile)) { - return $this->render('File\view.html.twig', [ - 'useheader' => false, - 'usemenu' => false, - 'usesidebar' => false, - 'access' => $access, - 'category' => $category, - 'id' => $id, - 'usage' => $usage, - 'navigation' => $navigation, - 'file' => $file, - 'basename' => basename($file), - 'canadd' => $canadd, - 'prev' => $prev, - 'next' => $next, - 'isimage' => str_starts_with(mime_content_type($tmpfile), 'image/'), - ]); - } else { - $response = new BinaryFileResponse($tmpfile); - $response->setContentDisposition(ResponseHeaderBag::DISPOSITION_ATTACHMENT, basename($file)); - - return $response; - } - } - - public function show($access, $category, $id, Request $request, ManagerRegistry $em): Response - { - $file = $request->query->get('file'); - $usage = $request->query->get('usage'); - $this->getPermission($em, $access, $category, $id, $usage); - - $tmpfile = $this->minio->download($file, basename($file)); - if (str_starts_with(mime_content_type($tmpfile), 'image/') || 'application/pdf' == mime_content_type($tmpfile) || 'text/plain' == mime_content_type($tmpfile)) { - $response = new BinaryFileResponse($tmpfile); - $response->headers->set('Content-Type', mime_content_type($tmpfile)); - } else { - $response = new BinaryFileResponse($tmpfile); - $response->setContentDisposition(ResponseHeaderBag::DISPOSITION_ATTACHMENT, basename($file)); - } - - return $response; - } - - public function download($access, $category, $id, Request $request, ManagerRegistry $em): Response - { - $file = $request->query->get('file'); - $usage = $request->query->get('usage'); - $this->getPermission($em, $access, $category, $id, $usage); - $tmpfile = $this->minio->download($file, basename($file)); - $response = new BinaryFileResponse($tmpfile); - $response->setContentDisposition(ResponseHeaderBag::DISPOSITION_ATTACHMENT, basename($file)); - - return $response; - } - - public function getPermission($em, $access, $category, $id, $usage = '') - { - if ('all' == $access) { - switch ($category) { - case 'pagewidget': - // Récupération du widget - $pagewidget = $em->getRepository("App\Entity\Pagewidget")->find($id); - - // Vérifier que l'on peut voir - if ('all' == $access) { - if (!$em->getRepository("App\Entity\Pagewidget")->getCansee($this->getUser(), $pagewidget)) { - throw $this->createAccessDeniedException('Permission denied'); - } - } - - // Retourner la permission d'ajout - return $em->getRepository("App\Entity\Pagewidget")->getCanadd($this->getUser(), $pagewidget, $usage); - break; - - case 'projecttask': - // Récupération de la tache - $projecttask = $em->getRepository('CadolesPortalBundle:Projecttask')->find($id); - if (!$projecttask) { - throw $this->createNotFoundException('Unable to find entity.'); - } - - // On s'assure que l'utilisateur à la permission de voir - $project = $projecttask->getProject(); - $user = $this->getUser(); - $em->getRepository('CadolesPortalBundle:Project')->getPermission($user, $project, $cansee, $canupdate, $canadd); - if (!$cansee) { - throw $this->createAccessDeniedException('Permission denied'); - } - - return $canupdate; - break; - - case 'calendarevent': - // Récupération de l'event' - $calendarevent = $em->getRepository('CadolesPortalBundle:Calendarevent')->find($id); - if (!$calendarevent) { - throw $this->createNotFoundException('Unable to find entity.'); - } - - // On s'assure que l'utilisateur à la permission de voir - $calendar = $calendarevent->getCalendar(); - $user = $this->getUser(); - $em->getRepository('CadolesPortalBundle:Calendar')->getPermission($user, $calendar, $cansee, $canupdate, $canadd); - if (!$cansee) { - throw $this->createAccessDeniedException('Permission denied'); - } - - return $canadd; - break; - } - } else { - return true; - } - } -} diff --git a/src/Controller/HomeController.php b/src/Controller/HomeController.php index 47c1f25..0fe38fa 100755 --- a/src/Controller/HomeController.php +++ b/src/Controller/HomeController.php @@ -15,37 +15,13 @@ class HomeController extends AbstractController return $this->redirectToRoute('app_login'); } - // Récupération de la page encours - $id = $request->query->get('id'); + return $this->render('Home/home.html.twig', [ + 'useheader' => false, + 'usemenu' => true, + 'usesidebar' => false, + 'maxsize' => 1000, + ]); - // Calcul des pages de l'utilisateur - $em->getRepository("App\Entity\Page")->getPagesUser($this->getUser(), $id, $pagecurrent, $pagesportal, $pagesuser, $groups); - - // si aucune page = page par défaut - if ($pagecurrent) { - return $this->render('Page/pages.html.twig', [ - 'useheader' => true, - 'usemenu' => true, - 'usesidebar' => false, - 'entity' => $pagecurrent, - 'access' => 'all', - 'pagesportal' => $pagesportal, - 'pagesuser' => $pagesuser, - 'groups' => $groups, - 'canadd' => true, - 'widgetsuser' => $em->getRepository("App\Entity\Widget")->getWidgetAccess('all'), - 'widgetsgroup' => $em->getRepository("App\Entity\Widget")->getWidgetAccess('group'), - ]); - } - - if (!$this->getUser()) { - return $this->render('Home/home.html.twig', [ - 'useheader' => true, - 'usemenu' => false, - 'usesidebar' => false, - 'maxsize' => 1000, - ]); - } if ($this->getUser()->hasRole('ROLE_USER')) { return $this->redirectToRoute('app_user_home'); } diff --git a/src/Controller/IconController.php b/src/Controller/IconController.php deleted file mode 100644 index eb8f640..0000000 --- a/src/Controller/IconController.php +++ /dev/null @@ -1,180 +0,0 @@ -get('inframe'); - - if ('admin' == $access) { - $icons = $em->getRepository($this->entity)->findBy(['user' => null], ['label' => 'ASC']); - } else { - $icons = $em->getRepository($this->entity)->findBy(['user' => $this->getUser()], ['label' => 'ASC']); - } - - return $this->render($this->twig.'list.html.twig', [ - 'useheader' => !$inframe, - 'usemenu' => false, - 'usesidebar' => ('admin' == $access && !$inframe), - 'access' => $access, - $this->data.'s' => $icons, - 'inframe' => $inframe, - ]); - } - - public function submit($access, Request $request, ManagerRegistry $em): Response - { - $inframe = $request->get('inframe'); - - // Initialisation de l'enregistrement - $data = new Icon(); - - // Création du formulaire - $form = $this->createForm(IconType::class, $data, ['mode' => 'submit']); - - // Récupération des data du formulaire - $form->handleRequest($request); - - // Sur validation - if ($form->get('submit')->isClicked() && $form->isValid()) { - $data = $form->getData(); - if ($data->getLabel()) { - if ('all' == $access) { - $data->setUser($this->getUser()); - } - - // Sauvegarde - $em->getManager()->persist($data); - $em->getManager()->flush(); - - // Retour à la liste - return $this->redirectToRoute(str_replace('_admin_', '_'.$access.'_', $this->route), ['inframe' => $inframe]); - } - } - - // Affichage du formulaire - return $this->render($this->twig.'edit.html.twig', [ - 'useheader' => !$inframe, - 'usemenu' => false, - 'usesidebar' => ('admin' == $access && !$inframe), - 'access' => $access, - $this->data => $data, - 'mode' => 'submit', - 'form' => $form->createView(), - 'inframe' => $inframe, - 'issystem' => false, - ]); - } - - public function update($id, $access, Request $request, ManagerRegistry $em): Response - { - $inframe = $request->get('inframe'); - - // Récupération de l'enregistrement courant - $data = $em->getRepository($this->entity)->find($id); - if (!$data) { - throw $this->createNotFoundException('Unable to find entity.'); - } - - // Création du formulaire - $form = $this->createForm(IconType::class, $data, ['mode' => 'update']); - - // Récupération des data du formulaire - $form->handleRequest($request); - - // Sur validation - if ($form->get('submit')->isClicked() && $form->isValid()) { - $data = $form->getData(); - - // Sauvegarde - $em->getManager()->flush(); - - // Retour à la liste - return $this->redirectToRoute(str_replace('_admin_', '_'.$access.'_', $this->route), ['inframe' => $inframe]); - } - - // Affichage du formulaire - return $this->render($this->twig.'edit.html.twig', [ - 'useheader' => !$inframe, - 'usemenu' => false, - 'usesidebar' => ('admin' == $access && !$inframe), - 'access' => $access, - $this->data => $data, - 'mode' => 'update', - 'form' => $form->createView(), - 'refresh' => false, - 'inframe' => $inframe, - 'issystem' => (0 === stripos($data->getLabel(), 'icon/icon_')), - ]); - } - - public function delete($id, $access, Request $request, ManagerRegistry $em): Response - { - $inframe = $request->get('inframe'); - - // Récupération de l'enregistrement courant - $data = $em->getRepository($this->entity)->find($id); - if (!$data) { - throw $this->createNotFoundException('Unable to find entity.'); - } - - // Vérifier que cet enregistrement est supprimable - if (0 === stripos($data->getLabel(), 'icon/icon_')) { - return $this->redirectToRoute(str_replace('_admin_', '_'.$access.'_', $this->route).'_update', ['id' => $id, 'inframe' => $inframe]); - } - - // Tentative de suppression - try { - $em->getManager()->remove($data); - $em->getManager()->flush(); - } catch (\Exception $e) { - $request->getSession()->getFlashBag()->add('error', $e->getMessage()); - - return $this->redirectToRoute(str_replace('_admin_', '_'.$access.'_', $this->route).'_update', ['id' => $id, 'inframe' => $inframe]); - } - - return $this->redirectToRoute(str_replace('_admin_', '_'.$access.'_', $this->route), ['inframe' => $inframe]); - } - - public function select($access, Request $request, ManagerRegistry $em): Response - { - // Affichage du formulaire - $icons = $em->getRepository($this->entity)->findBy(['user' => null], ['label' => 'ASC']); - $iconsuser = null; - if ('all' == $access) { - $iconsuser = $em->getRepository($this->entity)->findBy(['user' => $this->getUser()], ['label' => 'ASC']); - } - - return $this->render($this->twig.'select.html.twig', [ - 'useheader' => false, - 'usemenu' => false, - 'usesidebar' => false, - 'access' => $access, - $this->data.'s' => $icons, - 'iconsuser' => $iconsuser, - ]); - } - - public function upload($access): Response - { - return $this->render($this->twig.'upload.html.twig', [ - 'useheader' => false, - 'usemenu' => false, - 'usesidebar' => false, - ]); - } -} diff --git a/src/Controller/ItemController.php b/src/Controller/ItemController.php deleted file mode 100644 index 4e71526..0000000 --- a/src/Controller/ItemController.php +++ /dev/null @@ -1,160 +0,0 @@ -getRepository('App\Entity\Itemcategory')->findBy([], ['rowOrder' => 'asc']); - $groups = $em->getRepository('App\Entity\Group')->findBy([], ['label' => 'asc']); - - return $this->render($this->twig.'list.html.twig', [ - 'useheader' => true, - 'usemenu' => false, - 'usesidebar' => true, - 'access' => $access, - 'itemcategorys' => $itemcategorys, - 'groups' => $groups, - ]); - } - - public function submit($access, Request $request, ManagerRegistry $em): Response - { - // Initialisation de l'enregistrement - $data = new Item(); - - // Création du formulaire - $form = $this->createForm(ItemType::class, $data, ['mode' => 'submit', 'access' => $access]); - - // Récupération des data du formulaire - $form->handleRequest($request); - - // Sur validation - if ($form->get('submit')->isClicked() && $form->isValid()) { - $data = $form->getData(); - - $idicon = $form->get('idicon')->getData(); - $icon = $em->getRepository('App\Entity\Icon')->findoneby(['id' => $idicon]); - $data->setIcon($icon); - - // Sauvegarde - $em->getManager()->persist($data); - $em->getManager()->flush(); - - // Retour à la liste - return $this->redirectToRoute(str_replace('_admin_', '_'.$access.'_', $this->route)); - } - - // Affichage du formulaire - return $this->render($this->twig.'edit.html.twig', [ - 'useheader' => true, - 'usemenu' => false, - 'usesidebar' => true, - 'access' => $access, - $this->data => $data, - 'mode' => 'submit', - 'icons' => $em->getRepository('App\Entity\Icon')->findAll(), - 'form' => $form->createView(), - ]); - } - - public function update($id, $access, Request $request, ManagerRegistry $em): Response - { - // Initialisation de l'enregistrement - $data = $em->getRepository($this->entity)->find($id); - if (!$data) { - throw $this->createNotFoundException('Unable to find entity.'); - } - - // Création du formulaire - $form = $this->createForm(ItemType::class, $data, ['mode' => 'update', 'access' => $access, 'idicon' => ($data->getIcon() ? $data->getIcon()->getId() : null)]); - - // Récupération des data du formulaire - $form->handleRequest($request); - - // Sur validation - if ($form->get('submit')->isClicked() && $form->isValid()) { - $data = $form->getData(); - - $idicon = $form->get('idicon')->getData(); - $icon = $em->getRepository('App\Entity\Icon')->findoneby(['id' => $idicon]); - $data->setIcon($icon); - - // Sauvegarde - $em->getManager()->flush(); - - // Retour à la liste - return $this->redirectToRoute(str_replace('_admin_', '_'.$access.'_', $this->route)); - } - - // Affichage du formulaire - return $this->render($this->twig.'edit.html.twig', [ - 'useheader' => true, - 'usemenu' => false, - 'usesidebar' => true, - 'access' => $access, - $this->data => $data, - 'mode' => 'update', - 'icons' => $em->getRepository('App\Entity\Icon')->findAll(), - 'form' => $form->createView(), - ]); - } - - public function delete($id, $access, Request $request, ManagerRegistry $em): Response - { - // Initialisation de l'enregistrement - $data = $em->getRepository($this->entity)->find($id); - if (!$data) { - throw $this->createNotFoundException('Unable to find entity.'); - } - - // Tentative de suppression - try { - $em->getManager()->remove($data); - $em->getManager()->flush(); - } catch (\Exception $e) { - $request->getSession()->getFlashBag()->add('error', $e->getMessage()); - - return $this->redirectToRoute(str_replace('_admin_', '_'.$access.'_', $this->route).'_update', ['id' => $id]); - } - - return $this->redirectToRoute(str_replace('_admin_', '_'.$access.'_', $this->route)); - } - - public function order($access, Request $request, ManagerRegistry $em): Response - { - $output = []; - $id = $request->request->get('id'); - $categoryid = $request->request->get('categoryid'); - $order = $request->request->get('order'); - - $data = $em->getRepository($this->entity)->find($id); - if (!$data) { - throw $this->createNotFoundException('Unable to find entity.'); - } - - $data->setRoworder($order); - $itemcategory = $em->getRepository("App\Entity\Itemcategory")->find($categoryid); - if ($itemcategory) { - $data->setItemcategory($itemcategory); - } - - $em->getManager()->flush(); - - return new JsonResponse($output); - } -} diff --git a/src/Controller/ItemcategoryController.php b/src/Controller/ItemcategoryController.php deleted file mode 100644 index 91342db..0000000 --- a/src/Controller/ItemcategoryController.php +++ /dev/null @@ -1,129 +0,0 @@ -createForm(ItemcategoryType::class, $data, ['mode' => 'submit', 'access' => $access]); - - // Récupération des data du formulaire - $form->handleRequest($request); - - // Sur validation - if ($form->get('submit')->isClicked() && $form->isValid()) { - $data = $form->getData(); - - // Sauvegarde - $em->getManager()->persist($data); - $em->getManager()->flush(); - - // Retour à la liste - return $this->redirectToRoute(str_replace('_admin_', '_'.$access.'_', 'app_admin_item')); - } - - // Affichage du formulaire - return $this->render($this->twig.'edit.html.twig', [ - 'useheader' => true, - 'usemenu' => false, - 'usesidebar' => true, - 'access' => $access, - $this->data => $data, - 'mode' => 'submit', - 'form' => $form->createView(), - ]); - } - - public function update($id, $access, Request $request, ManagerRegistry $em): Response - { - // Initialisation de l'enregistrement - $data = $em->getRepository($this->entity)->find($id); - if (!$data) { - throw $this->createNotFoundException('Unable to find entity.'); - } - - // Création du formulaire - $form = $this->createForm(ItemcategoryType::class, $data, ['mode' => 'update']); - - // Récupération des data du formulaire - $form->handleRequest($request); - - // Sur validation - if ($form->get('submit')->isClicked() && $form->isValid()) { - $data = $form->getData(); - - // Sauvegarde - $em->getManager()->flush(); - - // Retour à la liste - return $this->redirectToRoute(str_replace('_admin_', '_'.$access.'_', 'app_admin_item')); - } - - // Affichage du formulaire - return $this->render($this->twig.'edit.html.twig', [ - 'useheader' => true, - 'usemenu' => false, - 'usesidebar' => true, - 'access' => $access, - $this->data => $data, - 'mode' => 'update', - 'form' => $form->createView(), - ]); - } - - public function delete($id, $access, Request $request, ManagerRegistry $em): Response - { - // Initialisation de l'enregistrement - $data = $em->getRepository($this->entity)->find($id); - if (!$data) { - throw $this->createNotFoundException('Unable to find entity.'); - } - - // Tentative de suppression - try { - $em->getManager()->remove($data); - $em->getManager()->flush(); - } catch (\Exception $e) { - $request->getSession()->getFlashBag()->add('error', $e->getMessage()); - - return $this->redirectToRoute($this->route.'_update', ['id' => $id]); - } - - return $this->redirectToRoute(str_replace('_admin_', '_'.$access.'_', 'app_admin_item')); - } - - public function order($access, Request $request, ManagerRegistry $em): Response - { - $output = []; - $id = $request->request->get('id'); - $order = $request->request->get('order'); - - $data = $em->getRepository($this->entity)->find($id); - if (!$data) { - throw $this->createNotFoundException('Unable to find entity.'); - } - - $data->setRoworder($order); - $em->getManager()->flush(); - - return new JsonResponse($output); - } -} diff --git a/src/Controller/MenuController.php b/src/Controller/MenuController.php new file mode 100644 index 0000000..2c87c91 --- /dev/null +++ b/src/Controller/MenuController.php @@ -0,0 +1,192 @@ +render($this->render.'home.html.twig', [ + 'useheader' => true, + 'usesidebar' => false, + 'usemonocolor' => true, + ]); + } + + public function list(ManagerRegistry $em) + { + // Récupérer les menus + $datas = $em->getRepository($this->entity)->findAll(); + + return $this->render($this->render.'list.html.twig', [ + $this->data.'s' => $datas, + 'useheader' => true, + 'usesidebar' => true, + ]); + } + + public function submit($id, Request $request, ManagerRegistry $em) + { + // Initialisation de l'enregistrement + $menu = $em->getRepository($this->entity)->find($id); + + // Initialisation de l'enregistrement + $data = new Menuchild(); + $data->setMenu($menu); + $data->setRoworder(0); + + // Création du formulaire + $form = $this->createForm(Form::class, $data, ['mode' => 'submit']); + + // Récupération des data du formulaire + $form->handleRequest($request); + + // Sur erreur + $this->getErrorForm(null, $form, $request, $data, 'submit'); + + // Sur validation + if ($form->get('submit')->isClicked() && $form->isValid()) { + $data = $form->getData(); + $error=false; + switch($data->getChildtype()) { + case "blog": + $error=(!$data->getBlog()); + break; + case "blogtype": + $error=(!$data->getBlogtype()); + break; + case "page": + $error=(!$data->getPage()); + break; + case "pagetype": + $error=(!$data->getPagetype()); + break; + } + + if(!$error) { + $em->getManager()->persist($data); + $em->getManager()->flush(); + + // Retour à la liste + return $this->redirectToRoute($this->route); + } + } + + // Affichage du formulaire + return $this->render($this->render.'edit.html.twig', [ + 'useheader' => true, + 'usesidebar' => true, + $this->data => $data, + 'mode' => 'submit', + 'form' => $form->createView(), + ]); + } + + public function update($id, Request $request, ManagerRegistry $em) + { + // Initialisation de l'enregistrement + $data = $em->getRepository($this->entity)->find($id); + + // Création du formulaire + $form = $this->createForm(Form::class, $data, ['mode' => 'update']); + + // Récupération des data du formulaire + $form->handleRequest($request); + + // Sur erreur + $this->getErrorForm(null, $form, $request, $data, 'update'); + + // Sur validation + if ($form->get('submit')->isClicked() && $form->isValid()) { + $data = $form->getData(); + $em->getManager()->flush(); + + // Retour à la liste + return $this->redirectToRoute($this->route); + } + + // Affichage du formulaire + return $this->render($this->render.'edit.html.twig', [ + 'useheader' => true, + 'usesidebar' => true, + $this->data => $data, + 'mode' => 'update', + 'form' => $form->createView(), + ]); + } + + public function delete($id, Request $request, ManagerRegistry $em) + { + // Initialisation de l'enregistrement + $data = $em->getRepository("App\Entity\Menuchild")->find($id); + + try { + $em->getManager()->remove($data); + $em->getManager()->flush(); + } catch (\Exception $e) { + $request->getSession()->getFlashBag()->add('error', $e->getMessage()); + + return $this->redirectToRoute($this->route); + } + + return $this->redirectToRoute($this->route); + } + + public function upload() + { + return $this->render($this->render.'upload.html.twig'); + } + + public function view($id, Request $request, ManagerRegistry $em) + { + $data = $em->getRepository($this->entity)->find($id); + if (!$data) { + throw $this->createNotFoundException('Not exist'); + } + + return $this->render($this->render.'view.html.twig', [ + 'useheader' => false, + 'usesidebar' => false, + $this->data => $data, + ]); + } + + public function order($id,$order,Request $request, ManagerRegistry $em) + { + $data = $em->getRepository("App\Entity\Menuchild")->find($id); + $data->setRoworder($order); + $em->getManager()->flush(); + + return new JsonResponse(); + } + + protected function getErrorForm($id, $form, $request, $data, $mode) + { + if ($form->get('submit')->isClicked() && 'delete' == $mode) { + } + + if ($form->get('submit')->isClicked() && 'submit' == $mode) { + } + + if ($form->get('submit')->isClicked() && !$form->isValid()) { + $this->get('session')->getFlashBag()->clear(); + + $errors = $form->getErrors(); + foreach ($errors as $error) { + $request->getSession()->getFlashBag()->add('error', $error->getMessage()); + } + } + } +} diff --git a/src/Controller/MinioController.php b/src/Controller/MinioController.php index 36fada7..596657f 100755 --- a/src/Controller/MinioController.php +++ b/src/Controller/MinioController.php @@ -8,6 +8,7 @@ use Symfony\Bundle\FrameworkBundle\Controller\AbstractController; use Symfony\Component\HttpFoundation\BinaryFileResponse; use Symfony\Component\HttpFoundation\Request; use Symfony\Component\HttpFoundation\Response; +use Symfony\Component\HttpFoundation\ResponseHeaderBag; use Symfony\Component\HttpKernel\KernelInterface; class MinioController extends AbstractController @@ -64,11 +65,34 @@ class MinioController extends AbstractController return $this->returnminio($file, $em); } - public function document(Request $request, ManagerRegistry $em) + public function show(Request $request, ManagerRegistry $em): Response { $file = $request->query->get('file'); + $tmpfile = $this->minio->download($file, basename($file)); + if (str_starts_with(mime_content_type($tmpfile), 'image/') || 'application/pdf' == mime_content_type($tmpfile) || 'text/plain' == mime_content_type($tmpfile)) { + $response = new BinaryFileResponse($tmpfile); + $response->headers->set('Content-Type', mime_content_type($tmpfile)); + } else { + $response = new BinaryFileResponse($tmpfile); + $response->setContentDisposition(ResponseHeaderBag::DISPOSITION_ATTACHMENT, basename($file)); + } - return $this->returnminio($file, $em); + return $response; + } + + public function download(Request $request, ManagerRegistry $em): Response + { + $file = $request->query->get('file'); + // C'est une url = on affiche l'url + if (0 === stripos($file, 'http')) { + $tmpfile = $file; + } else { + $tmpfile = $this->minio->download($file, basename($file)); + } + $response = new BinaryFileResponse($tmpfile); + $response->setContentDisposition(ResponseHeaderBag::DISPOSITION_ATTACHMENT, basename($file)); + + return $response; } private function returnminio($file, $em) @@ -78,6 +102,7 @@ class MinioController extends AbstractController case 'avatar/noavatar.png': case 'avatar/system.jpg': case 'header/header.jpg': + case 'header/body.jpg': case 'logo/logo.png': $file = 'medias/'.$file; $filePath = $file; diff --git a/src/Controller/PageController.php b/src/Controller/PageController.php index 13460b8..e0d3b95 100644 --- a/src/Controller/PageController.php +++ b/src/Controller/PageController.php @@ -2,547 +2,174 @@ namespace App\Controller; -use App\Entity\Page; -use App\Form\PageSubmitType; -use App\Form\PageUpdateEditorType; -use App\Form\PageUpdateToolType; -use App\Form\PageUpdateURLType; -use App\Form\PageUpdateWidgetType; +use App\Entity\Page as Entity; +use App\Form\PageType as Form; use Doctrine\Persistence\ManagerRegistry; use Symfony\Bundle\FrameworkBundle\Controller\AbstractController; -use Symfony\Component\Form\FormError; use Symfony\Component\HttpFoundation\JsonResponse; use Symfony\Component\HttpFoundation\Request; -use Symfony\Component\HttpFoundation\Response; class PageController extends AbstractController { private $data = 'page'; - private $entity = "App\Entity\Page"; - private $twig = 'Page/'; - private $route = 'app_admin_page_usage'; + private $route = 'app_page'; + private $render = 'Page/'; + private $entity = 'App\Entity\Page'; - public function list($access, $usage) + public function list(ManagerRegistry $em) { - return $this->render($this->twig.'list.html.twig', [ + // Récupérer les pages + $datas = $em->getRepository($this->entity)->findAll(); + + return $this->render($this->render.'list.html.twig', [ + $this->data.'s' => $datas, 'useheader' => true, - 'usemenu' => false, 'usesidebar' => true, - 'access' => $access, - 'usage' => $usage, - 'istemplate' => false, ]); } - public function tablelist($access, $usage, Request $request, ManagerRegistry $em): Response + public function submit(Request $request, ManagerRegistry $em) { - $query = $request->query->all(); - $start = $query['start']; - $length = $query['length']; - $search = $query['search']; - $draw = $query['draw']; - $ordercolumn = $query['order'][0]['column']; - $orderdir = $query['order'][0]['dir']; - $alluser = $query['alluser']; + // Initialisation de l'enregistrement + $data = new Entity(); - // On sauvegarde en session le flag alluser - $request->getSession()->set('alluserpage', $alluser); + // Création du formulaire + $form = $this->createForm(Form::class, $data, ['mode' => 'submit']); - // Query de base - $qbase = $em->getManager()->createQueryBuilder()->from($this->entity, 'table'); - $qsearch = $em->getManager()->createQueryBuilder()->from($this->entity, 'table'); - - if ('false' == $alluser) { - $qbase->where('table.user is null'); - $qbase->andWhere('table.parentfor is null'); - $qsearch->where('table.user is null'); - $qsearch->andWhere('table.parentfor is null'); - } else { - $qbase->from('App:User', 'user') - ->where('table.user=user'); - - $qsearch->from('App:User', 'user') - ->where('table.user=user'); - } - - if ('false' == $alluser) { - $qsearch->andwhere('table.id LIKE :value OR table.name LIKE :value'); - } else { - $qsearch->andWhere('table.id LIKE :value OR table.name LIKE :value OR user.username LIKE :value'); - } - - $qsearch->setParameter('value', '%'.$search['value'].'%'); - - // Nombre total d'enregistrement - $total = $qbase->select('COUNT(table)')->getQuery()->getSingleScalarResult(); - - // Nombre d'enregistrement filtré - if ('' == $search['value']) { - $totalf = $total; - } else { - $totalf = $qsearch->select('COUNT(table)')->getQuery()->getSingleScalarResult(); - } - - // Parcours des Enregistrement - if ('' == $search['value']) { - $qb = $qbase->select('table'); - } else { - $qb = $qsearch->select('table'); - } - - // Order - if ($ordercolumn) { - switch ($ordercolumn) { - case 1: - $qb->orderBy('table.roworder', $orderdir); - break; - case 2: - $qb->orderBy('table.name', $orderdir); - break; - case 4: - if ('true' == $alluser) { - $qb->orderBy('user.username', $orderdir); - } - break; - } - } - - // Execution de la requete d'affichage - $datas = $qb->setFirstResult($start)->setMaxResults($length)->getQuery()->getResult(); - - // Construction du tableau de retour - $output = [ - 'draw' => $draw, - 'recordsFiltered' => $totalf, - 'recordsTotal' => $total, - 'data' => [], - ]; - foreach ($datas as $data) { - $route = str_replace('_admin_', '_'.$access.'_', $this->route); - $route = str_replace('_usage', '_'.$usage, $route); - - $action = ''; - // $action.="$data->getId()))."'>"; - $action .= " $data->getId()])."'>"; - $action .= " $data->getId()])."'>"; - $action .= " $data->getId()])."' data-method='delete'>"; - - $user = ''; - if ($data->getUser()) { - $user .= " 'avatar/'.$data->getUser()->getAvatar()])."' class='avatar' style='margin:0px 5px 0px 0px;display:inline-block;'>"; - $user .= $data->getUser()->getUsername(); - } - - $icon = ''; - if ($data->getFonticon()) { - $icon .= " "; - } - - array_push($output['data'], [ - $action, - $data->getRoworder(), - $icon.$data->getName(), - $data->getPagecategory()->getName(), - $user, - ]); - } - - // Retour - return new Response(json_encode($output), 200); - } - - private function entityForm(Page $entity, $access, $em) - { - $route = str_replace('_admin_', '_'.$access.'_', $this->route); - - if ($em->getManager()->contains($entity)) { - // Type Tools - if ($entity->getPagecategory()->getId() < 0) { - return $this->createForm(PageUpdateToolType::class, $entity, [ - 'mode' => 'update', - 'access' => $access, - ]); - } - - // Type URL - if (1 == $entity->getPagecategory()->getId()) { - return $this->createForm(PageUpdateURLType::class, $entity, [ - 'mode' => 'update', - 'access' => $access, - ]); - } - - // Type Widget - elseif (2 == $entity->getPagecategory()->getId()) { - return $this->createForm(PageUpdateWidgetType::class, $entity, [ - 'mode' => 'update', - 'access' => $access, - ]); - } - - // Type Editeur - elseif (3 == $entity->getPagecategory()->getId()) { - return $this->createForm(PageUpdateEditorType::class, $entity, [ - 'mode' => 'update', - 'access' => $access, - ]); - } - } else { - return $this->createForm(PageSubmitType::class, $entity, [ - 'mode' => 'update', - 'access' => $access, - 'user' => $this->getUser(), - ]); - } - } - - public function submit($access, $usage, Request $request, ManagerRegistry $em): Response - { - $entity = new Page(); - $entity->setMaxwidth(0); - $entity->setRoworder(0); - - $form = $this->entityForm($entity, $access, $em); + // Récupération des data du formulaire $form->handleRequest($request); - // Une page d'usage groupe doit avoir au moins un group de selectionné - $datausage = $form->get('usage')->getData(); - if ('group' == $datausage && $entity->getGroups()->isEmpty()) { - $form->addError(new FormError('Vous devez selectionner au minimum un groupe')); - } + // Sur erreur + $this->getErrorForm(null, $form, $request, $data, 'submit'); // Sur validation if ($form->get('submit')->isClicked() && $form->isValid()) { - if ('all' == $access) { - $entity->setUser($this->getUser()); - } + $data = $form->getData(); - // Si template on duplique le template - if ($entity->getPage()) { - $page = $em->getRepository("App\Entity\Page")->clonePage($this->getUser(), $entity->getPage()); - $page->setName($entity->getName()); - $page->setRoworder($entity->getRoworder()); - $page->setMaxwidth($entity->getMaxwidth()); - foreach ($entity->getGroups() as $group) { - $page->addGroup($group); - } - $em->getManager()->persist($page); - $em->getManager()->flush(); - $route = str_replace('_admin_', '_'.$access.'_', $this->route); - $route = str_replace('_usage', '_'.$usage, $route); + $em->getManager()->persist($data); + $em->getManager()->flush(); - return $this->redirect($this->generateUrl($route.'_update', ['id' => $page->getId()])); - } else { - $em->getManager()->persist($entity); - $em->getManager()->flush(); - $route = str_replace('_admin_', '_'.$access.'_', $this->route); - $route = str_replace('_usage', '_'.$usage, $route); - - return $this->redirect($this->generateUrl($route.'_update', ['id' => $entity->getId()])); - } + // Retour à la liste + return $this->redirectToRoute('app_child', ['catparent' => 'page', 'idparent' => $data->getId()]); } - return $this->render($this->twig.'submit.html.twig', [ + // Affichage du formulaire + return $this->render($this->render.'edit.html.twig', [ 'useheader' => true, - 'usemenu' => false, - 'usesidebar' => ('admin' == $access), - 'maxwidth' => ('user' == $access), - $this->data => $entity, + 'usesidebar' => true, + $this->data => $data, 'mode' => 'submit', - 'usage' => $usage, - 'access' => $access, 'form' => $form->createView(), + 'from' => 'page', ]); } - public function update($id, $access, $usage, Request $request, ManagerRegistry $em): Response + public function update($id, Request $request, ManagerRegistry $em) { - $entity = $em->getRepository($this->entity)->find($id); - - if (!$entity) { - throw $this->createNotFoundException('Unable to find entity.'); - } - - // On s'assure que l'utilisateur à la permission de modifier - if ('all' == $access) { - $em->getRepository($this->entity)->getPermission($this->getUser(), $entity, $cansee, $canupdate, $canadd); - if (!$canupdate) { - throw $this->createAccessDeniedException('Permission denied'); - } - } + // Initialisation de l'enregistrement + $data = $em->getRepository($this->entity)->find($id); + $from = $request->get('from'); // Création du formulaire - $form = $this->entityForm($entity, $access, $em); + $form = $this->createForm(Form::class, $data, ['mode' => 'update']); + + // Récupération des data du formulaire $form->handleRequest($request); + // Sur erreur + $this->getErrorForm(null, $form, $request, $data, 'update'); + + // Sur validation if ($form->get('submit')->isClicked() && $form->isValid()) { + $data = $form->getData(); $em->getManager()->flush(); - if ('admin' == $access) { - $route = str_replace('_admin_', '_'.$access.'_', $this->route); - $route = str_replace('_usage', '_'.$usage, $route); - - return $this->redirect($this->generateUrl($route.'_view', ['id' => $id])); + // Retour à la liste + if ('child' == $from) { + return $this->redirectToRoute('app_child', ['catparent' => 'page', 'idparent' => $data->getId()]); } else { - return $this->redirect($this->generateUrl('app_home', ['id' => $id])); + return $this->redirectToRoute($this->route); } } - // Type URL - if (1 == $entity->getPagecategory()->getId()) { - return $this->render($this->twig.'updateurl.html.twig', [ - 'useheader' => true, - 'usemenu' => false, - 'usesidebar' => ('admin' == $access), - 'maxwidth' => ('all' == $access), - $this->data => $entity, - 'access' => $access, - 'usage' => $usage, - 'mode' => 'update', - 'form' => $form->createView(), - ]); - } - // Type Widget - elseif (2 == $entity->getPagecategory()->getId()) { - return $this->render($this->twig.'updatewidget.html.twig', [ - 'useheader' => true, - 'usemenu' => false, - 'usesidebar' => ('admin' == $access), - 'maxwidth' => ('all' == $access), - $this->data => $entity, - 'access' => $access, - 'mode' => 'update', - 'usage' => $usage, - 'form' => $form->createView(), - ]); - } - // Type Editeur - elseif (3 == $entity->getPagecategory()->getId()) { - return $this->render($this->twig.'updateeditor.html.twig', [ - 'useheader' => true, - 'usemenu' => false, - 'usesidebar' => ('admin' == $access), - 'maxwidth' => ('all' == $access), - $this->data => $entity, - 'access' => $access, - 'usage' => $usage, - 'mode' => 'update', - 'form' => $form->createView(), - ]); - } + // Affichage du formulaire + return $this->render($this->render.'edit.html.twig', [ + 'useheader' => true, + 'usesidebar' => true, + $this->data => $data, + 'mode' => 'update', + 'form' => $form->createView(), + 'from' => $from, + ]); } - public function delete($id, $access, $usage, Request $request, ManagerRegistry $em): Response + public function delete($id, Request $request, ManagerRegistry $em) { + // Initialisation de l'enregistrement $data = $em->getRepository($this->entity)->find($id); - if (!$data) { - throw $this->createNotFoundException('Unable to find entity.'); - } - // On s'assure que l'utilisateur à la permission de supprimer - if ('all' == $access) { - $em->getRepository($this->entity)->getPermission($this->getUser(), $data, $cansee, $canupdate, $canadd); - if (!$canupdate) { - throw $this->createAccessDeniedException('Permission denied'); - } - } - - // Tentative de suppression try { $em->getManager()->remove($data); $em->getManager()->flush(); } catch (\Exception $e) { $request->getSession()->getFlashBag()->add('error', $e->getMessage()); - return $this->redirectToRoute(str_replace('_admin_', '_'.$access.'_', $this->route).'_update', ['id' => $id]); + return $this->redirectToRoute($this->route.'_update', ['id' => $id]); } - // Retour - if ('admin' == $access) { - $route = str_replace('_admin_', '_'.$access.'_', $this->route); - $route = str_replace('_usage', '_'.$usage, $route); - - return $this->redirect($this->generateUrl($route)); - } else { - return $this->redirect($this->generateUrl('app_home')); - } + return $this->redirectToRoute($this->route); } - public function order($access, Request $request, ManagerRegistry $em): Response + public function home(ManagerRegistry $em) { - $output = []; - $id = $request->request->get('id'); - $order = $request->request->get('order'); + $heros = $em->getRepository($this->entity)->findBy(['ishead' => true], ['submitdate' => 'DESC']); + $pages = $em->getRepository($this->entity)->findBy([], ['submitdate' => 'DESC']); - $entity = $em->getRepository($this->entity)->find($id); - if (!$entity) { - throw $this->createNotFoundException('Unable to find entity.'); - } - - // On s'assure que l'utilisateur à la permission - if ('all' == $access) { - $em->getRepository($this->entity)->getPermission($this->getUser(), $entity, $cansee, $canupdate, $canadd); - if (!$canupdate) { - throw $this->createAccessDeniedException('Permission denied'); - } - } - - $entity->setRoworder($order); - $em->getManager()->flush(); - - return new JsonResponse($output); - } - - public function view($id, $access, $usage, Request $request, ManagerRegistry $em): Response - { - $entity = $em->getRepository($this->entity)->find($id); - if (!$entity) { - return $this->redirect($this->generateUrl('app_home')); - } - - // Permissions - if ('admin' == $access) { - $canupdate = true; - } else { - // On s'assure que l'utilisateur à la permission de voir - $em->getRepository($this->entity)->getPermission($this->getUser(), $entity, $cansee, $canupdate, $canadd); - if (!$cansee) { - return $this->redirect($this->generateUrl('app_home')); - } - } - - // Type Calendrier - if (-100 == $entity->getPageCategory()->getId()) { - $entity->setUrl($this->generateUrl('app_user_calendar_view')); - - return $this->render($this->twig.'viewurl.html.twig', [ - 'useheader' => ('admin' == $access), - 'usemenu' => ('admin' == $access), - 'usesidebar' => ('admin' == $access), - $this->data => $entity, - 'access' => $access, - 'canupdate' => $canupdate, - 'usage' => $usage, - ]); - } - - // Type Blob - if (-90 == $entity->getPageCategory()->getId()) { - $entity->setUrl($this->generateUrl('app_user_blog_view')); - - return $this->render($this->twig.'viewurl.html.twig', [ - 'useheader' => ('admin' == $access), - 'usemenu' => ('admin' == $access), - 'usesidebar' => ('admin' == $access), - $this->data => $entity, - 'access' => $access, - 'canupdate' => $canupdate, - 'usage' => $usage, - ]); - } - - // Type URL - if (1 == $entity->getPageCategory()->getId()) { - return $this->render($this->twig.'viewurl.html.twig', [ - 'useheader' => ('admin' == $access), - 'usemenu' => ('admin' == $access), - 'usesidebar' => ('admin' == $access), - $this->data => $entity, - 'access' => $access, - 'canupdate' => $canupdate, - 'usage' => $usage, - ]); - } - - // Type Widgets - if (2 == $entity->getPageCategory()->getId()) { - return $this->render($this->twig.'viewwidget.html.twig', [ - 'useheader' => ('admin' == $access), - 'usemenu' => ('admin' == $access), - 'usesidebar' => ('admin' == $access), - $this->data => $entity, - 'access' => $access, - 'canupdate' => $canupdate, - 'widgets' => $em->getRepository("App\Entity\Widget")->getWidgetAccess($access, 'config'), - 'usage' => "$usage", - ]); - } - // Type Editeur - if (3 == $entity->getPageCategory()->getId()) { - return $this->render($this->twig.'vieweditor.html.twig', [ - 'useheader' => ('config' == $access), - 'usemenu' => ('admin' == $access), - 'usesidebar' => ('config' == $access), - $this->data => $entity, - 'access' => $access, - 'canupdate' => $canupdate, - 'usage' => $usage, - ]); - } - } - - public function application($access, Request $request, ManagerRegistry $em): Response - { - $entity = $em->getRepository($this->entity)->findOneBy(['parentfor' => 'app']); - if (!$entity) { - return $this->redirect($this->generateUrl('app_home')); - } - - $canupdate = false; - - return $this->render($this->twig.'viewwidget.html.twig', [ - 'useheader' => ('admin' == $access), - 'usemenu' => false, - 'usesidebar' => ('admin' == $access), - $this->data => $entity, - 'access' => $access, - 'canupdate' => $canupdate, - 'mode' => 'view', - 'widgets' => $em->getRepository('App\Entity\Widget')->getWidgetAccess($access, 'config'), - 'usage' => 'portal', - 'selwidget' => null, + return $this->render($this->render.'home.html.twig', [ + 'useheader' => true, + 'usesidebar' => false, + 'heros' => $heros, + 'pages' => $pages, ]); } - protected function getPreference($user, $key, $id, $default) + public function select(Request $request, ManagerRegistry $em) { - $preference = $user->getPreference(); - $return = $default; + $output = []; + $page_limit = $request->query->get('page_limit'); + $q = $request->query->get('q'); - if (is_array($preference)) { - if (array_key_exists($key, $preference)) { - if (array_key_exists($id, $preference[$key])) { - $return = $preference[$key][$id]; - } - } + $qb = $em->getManager()->createQueryBuilder(); + $qb->select('table')->from($this->entity, 'table') + ->where('table.name LIKE :value') + ->setParameter('value', '%'.$q.'%') + ->orderBy('table.name'); + + $datas = $qb->setFirstResult(0)->setMaxResults($page_limit)->getQuery()->getResult(); + foreach ($datas as $data) { + array_push($output, ['id' => $data->getId(), 'text' => $data->getName()]); } - return $return; + $ret_string['results'] = $output; + + return new JsonResponse($ret_string); } - protected function setPreference($user, $key, $id, $value) + protected function getErrorForm($id, $form, $request, $data, $mode) { - $preference = $user->getPreference(); - $toupdate = false; - if (!array_key_exists($key, $preference)) { - $toupdate = true; - $preference[$key] = []; - } - if (!array_key_exists($id, $preference[$key])) { - $toupdate = true; - $preference[$key][$id] = $value; - } - if ($value && $preference[$key][$id] != $value) { - $toupdate = true; - $preference[$key][$id] = $value; + if ($form->get('submit')->isClicked() && 'delete' == $mode) { } - // Mise à jour des préferences - if ($toupdate) { - $em = $this->getDoctrine()->getManager(); - $user->setPreference($preference); - $em->persist($this->getUser()); - $em->flush(); + if ($form->get('submit')->isClicked() && ('submit' == $mode || 'update' == $mode)) { + } + + if ($form->get('submit')->isClicked() && !$form->isValid()) { + $this->get('session')->getFlashBag()->clear(); + + $errors = $form->getErrors(); + foreach ($errors as $error) { + $request->getSession()->getFlashBag()->add('error', $error->getMessage()); + } } } } diff --git a/src/Controller/PagetemplateController.php b/src/Controller/PagetemplateController.php deleted file mode 100644 index c4a5496..0000000 --- a/src/Controller/PagetemplateController.php +++ /dev/null @@ -1,286 +0,0 @@ -render($this->twig.'list.html.twig', [ - 'useheader' => true, - 'usemenu' => false, - 'usesidebar' => true, - 'access' => $access, - ]); - } - - public function tablelist($access, Request $request, ManagerRegistry $em): Response - { - $query = $request->query->all(); - $start = $query['start']; - $length = $query['length']; - $search = $query['search']; - $draw = $query['draw']; - $ordercolumn = $query['order'][0]['column']; - $orderdir = $query['order'][0]['dir']; - - // Query de base - $qbase = $em->getManager()->createQueryBuilder()->from($this->entity, 'table'); - $qsearch = $em->getManager()->createQueryBuilder()->from($this->entity, 'table'); - - $qbase->where('table.user is null'); - $qbase->andWhere('table.parentfor is not null'); - $qsearch->where('table.user is null'); - $qsearch->andWhere('table.parentfor is not null'); - $qsearch->andwhere('table.id LIKE :value OR table.name LIKE :value OR table.parentfor LIKE :value'); - $qsearch->setParameter('value', '%'.$search['value'].'%'); - - // Nombre total d'enregistrement - $total = $qbase->select('COUNT(table)')->getQuery()->getSingleScalarResult(); - - // Nombre d'enregistrement filtré - if ('' == $search['value']) { - $totalf = $total; - } else { - $totalf = $qsearch->select('COUNT(table)')->getQuery()->getSingleScalarResult(); - } - - // Parcours des Enregistrement - if ('' == $search['value']) { - $qb = $qbase->select('table'); - } else { - $qb = $qsearch->select('table'); - } - - // Order - if ($ordercolumn) { - switch ($ordercolumn) { - case 1: - $qb->orderBy('table.roworder', $orderdir); - break; - case 2: - $qb->orderBy('table.name', $orderdir); - break; - case 3: - $qb->orderBy('table.parentfor', $orderdir); - break; - } - } - - // Execution de la requete d'affichage - $datas = $qb->setFirstResult($start)->setMaxResults($length)->getQuery()->getResult(); - - // Construction du tableau de retour - $output = [ - 'draw' => $draw, - 'recordsFiltered' => $totalf, - 'recordsTotal' => $total, - 'data' => [], - ]; - foreach ($datas as $data) { - $route = str_replace('_admin_', '_'.$access.'_', $this->route); - $action = ''; - $action .= " $data->getId()])."'>"; - $action .= " $data->getId()])."'>"; - - array_push($output['data'], [ - $action, - $data->getRoworder(), - $data->getName(), - $data->getParentfor(), - ]); - } - - // Retour - return new Response(json_encode($output), 200); - } - - private function entityForm(Page $entity, $access, $em) - { - $route = str_replace('_admin_', '_'.$access.'_', $this->route); - - if ($em->getManager()->contains($entity)) { - return $this->createForm(PageUpdateWidgetType::class, $entity, [ - 'mode' => 'update', - 'access' => $access, - 'for' => $entity->getParentfor(), - ]); - } else { - return $this->createForm(PagetemplateSubmitType::class, $entity, [ - 'mode' => 'update', - 'access' => $access, - ]); - } - } - - public function submit($access, Request $request, ManagerRegistry $em): Response - { - $pagecategory = $em->getRepository("App\Entity\Pagecategory")->find(2); - $data = new Page(); - $data->setMaxwidth(0); - $data->setRoworder(0); - $data->setParentfor('user'); - $data->setPagecategory($pagecategory); - - $form = $this->entityForm($data, $access, $em); - $form->handleRequest($request); - - // Sur erreur - if ('app' == $data->getParentfor()) { - $tmp = $em->getRepository($this->entity)->findOneBy(['parentfor' => 'app']); - if ($tmp) { - $form->addError(new FormError("Il ne peut avoir qu'un seul template de type Application")); - } - } - - $data = $form->getData(); - - if ($form->get('submit')->isClicked() && $form->isValid()) { - // Sauvegarde - $em->getManager()->persist($data); - $em->getManager()->flush(); - - $route = str_replace('_admin_', '_'.$access.'_', $this->route); - - return $this->redirect($this->generateUrl($route.'_update', ['id' => $data->getId()])); - } - - return $this->render('Pagetemplate\submit.html.twig', [ - 'useheader' => true, - 'usemenu' => false, - 'usesidebar' => true, - $this->data => $data, - 'mode' => 'submit', - 'access' => $access, - 'usage' => 'template', - 'form' => $form->createView(), - ]); - } - - public function update($id, $access, Request $request, ManagerRegistry $em): Response - { - $data = $em->getRepository($this->entity)->find($id); - if (!$data) { - throw $this->createNotFoundException('Unable to find entity.'); - } - - // Création du formulaire - $form = $this->entityForm($data, $access, $em); - $form->handleRequest($request); - - if ($form->get('submit')->isClicked() && $form->isValid()) { - $em->getManager()->flush(); - $route = str_replace('_admin_', '_'.$access.'_', $this->route); - - return $this->redirect($this->generateUrl($route.'_view', ['id' => $id])); - } - - return $this->render('Page\updatewidget.html.twig', [ - 'useheader' => true, - 'usemenu' => false, - 'usesidebar' => true, - $this->data => $data, - 'access' => $access, - 'mode' => 'update', - 'usage' => 'template', - 'form' => $form->createView(), - ]); - } - - public function delete($id, $access, Request $request, ManagerRegistry $em): Response - { - $data = $em->getRepository($this->entity)->find($id); - if (!$data) { - throw $this->createNotFoundException('Unable to find entity.'); - } - - // On s'assure que l'utilisateur à la permission de supprimer - if ('all' == $access) { - $em->getRepository($this->entity)->getPermission($this->getUser(), $data, $cansee, $canupdate); - if (!$canupdate) { - throw $this->createAccessDeniedException('Permission denied'); - } - } - - // Tentative de suppression - try { - $group = $em->getRepository("App\Entity\Group")->findOneBy(['pagetemplate' => $data]); - if ($group) { - throw new \Exception('Impossible de supprimer ce modèle, il est utilisé par au moins un groupe'); - } - if ('app' == $data->getParentfor()) { - throw new \Exception('Vous ne pouvez pas supprimer un template de type Application'); - } - - $em->getManager()->remove($data); - $em->getManager()->flush(); - } catch (\Exception $e) { - $request->getSession()->getFlashBag()->add('error', $e->getMessage()); - - return $this->redirectToRoute(str_replace('_admin_', '_'.$access.'_', $this->route).'_update', ['id' => $id]); - } - - // Retour - return $this->redirect($this->generateUrl($this->route)); - } - - public function selectlist($access, Request $request, ManagerRegistry $em): Response - { - $output = []; - $page_limit = $request->query->get('page_limit'); - $q = $request->query->get('q'); - - $qb = $em->getManager()->createQueryBuilder(); - $qb->select('table')->from($this->entity, 'table') - ->where('table.name LIKE :value') - ->andWhere('table.parentfor is not null') - ->setParameter('value', '%'.$q.'%') - ->orderBy('table.name'); - - $datas = $qb->setFirstResult(0)->setMaxResults($page_limit)->getQuery()->getResult(); - foreach ($datas as $data) { - array_push($output, ['id' => $data->getId(), 'text' => $data->getName()]); - } - $ret_string['results'] = $output; - - return new JsonResponse($ret_string); - } - - public function view($id, $access, Request $request, ManagerRegistry $em): Response - { - $data = $em->getRepository($this->entity)->find($id); - if (!$data) { - throw $this->createNotFoundException('Unable to find entity.'); - } - - // Permissions - $canupdate = true; - - return $this->render('Page\viewwidget.html.twig', [ - 'useheader' => true, - 'usemenu' => true, - 'usesidebar' => true, - $this->data => $data, - 'access' => $access, - 'canupdate' => $canupdate, - 'usage' => 'template', - 'widgets' => $em->getRepository("App\Entity\Widget")->getWidgetAccess($access), - 'group' => '', - ]); - } -} diff --git a/src/Controller/PagetypeController.php b/src/Controller/PagetypeController.php new file mode 100644 index 0000000..c586d4a --- /dev/null +++ b/src/Controller/PagetypeController.php @@ -0,0 +1,174 @@ +getRepository($this->entity)->find($id); + + return $this->render($this->render.'home.html.twig', [ + 'useheader' => false, + 'usemenu' => true, + 'usesidebar' => false, + 'usemonocolor' => true, + $this->data => $data, + ]); + } + + public function list(ManagerRegistry $em) + { + // Récupérer les pagetypes + $datas = $em->getRepository($this->entity)->findAll(); + + return $this->render($this->render.'list.html.twig', [ + $this->data.'s' => $datas, + 'useheader' => true, + 'usesidebar' => true, + ]); + } + + public function submit(Request $request, ManagerRegistry $em) + { + // Initialisation de l'enregistrement + $data = new Entity(); + + // Création du formulaire + $form = $this->createForm(Form::class, $data, ['mode' => 'submit']); + + // Récupération des data du formulaire + $form->handleRequest($request); + + // Sur erreur + $this->getErrorForm(null, $form, $request, $data, 'submit'); + + // Sur validation + if ($form->get('submit')->isClicked() && $form->isValid()) { + $data = $form->getData(); + + $em->getManager()->persist($data); + $em->getManager()->flush(); + + // Retour à la liste + return $this->redirectToRoute($this->route); + } + + // Affichage du formulaire + return $this->render($this->render.'edit.html.twig', [ + 'useheader' => true, + 'usesidebar' => true, + $this->data => $data, + 'mode' => 'submit', + 'form' => $form->createView(), + ]); + } + + public function update($id, Request $request, ManagerRegistry $em) + { + // Initialisation de l'enregistrement + $data = $em->getRepository($this->entity)->find($id); + + // Création du formulaire + $form = $this->createForm(Form::class, $data, ['mode' => 'update']); + + // Récupération des data du formulaire + $form->handleRequest($request); + + // Sur erreur + $this->getErrorForm(null, $form, $request, $data, 'update'); + + // Sur validation + if ($form->get('submit')->isClicked() && $form->isValid()) { + $data = $form->getData(); + $em->getManager()->flush(); + + // Retour à la liste + return $this->redirectToRoute($this->route); + } + + // Affichage du formulaire + return $this->render($this->render.'edit.html.twig', [ + 'useheader' => true, + 'usesidebar' => true, + $this->data => $data, + 'mode' => 'update', + 'form' => $form->createView(), + ]); + } + + public function delete($id, Request $request, ManagerRegistry $em) + { + // Initialisation de l'enregistrement + $data = $em->getRepository($this->entity)->find($id); + + try { + $em->getManager()->remove($data); + $em->getManager()->flush(); + } catch (\Exception $e) { + $request->getSession()->getFlashBag()->add('error', $e->getMessage()); + + return $this->redirectToRoute($this->route.'_update', ['id' => $id]); + } + + return $this->redirectToRoute($this->route); + } + + public function upload() + { + return $this->render($this->render.'upload.html.twig'); + } + + + public function select(Request $request, ManagerRegistry $em) + { + $output = []; + $page_limit = $request->query->get('page_limit'); + $q = $request->query->get('q'); + + $qb = $em->getManager()->createQueryBuilder(); + $qb->select('table')->from($this->entity, 'table') + ->where('table.name LIKE :value') + ->setParameter('value', '%'.$q.'%') + ->orderBy('table.name'); + + $datas = $qb->setFirstResult(0)->setMaxResults($page_limit)->getQuery()->getResult(); + foreach ($datas as $data) { + array_push($output, ['id' => $data->getId(), 'text' => $data->getName()]); + } + + $ret_string['results'] = $output; + + return new JsonResponse($ret_string); + } + + protected function getErrorForm($id, $form, $request, $data, $mode) + { + if ($form->get('submit')->isClicked() && 'delete' == $mode) { + } + + if ($form->get('submit')->isClicked() && 'submit' == $mode) { + } + + if ($form->get('submit')->isClicked() && !$form->isValid()) { + $this->get('session')->getFlashBag()->clear(); + + $errors = $form->getErrors(); + foreach ($errors as $error) { + $request->getSession()->getFlashBag()->add('error', $error->getMessage()); + } + } + } +} diff --git a/src/Controller/PagewidgetController.php b/src/Controller/PagewidgetController.php deleted file mode 100644 index 4533064..0000000 --- a/src/Controller/PagewidgetController.php +++ /dev/null @@ -1,958 +0,0 @@ -minio = $minio; - } - - private function searchArray($array, $key, $value) - { - $results = []; - - if (is_array($array)) { - if (isset($array[$key]) && $array[$key] == $value) { - $results[] = $array; - } - - foreach ($array as $subarray) { - $results = array_merge($results, $this->searchArray($subarray, $key, $value)); - } - } - - return $results; - } - - private function entityForm(ManagerRegistry $em, Pagewidget $entity, $idpage, $id, $access) - { - if ($em->getManager()->contains($entity)) { - $widgettype = $em->getRepository('App\Entity\Pagewidget')->find($id)->getWidget(); - $params = $widgettype->getParameter(); - $values = $entity->getParameter(); - - foreach ($params['fields'] as $key => $param) { - $tmp = $this->searchArray($values, 'id', $param['id']); - if (is_array($tmp) && !empty($tmp)) { - $params['fields'][$key]['value'] = $tmp[0]['value']; - } else { - $params['fields'][$key]['value'] = $param['value']; - } - } - - return $this->createForm(PagewidgetType::class, $entity, [ - 'param' => $params, - 'mode' => 'update', - 'access' => $access, - 'idicon' => ($entity->getIcon() ? $entity->getIcon()->getId() : $widgettype->getIcon()->getId()), - 'method' => 'POST', - ]); - } else { - $widgettype = $em->getManager()->getRepository("App\Entity\Widget")->find($id); - $entity->setName($widgettype->getName()); - $entity->setHeight($widgettype->getHeight()); - $entity->setAutoajust($widgettype->isAutoajust()); - $entity->setBorder($widgettype->isBorder()); - $entity->setViewheader($widgettype->isViewheader()); - $entity->setColorheaderback($widgettype->getColorheaderback()); - $entity->setColorheaderfont($widgettype->getColorheaderfont()); - $entity->setColorbodyback($widgettype->getColorbodyback()); - $entity->setColorbodyfont($widgettype->getColorbodyfont()); - $entity->setIcon($widgettype->getIcon()); - $entity->setWidget($widgettype); - - $param = $widgettype->getParameter(); - - return $this->createForm(PagewidgetType::class, $entity, [ - 'param' => $param, - 'mode' => 'submit', - 'access' => $access, - 'idicon' => $widgettype->getIcon()->getId(), - 'method' => 'POST', - ]); - } - } - - public function submit($access, $idpage, $idwidgettype, Request $request, ManagerRegistry $em): Response - { - $usage = $request->query->get('usage'); - - $entity = new Pagewidget(); - $form = $this->entityForm($em, $entity, $idpage, $idwidgettype, $access, $usage); - $form->handleRequest($request); - - // On s'assure que la page où l'on souhaite insérer un widget est bien du bon type - $page = $em->getRepository("App\Entity\Page")->findoneby(['id' => $idpage]); - if (!$page) { - throw $this->createNotFoundException('Unable to find entity.'); - } - if (2 != $page->getPagecategory()->getId()) { - throw $this->createAccessDeniedException('Permission denied'); - } - - // Sur validation - if ($form->get('submit')->isClicked() && $form->isValid()) { - $idicon = $form->get('idicon')->getData(); - $icon = $em->getRepository('App\Entity\Icon')->findoneby(['id' => $idicon]); - $widgettype = $em->getRepository('App\Entity\Widget')->findoneby(['id' => $idwidgettype]); - - // Localisation par défaut en R1C1 - $entity->setLoc('R1C1'); - $entity->setRoworder('1'); - - // Rattachement icon / panel / widgettype - $entity->setIcon($icon); - $entity->setPage($page); - $entity->setWidget($widgettype); - - // Récupération des paramétres - $jsons = $widgettype->getParameter(); - $param = []; - $param['fields'] = []; - foreach ($jsons['fields'] as $field) { - $tmp = []; - $tmp['id'] = $field['id']; - $tmp['value'] = ('hidden' != $field['type'] ? $form->get($field['id'])->getData() : ''); - array_push($param['fields'], $tmp); - } - - $entity->setParameter($param); - - $em = $em->getManager(); - $em->persist($entity); - $em->flush(); - - return $this->redirect($this->generateUrl('app_'.$access.'_page_'.$usage.'_view', ['id' => $idpage])); - } - - $icons = $em->getRepository('App\Entity\Icon')->findBy(['user' => null]); - $iconsuser = null; - if ('all' == $access) { - $iconsuser = $em->getRepository('App\Entity\Icon')->findBy(['user' => $this->getUser()]); - } - - return $this->render($this->twig.'edit.html.twig', [ - 'useheader' => ('admin' == $access), - 'usemenu' => false, - 'usesidebar' => ('admin' == $access), - 'entity' => $entity, - 'icons' => $icons, - 'iconsuser' => $iconsuser, - 'mode' => 'submit', - 'usage' => $usage, - 'access' => $access, - 'idpage' => $idpage, - 'form' => $form->createView(), - ]); - } - - public function update($access, $idpage, $idwidget, Request $request, ManagerRegistry $em): Response - { - $usage = $request->query->get('usage'); - - // Recherche du pagewidget - $entity = $em->getRepository($this->labelentity)->find($idwidget); - if (!$entity) { - throw $this->createNotFoundException('Unable to find entity.'); - } - - // On s'assure que l'utilisateur à la permission de modifier - if ('all' == $access) { - $em->getRepository('App\Entity\Page')->getPermission($this->getUser(), $entity->getPage(), $cansee, $canupdate, $canadd); - if (!$canupdate) { - throw $this->createAccessDeniedException('Permission denied'); - } - } - - // Création du formulaire - $form = $this->entityForm($em, $entity, $idpage, $idwidget, $access); - $form->handleRequest($request); - - // Validation - if ($form->get('submit')->isClicked() && $form->isValid()) { - $idicon = $form->get('idicon')->getData(); - $icon = $em->getRepository('App\Entity\Icon')->findoneby(['id' => $idicon]); - $entity->setIcon($icon); - - // Récupération des paramétres - $widgettype = $entity->getWidget(); - $jsons = $widgettype->getParameter(); - $param = []; - $param['fields'] = []; - foreach ($jsons['fields'] as $field) { - $tmp = []; - $tmp['id'] = $field['id']; - - $tmp['value'] = ('hidden' != $field['type'] ? $form->get($field['id'])->getData() : ''); - array_push($param['fields'], $tmp); - } - - $entity->setParameter($param); - - $em->getManager()->flush(); - - // Si widget RSS On supprime le potentiel cache de ce flux - if (-1880 == $entity->getWidget()->getId()) { - $dir = $this->container->getParameter('kernel.root_dir').'/../web/uploads/flux/'; - $mask = $dir.'widget-'.$entity->getId().'.*'; - array_map('unlink', glob($mask)); - } - - // Retour - return $this->redirect($this->generateUrl('app_'.$access.'_page_'.$usage.'_view', ['id' => $idpage])); - } - - $icons = $em->getRepository('App\Entity\Icon')->findBy(['user' => null]); - $iconsuser = null; - if ('all' == $access) { - $iconsuser = $em->getRepository('App\Entity\Icon')->findBy(['user' => $this->getUser()]); - } - - return $this->render($this->twig.'edit.html.twig', [ - 'useheader' => ('admin' == $access), - 'usemenu' => false, - 'usesidebar' => ('admin' == $access), - 'entity' => $entity, - 'icons' => $icons, - 'iconsuser' => $iconsuser, - 'mode' => 'update', - 'access' => $access, - 'idpage' => $idpage, - 'form' => $form->createView(), - 'usage' => $usage, - 'group' => $group, - ]); - } - - public function delete($access, $idwidget, Request $request, ManagerRegistry $em): Response - { - // Récupération des parametres - $output = []; - - // Recherche du pagetwidget - $entity = $em->getRepository($this->labelentity)->find($idwidget); - if (!$entity) { - throw $this->createNotFoundException('Unable to find entity.'); - } - - // On s'assure que l'utilisateur à la permission de supprimer - if ('all' == $access) { - $em->getRepository('App\Entity\Page')->getPermission($this->getUser(), $entity->getPage(), $cansee, $canupdate, $canadd); - if (!$canupdate) { - throw $this->createAccessDeniedException('Permission denied'); - } - } - - // Tentative de suppression - try { - $em->getManager()->remove($entity); - $em->getManager()->flush(); - } catch (\Exception $e) { - $request->getSession()->getFlashBag()->add('error', $e->getMessage()); - throw $this->createAccessDeniedException('Permission denied'); - } - - return new JsonResponse($output); - } - - public function order($access, Request $request, ManagerRegistry $em): Response - { - $idwidget = $request->request->get('idwidget'); - $order = $request->request->get('order'); - $idloc = $request->request->get('idloc'); - - $entity = $em->getRepository($this->labelentity)->find($idwidget); - if (!$entity) { - throw $this->createNotFoundException('Unable to find entity.'); - } - - $entity->setRoworder($order); - $entity->setLoc($idloc); - $em->getManager()->flush(); - - return new JsonResponse([]); - } - - public function ckeditor($access, $idwidget, Request $request, ManagerRegistry $em): Response - { - $usage = $request->query->get('usage'); - - // Recherche du pagewidget - $entity = $em->getRepository($this->labelentity)->find($idwidget); - if (!$entity) { - throw $this->createNotFoundException('Unable to find entity.'); - } - - // On s'assure que l'utilisateur à la permission de modifier - if ('all' == $access) { - $em->getRepository('App\Entity\Page')->getPermission($this->getUser(), $entity->getPage(), $cansee, $canupdate, $canadd); - if (!$canadd) { - throw $this->createAccessDeniedException('Permission denied'); - } - } - - // Création du formulaire - $form = $this->createForm(PagewidgetckeditorType::class, ['ckeditor' => $entity->getParameter()['fields'][0]['value']], ['idwidget' => $idwidget, 'usage' => $usage]); - - // Récupération des data du formulaire - $form->handleRequest($request); - if ($form->get('submit')->isClicked() && $form->isValid()) { - $ckeditor = $form->get('ckeditor')->getData(); - $param = $entity->getParameter(); - $param['fields'][0]['value'] = $ckeditor; - $entity->setParameter($param); - $em->getManager()->flush(); - - // Retour - return $this->redirect($this->generateUrl('app_'.$access.'_page_'.$usage.'_view', ['id' => $entity->getPage()->getId()])); - } - - return $this->render($this->twig.'ckeditor.html.twig', [ - 'useheader' => ('admin' == $access), - 'usemenu' => false, - 'usesidebar' => ('admin' == $access), - 'entity' => $entity, - 'usage' => $usage, - 'access' => $access, - 'idpage' => $entity->getPage()->getId(), - 'form' => $form->createView(), - ]); - } - - protected function setRequest($em, $request, $id, $access) - { - $this->em = $em; - $this->user = $this->getUser(); - $this->id = $id; - $this->access = $access; - $this->usage = $request->query->get('usage'); - $this->group = $request->query->get('group'); - - // Le widget existe-t-il ? - $this->entity = $this->em->getRepository($this->labelentity)->find($this->id); - if (!$this->entity) { - throw $this->createNotFoundException('Unable to find entity.'); - } - - // Permissions - if ('admin' == $this->access) { - $this->canupdate = true; - $this->canadd = true; - } else { - // On s'assure que l'utilisateur à la permission de voir - $this->page = $this->entity->getPage(); - $this->em->getRepository('App\Entity\Page')->getPermission($this->user, $this->page, $this->cansee, $this->canupdate, $this->canadd); - if (!$this->cansee) { - throw $this->createAccessDeniedException('Permission denied'); - } - } - - $this->getPreference($this->entity); - } - - protected function getPreference(&$entity) - { - $user = $this->getUser(); - if ($user) { - if ($entity->isViewheader()) { - $preference = $user->getPreference(); - $id = $entity->getId(); - - // Preference widgetshowhide - if (is_array($preference)) { - if (array_key_exists('widgetshowhide', $preference)) { - if (array_key_exists($id, $preference['widgetshowhide'])) { - $entity->setOpened('true' == $preference['widgetshowhide'][$id]); - } - } - } - } - } - } - - protected function getKeyPreference(&$entity, $key, $value) - { - $user = $this->getUser(); - if (!$user) { - return $value; - } - - $preference = $user->getPreference(); - $id = $entity->getId(); - - if (!is_array($preference)) { - return $value; - } - - if (!array_key_exists($key, $preference)) { - return $value; - } - - if (!array_key_exists($id, $preference[$key])) { - return $value; - } - - return $preference[$key][$id]; - } - - protected function getRender($view, $params) - { - // Paramétres toujours présent dans un rendu de widget - $allways = [ - 'entity' => $this->entity, - 'canupdate' => $this->canupdate, // Permissions de modifier le widget - 'canadd' => $this->canadd, // Permission d'ajouter des éléments au widget - 'access' => $this->access, - 'usage' => $this->usage, - ]; - - // Parametres spéficiques - $params = array_merge($allways, $params); - - // Rendu - return $this->render($this->twig.'\\'.$view, $params); - } - - public function viewurl($access, $id, Request $request, ManagerRegistry $em) - { - // Récupération de la requete - $this->setRequest($em, $request, $id, $access); - - // Valeur par défaut - $url = ''; - $imagemedia = false; - - // Récupération des paramétres du widget - foreach ($this->entity->getParameter()['fields'] as $parameter) { - if ('url' == $parameter['id']) { - $url = $parameter['value']; - } - } - - // Gestion des url youtuve - $url = str_replace('http://www.youtube.com', 'https://www.youtube.com', $url); - $url = str_replace('https://www.youtube.com/watch?v=', 'https://www.youtube.com/embed/', $url); - - // Detecter le type de lien - $pathinfo = pathinfo($url); - - // Type image - if (array_key_exists('extension', $pathinfo)) { - if ('jpg' == $pathinfo['extension'] || 'gif' == $pathinfo['extension'] || 'png' == $pathinfo['extension']) { - $imagemedia = true; - } - } - - // Spécifique Deviant Art - if (false !== strpos($url, 'images-wixmp')) { - $imagemedia = true; - } - - return $this->getRender('viewurl.html.twig', [ - 'url' => $url, - 'imagemedia' => $imagemedia, - ]); - } - - public function viewurlfixe($access, $id, Request $request, ManagerRegistry $em) - { - // Récupération de la requete - $this->setRequest($em, $request, $id, $access); - - // Valeur par défaut - $url = ''; - $imagemedia = false; - - // Récupération des paramétres du widget - $widgettype = $this->entity->getWidget(); - $jsons = $widgettype->getParameter(); - $param = []; - $param['fields'] = []; - foreach ($jsons->fields as $field) { - if ('url' == $field->id) { - $url = $field->value; - } - } - - // Gestion des url youtuve - $url = str_replace('http://www.youtube.com', 'https://www.youtube.com', $url); - $url = str_replace('https://www.youtube.com/watch?v=', 'https://www.youtube.com/embed/', $url); - - // Detecter le type de lien - $pathinfo = pathinfo($url); - - // Type image - if (array_key_exists('extension', $pathinfo)) { - if ('jpg' == $pathinfo['extension'] || 'gif' == $pathinfo['extension'] || 'png' == $pathinfo['extension']) { - $imagemedia = true; - } - } - - // Spécifique Deviant Art - if (false !== strpos($url, 'images-wixmp')) { - $imagemedia = true; - } - - return $this->getRender('viewurl.html.twig', [ - 'url' => $url, - 'imagemedia' => $imagemedia, - ]); - } - - public function viewitem($access, $id, Request $request, ManagerRegistry $em) - { - // Récupération de la requete - $this->setRequest($em, $request, $id, $access); - - // Valeur par défaut - $modedesktop = 0; - $menu = false; - $menuall = true; - $search = false; - $withbookmark = true; - $bookmarks = null; - $itemsordered = null; - $itemcategorys = null; - - // Récupération des paramétres du widget - $iditemcategory = null; - foreach ($this->entity->getParameter()['fields'] as $parameter) { - switch ($parameter['id']) { - case 'modedesktop': - $modedesktop = $parameter['value']; - break; - - case 'withbookmark': - $withbookmark = $parameter['value']; - break; - - case 'itemcategory': - $iditemcategory = $parameter['value']; - break; - - case 'search': - $search = (1 == $parameter['value']); - break; - - case 'menu': - $menu = (1 == $parameter['value']); - break; - - case 'menuall': - $menuall = (1 == $parameter['value']); - break; - } - } - - // Préference utilisateur - $modedesktop = $this->getKeyPreference($this->entity, 'modedesktop', $modedesktop); - - // Profilage - $this->em->getRepository('App\Entity\Item')->getUserItems($this->user, $bookmarks, $items, $itemcategorys, $iditemcategory, $withbookmark, false); - - // Render - return $this->getRender('viewitem.html.twig', [ - 'canadd' => $this->user, - 'modedesktop' => $modedesktop, - 'search' => $search, - 'menu' => $menu, - 'menuall' => $menuall, - 'withbookmark' => $withbookmark, - 'bookmarks' => $bookmarks, - 'items' => $items, - 'itemcategorys' => $itemcategorys, - ]); - } - - public function viewitemessential($access, $id, Request $request, ManagerRegistry $em) - { - // Récupération de la requete - $this->setRequest($em, $request, $id, $access); - - // Valeur par défaut - $modedesktop = 0; - $itemsordered = null; - $bookmarks = null; - - // Récupération des paramétres du widget - foreach ($this->entity->getParameter()['fields'] as $parameter) { - switch ($parameter['id']) { - case 'modedesktop': - $modedesktop = $parameter['value']; - break; - } - } - - // Préference utilisateur - $modedesktop = $this->getKeyPreference($this->entity, 'modedesktop', $modedesktop); - - // Profilage - $em->getRepository('App\Entity\Item')->getUserItems($this->user, $bookmarks, $items, $itemcategorys, null, 0, true); - - // Render - return $this->getRender('viewitemessential.html.twig', [ - 'canadd' => $this->user, - 'modedesktop' => $modedesktop, - 'items' => $items, - 'bookmarks' => $bookmarks, - ]); - } - - public function viewalert($id, $access, Request $request, ManagerRegistry $em) - { - // Récupération de la requete - $this->setRequest($em, $request, $id, $access); - - // Valeur par défaut - $alertsordered = null; - - // Récupération des paramétres du widget - $idalertcategory = null; - $alertcategoryfilter = null; - foreach ($this->entity->getParameter()['fields'] as $parameter) { - switch ($parameter['id']) { - case 'alertcategory': - $idalertcategory = $parameter['value']; - if ($idalertcategory) { - $alertcategoryfilter = $this->em->getRepository('App:Alertcategory')->find($idalertcategory); - } - break; - } - } - - // Profilage - $alertsordered = $this->em->getRepository('App\Entity\Alert')->getUserAlerts($this->user, $idalertcategory, $alertcategoryfilter); - - // Render - return $this->getRender('viewalert.html.twig', [ - 'alerts' => $alertsordered, - ]); - } - - public function viewbookmark($id, $access, Request $request, ManagerRegistry $em) - { - // Récupération de la requete - $this->setRequest($em, $request, $id, $access); - - // Valeur par défaut - $modedesktop = 0; - $bookmarks = null; - - // Récupération des paramétres du widget - foreach ($this->entity->getParameter()['fields'] as $parameter) { - switch ($parameter['id']) { - case 'modedesktop': - $modedesktop = $parameter['value']; - break; - } - } - - // Bookmark du widget - $bookmarks = $em->getRepository('App\Entity\Bookmark')->findBy(['pagewidget' => $this->entity]); - - // Préference utilisateur - $modedesktop = $this->getKeyPreference($this->entity, 'modedesktop', $modedesktop); - - // Render - return $this->getRender('viewbookmark.html.twig', [ - 'canadd' => $this->canadd, - 'modedesktop' => $modedesktop, - 'bookmarks' => $bookmarks, - ]); - } - - public function viewlink($id, $access, Request $request, ManagerRegistry $em) - { - // Récupération de la requete - $this->setRequest($em, $request, $id, $access); - - // Récupération des paramétres du widget - $url = ''; - $target = '_blank'; - foreach ($this->entity->getParameter()['fields'] as $parameter) { - switch ($parameter['id']) { - case 'url': - $url = $parameter['value']; - break; - case 'target': - $target = $parameter['value']; - break; - } - } - - // Render - return $this->getRender('viewlink.html.twig', [ - 'url' => $url, - 'target' => $target, - ]); - } - - public function viewinfo($id, $access, Request $request, ManagerRegistry $em) - { - // Récupération de la requete - $this->setRequest($em, $request, $id, $access); - - if (1 == $this->entity->getPage()->getGroups()->count()) { - $this->entity->setName($this->entity->getPage()->getGroups()[0]->getLabel()); - } elseif (0 == $this->entity->getPage()->getGroups()->count() && $this->entity->getPage()->getUser()) { - $this->entity->setName($this->entity->getPage()->getName()); - } - - // Render - return $this->getRender('viewinfo.html.twig', [ - 'usage' => $this->usage, - 'id' => $id, - 'idpage' => $this->entity->getPage()->getId(), - ]); - } - - public function vieweditor($id, $access, Request $request, ManagerRegistry $em) - { - // Récupération de la requete - $this->setRequest($em, $request, $id, $access); - - // Récupération des paramétres du widget - $html = ''; - foreach ($this->entity->getParameter()['fields'] as $parameter) { - switch ($parameter['id']) { - case 'html': - $html = $parameter['value']; - break; - } - } - - // Render - return $this->getRender('vieweditor.html.twig', [ - 'html' => $html, - ]); - } - - public function viewslide($id, $access, Request $request, ManagerRegistry $em) - { - // Récupération de la requete - $this->setRequest($em, $request, $id, $access); - - // Récupération des paramétres du widget - $interval = '2'; - foreach ($this->entity->getParameter()['fields'] as $parameter) { - switch ($parameter['id']) { - case 'interval': - $interval = $parameter['value']; - break; - } - } - - // Récupération des slides - $slides = $this->em->getRepository('App\Entity\Pagewidgetslide')->findBy(['pagewidget' => $this->entity], ['roworder' => 'ASC', 'title' => 'ASC']); - - // Render - return $this->getRender('viewslide.html.twig', [ - 'slides' => $slides, - 'interval' => $interval, - ]); - } - - public function viewfile($id, $access, Request $request, ManagerRegistry $em) - { - // Récupération de la requete - $this->setRequest($em, $request, $id, $access); - - // Récupération des paramétres du widget - $view = 'small'; - foreach ($this->entity->getParameter()['fields'] as $parameter) { - switch ($parameter['id']) { - case 'modelist': - $view = (0 == $parameter['value'] ? 'small' : 'list'); - break; - } - } - - // Préference - $widgetfolder = $this->getKeyPreference($this->entity, 'widgetfolder', ''); - $view = ($widgetfolder && $widgetfolder['view'] ? $widgetfolder['view'] : $view); - - // Render - return $this->getRender('viewfile.html.twig', [ - 'category' => 'pagewidget', - 'id' => $id, - 'view' => $view, - ]); - } - - public function viewgalery($id, $access, Request $request, ManagerRegistry $em) - { - // Récupération de la requete - $this->setRequest($em, $request, $id, $access); - - $directory = 'file/pagewidget/'.$id.'/.thumb/'; - $files = $this->minio->listFiles($directory, '/'); - if ($files) { - $date = array_column($files, 'LastModified'); - array_multisort($date, SORT_DESC, $files); - } - - // Render - return $this->getRender('viewgalery.html.twig', [ - 'files' => $files, - ]); - } - - public function viewcalendar(Request $request, $id, $access = 'config') - { - // Récupération de la requete - $this->setRequest($em, $request, $id, $access); - - // Récupération des paramétres du widget - $nbday = '0'; - foreach ($this->entity->getParameter()['fields'] as $parameter) { - switch ($parameter['id']) { - case 'nbday': - $nbday = $parameter['value']; - break; - } - } - - // Récupérer les events de l'utilisateur - $user = $this->getUser(); - $events = $this->em->getRepository('App:Calendarevent')->getUserCalendarevents($user, $this->get('session')->get('color')['main'], $this->usage, $this->group, $firstcalendar); - - // Render - return $this->getRender('viewcalendar.html.twig', [ - 'events' => $events, - 'nbday' => $nbday, - 'firstcalendar' => $firstcalendar, - 'usage' => $this->usage, - ]); - } - - public function viewblog(Request $request, $id, $access = 'config') - { - // Récupération de la requete - $this->setRequest($em, $request, $id, $access); - - // Récupération des paramétres du widget - $nbarticle = 10; - foreach ($this->entity->getParameter()['fields'] as $parameter) { - switch ($parameter['id']) { - case 'nbarticle': - $nbarticle = $parameter['value']; - break; - } - } - - // On récupère soit les blogs du group en cours soit l'ensemble des blogs de l'utilisateur - if ('group' == $this->usage) { - $blogs = $this->em->getRepository('App:Blog')->getBlogsGroup($this->getUser(), $this->group); - if ($blogs) { - $firstblog = $blogs[0]->getId(); - } - } else { - $this->em->getRepository('App:Blog')->getBlogsUser($this->getUser(), $blogsuser, $blogsadmin, $blogsshared); - $blogs = array_merge($blogsuser, $blogsadmin->toArray(), $blogsshared); - $firstblog = 'all'; - } - - // On récupère les nbarticle de ses blogs - $this->em->getRepository('App:Blogarticle')->getBlogsArticles($blogs, 0, $nbarticle, $count, $blogarticles); - - // Render - return $this->getRender('viewblog.html.twig', [ - 'blogarticles' => $blogarticles, - 'nbarticle' => $nbarticle, - 'firstblog' => $firstblog, - 'usage' => $this->usage, - ]); - } - - public function viewproject(Request $request, $id, $access = 'config') - { - // Récupération de la requete - $this->setRequest($em, $request, $id, $access); - - // Parametres - $nbarticle = 10; - foreach ($this->entity->getParameter()['fields'] as $parameter) { - switch ($parameter['id']) { - case 'nbarticle': - $nbarticle = $parameter['value']; - break; - } - } - - // On récupère soit les projects du group en cours soit l'ensemble des projects de l'utilisateur - $user = $this->getUser(); - if ('group' == $this->usage) { - $projects = $this->em->getRepository('App:Project')->getProjectsGroup($this->getUser(), $this->group); - if ($projects) { - $firstproject = $projects[0]->getId(); - } - } else { - $this->em->getRepository('App:Project')->getProjectsUser($user, $projectsuser, $projectsadmin, $projectsshared); - $projects = array_merge($projectsuser, $projectsadmin->toArray(), $projectsshared); - $firstproject = 'all'; - } - - // On récupère les nbarticle de ses projects - $this->em->getRepository('App:Projecttask')->getProjectsTasks($projects, 0, $nbarticle, $count, $projecttasks); - - foreach ($projecttasks as $key => $projecttask) { - if (100 == $projecttask->getPercentage()) { - unset($projecttasks[$key]); - } - } - - if ('group' != $this->usage) { - foreach ($projecttasks as $key => $projecttask) { - if (!$user) { - unset($projecttasks[$key]); - } else { - if ($projecttask->getUser() && $projecttask->getUser() != $user) { - unset($projecttasks[$key]); - } elseif (!$projecttask->getUser() && $projecttask->getOwner() && $projecttask->getOwner() != $user) { - unset($projecttasks[$key]); - } - } - } - } - - // Render - return $this->getRender('viewproject.html.twig', [ - 'projecttasks' => $projecttasks, - 'nbarticle' => $nbarticle, - 'firstproject' => $firstproject, - 'usage' => $this->usage, - ]); - } -} diff --git a/src/Controller/PagewidgetslideController.php b/src/Controller/PagewidgetslideController.php deleted file mode 100644 index 2f1133b..0000000 --- a/src/Controller/PagewidgetslideController.php +++ /dev/null @@ -1,223 +0,0 @@ -query->get('usage'); - - // On s'assure que le widget existe - $pagewidget = $em->getRepository("App\Entity\Pagewidget")->find($idwidget); - if (!$pagewidget) { - throw $this->createNotFoundException('Unable to find entity.'); - } - - // Vérifier que l'on peut générer un pagewidgetslide - if ('all' == $access) { - if (!$em->getRepository("App\Entity\Pagewidget")->getCanadd($this->getUser(), $pagewidget, $usage)) { - throw $this->createAccessDeniedException('Permission denied'); - } - } - - // Recherche des pagewidgetslides du widget - $datas = $em->getRepository($this->labelentity)->findBy(['pagewidget' => $pagewidget], ['roworder' => 'ASC', 'title' => 'ASC']); - - return $this->render($this->twig.'list.html.twig', [ - 'useheader' => ('admin' == $access), - 'usemenu' => ('admin' == $access), - 'usesidebar' => ('admin' == $access), - 'maxsize' => ('all' == $access ? 1200 : null), - 'access' => $access, - 'pagewidget' => $pagewidget, - 'usage' => $usage, - $this->data.'s' => $datas, - ]); - } - - public function submit($idwidget, $access, Request $request, ManagerRegistry $em): Response - { - $usage = $request->query->get('usage'); - - // Initialisation de l'enregistrement - $data = new Pagewidgetslide(); - $data->setRoworder(0); - - // On s'assure que le widget existe - $pagewidget = $em->getRepository("App\Entity\Pagewidget")->find($idwidget); - if (!$pagewidget) { - throw $this->createNotFoundException('Unable to find entity.'); - } - - // Vérifier que l'on peut générer un pagewidgetslide - if ('all' == $access) { - if (!$em->getRepository("App\Entity\Pagewidget")->getCanadd($this->getUser(), $pagewidget, $usage)) { - throw $this->createAccessDeniedException('Permission denied'); - } - } - - // Création du formulaire - $form = $this->createForm(PagewidgetslideType::class, $data, ['mode' => 'submit']); - - // Récupération des data du formulaire - $form->handleRequest($request); - - // Sur validation - if ($form->get('submit')->isClicked() && $form->isValid()) { - $data = $form->getData(); - if ($data->getImage()) { - $data->setPagewidget($pagewidget); - - // Sauvegarde - $em->getManager()->persist($data); - $em->getManager()->flush(); - - // Retour à la page - return $this->redirect($this->generateUrl('app_'.$access.'_pagewidgetslide_list', ['idwidget' => $idwidget, 'usage' => $usage])); - } - } - - return $this->render($this->twig.'edit.html.twig', [ - 'useheader' => ('admin' == $access), - 'usemenu' => ('admin' == $access), - 'usesidebar' => ('admin' == $access), - 'maxsize' => ('all' == $access ? 1200 : null), - 'entity' => $data, - 'mode' => 'submit', - 'access' => $access, - 'pagewidget' => $pagewidget, - 'usage' => $usage, - 'form' => $form->createView(), - ]); - } - - public function update($id, $idwidget, $access, Request $request, ManagerRegistry $em): Response - { - $usage = $request->query->get('usage'); - - // Récupération de l'enregistrement courant - $data = $em->getRepository("App\Entity\Pagewidgetslide")->find($id); - if (!$data) { - throw $this->createNotFoundException('Unable to find entity.'); - } - - // On s'assure que le widget existe - $pagewidget = $em->getRepository("App\Entity\Pagewidget")->find($idwidget); - if (!$pagewidget) { - throw $this->createNotFoundException('Unable to find entity.'); - } - - // Vérifier que l'on peut générer un pagewidgetslide - if ('all' == $access) { - if (!$em->getRepository("App\Entity\Pagewidget")->getCanadd($this->getUser(), $pagewidget, $usage)) { - throw $this->createAccessDeniedException('Permission denied'); - } - } - - // Création du formulaire - $form = $this->createForm(PagewidgetslideType::class, $data, ['mode' => 'update']); - - // Récupération des data du formulaire - $form->handleRequest($request); - - // Sur validation - if ($form->get('submit')->isClicked() && $form->isValid()) { - $data = $form->getData(); - if ($data->getImage()) { - // Sauvegarde - $em->getManager()->flush(); - - // Retour à la page - return $this->redirect($this->generateUrl('app_'.$access.'_pagewidgetslide_list', ['idwidget' => $idwidget, 'usage' => $usage])); - } - } - - // Affichage du formulaire - return $this->render($this->twig.'edit.html.twig', [ - 'useheader' => ('admin' == $access), - 'usemenu' => ('admin' == $access), - 'usesidebar' => ('admin' == $access), - 'maxsize' => ('all' == $access ? 1200 : null), - 'entity' => $data, - 'mode' => 'update', - 'access' => $access, - 'pagewidget' => $pagewidget, - 'usage' => $usage, - 'form' => $form->createView(), - ]); - } - - public function delete($id, $idwidget, $access, Request $request, ManagerRegistry $em): Response - { - $usage = $request->query->get('usage'); - - // Récupération de l'enregistrement courant - $data = $em->getRepository("App\Entity\Pagewidgetslide")->find($id); - if (!$data) { - throw $this->createNotFoundException('Unable to find entity.'); - } - - // On s'assure que le widget existe - $pagewidget = $em->getRepository("App\Entity\Pagewidget")->find($idwidget); - if (!$pagewidget) { - throw $this->createNotFoundException('Unable to find entity.'); - } - - // Vérifier que l'on peut générer un pagewidgetslide - if ('all' == $access) { - if (!$em->getRepository("App\Entity\Pagewidget")->getCanadd($this->getUser(), $pagewidget, $usage)) { - throw $this->createAccessDeniedException('Permission denied'); - } - } - - // Tentative de suppression - try { - $em->getManager()->remove($data); - $em->getManager()->flush(); - } catch (\Exception $e) { - $request->getSession()->getFlashBag()->add('error', $e->getMessage()); - throw $this->createAccessDeniedException('Permission denied'); - } - - // Retour à la list - return $this->redirect($this->generateUrl('app_'.$access.'_pagewidgetslide_list', ['idwidget' => $idwidget, 'usage' => $usage])); - } - - public function upload($idwidget, $access, Request $request, ManagerRegistry $em): Response - { - $usage = $request->query->get('usage'); - - // On s'assure que le widget existe - $pagewidget = $em->getRepository("App\Entity\Pagewidget")->find($idwidget); - if (!$pagewidget) { - throw $this->createNotFoundException('Unable to find entity.'); - } - - // Vérifier que l'on peut générer un pagewidgetslide - if ('all' == $access) { - if (!$em->getRepository("App\Entity\Pagewidget")->getCanadd($this->getUser(), $pagewidget, $usage)) { - throw $this->createAccessDeniedException('Permission denied'); - } - } - - return $this->render($this->twig.'upload.html.twig', [ - 'useheader' => false, - 'usemenu' => false, - 'usesidebar' => false, - 'pagewidget' => $pagewidget, - ]); - } -} diff --git a/src/Controller/PinController.php b/src/Controller/PinController.php new file mode 100644 index 0000000..5c78664 --- /dev/null +++ b/src/Controller/PinController.php @@ -0,0 +1,187 @@ +getDoctrine()->getManager(); + + // Récupérer les pins + $datas = $em->getRepository($this->entity)->findAll(); + + return $this->render($this->render.'list.html.twig', [ + $this->data.'s' => $datas, + 'useheader' => true, + 'usesidebar' => true, + ]); + } + + public function submit(Request $request) + { + $em = $this->getDoctrine()->getManager(); + + // Initialisation de l'enregistrement + $data = new Entity(); + + // Création du formulaire + $form = $this->createForm(Form::class, $data, ['mode' => 'submit']); + + // Récupération des data du formulaire + $form->handleRequest($request); + + // Sur erreur + $this->getErrorForm(null, $form, $request, $data, 'submit'); + + // Sur validation + if ($form->get('submit')->isClicked() && $form->isValid()) { + $data = $form->getData(); + + $em->persist($data); + $em->flush(); + + // Retour à la liste + return $this->redirectToRoute($this->route); + } + + // Affichage du formulaire + return $this->render($this->render.'edit.html.twig', [ + 'useheader' => true, + 'usesidebar' => true, + $this->data => $data, + 'mode' => 'submit', + 'form' => $form->createView(), + ]); + } + + public function update($id, Request $request) + { + // Initialisation de l'enregistrement + $em = $this->getDoctrine()->getManager(); + $data = $em->getRepository($this->entity)->find($id); + + // Création du formulaire + $form = $this->createForm(Form::class, $data, ['mode' => 'update']); + + // Récupération des data du formulaire + $form->handleRequest($request); + + // Sur erreur + $this->getErrorForm(null, $form, $request, $data, 'update'); + + // Sur validation + if ($form->get('submit')->isClicked() && $form->isValid()) { + $data = $form->getData(); + $em->persist($data); + $em->flush(); + + // Retour à la liste + return $this->redirectToRoute($this->route); + } + + // Affichage du formulaire + return $this->render($this->render.'edit.html.twig', [ + 'useheader' => true, + 'usesidebar' => true, + $this->data => $data, + 'mode' => 'update', + 'form' => $form->createView(), + ]); + } + + public function delete($id, Request $request) + { + // Initialisation de l'enregistrement + $em = $this->getDoctrine()->getManager(); + $data = $em->getRepository($this->entity)->find($id); + + // Controle avant suppression + $error = false; + if ($id < 0) { + $error = true; + } + + if ($error) { + return $this->redirectToRoute($this->route); + } else { + $em->remove($data); + $em->flush(); + + // Retour à la liste + return $this->redirectToRoute($this->route); + } + } + + public function view($id, Request $request) + { + $em = $this->getDoctrine()->getManager(); + $data = $em->getRepository($this->entity)->find($id); + if (!$data) { + throw $this->createNotFoundException('Not exist'); + } + + return $this->render($this->render.'view.html.twig', [ + 'useheader' => false, + 'usesidebar' => false, + $this->data => $data, + ]); + } + + public function select(Request $request) + { + // S'assurer que c'est un appel ajax + if (!$request->isXmlHttpRequest()) { + return new JsonResponse(['message' => 'Interdit'], 400); + } + + $output = []; + $em = $this->getDoctrine()->getManager(); + $page_limit = $request->query->get('page_limit'); + $q = $request->query->get('q'); + + $qb = $em->createQueryBuilder(); + $qb->select('table')->from($this->entity, 'table') + ->where('table.name LIKE :value') + ->setParameter('value', '%'.$q.'%') + ->orderBy('table.name'); + + $datas = $qb->setFirstResult(0)->setMaxResults($page_limit)->getQuery()->getResult(); + foreach ($datas as $data) { + array_push($output, ['id' => $data->getId(), 'text' => $data->getName()]); + } + + $ret_string['results'] = $output; + + return new JsonResponse($ret_string); + } + + protected function getErrorForm($id, $form, $request, $data, $mode) + { + if ($form->get('submit')->isClicked() && 'delete' == $mode) { + } + + if ($form->get('submit')->isClicked() && 'submit' == $mode) { + } + + if ($form->get('submit')->isClicked() && !$form->isValid()) { + $this->get('session')->getFlashBag()->clear(); + + $errors = $form->getErrors(); + foreach ($errors as $error) { + $request->getSession()->getFlashBag()->add('error', $error->getMessage()); + } + } + } +} diff --git a/src/Controller/TagController.php b/src/Controller/TagController.php new file mode 100644 index 0000000..bcc7bf1 --- /dev/null +++ b/src/Controller/TagController.php @@ -0,0 +1,137 @@ +getDoctrine()->getManager(); + + // Récupérer les tags + $datas = $em->getRepository($this->entity)->findAll(); + + return $this->render($this->render.'list.html.twig', [ + $this->data.'s' => $datas, + 'useheader' => true, + 'usesidebar' => true, + ]); + } + + public function submit(Request $request) + { + $em = $this->getDoctrine()->getManager(); + + // Initialisation de l'enregistrement + $data = new Entity(); + + // Création du formulaire + $form = $this->createForm(Form::class, $data, ['mode' => 'submit']); + + // Récupération des data du formulaire + $form->handleRequest($request); + + // Sur erreur + $this->getErrorForm(null, $form, $request, $data, 'submit'); + + // Sur validation + if ($form->get('submit')->isClicked() && $form->isValid()) { + $data = $form->getData(); + + $em->persist($data); + $em->flush(); + + // Retour à la liste + return $this->redirectToRoute($this->route); + } + + // Affichage du formulaire + return $this->render($this->render.'edit.html.twig', [ + 'useheader' => true, + 'usesidebar' => true, + $this->data => $data, + 'mode' => 'submit', + 'form' => $form->createView(), + ]); + } + + public function delete($id, Request $request) + { + // Initialisation de l'enregistrement + $em = $this->getDoctrine()->getManager(); + $data = $em->getRepository($this->entity)->find($id); + + // Controle avant suppression + $error = false; + if ($id < 0) { + $error = true; + } + + if ($error) { + return $this->redirectToRoute($this->route); + } else { + $em->remove($data); + $em->flush(); + + // Retour à la liste + return $this->redirectToRoute($this->route); + } + } + + public function select(Request $request) + { + // S'assurer que c'est un appel ajax + if (!$request->isXmlHttpRequest()) { + return new JsonResponse(['message' => 'Interdit'], 400); + } + + $output = []; + $em = $this->getDoctrine()->getManager(); + $page_limit = $request->query->get('page_limit'); + $q = $request->query->get('q'); + + $qb = $em->createQueryBuilder(); + $qb->select('table')->from($this->entity, 'table') + ->where('table.id LIKE :value') + ->setParameter('value', '%'.$q.'%') + ->orderBy('table.id'); + + $datas = $qb->setFirstResult(0)->setMaxResults($page_limit)->getQuery()->getResult(); + foreach ($datas as $data) { + array_push($output, ['id' => $data->getId(), 'text' => $data->getId()]); + } + + $ret_string['results'] = $output; + + return new JsonResponse($ret_string); + } + + protected function getErrorForm($id, $form, $request, $data, $mode) + { + if ($form->get('submit')->isClicked() && 'delete' == $mode) { + } + + if ($form->get('submit')->isClicked() && 'submit' == $mode) { + } + + if ($form->get('submit')->isClicked() && !$form->isValid()) { + $this->get('session')->getFlashBag()->clear(); + + $errors = $form->getErrors(); + foreach ($errors as $error) { + $request->getSession()->getFlashBag()->add('error', $error->getMessage()); + } + } + } +} diff --git a/src/Entity/Alert.php b/src/Entity/Alert.php deleted file mode 100755 index 67a06c9..0000000 --- a/src/Entity/Alert.php +++ /dev/null @@ -1,413 +0,0 @@ -unpublishedat && - $this->publishedat->getTimestamp() <= $today->getTimestamp() - ) { - return true; - } - if ( - $this->publishedat->getTimestamp() <= $today->getTimestamp() && - $this->unpublishedat->getTimestamp() >= $today->getTimestamp() - ) { - return true; - } - - return false; - } - - // IsPending - public function isPending() - { - $today = new \DateTime(); - if ($this->publishedat->getTimestamp() > $today->getTimestamp()) { - return true; - } - - return false; - } - - // IsArchived - public function isArchived() - { - $today = new \DateTime(); - if (null === $this->unpublishedat) { - return false; - } - if ($this->unpublishedat->getTimestamp() < $today->getTimestamp()) { - return true; - } - - return false; - } - - /** - * Constructor. - */ - public function __construct() - { - $this->groups = new \Doctrine\Common\Collections\ArrayCollection(); - $this->readers = new ArrayCollection(); - } - - /** - * Get id. - * - * @return int - */ - public function getId() - { - return $this->id; - } - - /** - * Set title. - * - * @param string $title - * - * @return Alert - */ - public function setTitle($title) - { - $this->title = $title; - - return $this; - } - - /** - * Get title. - * - * @return string - */ - public function getTitle() - { - return $this->title; - } - - /** - * Set content. - * - * @param string $content - * - * @return Alert - */ - public function setContent($content) - { - $this->content = $content; - - return $this; - } - - /** - * Get content. - * - * @return string - */ - public function getContent() - { - return $this->content; - } - - /** - * Set rowOrder. - * - * @param int $rowOrder - * - * @return Alert - */ - public function setRowOrder($rowOrder) - { - $this->rowOrder = $rowOrder; - - return $this; - } - - /** - * Get rowOrder. - * - * @return int - */ - public function getRowOrder() - { - return $this->rowOrder; - } - - /** - * Set publishedat. - * - * @param \DateTime $publishedat - * - * @return Alert - */ - public function setpublishedat($publishedat) - { - $this->publishedat = $publishedat; - - return $this; - } - - /** - * Get publishedat. - * - * @return \DateTime - */ - public function getpublishedat() - { - return $this->publishedat; - } - - /** - * Set unpublishedat. - * - * @param \DateTime $unpublishedat - * - * @return Alert - */ - public function setUnpublishedat($unpublishedat) - { - $this->unpublishedat = $unpublishedat; - - return $this; - } - - /** - * Get unpublishedat. - * - * @return \DateTime - */ - public function getUnpublishedat() - { - return $this->unpublishedat; - } - - /** - * Set roles. - * - * @param array $roles - * - * @return Alert - */ - public function setRoles($roles) - { - $this->roles = $roles; - - return $this; - } - - /** - * Get roles. - * - * @return array - */ - public function getRoles() - { - return $this->roles; - } - - /** - * Set alertcategory. - * - * @return Alert - */ - public function setAlertcategory(Alertcategory $alertcategory) - { - $this->alertcategory = $alertcategory; - - return $this; - } - - /** - * Get alertcategory. - * - * @return Alertcategory - */ - public function getAlertcategory() - { - return $this->alertcategory; - } - - /** - * Add group. - * - * @return Alert - */ - public function addGroup(Group $group) - { - $this->groups[] = $group; - - return $this; - } - - /** - * Remove group. - */ - public function removeGroup(Group $group) - { - $this->groups->removeElement($group); - } - - /** - * Get groups. - * - * @return \Doctrine\Common\Collections\Collection - */ - public function getGroups() - { - return $this->groups; - } - - /** - * Set fghideable. - * - * @param bool $fghideable - * - * @return Alert - */ - public function setFghideable($fghideable) - { - $this->fghideable = $fghideable; - - return $this; - } - - /** - * Get fghideable. - * - * @return bool - */ - public function getFghideable() - { - return $this->fghideable; - } - - /** - * Add reader. - * - * @return Alert - */ - public function addReader(User $reader) - { - $this->readers[] = $reader; - - return $this; - } - - /** - * Remove reader. - */ - public function removeReader(User $reader) - { - $this->readers->removeElement($reader); - } - - /** - * Get readers. - * - * @return \Doctrine\Common\Collections\Collection - */ - public function getReaders() - { - return $this->readers; - } - - public function isFghideable(): ?bool - { - return $this->fghideable; - } -} diff --git a/src/Entity/Alertcategory.php b/src/Entity/Alertcategory.php deleted file mode 100755 index 9bc7682..0000000 --- a/src/Entity/Alertcategory.php +++ /dev/null @@ -1,175 +0,0 @@ -id = $id; - - return $this; - } - - /** - * Constructor. - */ - public function __construct() - { - $this->alerts = new \Doctrine\Common\Collections\ArrayCollection(); - } - - /** - * Get id. - * - * @return int - */ - public function getId() - { - return $this->id; - } - - /** - * Set label. - * - * @param string $label - * - * @return Alertcategory - */ - public function setLabel($label) - { - $this->label = $label; - - return $this; - } - - /** - * Get label. - * - * @return string - */ - public function getLabel() - { - return $this->label; - } - - /** - * Set color. - * - * @param string $color - * - * @return Alertcategory - */ - public function setColor($color) - { - $this->color = $color; - - return $this; - } - - /** - * Get color. - * - * @return string - */ - public function getColor() - { - return $this->color; - } - - /** - * Set icon. - * - * @param Icon $icon - * - * @return Alertcategory - */ - public function setIcon(Icon $icon = null) - { - $this->icon = $icon; - - return $this; - } - - /** - * Get icon. - * - * @return Icon - */ - public function getIcon() - { - return $this->icon; - } - - /** - * Add alert. - * - * @return Alertcategory - */ - public function addAlert(Alert $alert) - { - $this->alerts[] = $alert; - - return $this; - } - - /** - * Remove alert. - */ - public function removeAlert(Alert $alert) - { - $this->alerts->removeElement($alert); - } - - /** - * Get alerts. - * - * @return \Doctrine\Common\Collections\Collection - */ - public function getAlerts() - { - return $this->alerts; - } -} diff --git a/src/Entity/Audit.php b/src/Entity/Audit.php index 6a3e46b..5457768 100755 --- a/src/Entity/Audit.php +++ b/src/Entity/Audit.php @@ -2,6 +2,7 @@ namespace App\Entity; +use Doctrine\DBAL\Types\Types; use Doctrine\ORM\Mapping as ORM; /** diff --git a/src/Entity/Blog.php b/src/Entity/Blog.php new file mode 100644 index 0000000..40c1a68 --- /dev/null +++ b/src/Entity/Blog.php @@ -0,0 +1,201 @@ +childs = new ArrayCollection(); + $this->menuchilds = new ArrayCollection(); + } + + /** + * @ORM\PrePersist + */ + public function onPrePersist() + { + $this->submitdate = new \DateTime('now'); + } + + public function getId(): ?int + { + return $this->id; + } + + public function getName(): ?string + { + return $this->name; + } + + public function setName(string $name): self + { + $this->name = $name; + + return $this; + } + + public function getSubmitdate(): ?\DateTimeInterface + { + return $this->submitdate; + } + + public function setSubmitdate(\DateTimeInterface $submitdate): self + { + $this->submitdate = $submitdate; + + return $this; + } + + public function getExternalcode(): ?string + { + return $this->externalcode; + } + + public function setExternalcode(?string $externalcode): self + { + $this->externalcode = $externalcode; + + return $this; + } + + public function getExternalid(): ?string + { + return $this->externalid; + } + + public function setExternalid(?string $externalid): self + { + $this->externalid = $externalid; + + return $this; + } + + public function getBlogtype(): ?Blogtype + { + return $this->blogtype; + } + + public function setBlogtype(?Blogtype $blogtype): self + { + $this->blogtype = $blogtype; + + return $this; + } + + /** + * @return Collection + */ + public function getChilds(): Collection + { + return $this->childs; + } + + public function addChild(Child $child): self + { + if (!$this->childs->contains($child)) { + $this->childs->add($child); + $child->setBlog($this); + } + + return $this; + } + + public function removeChild(Child $child): self + { + if ($this->childs->removeElement($child)) { + // set the owning side to null (unless already changed) + if ($child->getBlog() === $this) { + $child->setBlog(null); + } + } + + return $this; + } + + /** + * @return Collection + */ + public function getMenuchilds(): Collection + { + return $this->menuchilds; + } + + public function addMenuchild(Menuchild $menuchild): self + { + if (!$this->menuchilds->contains($menuchild)) { + $this->menuchilds->add($menuchild); + $menuchild->setBlog($this); + } + + return $this; + } + + public function removeMenuchild(Menuchild $menuchild): self + { + if ($this->menuchilds->removeElement($menuchild)) { + // set the owning side to null (unless already changed) + if ($menuchild->getBlog() === $this) { + $menuchild->setBlog(null); + } + } + + return $this; + } + +} diff --git a/src/Entity/Blogtype.php b/src/Entity/Blogtype.php new file mode 100644 index 0000000..961da4c --- /dev/null +++ b/src/Entity/Blogtype.php @@ -0,0 +1,180 @@ +id = $id; + + return $this; + } + + public function __construct() + { + $this->blogs = new ArrayCollection(); + $this->menuchilds = new ArrayCollection(); + } + + public function getId(): ?int + { + return $this->id; + } + + public function getName(): ?string + { + return $this->name; + } + + public function setName(string $name): self + { + $this->name = $name; + + return $this; + } + + public function getSortby(): ?string + { + return $this->sortby; + } + + public function setSortby(string $sortby): self + { + $this->sortby = $sortby; + + return $this; + } + + public function getImage(): ?string + { + return $this->image; + } + + public function setImage(?string $image): self + { + $this->image = $image; + + return $this; + } + + /** + * @return Collection + */ + public function getBlogs(): Collection + { + return $this->blogs; + } + + public function addBlog(Blog $blog): self + { + if (!$this->blogs->contains($blog)) { + $this->blogs->add($blog); + $blog->setBlogtype($this); + } + + return $this; + } + + public function removeBlog(Blog $blog): self + { + if ($this->blogs->removeElement($blog)) { + // set the owning side to null (unless already changed) + if ($blog->getBlogtype() === $this) { + $blog->setBlogtype(null); + } + } + + return $this; + } + + /** + * @return Collection + */ + public function getMenuchilds(): Collection + { + return $this->menuchilds; + } + + public function addMenuchild(Menuchild $menuchild): self + { + if (!$this->menuchilds->contains($menuchild)) { + $this->menuchilds->add($menuchild); + $menuchild->setBlogtype($this); + } + + return $this; + } + + public function removeMenuchild(Menuchild $menuchild): self + { + if ($this->menuchilds->removeElement($menuchild)) { + // set the owning side to null (unless already changed) + if ($menuchild->getBlogtype() === $this) { + $menuchild->setBlogtype(null); + } + } + + return $this; + } + + public function getDescription(): ?string + { + return $this->description; + } + + public function setDescription(?string $description): self + { + $this->description = $description; + + return $this; + } +} diff --git a/src/Entity/Bookmark.php b/src/Entity/Bookmark.php deleted file mode 100755 index 71053e5..0000000 --- a/src/Entity/Bookmark.php +++ /dev/null @@ -1,337 +0,0 @@ -id; - } - - /** - * Set title. - * - * @param string $title - * - * @return Bookmark - */ - public function setTitle($title) - { - $this->title = $title; - - return $this; - } - - /** - * Get title. - * - * @return string - */ - public function getTitle() - { - return $this->title; - } - - /** - * Set subtitle. - * - * @param string $subtitle - * - * @return Bookmark - */ - public function setSubtitle($subtitle) - { - $this->subtitle = $subtitle; - - return $this; - } - - /** - * Get subtitle. - * - * @return string - */ - public function getSubtitle() - { - return $this->subtitle; - } - - /** - * Set url. - * - * @param string $url - * - * @return Bookmark - */ - public function setUrl($url) - { - $this->url = $url; - - return $this; - } - - /** - * Get url. - * - * @return string - */ - public function getUrl() - { - return $this->url; - } - - /** - * Set target. - * - * @param string $target - * - * @return Bookmark - */ - public function setTarget($target) - { - $this->target = $target; - - return $this; - } - - /** - * Get target. - * - * @return string - */ - public function getTarget() - { - return $this->target; - } - - /** - * Set rowOrder. - * - * @param int $rowOrder - * - * @return Bookmark - */ - public function setRowOrder($rowOrder) - { - $this->rowOrder = $rowOrder; - - return $this; - } - - /** - * Get rowOrder. - * - * @return int - */ - public function getRowOrder() - { - return $this->rowOrder; - } - - /** - * Set color. - * - * @param string $color - * - * @return Bookmark - */ - public function setColor($color) - { - $this->color = $color; - - return $this; - } - - /** - * Get color. - * - * @return string - */ - public function getColor() - { - return $this->color; - } - - /** - * Set icon. - * - * @param Icon $icon - * - * @return Bookmark - */ - public function setIcon(Icon $icon = null) - { - $this->icon = $icon; - - return $this; - } - - /** - * Get icon. - * - * @return Icon - */ - public function getIcon() - { - return $this->icon; - } - - /** - * Set user. - * - * @param User $user - * - * @return Bookmark - */ - public function setUser(User $user = null) - { - $this->user = $user; - - return $this; - } - - /** - * Get user. - * - * @return User - */ - public function getUser() - { - return $this->user; - } - - /** - * Set pagewidget. - * - * @param Pagewidget $pagewidget - * - * @return Bookmark - */ - public function setPagewidget(Pagewidget $pagewidget = null) - { - $this->pagewidget = $pagewidget; - - return $this; - } - - /** - * Get pagewidget. - * - * @return Pagewidget - */ - public function getPagewidget() - { - return $this->pagewidget; - } - - /** - * Set item. - * - * @param Item $item - * - * @return Bookmark - */ - public function setItem(Item $item = null) - { - $this->item = $item; - - return $this; - } - - /** - * Get item. - * - * @return Item - */ - public function getItem() - { - return $this->item; - } -} diff --git a/src/Entity/Child.php b/src/Entity/Child.php new file mode 100644 index 0000000..68be8be --- /dev/null +++ b/src/Entity/Child.php @@ -0,0 +1,404 @@ +childheaders = new ArrayCollection(); + $this->tags = new ArrayCollection(); + $this->pins = new ArrayCollection(); + } + + /** + * @ORM\PrePersist + */ + public function onPrePersist() + { + $this->submitdate = new \DateTime('now'); + } + + public function getId(): ?int + { + return $this->id; + } + + public function getName(): ?string + { + return $this->name; + } + + public function setName(string $name): self + { + $this->name = $name; + + return $this; + } + + public function getSubname(): ?string + { + return $this->subname; + } + + public function setSubname(?string $subname): self + { + $this->subname = $subname; + + return $this; + } + + public function getDescription(): ?string + { + return $this->description; + } + + public function setDescription(?string $description): self + { + $this->description = $description; + + return $this; + } + + public function getSubmitdate(): ?\DateTimeInterface + { + return $this->submitdate; + } + + public function setSubmitdate(\DateTimeInterface $submitdate): self + { + $this->submitdate = $submitdate; + + return $this; + } + + public function getFilename(): ?string + { + return $this->filename; + } + + public function setFilename(?string $filename): self + { + $this->filename = $filename; + + return $this; + } + + public function getFileextention(): ?string + { + return $this->fileextention; + } + + public function setFileextention(?string $fileextention): self + { + $this->fileextention = $fileextention; + + return $this; + } + + public function getFileminetype(): ?string + { + return $this->fileminetype; + } + + public function setFileminetype(?string $fileminetype): self + { + $this->fileminetype = $fileminetype; + + return $this; + } + + public function getUrl(): ?string + { + return $this->url; + } + + public function setUrl(?string $url): self + { + $this->url = $url; + + return $this; + } + + public function getExternalcode(): ?string + { + return $this->externalcode; + } + + public function setExternalcode(?string $externalcode): self + { + $this->externalcode = $externalcode; + + return $this; + } + + public function getExternalid(): ?string + { + return $this->externalid; + } + + public function setExternalid(?string $externalid): self + { + $this->externalid = $externalid; + + return $this; + } + + public function getExternalscript(): ?string + { + return $this->externalscript; + } + + public function setExternalscript(?string $externalscript): self + { + $this->externalscript = $externalscript; + + return $this; + } + + public function getBlog(): ?Blog + { + return $this->blog; + } + + public function setBlog(?Blog $blog): self + { + $this->blog = $blog; + + return $this; + } + + public function getPage(): ?Page + { + return $this->page; + } + + public function setPage(?Page $page): self + { + $this->page = $page; + + return $this; + } + + public function getChildtype(): ?Childtype + { + return $this->childtype; + } + + public function setChildtype(?Childtype $childtype): self + { + $this->childtype = $childtype; + + return $this; + } + + /** + * @return Collection + */ + public function getChildheaders(): Collection + { + return $this->childheaders; + } + + public function addChildheader(Childheader $childheader): self + { + if (!$this->childheaders->contains($childheader)) { + $this->childheaders->add($childheader); + $childheader->setChild($this); + } + + return $this; + } + + public function removeChildheader(Childheader $childheader): self + { + if ($this->childheaders->removeElement($childheader)) { + // set the owning side to null (unless already changed) + if ($childheader->getChild() === $this) { + $childheader->setChild(null); + } + } + + return $this; + } + + /** + * @return Collection + */ + public function getTags(): Collection + { + return $this->tags; + } + + public function addTag(Tag $tag): self + { + if (!$this->tags->contains($tag)) { + $this->tags->add($tag); + } + + return $this; + } + + public function removeTag(Tag $tag): self + { + $this->tags->removeElement($tag); + + return $this; + } + + /** + * @return Collection + */ + public function getPins(): Collection + { + return $this->pins; + } + + public function addPin(Pin $pin): self + { + if (!$this->pins->contains($pin)) { + $this->pins->add($pin); + } + + return $this; + } + + public function removePin(Pin $pin): self + { + $this->pins->removeElement($pin); + + return $this; + } + + public function getRoworder(): ?int + { + return $this->roworder; + } + + public function setRoworder(int $roworder): self + { + $this->roworder = $roworder; + + return $this; + } + +} diff --git a/src/Entity/Childheader.php b/src/Entity/Childheader.php new file mode 100644 index 0000000..b7192ad --- /dev/null +++ b/src/Entity/Childheader.php @@ -0,0 +1,94 @@ +id; + } + + public function getFilename(): ?string + { + return $this->filename; + } + + public function setFilename(string $filename): self + { + $this->filename = $filename; + + return $this; + } + + public function getChild(): ?Child + { + return $this->child; + } + + public function setChild(?Child $child): self + { + $this->child = $child; + + return $this; + } + + public function getRoworder(): ?int + { + return $this->roworder; + } + + public function setRoworder(int $roworder): self + { + $this->roworder = $roworder; + + return $this; + } + + public function getCredit(): ?string + { + return $this->credit; + } + + public function setCredit(?string $credit): self + { + $this->credit = $credit; + + return $this; + } +} diff --git a/src/Entity/Childtype.php b/src/Entity/Childtype.php new file mode 100644 index 0000000..c41e3bb --- /dev/null +++ b/src/Entity/Childtype.php @@ -0,0 +1,216 @@ +childs = new ArrayCollection(); + $this->childtypeattributs = new ArrayCollection(); + } + + public function getId(): ?int + { + return $this->id; + } + + public function setId(int $id): self + { + $this->id = $id; + + return $this; + } + + public function getName(): ?string + { + return $this->name; + } + + public function setName(string $name): self + { + $this->name = $name; + + return $this; + } + + public function getRoworder(): ?int + { + return $this->roworder; + } + + public function setRoworder(int $roworder): self + { + $this->roworder = $roworder; + + return $this; + } + + public function getSubmitroute(): ?string + { + return $this->submitroute; + } + + public function setSubmitroute(string $submitroute): self + { + $this->submitroute = $submitroute; + + return $this; + } + + public function getHavechildheader(): ?bool + { + return $this->havechildheader; + } + + public function setHavechildheader(bool $havechildheader): self + { + $this->havechildheader = $havechildheader; + + return $this; + } + + public function getHavefile(): ?bool + { + return $this->havefile; + } + + public function setHavefile(bool $havefile): self + { + $this->havefile = $havefile; + + return $this; + } + + public function getHaveurl(): ?bool + { + return $this->haveurl; + } + + public function setHaveurl(bool $haveurl): self + { + $this->haveurl = $haveurl; + + return $this; + } + + /** + * @return Collection|Child[] + */ + public function getChilds(): Collection + { + return $this->childs; + } + + public function addChild(Child $child): self + { + if (!$this->childs->contains($child)) { + $this->childs[] = $child; + $child->setChildtype($this); + } + + return $this; + } + + public function removeChild(Child $child): self + { + if ($this->childs->contains($child)) { + $this->childs->removeElement($child); + // set the owning side to null (unless already changed) + if ($child->getChildtype() === $this) { + $child->setChildtype(null); + } + } + + return $this; + } + + public function getHavepin(): ?bool + { + return $this->havepin; + } + + public function setHavepin(bool $havepin): self + { + $this->havepin = $havepin; + + return $this; + } + + public function isHavechildheader(): ?bool + { + return $this->havechildheader; + } + + public function isHavefile(): ?bool + { + return $this->havefile; + } + + public function isHaveurl(): ?bool + { + return $this->haveurl; + } + + public function isHavepin(): ?bool + { + return $this->havepin; + } +} diff --git a/src/Entity/Config.php b/src/Entity/Config.php index 3dae3f8..074f226 100755 --- a/src/Entity/Config.php +++ b/src/Entity/Config.php @@ -2,6 +2,7 @@ namespace App\Entity; +use Doctrine\DBAL\Types\Types; use Doctrine\ORM\Mapping as ORM; /** diff --git a/src/Entity/Cron.php b/src/Entity/Cron.php index 68f4f80..3986140 100755 --- a/src/Entity/Cron.php +++ b/src/Entity/Cron.php @@ -2,6 +2,7 @@ namespace App\Entity; +use Doctrine\DBAL\Types\Types; use Doctrine\ORM\Mapping as ORM; use Symfony\Component\Validator\Constraints as Assert; diff --git a/src/Entity/Group.php b/src/Entity/Group.php index 3238587..f5936ec 100755 --- a/src/Entity/Group.php +++ b/src/Entity/Group.php @@ -5,6 +5,7 @@ namespace App\Entity; use App\Validator; use Doctrine\Common\Collections\ArrayCollection; use Doctrine\Common\Collections\Collection; +use Doctrine\DBAL\Types\Types; use Doctrine\ORM\Mapping as ORM; use Symfony\Bridge\Doctrine\Validator\Constraints\UniqueEntity; @@ -80,11 +81,6 @@ class Group */ private $owner; - /** - * @ORM\ManyToOne(targetEntity="Page", inversedBy="templategroups") - */ - private $pagetemplate; - /** * @var ArrayCollection * @var UserGroup @@ -93,27 +89,9 @@ class Group */ private $users; - /** - * @ORM\ManyToMany(targetEntity="Alert", mappedBy="groups") - */ - protected $alerts; - - /** - * @ORM\ManyToMany(targetEntity="Item", mappedBy="groups") - */ - protected $items; - - /** - * @ORM\ManyToMany(targetEntity="Page", mappedBy="groups") - */ - protected $pages; - public function __construct() { $this->users = new ArrayCollection(); - $this->alerts = new ArrayCollection(); - $this->items = new ArrayCollection(); - $this->pages = new ArrayCollection(); } // == CODE A NE PAS REGENERER @@ -279,97 +257,4 @@ class Group return $this; } - - /** - * @return Collection - */ - public function getAlerts(): Collection - { - return $this->alerts; - } - - public function addAlert(Alert $alert): self - { - if (!$this->alerts->contains($alert)) { - $this->alerts->add($alert); - $alert->addGroup($this); - } - - return $this; - } - - public function removeAlert(Alert $alert): self - { - if ($this->alerts->removeElement($alert)) { - $alert->removeGroup($this); - } - - return $this; - } - - /** - * @return Collection - */ - public function getItems(): Collection - { - return $this->items; - } - - public function addItem(Item $item): self - { - if (!$this->items->contains($item)) { - $this->items->add($item); - $item->addGroup($this); - } - - return $this; - } - - public function removeItem(Item $item): self - { - if ($this->items->removeElement($item)) { - $item->removeGroup($this); - } - - return $this; - } - - public function getPagetemplate(): ?Page - { - return $this->pagetemplate; - } - - public function setPagetemplate(?Page $pagetemplate): self - { - $this->pagetemplate = $pagetemplate; - - return $this; - } - - /** - * @return Collection - */ - public function getPages(): Collection - { - return $this->pages; - } - - public function addPage(Page $page): self - { - if (!$this->pages->contains($page)) { - $this->pages->add($page); - $page->addGroup($this); - } - - return $this; - } - - public function removePage(Page $page): self - { - if ($this->pages->removeElement($page)) { - $page->removeGroup($this); - } - - return $this; - } } diff --git a/src/Entity/Icon.php b/src/Entity/Icon.php deleted file mode 100755 index 4ddbb74..0000000 --- a/src/Entity/Icon.php +++ /dev/null @@ -1,400 +0,0 @@ -items = new \Doctrine\Common\Collections\ArrayCollection(); - $this->itemcategorys = new \Doctrine\Common\Collections\ArrayCollection(); - $this->alertcategorys = new \Doctrine\Common\Collections\ArrayCollection(); - $this->pagewidgets = new \Doctrine\Common\Collections\ArrayCollection(); - $this->widgets = new \Doctrine\Common\Collections\ArrayCollection(); - $this->bookmarks = new \Doctrine\Common\Collections\ArrayCollection(); - $this->groups = new ArrayCollection(); - } - - /** - * Get id. - * - * @return int - */ - public function getId() - { - return $this->id; - } - - /** - * Set label. - * - * @param string $label - * - * @return Icon - */ - public function setLabel($label) - { - $this->label = $label; - - return $this; - } - - /** - * Get label. - * - * @return string - */ - public function getLabel() - { - return $this->label; - } - - /** - * Set user. - * - * @param User $user - * - * @return Icon - */ - public function setUser(User $user = null) - { - $this->user = $user; - - return $this; - } - - /** - * Get user. - * - * @return User - */ - public function getUser() - { - return $this->user; - } - - /** - * Add item. - * - * @return Icon - */ - public function addItem(Item $item) - { - $this->items[] = $item; - - return $this; - } - - /** - * Remove item. - */ - public function removeItem(Item $item) - { - $this->items->removeElement($item); - } - - /** - * Get items. - * - * @return \Doctrine\Common\Collections\Collection - */ - public function getItems() - { - return $this->items; - } - - /** - * Add itemcategory. - * - * @return Icon - */ - public function addItemcategory(Itemcategory $itemcategory) - { - $this->itemcategorys[] = $itemcategory; - - return $this; - } - - /** - * Remove itemcategory. - */ - public function removeItemcategory(Itemcategory $itemcategory) - { - $this->itemcategorys->removeElement($itemcategory); - } - - /** - * Get itemcategorys. - * - * @return \Doctrine\Common\Collections\Collection - */ - public function getItemcategorys() - { - return $this->itemcategorys; - } - - /** - * Add alertcategory. - * - * @return Icon - */ - public function addAlertcategory(Alertcategory $alertcategory) - { - $this->alertcategorys[] = $alertcategory; - - return $this; - } - - /** - * Remove alertcategory. - */ - public function removeAlertcategory(Alertcategory $alertcategory) - { - $this->alertcategorys->removeElement($alertcategory); - } - - /** - * Get alertcategorys. - * - * @return \Doctrine\Common\Collections\Collection - */ - public function getAlertcategorys() - { - return $this->alertcategorys; - } - - /** - * Add pagewidget. - * - * @return Icon - */ - public function addPagewidget(Pagewidget $pagewidget) - { - $this->pagewidgets[] = $pagewidget; - - return $this; - } - - /** - * Remove pagewidget. - */ - public function removePagewidget(Pagewidget $pagewidget) - { - $this->pagewidgets->removeElement($pagewidget); - } - - /** - * Get pagewidgets. - * - * @return \Doctrine\Common\Collections\Collection - */ - public function getPagewidgets() - { - return $this->pagewidgets; - } - - /** - * Add widget. - * - * @return Icon - */ - public function addWidget(Widget $widget) - { - $this->widgets[] = $widget; - - return $this; - } - - /** - * Remove widget. - */ - public function removeWidget(Widget $widget) - { - $this->widgets->removeElement($widget); - } - - /** - * Get widgets. - * - * @return \Doctrine\Common\Collections\Collection - */ - public function getWidgets() - { - return $this->widgets; - } - - /** - * Add bookmark. - * - * @return Icon - */ - public function addBookmark(Bookmark $bookmark) - { - $this->bookmarks[] = $bookmark; - - return $this; - } - - /** - * Remove bookmark. - */ - public function removeBookmark(Bookmark $bookmark) - { - $this->bookmarks->removeElement($bookmark); - } - - /** - * Get bookmarks. - * - * @return \Doctrine\Common\Collections\Collection - */ - public function getBookmarks() - { - return $this->bookmarks; - } - - /** - * Add group. - * - * @return Icon - */ - public function addGroup(Group $group) - { - $this->groups[] = $group; - - return $this; - } - - /** - * Remove group. - */ - public function removeGroup(Group $group) - { - $this->groups->removeElement($group); - } - - /** - * Get groups. - * - * @return \Doctrine\Common\Collections\Collection - */ - public function getGroups() - { - return $this->groups; - } - - /** - * Set tags. - * - * @param string $tags - * - * @return Icon - */ - public function setTags($tags) - { - $this->tags = $tags; - - return $this; - } - - /** - * Get tags. - * - * @return string - */ - public function getTags() - { - return $this->tags; - } -} diff --git a/src/Entity/Item.php b/src/Entity/Item.php deleted file mode 100755 index ebc4006..0000000 --- a/src/Entity/Item.php +++ /dev/null @@ -1,359 +0,0 @@ -bookmarks = new ArrayCollection(); - $this->groups = new ArrayCollection(); - } - - // A garder pour forcer l'id en init - public function setId($id) - { - $this->id = $id; - - return $this; - } - - public function getId(): ?int - { - return $this->id; - } - - public function getTitle(): ?string - { - return $this->title; - } - - public function setTitle(string $title): self - { - $this->title = $title; - - return $this; - } - - public function getSubtitle(): ?string - { - return $this->subtitle; - } - - public function setSubtitle(?string $subtitle): self - { - $this->subtitle = $subtitle; - - return $this; - } - - public function getSlug(): ?string - { - return $this->slug; - } - - public function setSlug(?string $slug): self - { - $this->slug = $slug; - - return $this; - } - - public function getUrl(): ?string - { - return $this->url; - } - - public function setUrl(string $url): self - { - $this->url = $url; - - return $this; - } - - public function getTarget(): ?string - { - return $this->target; - } - - public function setTarget(string $target): self - { - $this->target = $target; - - return $this; - } - - public function getContent(): ?string - { - return $this->content; - } - - public function setContent(?string $content): self - { - $this->content = $content; - - return $this; - } - - public function getRowOrder(): ?int - { - return $this->rowOrder; - } - - public function setRowOrder(?int $rowOrder): self - { - $this->rowOrder = $rowOrder; - - return $this; - } - - public function isEssential(): ?bool - { - return $this->essential; - } - - public function setEssential(?bool $essential): self - { - $this->essential = $essential; - - return $this; - } - - public function isProtected(): ?bool - { - return $this->protected; - } - - public function setProtected(?bool $protected): self - { - $this->protected = $protected; - - return $this; - } - - public function getColor(): ?string - { - return $this->color; - } - - public function setColor(?string $color): self - { - $this->color = $color; - - return $this; - } - - public function getRoles(): array - { - return $this->roles; - } - - public function setRoles(?array $roles): self - { - $this->roles = $roles; - - return $this; - } - - public function getIcon(): ?Icon - { - return $this->icon; - } - - public function setIcon(?Icon $icon): self - { - $this->icon = $icon; - - return $this; - } - - /** - * @return Collection - */ - public function getBookmarks(): Collection - { - return $this->bookmarks; - } - - public function addBookmark(Bookmark $bookmark): self - { - if (!$this->bookmarks->contains($bookmark)) { - $this->bookmarks->add($bookmark); - $bookmark->setItem($this); - } - - return $this; - } - - public function removeBookmark(Bookmark $bookmark): self - { - if ($this->bookmarks->removeElement($bookmark)) { - // set the owning side to null (unless already changed) - if ($bookmark->getItem() === $this) { - $bookmark->setItem(null); - } - } - - return $this; - } - - public function getItemcategory(): ?Itemcategory - { - return $this->itemcategory; - } - - public function setItemcategory(?Itemcategory $itemcategory): self - { - $this->itemcategory = $itemcategory; - - return $this; - } - - /** - * @return Collection - */ - public function getGroups(): Collection - { - return $this->groups; - } - - public function addGroup(Group $group): self - { - if (!$this->groups->contains($group)) { - $this->groups->add($group); - } - - return $this; - } - - public function removeGroup(Group $group): self - { - $this->groups->removeElement($group); - - return $this; - } -} diff --git a/src/Entity/Itemcategory.php b/src/Entity/Itemcategory.php deleted file mode 100755 index 424a2c0..0000000 --- a/src/Entity/Itemcategory.php +++ /dev/null @@ -1,213 +0,0 @@ -id = $id; - - return $this; - } - - /** - * Constructor. - */ - public function __construct() - { - $this->items = new \Doctrine\Common\Collections\ArrayCollection(); - } - - /** - * Get id. - * - * @return int - */ - public function getId() - { - return $this->id; - } - - /** - * Set label. - * - * @param string $label - * - * @return Itemcategory - */ - public function setLabel($label) - { - $this->label = $label; - - return $this; - } - - /** - * Get label. - * - * @return string - */ - public function getLabel() - { - return $this->label; - } - - /** - * Set color. - * - * @param string $color - * - * @return Itemcategory - */ - public function setColor($color) - { - $this->color = $color; - - return $this; - } - - /** - * Get color. - * - * @return string - */ - public function getColor() - { - return $this->color; - } - - /** - * Set rowOrder. - * - * @param int $rowOrder - * - * @return Itemcategory - */ - public function setRowOrder($rowOrder) - { - $this->rowOrder = $rowOrder; - - return $this; - } - - /** - * Get rowOrder. - * - * @return int - */ - public function getRowOrder() - { - return $this->rowOrder; - } - - /** - * Set icon. - * - * @param Icon $icon - * - * @return Itemcategory - */ - public function setIcon(Icon $icon = null) - { - $this->icon = $icon; - - return $this; - } - - /** - * Get icon. - * - * @return Icon - */ - public function getIcon() - { - return $this->icon; - } - - /** - * Add item. - * - * @return Itemcategory - */ - public function addItem(Item $item) - { - $this->items[] = $item; - - return $this; - } - - /** - * Remove item. - */ - public function removeItem(Item $item) - { - $this->items->removeElement($item); - } - - /** - * Get items. - * - * @return \Doctrine\Common\Collections\Collection - */ - public function getItems() - { - return $this->items; - } -} diff --git a/src/Entity/Menu.php b/src/Entity/Menu.php new file mode 100644 index 0000000..b956fd8 --- /dev/null +++ b/src/Entity/Menu.php @@ -0,0 +1,93 @@ +id = $id; + + return $this; + } + + public function __construct() + { + $this->menuchilds = new ArrayCollection(); + } + + public function getId(): ?int + { + return $this->id; + } + + public function getName(): ?string + { + return $this->name; + } + + public function setName(string $name): self + { + $this->name = $name; + + return $this; + } + + /** + * @return Collection + */ + public function getMenuchilds(): Collection + { + return $this->menuchilds; + } + + public function addMenuchild(Menuchild $menuchild): self + { + if (!$this->menuchilds->contains($menuchild)) { + $this->menuchilds->add($menuchild); + $menuchild->setMenu($this); + } + + return $this; + } + + public function removeMenuchild(Menuchild $menuchild): self + { + if ($this->menuchilds->removeElement($menuchild)) { + // set the owning side to null (unless already changed) + if ($menuchild->getMenu() === $this) { + $menuchild->setMenu(null); + } + } + + return $this; + } +} diff --git a/src/Entity/Menuchild.php b/src/Entity/Menuchild.php new file mode 100644 index 0000000..3d90724 --- /dev/null +++ b/src/Entity/Menuchild.php @@ -0,0 +1,145 @@ +id; + } + + public function getChildtype(): ?string + { + return $this->childtype; + } + + public function setChildtype(string $childtype): self + { + $this->childtype = $childtype; + + return $this; + } + + public function getRoworder(): ?int + { + return $this->roworder; + } + + public function setRoworder(int $roworder): self + { + $this->roworder = $roworder; + + return $this; + } + + public function getMenu(): ?Menu + { + return $this->menu; + } + + public function setMenu(?Menu $menu): self + { + $this->menu = $menu; + + return $this; + } + + public function getBlog(): ?Blog + { + return $this->blog; + } + + public function setBlog(?Blog $blog): self + { + $this->blog = $blog; + + return $this; + } + + public function getPage(): ?Page + { + return $this->page; + } + + public function setPage(?Page $page): self + { + $this->page = $page; + + return $this; + } + + public function getBlogtype(): ?Blogtype + { + return $this->blogtype; + } + + public function setBlogtype(?Blogtype $blogtype): self + { + $this->blogtype = $blogtype; + + return $this; + } + + public function getPagetype(): ?Pagetype + { + return $this->pagetype; + } + + public function setPagetype(?Pagetype $pagetype): self + { + $this->pagetype = $pagetype; + + return $this; + } +} diff --git a/src/Entity/Niveau01.php b/src/Entity/Niveau01.php index 5cc3e1c..f0cc6e0 100755 --- a/src/Entity/Niveau01.php +++ b/src/Entity/Niveau01.php @@ -5,6 +5,7 @@ namespace App\Entity; use App\Validator; use Doctrine\Common\Collections\ArrayCollection; use Doctrine\Common\Collections\Collection; +use Doctrine\DBAL\Types\Types; use Doctrine\ORM\Mapping as ORM; use Symfony\Bridge\Doctrine\Validator\Constraints\UniqueEntity; diff --git a/src/Entity/Niveau02.php b/src/Entity/Niveau02.php index fcd93d1..9dd71df 100755 --- a/src/Entity/Niveau02.php +++ b/src/Entity/Niveau02.php @@ -5,6 +5,7 @@ namespace App\Entity; use App\Validator; use Doctrine\Common\Collections\ArrayCollection; use Doctrine\Common\Collections\Collection; +use Doctrine\DBAL\Types\Types; use Doctrine\ORM\Mapping as ORM; use Symfony\Bridge\Doctrine\Validator\Constraints\UniqueEntity; diff --git a/src/Entity/Niveau03.php b/src/Entity/Niveau03.php index 01c538a..0083c92 100755 --- a/src/Entity/Niveau03.php +++ b/src/Entity/Niveau03.php @@ -5,6 +5,7 @@ namespace App\Entity; use App\Validator; use Doctrine\Common\Collections\ArrayCollection; use Doctrine\Common\Collections\Collection; +use Doctrine\DBAL\Types\Types; use Doctrine\ORM\Mapping as ORM; use Symfony\Bridge\Doctrine\Validator\Constraints\UniqueEntity; diff --git a/src/Entity/Niveau04.php b/src/Entity/Niveau04.php index b2411f2..bfec68e 100755 --- a/src/Entity/Niveau04.php +++ b/src/Entity/Niveau04.php @@ -5,6 +5,7 @@ namespace App\Entity; use App\Validator; use Doctrine\Common\Collections\ArrayCollection; use Doctrine\Common\Collections\Collection; +use Doctrine\DBAL\Types\Types; use Doctrine\ORM\Mapping as ORM; use Symfony\Bridge\Doctrine\Validator\Constraints\UniqueEntity; diff --git a/src/Entity/Page.php b/src/Entity/Page.php old mode 100755 new mode 100644 index 174745f..b696e19 --- a/src/Entity/Page.php +++ b/src/Entity/Page.php @@ -3,640 +3,199 @@ namespace App\Entity; use Doctrine\Common\Collections\ArrayCollection; +use Doctrine\Common\Collections\Collection; +use Doctrine\DBAL\Types\Types; use Doctrine\ORM\Mapping as ORM; /** * Page. * - * @ORM\Entity - * @ORM\Table(name="page") + * @ORM\Table(name="Page") * @ORM\Entity(repositoryClass="App\Repository\PageRepository") + * @ORM\HasLifecycleCallbacks */ class Page { /** - * @var int - * - * @ORM\Column(name="id", type="integer") * @ORM\Id + * @ORM\Column(type="integer") * @ORM\GeneratedValue(strategy="AUTO") */ private $id; /** - * @var string - * - * @ORM\Column(name="name", type="string", length=100) + * @ORM\Column(type="string") */ private $name; /** - * @var int - * - * @ORM\Column(name="roworder", type="integer") + * @ORM\Column(type="datetime", nullable=false) */ - private $roworder; + private $submitdate; /** - * @var int - * - * @ORM\Column(name="maxwidth", type="integer") + * @ORM\Column(type="string", nullable=true) */ - private $maxwidth; + private $externalcode; /** - * @var string - * - * @ORM\Column(name="fonticon", type="string", nullable=true) + * @ORM\Column(type="string", nullable=true) */ - private $fonticon; + private $externalid; /** - * @var string - * - * @ORM\Column(name="url", type="text", nullable=true) + * @ORM\ManyToOne(targetEntity="Pagetype", inversedBy="pages") */ - private $url; + private $pagetype; /** - * @var bool - * - * @ORM\Column(name="toreload", type="boolean", nullable=true) + * @ORM\OneToMany(targetEntity="Child", mappedBy="page", cascade={"persist"}, orphanRemoval=true) + * @ORM\OrderBy({"roworder" = "ASC"}) */ - private $toreload; + private $childs; /** - * @var string - * - * @ORM\Column(name="html", type="text", nullable=true) + * @ORM\OneToMany(targetEntity="Menuchild", mappedBy="page", cascade={"persist"}, orphanRemoval=true) */ - private $html; + private $menuchilds; - /** - * @var string - * - * @ORM\Column(name="template", type="array", nullable=true) - */ - private $template; - - /** - * @var string - * - * @ORM\Column(name="parentfor", type="string", nullable=true) - */ - protected $parentfor; - - /** - * @var string - * - * @ORM\Column(name="roles", type="array", nullable=true) - */ - private $roles; - - /** - * @ORM\ManyToOne(targetEntity="Pagecategory", inversedBy="pages") - */ - private $pagecategory; - - /** - * @ORM\ManyToMany(targetEntity="Group", inversedBy="pages", cascade={"persist"}) - * @ORM\JoinTable(name="pagegroupe", - * joinColumns={@ORM\JoinColumn(name="page", referencedColumnName="id")}, - * inverseJoinColumns={@ORM\JoinColumn(name="groupe", referencedColumnName="id")} - * ) - */ - protected $groups; - - /** - * @ORM\ManyToOne(targetEntity="User", inversedBy="pages") - * @ORM\JoinColumn(nullable=true) - */ - private $user; - - /** - * @var ArrayCollection - * @var Pagewidget - * - * @ORM\OneToMany(targetEntity="Pagewidget", mappedBy="page", cascade={"persist"}, orphanRemoval=true) - * @ORM\OrderBy({"loc" = "ASC", "roworder" = "ASC"}) - */ - private $pagewidgets; - - /** - * @ORM\ManyToOne(targetEntity="Page", inversedBy="pages") - * @ORM\JoinColumn(nullable=true, onDelete="SET NULL") - */ - private $page; - - /** - * @var ArrayCollection - * @var Page - * - * @ORM\OneToMany(targetEntity="Page", mappedBy="page", cascade={"persist"}, orphanRemoval=false) - */ - private $pages; - - /** - * @var ArrayCollection - * @var Group - * - * @ORM\OneToMany(targetEntity="Group", mappedBy="pagetemplate", cascade={"persist"}, orphanRemoval=false) - */ - private $templategroups; - - /* champs calculé non stocké en base */ - private $canupdate; - - public function getCanupdate() - { - return $this->canupdate; - } - - public function setCanupdate($canupdate) - { - $this->canupdate = $canupdate; - - return $this; - } - - /* champs calculé non stocké en base */ - private $counterread; - - public function getCounterRead() - { - return $this->counterread; - } - - public function setCounterRead($counterread) - { - $this->counterread = $counterread; - - return $this; - } - - // A garder pour forcer l'id en init - public function setId($id) - { - $this->id = $id; - - return $this; - } - - /** - * Constructor. - */ public function __construct() { - $this->groups = new \Doctrine\Common\Collections\ArrayCollection(); - $this->pagewidgets = new \Doctrine\Common\Collections\ArrayCollection(); - $this->pages = new \Doctrine\Common\Collections\ArrayCollection(); - $this->templategroups = new ArrayCollection(); + $this->childs = new ArrayCollection(); + $this->menuchilds = new ArrayCollection(); } /** - * Get id. - * - * @return int + * @ORM\PrePersist */ - public function getId() + public function onPrePersist() + { + $this->submitdate = new \DateTime('now'); + } + + public function getId(): ?int { return $this->id; } - /** - * Set name. - * - * @param string $name - * - * @return Page - */ - public function setName($name) + public function getName(): ?string + { + return $this->name; + } + + public function setName(string $name): self { $this->name = $name; return $this; } - /** - * Get name. - * - * @return string - */ - public function getName() + public function getSubmitdate(): ?\DateTimeInterface { - return $this->name; + return $this->submitdate; } - /** - * Set roworder. - * - * @param int $roworder - * - * @return Page - */ - public function setRoworder($roworder) + public function setSubmitdate(\DateTimeInterface $submitdate): self { - $this->roworder = $roworder; + $this->submitdate = $submitdate; + + return $this; + } + + public function getExternalcode(): ?string + { + return $this->externalcode; + } + + public function setExternalcode(?string $externalcode): self + { + $this->externalcode = $externalcode; + + return $this; + } + + public function getExternalid(): ?string + { + return $this->externalid; + } + + public function setExternalid(?string $externalid): self + { + $this->externalid = $externalid; + + return $this; + } + + public function getPagetype(): ?Pagetype + { + return $this->pagetype; + } + + public function setPagetype(?Pagetype $pagetype): self + { + $this->pagetype = $pagetype; return $this; } /** - * Get roworder. - * - * @return int + * @return Collection */ - public function getRoworder() + public function getChilds(): Collection { - return $this->roworder; + return $this->childs; } - /** - * Set maxwidth. - * - * @param int $maxwidth - * - * @return Page - */ - public function setMaxwidth($maxwidth) + public function addChild(Child $child): self { - $this->maxwidth = $maxwidth; + if (!$this->childs->contains($child)) { + $this->childs->add($child); + $child->setPage($this); + } + + return $this; + } + + public function removeChild(Child $child): self + { + if ($this->childs->removeElement($child)) { + // set the owning side to null (unless already changed) + if ($child->getPage() === $this) { + $child->setPage(null); + } + } return $this; } /** - * Get maxwidth. - * - * @return int + * @return Collection */ - public function getMaxwidth() + public function getMenuchilds(): Collection { - return $this->maxwidth; + return $this->menuchilds; } - /** - * Set url. - * - * @param string $url - * - * @return Page - */ - public function setUrl($url) + public function addMenuchild(Menuchild $menuchild): self { - $this->url = $url; + if (!$this->menuchilds->contains($menuchild)) { + $this->menuchilds->add($menuchild); + $menuchild->setPage($this); + } return $this; } - /** - * Get url. - * - * @return string - */ - public function getUrl() + public function removeMenuchild(Menuchild $menuchild): self { - return $this->url; - } - - /** - * Set html. - * - * @param string $html - * - * @return Page - */ - public function setHtml($html) - { - $this->html = $html; + if ($this->menuchilds->removeElement($menuchild)) { + // set the owning side to null (unless already changed) + if ($menuchild->getPage() === $this) { + $menuchild->setPage(null); + } + } return $this; } - /** - * Get html. - * - * @return string - */ - public function getHtml() - { - return $this->html; - } - - /** - * Set template. - * - * @param array $template - * - * @return Page - */ - public function setTemplate($template) - { - $this->template = $template; - - return $this; - } - - /** - * Get template. - * - * @return array - */ - public function getTemplate() - { - return $this->template; - } - - /** - * Set parentfor. - * - * @param string $parentfor - * - * @return Page - */ - public function setParentfor($parentfor) - { - $this->parentfor = $parentfor; - - return $this; - } - - /** - * Get parentfor. - * - * @return string - */ - public function getParentfor() - { - return $this->parentfor; - } - - /** - * Set roles. - * - * @param array $roles - * - * @return Page - */ - public function setRoles($roles) - { - $this->roles = $roles; - - return $this; - } - - /** - * Get roles. - * - * @return array - */ - public function getRoles() - { - return $this->roles; - } - - /** - * Set pagecategory. - * - * @param Pagecategory $pagecategory - * - * @return Page - */ - public function setPagecategory(Pagecategory $pagecategory = null) - { - $this->pagecategory = $pagecategory; - - return $this; - } - - /** - * Get pagecategory. - * - * @return Pagecategory - */ - public function getPagecategory() - { - return $this->pagecategory; - } - - /** - * Add group. - * - * @return Page - */ - public function addGroup(Group $group) - { - $this->groups[] = $group; - - return $this; - } - - /** - * Remove group. - */ - public function removeGroup(Group $group) - { - $this->groups->removeElement($group); - } - - /** - * Get groups. - * - * @return \Doctrine\Common\Collections\Collection - */ - public function getGroups() - { - return $this->groups; - } - - /** - * Set user. - * - * @param User $user - * - * @return Page - */ - public function setUser(User $user = null) - { - $this->user = $user; - - return $this; - } - - /** - * Get user. - * - * @return User - */ - public function getUser() - { - return $this->user; - } - - /** - * Add pagewidget. - * - * @return Page - */ - public function addPagewidget(Pagewidget $pagewidget) - { - $this->pagewidgets[] = $pagewidget; - - return $this; - } - - /** - * Remove pagewidget. - */ - public function removePagewidget(Pagewidget $pagewidget) - { - $this->pagewidgets->removeElement($pagewidget); - } - - /** - * Get pagewidgets. - * - * @return \Doctrine\Common\Collections\Collection - */ - public function getPagewidgets() - { - return $this->pagewidgets; - } - - /** - * Set page. - * - * @param Page $page - * - * @return Page - */ - public function setPage(Page $page = null) - { - $this->page = $page; - - return $this; - } - - /** - * Get page. - * - * @return Page - */ - public function getPage() - { - return $this->page; - } - - /** - * Add page. - * - * @return Page - */ - public function addPage(Page $page) - { - $this->pages[] = $page; - - return $this; - } - - /** - * Remove page. - */ - public function removePage(Page $page) - { - $this->pages->removeElement($page); - } - - /** - * Get pages. - * - * @return \Doctrine\Common\Collections\Collection - */ - public function getPages() - { - return $this->pages; - } - - /** - * Add templategroup. - * - * @return Page - */ - public function addTemplategroup(Group $templategroup) - { - $this->templategroups[] = $templategroup; - - return $this; - } - - /** - * Remove templategroup. - */ - public function removeTemplategroup(Group $templategroup) - { - $this->templategroups->removeElement($templategroup); - } - - /** - * Get templategroups. - * - * @return \Doctrine\Common\Collections\Collection - */ - public function getTemplategroups() - { - return $this->templategroups; - } - - /** - * Set fonticon. - * - * @param string $fonticon - * - * @return Page - */ - public function setFonticon($fonticon) - { - $this->fonticon = $fonticon; - - return $this; - } - - /** - * Get fonticon. - * - * @return string - */ - public function getFonticon() - { - return $this->fonticon; - } - - /** - * Set toreload. - * - * @param bool $toreload - * - * @return Page - */ - public function setToreload($toreload) - { - $this->toreload = $toreload; - - return $this; - } - - /** - * Get toreload. - * - * @return bool - */ - public function getToreload() - { - return $this->toreload; - } - - public function isToreload(): ?bool - { - return $this->toreload; - } } diff --git a/src/Entity/Pagecategory.php b/src/Entity/Pagecategory.php deleted file mode 100755 index a26cae4..0000000 --- a/src/Entity/Pagecategory.php +++ /dev/null @@ -1,119 +0,0 @@ -id = $id; - - return $this; - } - - /** - * Constructor. - */ - public function __construct() - { - $this->pages = new \Doctrine\Common\Collections\ArrayCollection(); - } - - /** - * Get id. - * - * @return int - */ - public function getId() - { - return $this->id; - } - - /** - * Set name. - * - * @param string $name - * - * @return Pagecategory - */ - public function setName($name) - { - $this->name = $name; - - return $this; - } - - /** - * Get name. - * - * @return string - */ - public function getName() - { - return $this->name; - } - - /** - * Add page. - * - * @return Pagecategory - */ - public function addPage(Page $page) - { - $this->pages[] = $page; - - return $this; - } - - /** - * Remove page. - */ - public function removePage(Page $page) - { - $this->pages->removeElement($page); - } - - /** - * Get pages. - * - * @return \Doctrine\Common\Collections\Collection - */ - public function getPages() - { - return $this->pages; - } -} diff --git a/src/Entity/Pagetype.php b/src/Entity/Pagetype.php new file mode 100644 index 0000000..295f174 --- /dev/null +++ b/src/Entity/Pagetype.php @@ -0,0 +1,180 @@ +id = $id; + + return $this; + } + + public function __construct() + { + $this->pages = new ArrayCollection(); + $this->menuchilds = new ArrayCollection(); + } + + public function getId(): ?int + { + return $this->id; + } + + public function getName(): ?string + { + return $this->name; + } + + public function setName(string $name): self + { + $this->name = $name; + + return $this; + } + + public function getSortby(): ?string + { + return $this->sortby; + } + + public function setSortby(string $sortby): self + { + $this->sortby = $sortby; + + return $this; + } + + public function getImage(): ?string + { + return $this->image; + } + + public function setImage(?string $image): self + { + $this->image = $image; + + return $this; + } + + /** + * @return Collection + */ + public function getPages(): Collection + { + return $this->pages; + } + + public function addPage(Page $page): self + { + if (!$this->pages->contains($page)) { + $this->pages->add($page); + $page->setPagetype($this); + } + + return $this; + } + + public function removePage(Page $page): self + { + if ($this->pages->removeElement($page)) { + // set the owning side to null (unless already changed) + if ($page->getPagetype() === $this) { + $page->setPagetype(null); + } + } + + return $this; + } + + /** + * @return Collection + */ + public function getMenuchilds(): Collection + { + return $this->menuchilds; + } + + public function addMenuchild(Menuchild $menuchild): self + { + if (!$this->menuchilds->contains($menuchild)) { + $this->menuchilds->add($menuchild); + $menuchild->setPagetype($this); + } + + return $this; + } + + public function removeMenuchild(Menuchild $menuchild): self + { + if ($this->menuchilds->removeElement($menuchild)) { + // set the owning side to null (unless already changed) + if ($menuchild->getPagetype() === $this) { + $menuchild->setPagetype(null); + } + } + + return $this; + } + + public function getDescription(): ?string + { + return $this->description; + } + + public function setDescription(?string $description): self + { + $this->description = $description; + + return $this; + } +} diff --git a/src/Entity/Pagewidget.php b/src/Entity/Pagewidget.php deleted file mode 100755 index 4b96efe..0000000 --- a/src/Entity/Pagewidget.php +++ /dev/null @@ -1,420 +0,0 @@ -bookmarks = new ArrayCollection(); - $this->pagewidgetslides = new ArrayCollection(); - } - - // A garder pour forcer l'id en init - public function setId($id) - { - $this->id = $id; - - return $this; - } - - public function getId(): ?int - { - return $this->id; - } - - public function getName(): ?string - { - return $this->name; - } - - public function setName(string $name): self - { - $this->name = $name; - - return $this; - } - - public function getLoc(): ?string - { - return $this->loc; - } - - public function setLoc(string $loc): self - { - $this->loc = $loc; - - return $this; - } - - public function getRoworder(): ?int - { - return $this->roworder; - } - - public function setRoworder(int $roworder): self - { - $this->roworder = $roworder; - - return $this; - } - - public function getHeight(): ?int - { - return $this->height; - } - - public function setHeight(int $height): self - { - $this->height = $height; - - return $this; - } - - public function isAutoajust(): ?bool - { - return $this->autoajust; - } - - public function setAutoajust(bool $autoajust): self - { - $this->autoajust = $autoajust; - - return $this; - } - - public function isBorder(): ?bool - { - return $this->border; - } - - public function setBorder(bool $border): self - { - $this->border = $border; - - return $this; - } - - public function isOpened(): ?bool - { - return $this->opened; - } - - public function setOpened(bool $opened): self - { - $this->opened = $opened; - - return $this; - } - - public function isViewheader(): ?bool - { - return $this->viewheader; - } - - public function setViewheader(bool $viewheader): self - { - $this->viewheader = $viewheader; - - return $this; - } - - public function getColorheaderback(): ?string - { - return $this->colorheaderback; - } - - public function setColorheaderback(?string $colorheaderback): self - { - $this->colorheaderback = $colorheaderback; - - return $this; - } - - public function getColorheaderfont(): ?string - { - return $this->colorheaderfont; - } - - public function setColorheaderfont(?string $colorheaderfont): self - { - $this->colorheaderfont = $colorheaderfont; - - return $this; - } - - public function getColorbodyback(): ?string - { - return $this->colorbodyback; - } - - public function setColorbodyback(?string $colorbodyback): self - { - $this->colorbodyback = $colorbodyback; - - return $this; - } - - public function getColorbodyfont(): ?string - { - return $this->colorbodyfont; - } - - public function setColorbodyfont(?string $colorbodyfont): self - { - $this->colorbodyfont = $colorbodyfont; - - return $this; - } - - public function getParameter(): array - { - return $this->parameter; - } - - public function setParameter(?array $parameter): self - { - $this->parameter = $parameter; - - return $this; - } - - public function getPage(): ?Page - { - return $this->page; - } - - public function setPage(?Page $page): self - { - $this->page = $page; - - return $this; - } - - public function getWidget(): ?Widget - { - return $this->widget; - } - - public function setWidget(?Widget $widget): self - { - $this->widget = $widget; - - return $this; - } - - public function getIcon(): ?Icon - { - return $this->icon; - } - - public function setIcon(?Icon $icon): self - { - $this->icon = $icon; - - return $this; - } - - /** - * @return Collection - */ - public function getBookmarks(): Collection - { - return $this->bookmarks; - } - - public function addBookmark(Bookmark $bookmark): self - { - if (!$this->bookmarks->contains($bookmark)) { - $this->bookmarks->add($bookmark); - $bookmark->setPagewidget($this); - } - - return $this; - } - - public function removeBookmark(Bookmark $bookmark): self - { - if ($this->bookmarks->removeElement($bookmark)) { - // set the owning side to null (unless already changed) - if ($bookmark->getPagewidget() === $this) { - $bookmark->setPagewidget(null); - } - } - - return $this; - } - - /** - * @return Collection - */ - public function getPagewidgetslides(): Collection - { - return $this->pagewidgetslides; - } - - public function addPagewidgetslide(Pagewidgetslide $pagewidgetslide): self - { - if (!$this->pagewidgetslides->contains($pagewidgetslide)) { - $this->pagewidgetslides->add($pagewidgetslide); - $pagewidgetslide->setPagewidget($this); - } - - return $this; - } - - public function removePagewidgetslide(Pagewidgetslide $pagewidgetslide): self - { - if ($this->pagewidgetslides->removeElement($pagewidgetslide)) { - // set the owning side to null (unless already changed) - if ($pagewidgetslide->getPagewidget() === $this) { - $pagewidgetslide->setPagewidget(null); - } - } - - return $this; - } -} diff --git a/src/Entity/Pagewidgetslide.php b/src/Entity/Pagewidgetslide.php deleted file mode 100644 index 361d990..0000000 --- a/src/Entity/Pagewidgetslide.php +++ /dev/null @@ -1,158 +0,0 @@ -id; - } - - public function getTitle(): ?string - { - return $this->title; - } - - public function setTitle(?string $title): self - { - $this->title = $title; - - return $this; - } - - public function getSubtitle(): ?string - { - return $this->subtitle; - } - - public function setSubtitle(?string $subtitle): self - { - $this->subtitle = $subtitle; - - return $this; - } - - public function getUrl(): ?string - { - return $this->url; - } - - public function setUrl(?string $url): self - { - $this->url = $url; - - return $this; - } - - public function getTarget(): ?string - { - return $this->target; - } - - public function setTarget(string $target): self - { - $this->target = $target; - - return $this; - } - - public function getRoworder(): ?int - { - return $this->roworder; - } - - public function setRoworder(?int $roworder): self - { - $this->roworder = $roworder; - - return $this; - } - - public function getImage(): ?string - { - return $this->image; - } - - public function setImage(?string $image): self - { - $this->image = $image; - - return $this; - } - - public function getPagewidget(): ?Pagewidget - { - return $this->pagewidget; - } - - public function setPagewidget(?Pagewidget $pagewidget): self - { - $this->pagewidget = $pagewidget; - - return $this; - } -} diff --git a/src/Entity/Pin.php b/src/Entity/Pin.php new file mode 100644 index 0000000..78d052e --- /dev/null +++ b/src/Entity/Pin.php @@ -0,0 +1,161 @@ +childs = new ArrayCollection(); + } + + /** + * @ORM\PrePersist + */ + public function onPrePersist() + { + $this->submitdate = new \DateTime('now'); + } + + public function getId(): ?string + { + return $this->id; + } + + public function getName(): ?string + { + return $this->name; + } + + public function setName(string $name): self + { + $this->name = $name; + + return $this; + } + + public function getSubname(): ?string + { + return $this->subname; + } + + public function setSubname(?string $subname): self + { + $this->subname = $subname; + + return $this; + } + + public function getDescription(): ?string + { + return $this->description; + } + + public function setDescription(?string $description): self + { + $this->description = $description; + + return $this; + } + + public function getSubmitdate(): ?\DateTimeInterface + { + return $this->submitdate; + } + + public function setSubmitdate(\DateTimeInterface $submitdate): self + { + $this->submitdate = $submitdate; + + return $this; + } + + /** + * @return Collection|Child[] + */ + public function getChilds(): Collection + { + return $this->childs; + } + + public function addChild(Child $child): self + { + if (!$this->childs->contains($child)) { + $this->childs[] = $child; + $child->addPin($this); + } + + return $this; + } + + public function removeChild(Child $child): self + { + if ($this->childs->contains($child)) { + $this->childs->removeElement($child); + $child->removePin($this); + } + + return $this; + } + + public function getImage(): ?string + { + return $this->image; + } + + public function setImage(?string $image): self + { + $this->image = $image; + + return $this; + } +} diff --git a/src/Entity/Registration.php b/src/Entity/Registration.php index b8d2580..1565aad 100755 --- a/src/Entity/Registration.php +++ b/src/Entity/Registration.php @@ -3,6 +3,7 @@ namespace App\Entity; use App\Validator; +use Doctrine\DBAL\Types\Types; use Doctrine\ORM\Mapping as ORM; use Symfony\Bridge\Doctrine\Validator\Constraints\UniqueEntity; use Symfony\Component\Security\Core\User\LegacyPasswordAuthenticatedUserInterface; diff --git a/src/Entity/Tag.php b/src/Entity/Tag.php new file mode 100644 index 0000000..ae7b712 --- /dev/null +++ b/src/Entity/Tag.php @@ -0,0 +1,74 @@ +childs = new ArrayCollection(); + } + + public function getId(): ?string + { + return $this->id; + } + + public function setId(string $id): self + { + $this->id = $id; + + return $this; + } + + /** + * @return Collection|Child[] + */ + public function getChilds(): Collection + { + return $this->childs; + } + + public function addChild(Child $child): self + { + if (!$this->childs->contains($child)) { + $this->childs[] = $child; + $child->addTag($this); + } + + return $this; + } + + public function removeChild(Child $child): self + { + if ($this->childs->contains($child)) { + $this->childs->removeElement($child); + $child->removeTag($this); + } + + return $this; + } +} diff --git a/src/Entity/User.php b/src/Entity/User.php index 1f5c732..04a4c40 100755 --- a/src/Entity/User.php +++ b/src/Entity/User.php @@ -5,6 +5,7 @@ namespace App\Entity; use App\Validator; use Doctrine\Common\Collections\ArrayCollection; use Doctrine\Common\Collections\Collection; +use Doctrine\DBAL\Types\Types; use Doctrine\ORM\Mapping as ORM; use Symfony\Bridge\Doctrine\Validator\Constraints\UniqueEntity; use Symfony\Component\Security\Core\User\LegacyPasswordAuthenticatedUserInterface; @@ -191,17 +192,11 @@ class User implements UserInterface, LegacyPasswordAuthenticatedUserInterface */ private $modos; - /** - * @ORM\ManyToMany(targetEntity="App\Entity\Alert", mappedBy="readers") - */ - protected $alertreaders; - public function __construct() { $this->groups = new ArrayCollection(); $this->ownergroups = new ArrayCollection(); $this->modos = new ArrayCollection(); - $this->alertreaders = new ArrayCollection(); } // == CODE A NE PAS REGENERER @@ -683,31 +678,4 @@ class User implements UserInterface, LegacyPasswordAuthenticatedUserInterface return $this; } - - /** - * @return Collection - */ - public function getAlertreaders(): Collection - { - return $this->alertreaders; - } - - public function addAlertreader(Alert $alertreader): self - { - if (!$this->alertreaders->contains($alertreader)) { - $this->alertreaders->add($alertreader); - $alertreader->addReader($this); - } - - return $this; - } - - public function removeAlertreader(Alert $alertreader): self - { - if ($this->alertreaders->removeElement($alertreader)) { - $alertreader->removeReader($this); - } - - return $this; - } } diff --git a/src/Entity/UserGroup.php b/src/Entity/UserGroup.php index 4ddec36..956d2d7 100755 --- a/src/Entity/UserGroup.php +++ b/src/Entity/UserGroup.php @@ -2,6 +2,7 @@ namespace App\Entity; +use Doctrine\DBAL\Types\Types; use Doctrine\ORM\Mapping as ORM; use Symfony\Bridge\Doctrine\Validator\Constraints\UniqueEntity; diff --git a/src/Entity/Widget.php b/src/Entity/Widget.php deleted file mode 100755 index de1f2d5..0000000 --- a/src/Entity/Widget.php +++ /dev/null @@ -1,385 +0,0 @@ -pagewidgets = new ArrayCollection(); - } - - // A garder pour forcer l'id en init - public function setId($id) - { - $this->id = $id; - - return $this; - } - - public function getId(): ?int - { - return $this->id; - } - - public function getRoworder(): ?int - { - return $this->roworder; - } - - public function setRoworder(int $roworder): self - { - $this->roworder = $roworder; - - return $this; - } - - public function getName(): ?string - { - return $this->name; - } - - public function setName(string $name): self - { - $this->name = $name; - - return $this; - } - - public function getDescription(): ?string - { - return $this->description; - } - - public function setDescription(?string $description): self - { - $this->description = $description; - - return $this; - } - - public function getRouteview(): ?string - { - return $this->routeview; - } - - public function setRouteview(string $routeview): self - { - $this->routeview = $routeview; - - return $this; - } - - public function getHeight(): ?int - { - return $this->height; - } - - public function setHeight(int $height): self - { - $this->height = $height; - - return $this; - } - - public function isAutoajust(): ?bool - { - return $this->autoajust; - } - - public function setAutoajust(bool $autoajust): self - { - $this->autoajust = $autoajust; - - return $this; - } - - public function isBorder(): ?bool - { - return $this->border; - } - - public function setBorder(bool $border): self - { - $this->border = $border; - - return $this; - } - - public function isOpened(): ?bool - { - return $this->opened; - } - - public function setOpened(bool $opened): self - { - $this->opened = $opened; - - return $this; - } - - public function isViewheader(): ?bool - { - return $this->viewheader; - } - - public function setViewheader(bool $viewheader): self - { - $this->viewheader = $viewheader; - - return $this; - } - - public function getColorheaderback(): ?string - { - return $this->colorheaderback; - } - - public function setColorheaderback(?string $colorheaderback): self - { - $this->colorheaderback = $colorheaderback; - - return $this; - } - - public function getColorheaderfont(): ?string - { - return $this->colorheaderfont; - } - - public function setColorheaderfont(?string $colorheaderfont): self - { - $this->colorheaderfont = $colorheaderfont; - - return $this; - } - - public function getColorbodyback(): ?string - { - return $this->colorbodyback; - } - - public function setColorbodyback(?string $colorbodyback): self - { - $this->colorbodyback = $colorbodyback; - - return $this; - } - - public function getColorbodyfont(): ?string - { - return $this->colorbodyfont; - } - - public function setColorbodyfont(?string $colorbodyfont): self - { - $this->colorbodyfont = $colorbodyfont; - - return $this; - } - - public function getAccess(): array - { - return $this->access; - } - - public function setAccess(?array $access): self - { - $this->access = $access; - - return $this; - } - - public function getParameter(): array - { - return $this->parameter; - } - - public function setParameter(?array $parameter): self - { - $this->parameter = $parameter; - - return $this; - } - - public function getIcon(): ?Icon - { - return $this->icon; - } - - public function setIcon(?Icon $icon): self - { - $this->icon = $icon; - - return $this; - } - - /** - * @return Collection - */ - public function getPagewidgets(): Collection - { - return $this->pagewidgets; - } - - public function addPagewidget(Pagewidget $pagewidget): self - { - if (!$this->pagewidgets->contains($pagewidget)) { - $this->pagewidgets->add($pagewidget); - $pagewidget->setWidget($this); - } - - return $this; - } - - public function removePagewidget(Pagewidget $pagewidget): self - { - if ($this->pagewidgets->removeElement($pagewidget)) { - // set the owning side to null (unless already changed) - if ($pagewidget->getWidget() === $this) { - $pagewidget->setWidget(null); - } - } - - return $this; - } -} diff --git a/src/EventListener/PurgefileSubscriber.php b/src/EventListener/PurgefileSubscriber.php deleted file mode 100755 index 5990b7a..0000000 --- a/src/EventListener/PurgefileSubscriber.php +++ /dev/null @@ -1,73 +0,0 @@ -minio = $minio; - } - - public function getSubscribedEvents(): array - { - return [ - Events::preRemove, - ]; - } - - public function preRemove(LifecycleEventArgs $args): void - { - $this->entity = $args->getObject(); - - // Sur suppression de pagewidget - if ($this->entity instanceof Pagewidget) { - try { - $files = $this->minio->listFiles('file/pagewidget/'.$this->entity->getId().'/'); - if ($files) { - foreach ($files as $file) { - $this->minio->delete($file['Key']); - } - } - } catch (\Exception $e) { - } - } - - // Sur suppression pagewidgetslide - if ($this->entity instanceof Pagewidgetslide) { - try { - $files = $this->minio->listFiles($this->entity->getImage()); - if ($files) { - foreach ($files as $file) { - $this->minio->delete($file['Key']); - } - } - } catch (\Exception $e) { - } - } - - // Sur suppression icon - if ($this->entity instanceof Icon) { - try { - $files = $this->minio->listFiles($this->entity->getLabel()); - if ($files) { - foreach ($files as $file) { - $this->minio->delete($file['Key']); - } - } - } catch (\Exception $e) { - } - } - } -} diff --git a/src/Form/AlertType.php b/src/Form/AlertType.php deleted file mode 100644 index 8331f90..0000000 --- a/src/Form/AlertType.php +++ /dev/null @@ -1,117 +0,0 @@ -add('submit', SubmitType::class, [ - 'label' => 'Valider', - 'attr' => ['class' => 'btn btn-success'], - ]) - - ->add('title', TextType::class, [ - 'label' => 'Titre', - ]) - - ->add('content', CKEditorType::class, [ - 'config_name' => 'full_config', - 'label' => 'Description', - 'required' => false, - 'disabled' => ('delete' == $options['mode'] ? true : false), - 'config' => ['height' => '500px', 'filebrowserUploadRoute' => 'app_ckeditor_upload'], - ]) - - ->add('fghideable', ChoiceType::class, [ - 'label' => "Permettre aux utilisateurs de masquer l'annonce", - 'choices' => ['non' => '0', 'oui' => '1'], - ]) - - ->add('alertcategory', EntityType::class, [ - 'label' => 'Catégorie', - 'class' => 'App\Entity\Alertcategory', - 'choice_label' => 'label', - 'placeholder' => '-- Sélectionnez une Catégorie --', - ]) - - ->add('roles', ChoiceType::class, [ - 'label' => 'Visible pour les Rôles', - 'choices' => [ - 'Visiteur' => 'ROLE_ANONYME', - 'Utilisateur' => 'ROLE_USER', - 'Manager' => 'ROLE_MANAGER', - 'Master' => 'ROLE_MASTER', - 'Modérateur' => 'ROLE_MODO', - 'Administateur' => 'ROLE_ADMIN', - ], - 'multiple' => true, - 'expanded' => true, - ]) - - ->add('groups', Select2EntityType::class, [ - 'label' => 'Visible pour les Groupes', - 'class' => 'App\Entity\Group', - 'text_property' => 'label', - 'multiple' => true, - 'remote_route' => 'app_'.$options['access'].'_group_selectlist', - 'primary_key' => 'id', - 'text_property' => 'label', - 'minimum_input_length' => 0, - 'page_limit' => 100, - 'allow_clear' => true, - 'delay' => 250, - 'cache' => false, - 'cache_timeout' => 60000, - 'language' => 'fr', - 'placeholder' => 'Selectionner des groupes', - ]) - - ->add('publishedat', DateType::class, [ - 'label' => 'Publier du', - 'widget' => 'single_text', - ]) - - ->add('unpublishedat', DateType::class, [ - 'label' => 'Jusqu\'au', - 'required' => false, - 'widget' => 'single_text', - ]); - - $builder->get('publishedat')->addModelTransformer(new CallbackTransformer( - function ($value) { - if (!$value) { - return new \DateTime('now'); - } - - return $value; - }, - function ($value) { - return $value; - } - )); - } - - public function configureOptions(OptionsResolver $resolver) - { - $resolver->setDefaults([ - 'data_class' => 'App\Entity\Alert', - 'mode' => 'string', - 'appNiveau01labels' => 'string', - 'access' => 'string', - ]); - } -} diff --git a/src/Form/AlertcategoryType.php b/src/Form/AlertcategoryType.php deleted file mode 100644 index d1e1367..0000000 --- a/src/Form/AlertcategoryType.php +++ /dev/null @@ -1,47 +0,0 @@ -add('submit', - SubmitType::class, [ - 'label' => 'Valider', - 'attr' => ['class' => 'btn btn-success'], - ] - ); - - $builder->add('label', - TextType::class, [ - 'label' => 'Label', - ] - ); - - $builder->add('idicon', HiddenType::class, ['mapped' => false, 'data' => $options['idicon']]); - - $builder->add('color', TextType::class, [ - 'label' => 'Couleur', - 'required' => false, - 'attr' => ['class' => 'pick-a-color'], - ]); - } - - public function configureOptions(OptionsResolver $resolver) - { - $resolver->setDefaults([ - 'data_class' => 'App\Entity\Alertcategory', - 'mode' => 'string', - 'idicon' => null, - 'access' => 'string', - ]); - } -} diff --git a/src/Form/IconType.php b/src/Form/BlogType.php similarity index 53% rename from src/Form/IconType.php rename to src/Form/BlogType.php index eb00723..c6ad484 100644 --- a/src/Form/IconType.php +++ b/src/Form/BlogType.php @@ -2,41 +2,40 @@ namespace App\Form; +use Symfony\Bridge\Doctrine\Form\Type\EntityType; use Symfony\Component\Form\AbstractType; -use Symfony\Component\Form\Extension\Core\Type\HiddenType; use Symfony\Component\Form\Extension\Core\Type\SubmitType; use Symfony\Component\Form\Extension\Core\Type\TextType; use Symfony\Component\Form\FormBuilderInterface; use Symfony\Component\OptionsResolver\OptionsResolver; -class IconType extends AbstractType +class BlogType extends AbstractType { public function buildForm(FormBuilderInterface $builder, array $options) { - $builder->add('submit', - SubmitType::class, [ + $builder + ->add('submit', SubmitType::class, [ 'label' => 'Valider', 'attr' => ['class' => 'btn btn-success'], - ] - ); + ]) - $builder->add('label', - HiddenType::class, [ - 'label' => 'Label', - ] - ); + ->add('name', TextType::class, [ + 'label' => 'Titre', + ]) - $builder->add('tags', TextType::class, [ - 'label' => 'Tags', - 'required' => false, - ]); + ->add('blogtype', EntityType::class, [ + 'label' => 'Type', + 'class' => 'App\Entity\Blogtype', + 'choice_label' => 'name', + ]); } public function configureOptions(OptionsResolver $resolver) { $resolver->setDefaults([ - 'data_class' => 'App\Entity\Icon', + 'data_class' => 'App\Entity\Blog', 'mode' => 'string', + 'blogtype' => 'App\Entity\Blogtype', ]); } } diff --git a/src/Form/BlogtypeType.php b/src/Form/BlogtypeType.php new file mode 100644 index 0000000..0dc2e82 --- /dev/null +++ b/src/Form/BlogtypeType.php @@ -0,0 +1,53 @@ +add('submit', SubmitType::class, [ + 'label' => 'Valider', + 'attr' => ['class' => 'btn btn-success'], + ]) + + ->add('image', HiddenType::class, ['empty_data' => 'noimage.png']) + + ->add('name', TextType::class, [ + 'label' => 'Titre', + ]) + + ->add('description', CkeditorType::class, [ + 'config_name' => 'full_config', + 'label' => 'Description', + 'required' => false, + 'config' => [ + 'height' => '300px', + 'filebrowserUploadRoute' => 'app_ckeditor_upload', + ], + ]) + + ->add('sortby', ChoiceType::class, [ + 'label' => 'Ordonner par', + 'choices' => ['Par date' => 'bydate', 'Par Nom' => 'byname'], + ]); + } + + public function configureOptions(OptionsResolver $resolver) + { + $resolver->setDefaults([ + 'data_class' => 'App\Entity\Blogtype', + 'mode' => 'string', + ]); + } +} diff --git a/src/Form/BookmarkType.php b/src/Form/BookmarkType.php deleted file mode 100755 index 9ecc749..0000000 --- a/src/Form/BookmarkType.php +++ /dev/null @@ -1,64 +0,0 @@ -add('submit', SubmitType::class, [ - 'label' => ('delete' == $options['mode'] ? 'Confirmer la Suppression' : 'Valider'), - 'attr' => ('delete' == $options['mode'] ? ['class' => 'btn btn-danger'] : ['class' => 'btn btn-success']), - ]) - - ->add('title', TextType::class, [ - 'label' => 'Titre', - 'disabled' => ('delete' == $options['mode'] ? true : false), - ]) - - ->add('subtitle', TextareaType::class, [ - 'label' => 'Sous Titre', - 'required' => false, - 'disabled' => ('delete' == $options['mode'] ? true : false), - 'attr' => ['rows' => '4'], - ]) - - ->add('color', TextType::class, [ - 'label' => 'Couleur', - 'required' => false, - 'attr' => ['class' => 'pick-a-color'], - ]) - - ->add('url') - - ->add('target', ChoiceType::class, [ - 'label' => 'Ouvrir le lien dans', - 'choices' => [ - 'Nouvel onglet/fenêtre' => '_blank', - 'iFrame' => 'frame', - 'Onglet courant' => '_self', - ], - ]) - - ->add('idicon', HiddenType::class, ['mapped' => false, 'data' => $options['idicon']]); - } - - public function configureOptions(OptionsResolver $resolver) - { - $resolver->setDefaults([ - 'data_class' => 'App\Entity\Bookmark', - 'mode' => 'string', - 'idicon' => null, - ]); - } -} diff --git a/src/Form/ChildType.php b/src/Form/ChildType.php new file mode 100644 index 0000000..ad718cc --- /dev/null +++ b/src/Form/ChildType.php @@ -0,0 +1,100 @@ +add('submit', SubmitType::class, [ + 'label' => 'Valider', + 'attr' => ['class' => 'btn btn-success'], + ]) + + ->add('name', TextType::class, [ + 'label' => 'Titre', + ]) + + ->add('subname', TextareaType::class, [ + 'label' => 'Sous Titre', + 'required' => false, + 'attr' => ['rows' => 5], + ]) + + ->add('description', CkeditorType::class, [ + 'config_name' => 'full_config', + 'label' => 'Description', + 'required' => false, + 'config' => [ + 'height' => '600px', + 'filebrowserUploadRoute' => 'app_ckeditor_upload', + ], + ]) + + ->add('tags', Select2EntityType::class, [ + 'label' => 'Tags', + 'class' => 'App\Entity\Tag', + 'multiple' => true, + 'remote_route' => 'app_tag_select', + 'primary_key' => 'id', + 'text_property' => 'id', + 'minimum_input_length' => 0, + 'page_limit' => 100, + 'allow_clear' => true, + 'delay' => 250, + 'cache' => false, + 'cache_timeout' => 60000, + 'language' => 'fr', + 'placeholder' => 'Selectionner des tags', + ]); + + if ($childtype->getHavepin()) { + $builder->add('pins', Select2EntityType::class, [ + 'label' => 'Pins', + 'class' => 'App\Entity\Pin', + 'multiple' => true, + 'remote_route' => 'app_pin_select', + 'primary_key' => 'id', + 'text_property' => 'name', + 'minimum_input_length' => 0, + 'page_limit' => 100, + 'allow_clear' => true, + 'delay' => 250, + 'cache' => false, + 'cache_timeout' => 60000, + 'language' => 'fr', + 'placeholder' => 'Selectionner des pins', + ]); + } + + if ($childtype->getHaveurl()) { + $builder->add('url', TextareaType::class, [ + 'label' => 'URL', + 'required' => false, + 'attr' => ['rows' => 3], + ]); + } + } + + public function configureOptions(OptionsResolver $resolver) + { + $resolver->setDefaults([ + 'data_class' => 'App\Entity\Child', + 'mode' => 'string', + 'childtype' => 'App\Entity\Childtype', + ]); + } +} diff --git a/src/Form/ItemcategoryType.php b/src/Form/ChildheaderType.php similarity index 64% rename from src/Form/ItemcategoryType.php rename to src/Form/ChildheaderType.php index 5439656..9a15523 100644 --- a/src/Form/ItemcategoryType.php +++ b/src/Form/ChildheaderType.php @@ -8,30 +8,27 @@ use Symfony\Component\Form\Extension\Core\Type\TextType; use Symfony\Component\Form\FormBuilderInterface; use Symfony\Component\OptionsResolver\OptionsResolver; -class ItemcategoryType extends AbstractType +class ChildheaderType extends AbstractType { public function buildForm(FormBuilderInterface $builder, array $options) { - $builder->add('submit', - SubmitType::class, [ + $builder + ->add('submit', SubmitType::class, [ 'label' => 'Valider', 'attr' => ['class' => 'btn btn-success'], - ] - ); + ]) - $builder->add('label', - TextType::class, [ - 'label' => 'Label', - ] - ); + ->add('credit', TextType::class, [ + 'label' => 'Crédit', + 'required' => false, + ]); } public function configureOptions(OptionsResolver $resolver) { $resolver->setDefaults([ - 'data_class' => 'App\Entity\Itemcategory', + 'data_class' => 'App\Entity\Childheader', 'mode' => 'string', - 'access' => 'string', ]); } } diff --git a/src/Form/ItemType.php b/src/Form/ItemType.php deleted file mode 100644 index 144a96a..0000000 --- a/src/Form/ItemType.php +++ /dev/null @@ -1,128 +0,0 @@ -add('submit', SubmitType::class, [ - 'label' => ('delete' == $options['mode'] ? 'Confirmer la Suppression' : 'Valider'), - 'attr' => ('delete' == $options['mode'] ? ['class' => 'btn btn-danger'] : ['class' => 'btn btn-success']), - ]) - - ->add('title', TextType::class, [ - 'label' => 'Titre', - 'disabled' => ('delete' == $options['mode'] ? true : false), - ]) - - ->add('subtitle', TextareaType::class, [ - 'label' => 'Sous Titre', - 'required' => false, - 'disabled' => ('delete' == $options['mode'] ? true : false), - 'attr' => ['rows' => '4'], - ]) - - ->add('content', CKEditorType::class, [ - 'config_name' => 'full_config', - 'label' => 'Description', - 'required' => false, - 'disabled' => ('delete' == $options['mode'] ? true : false), - 'config' => ['height' => '500px', 'filebrowserUploadRoute' => 'app_ckeditor_upload'], - ]) - - ->add('itemcategory', EntityType::class, [ - 'label' => 'Catégorie', - 'class' => 'App\Entity\Itemcategory', - 'choice_label' => 'label', - 'placeholder' => '-- Sélectionnez une Catégorie --', - 'disabled' => ('delete' == $options['mode'] ? true : false), - ]) - - ->add('roles', ChoiceType::class, [ - 'label' => 'Visible pour les Rôles', - 'choices' => [ - 'Visiteur' => 'ROLE_ANONYME', - 'Utilisateur' => 'ROLE_USER', - 'Manager' => 'ROLE_MANAGER', - 'Master' => 'ROLE_MASTER', - 'Modérateur' => 'ROLE_MODO', - 'Administateur' => 'ROLE_ADMIN', - ], - 'multiple' => true, - 'expanded' => true, - 'disabled' => ('delete' == $options['mode'] ? true : false), - ]) - - ->add('groups', Select2EntityType::class, [ - 'label' => 'Visible pour les Groupes', - 'class' => 'App\Entity\Group', - 'text_property' => 'label', - 'multiple' => true, - 'remote_route' => 'app_'.$options['access'].'_group_selectlist', - 'primary_key' => 'id', - 'text_property' => 'label', - 'minimum_input_length' => 0, - 'page_limit' => 100, - 'allow_clear' => true, - 'delay' => 250, - 'cache' => false, - 'cache_timeout' => 60000, - 'language' => 'fr', - 'placeholder' => 'Selectionner des groupes', - ]) - - ->add('color', TextType::class, [ - 'label' => 'Couleur', - 'required' => false, - 'attr' => ['class' => 'pick-a-color'], - ]) - - ->add('url') - - ->add('protected', CheckboxType::class, [ - 'label' => "Force l'authentification de l'utilisateur ?", - 'required' => false, - ]) - - ->add('essential', CheckboxType::class, [ - 'label' => 'Item essentiel ?', - 'required' => false, - ]) - - ->add('target', ChoiceType::class, [ - 'label' => 'Ouvrir le lien dans', - 'choices' => [ - 'Nouvel onglet/fenêtre' => '_blank', - 'iFrame' => 'frame', - 'Onglet courant' => '_top', - ], - ]) - - ->add('idicon', HiddenType::class, ['mapped' => false, 'data' => $options['idicon']]); - } - - public function configureOptions(OptionsResolver $resolver) - { - $resolver->setDefaults([ - 'data_class' => 'App\Entity\Item', - 'mode' => 'string', - 'access' => 'string', - 'idicon' => null, - ]); - } -} diff --git a/src/Form/MenuchildType.php b/src/Form/MenuchildType.php new file mode 100644 index 0000000..bf7d4d6 --- /dev/null +++ b/src/Form/MenuchildType.php @@ -0,0 +1,104 @@ +add('submit', SubmitType::class, [ + 'label' => 'Valider', + 'attr' => ['class' => 'btn btn-success'], + ]) + + ->add('childtype', ChoiceType::class, [ + 'label' => 'Ordonner par', + 'choices' => ['blog' => 'blog', 'blogtype' => 'blogtype','page' => 'page', 'pagetype' => 'pagetype'], + ]) + + ->add('blog', Select2EntityType::class, [ + 'label' => 'Blog', + 'required' => false, + 'remote_route' => 'app_blog_selectlist', + 'class' => "App\Entity\Blog", + 'primary_key' => 'id', + 'text_property' => 'name', + 'minimum_input_length' => 0, + 'page_limit' => 10, + 'allow_clear' => true, + 'delay' => 250, + 'cache' => false, + 'cache_timeout' => 60000, + 'language' => 'fr', + 'placeholder' => '== Choisir Blog ==', + ]) + + ->add('blogtype', Select2EntityType::class, [ + 'label' => 'Type de Blog', + 'required' => false, + 'remote_route' => 'app_typeblog_selectlist', + 'class' => "App\Entity\Blogtype", + 'primary_key' => 'id', + 'text_property' => 'name', + 'minimum_input_length' => 0, + 'page_limit' => 10, + 'allow_clear' => true, + 'delay' => 250, + 'cache' => false, + 'cache_timeout' => 60000, + 'language' => 'fr', + 'placeholder' => '== Choisir Type de Blog ==', + ]) + + ->add('page', Select2EntityType::class, [ + 'label' => 'Page', + 'required' => false, + 'remote_route' => 'app_page_selectlist', + 'class' => "App\Entity\Page", + 'primary_key' => 'id', + 'text_property' => 'name', + 'minimum_input_length' => 0, + 'page_limit' => 10, + 'allow_clear' => true, + 'delay' => 250, + 'cache' => false, + 'cache_timeout' => 60000, + 'language' => 'fr', + 'placeholder' => '== Choisir Page ==', + ]) + + ->add('pagetype', Select2EntityType::class, [ + 'label' => 'Type de Page', + 'required' => false, + 'remote_route' => 'app_typepage_selectlist', + 'class' => "App\Entity\Pagetype", + 'primary_key' => 'id', + 'text_property' => 'name', + 'minimum_input_length' => 0, + 'page_limit' => 10, + 'allow_clear' => true, + 'delay' => 250, + 'cache' => false, + 'cache_timeout' => 60000, + 'language' => 'fr', + 'placeholder' => '== Choisir Type de Page ==', + ]) + ; + } + + public function configureOptions(OptionsResolver $resolver) + { + $resolver->setDefaults([ + 'data_class' => 'App\Entity\Menuchild', + 'mode' => 'string', + ]); + } +} diff --git a/src/Form/PageSubmitType.php b/src/Form/PageSubmitType.php deleted file mode 100644 index c224d1b..0000000 --- a/src/Form/PageSubmitType.php +++ /dev/null @@ -1,148 +0,0 @@ -add('submit', SubmitType::class, [ - 'label' => ('delete' == $options['mode'] ? 'Confirmer la Suppression' : 'Valider'), - 'attr' => ('delete' == $options['mode'] ? ['class' => 'btn btn-danger'] : ['class' => 'btn btn-success']), - ]) - - ->add('name', TextType::class, [ - 'label' => 'Nom', - ]) - - ->add('pagecategory', EntityType::class, [ - 'label' => 'Catégorie de Page', - 'class' => 'App\Entity\Pagecategory', - 'choice_label' => 'name', - 'placeholder' => '-- Sélectionnez une catégorie --', - 'query_builder' => function (EntityRepository $er) use ($access) { - if ('admin' == $access) { - return $er->createQueryBuilder('pc') - ->select('pc'); - } else { - return $er->createQueryBuilder('pc') - ->select('pc') - ->where('pc.id>0'); - } - }, - ]) - - ->add('usage', ChoiceType::class, [ - 'label' => 'Usage', - 'mapped' => false, - 'choices' => ['Personnel' => 'user', 'Groupe de Travail' => 'group'], - 'disabled' => ('delete' == $options['mode'] ? true : false), - ]) - - ->add('fonticon', FaChoiceType::class, [ - 'label' => 'Icône', - 'required' => false, - ]) - - ->add('page', - Select2EntityType::class, [ - 'label' => 'Modèle de Page', - 'disabled' => ('delete' == $options['mode'] ? true : false), - 'required' => false, - 'multiple' => false, - 'remote_route' => 'app_all_page_template_selectlist', - 'class' => 'App\Entity\Page', - 'req_params' => ['usage' => 'parent.children[usage]'], - 'primary_key' => 'id', - 'text_property' => 'name', - 'minimum_input_length' => 0, - 'page_limit' => 10, - 'allow_clear' => true, - 'delay' => 250, - 'cache' => false, - 'cache_timeout' => 60000, // if 'cache' is true - 'language' => 'fr', - 'placeholder' => '-- Selectionner un modèle de page --', - 'attr' => ['class' => 'form-control', 'style' => 'margin-bottom:15px'], - ] - ) - - ->add('groups', EntityType::class, [ - 'label' => 'Partager avec les Groupes', - 'class' => 'App\Entity\Group', - 'choice_label' => 'label', - 'required' => false, - 'multiple' => true, - 'expanded' => false, - 'placeholder' => '-- Selectionner un groupe --', - 'query_builder' => function (EntityRepository $er) use ($user) { - return $er->createQueryBuilder('g') - ->select('g') - ->From('App:UserGroup', 'ug') - ->where('g.isworkgroup=:isworkgroup') - ->andWhere('g=ug.group') - ->andWhere('ug.user=:user') - ->andWhere('ug.rolegroup>=:role') - ->setParameter('isworkgroup', true) - ->setParameter('role', 90) - ->setParameter('user', $user); - }, - ]) - - ->add('roworder', IntegerType::class, [ - 'label' => 'Ordre', - ]) - - ->add('maxwidth', IntegerType::class, [ - 'label' => "Largeur maximum (0 pour largeur de l'écran)", - ]); - - if ('admin' == $access) { - $builder->add('user', Select2EntityType::class, [ - 'label' => 'Propriétaire', - 'disabled' => ('delete' == $options['mode'] ? true : false), - 'required' => false, - 'multiple' => false, - 'remote_route' => 'app_admin_user_selectlist', - 'class' => 'App\Entity\User', - 'primary_key' => 'id', - 'text_property' => 'username', - 'minimum_input_length' => 2, - 'page_limit' => 10, - 'allow_clear' => true, - 'delay' => 250, - 'cache' => false, - 'cache_timeout' => 60000, // if 'cache' is true - 'language' => 'fr', - 'placeholder' => 'Selectionner un propriétaire', - 'attr' => ['class' => 'form-control', 'style' => 'margin-bottom:15px'], - ]); - } - } - - public function configureOptions(OptionsResolver $resolver) - { - $resolver->setDefaults([ - 'data_class' => 'App\Entity\Page', - 'mode' => 'string', - 'access' => 'string', - 'user' => 'App\Entity\User', - ]); - } -} diff --git a/src/Form/PagetemplateSubmitType.php b/src/Form/PageType.php similarity index 52% rename from src/Form/PagetemplateSubmitType.php rename to src/Form/PageType.php index 11c972a..149f914 100644 --- a/src/Form/PagetemplateSubmitType.php +++ b/src/Form/PageType.php @@ -2,15 +2,14 @@ namespace App\Form; +use Symfony\Bridge\Doctrine\Form\Type\EntityType; use Symfony\Component\Form\AbstractType; -use Symfony\Component\Form\Extension\Core\Type\ChoiceType; -use Symfony\Component\Form\Extension\Core\Type\IntegerType; use Symfony\Component\Form\Extension\Core\Type\SubmitType; use Symfony\Component\Form\Extension\Core\Type\TextType; use Symfony\Component\Form\FormBuilderInterface; use Symfony\Component\OptionsResolver\OptionsResolver; -class PagetemplateSubmitType extends AbstractType +class PageType extends AbstractType { public function buildForm(FormBuilderInterface $builder, array $options) { @@ -21,24 +20,13 @@ class PagetemplateSubmitType extends AbstractType ]) ->add('name', TextType::class, [ - 'label' => 'Nom', + 'label' => 'Titre', ]) - ->add('parentfor', ChoiceType::class, [ - 'label' => 'Modèle pour les', - 'choices' => [ - 'Utilisateurs' => 'user', - 'Groupes' => 'group', - 'Application' => 'app', - ], - ]) - - ->add('roworder', IntegerType::class, [ - 'label' => 'Ordre', - ]) - - ->add('maxwidth', IntegerType::class, [ - 'label' => "Largeur maximum (0 pour largeur de l'écran)", + ->add('pagetype', EntityType::class, [ + 'label' => 'Type', + 'class' => 'App\Entity\Pagetype', + 'choice_label' => 'name', ]); } @@ -47,7 +35,7 @@ class PagetemplateSubmitType extends AbstractType $resolver->setDefaults([ 'data_class' => 'App\Entity\Page', 'mode' => 'string', - 'access' => 'string', + 'pagetype' => 'App\Entity\Pagetype', ]); } } diff --git a/src/Form/PageUpdateWidgetType.php b/src/Form/PageUpdateWidgetType.php deleted file mode 100644 index 5af684f..0000000 --- a/src/Form/PageUpdateWidgetType.php +++ /dev/null @@ -1,114 +0,0 @@ -add('submit', SubmitType::class, [ - 'label' => 'Valider', - 'attr' => ['class' => 'btn btn-success'], - ]) - - ->add('name', TextType::class, [ - 'label' => 'Nom', - ]) - - ->add('roworder', IntegerType::class, [ - 'label' => 'Ordre', - ]) - - ->add('fonticon', FaChoiceType::class, [ - 'label' => 'Icône', - 'required' => false, - ]) - - ->add('maxwidth', IntegerType::class, [ - 'label' => "Largeur maximum (0 pour largeur de l'écran)", - ]) - - ->add('template', HiddenType::class, [ - 'label' => 'Template', - 'required' => false, - ]); - - if ('admin' == $options['access'] && 'group' != $options['for']) { - $builder - ->add('roles', ChoiceType::class, [ - 'label' => 'Visible pour les Rôles', - 'choices' => [ - 'Visiteur' => 'ROLE_ANONYME', - 'Utilisateur' => 'ROLE_USER', - 'Manager' => 'ROLE_MANAGER', - 'Master' => 'ROLE_MASTER', - 'Modérateur' => 'ROLE_MODO', - 'Administateur' => 'ROLE_ADMIN', - ], - 'multiple' => true, - 'expanded' => true, - 'disabled' => ('delete' == $options['mode'] ? true : false), - ]) - - ->add('groups', Select2EntityType::class, [ - 'label' => 'Visible pour les Groupes', - 'class' => 'App\Entity\Group', - 'text_property' => 'label', - 'multiple' => true, - 'remote_route' => 'app_admin_group_selectlist', - 'primary_key' => 'id', - 'text_property' => 'label', - 'minimum_input_length' => 0, - 'page_limit' => 100, - 'allow_clear' => true, - 'delay' => 250, - 'cache' => false, - 'cache_timeout' => 60000, - 'language' => 'fr', - 'placeholder' => 'Selectionner un groupe', - ]) - - ->add('user', Select2EntityType::class, [ - 'label' => 'Propriétaire', - 'disabled' => ('delete' == $options['mode'] ? true : false), - 'required' => false, - 'multiple' => false, - 'remote_route' => 'app_admin_user_selectlist', - 'class' => 'App\Entity\User', - 'primary_key' => 'id', - 'text_property' => 'username', - 'minimum_input_length' => 2, - 'page_limit' => 10, - 'allow_clear' => true, - 'delay' => 250, - 'cache' => false, - 'cache_timeout' => 60000, // if 'cache' is true - 'language' => 'fr', - 'placeholder' => 'Selectionner un propriétaire', - 'attr' => ['class' => 'form-control', 'style' => 'margin-bottom:15px'], - ]); - } - } - - public function configureOptions(OptionsResolver $resolver) - { - $resolver->setDefaults([ - 'data_class' => 'App\Entity\Page', - 'access' => 'string', - 'mode' => 'string', - 'for' => 'string', - ]); - } -} diff --git a/src/Form/PagewidgetckeditorType.php b/src/Form/PagetypeType.php similarity index 54% rename from src/Form/PagewidgetckeditorType.php rename to src/Form/PagetypeType.php index 0ea0306..418bc1e 100644 --- a/src/Form/PagewidgetckeditorType.php +++ b/src/Form/PagetypeType.php @@ -2,13 +2,16 @@ namespace App\Form; -use FOS\CKEditorBundle\Form\Type\CKEditorType; use Symfony\Component\Form\AbstractType; +use Symfony\Component\Form\Extension\Core\Type\ChoiceType; +use Symfony\Component\Form\Extension\Core\Type\HiddenType; use Symfony\Component\Form\Extension\Core\Type\SubmitType; +use Symfony\Component\Form\Extension\Core\Type\TextType; use Symfony\Component\Form\FormBuilderInterface; use Symfony\Component\OptionsResolver\OptionsResolver; +use FOS\CKEditorBundle\Form\Type\CKEditorType; -class PagewidgetckeditorType extends AbstractType +class PagetypeType extends AbstractType { public function buildForm(FormBuilderInterface $builder, array $options) { @@ -17,24 +20,34 @@ class PagewidgetckeditorType extends AbstractType 'label' => 'Valider', 'attr' => ['class' => 'btn btn-success'], ]) - ->add('ckeditor', CKEditorType::class, [ - 'label' => 'Texte', - 'required' => false, + + ->add('image', HiddenType::class, ['empty_data' => 'noimage.png']) + + ->add('name', TextType::class, [ + 'label' => 'Titre', + ]) + + ->add('description', CkeditorType::class, [ 'config_name' => 'full_config', + 'label' => 'Description', + 'required' => false, 'config' => [ - 'height' => 600, + 'height' => '300px', 'filebrowserUploadRoute' => 'app_ckeditor_upload', - 'filebrowserUploadRouteParameters' => ['category' => 'pagewidget', 'id' => $options['idwidget'], 'usage' => $options['usage']], ], + ]) + + ->add('sortby', ChoiceType::class, [ + 'label' => 'Ordonner par', + 'choices' => ['Par date' => 'bydate', 'Par Nom' => 'byname'], ]); } public function configureOptions(OptionsResolver $resolver) { $resolver->setDefaults([ + 'data_class' => 'App\Entity\Pagetype', 'mode' => 'string', - 'idwidget' => 'string', - 'usage' => 'string', ]); } } diff --git a/src/Form/PagewidgetType.php b/src/Form/PagewidgetType.php deleted file mode 100644 index 864be8a..0000000 --- a/src/Form/PagewidgetType.php +++ /dev/null @@ -1,247 +0,0 @@ -container = $container; - } - - public function buildForm(FormBuilderInterface $builder, array $options) - { - // Ajout des champs commun à tout les widgets - $builder - ->add('submit', SubmitType::class, [ - 'label' => ('delete' == $options['mode'] ? 'Confirmer la Suppression' : 'Valider'), - 'attr' => ('delete' == $options['mode'] ? ['class' => 'btn btn-danger'] : ['class' => 'btn btn-success']), - ]) - - ->add('name', TextType::class, [ - 'label' => 'Nom', - ]) - ->add('height', IntegerType::class, [ - 'label' => 'Hauteur du Widget', - ]) - ->add('border', ChoiceType::class, [ - 'label' => 'Afficher les Bords', - 'choices' => ['oui' => '1', 'non' => '0'], - ]) - ->add('autoajust', ChoiceType::class, [ - 'label' => 'Ajuster la Hauteur au Contenu', - 'choices' => ['oui' => '1', 'non' => '0'], - ]) - ->add('opened', ChoiceType::class, [ - 'label' => "Afficher le corps du widget à l'ouverture", - 'choices' => ['oui' => '1', 'non' => '0'], - ]) - ->add('viewheader', ChoiceType::class, [ - 'label' => "Afficher l'Entête", - 'choices' => ['oui' => '1', 'non' => '0'], - ]) - ->add('colorheaderback', TextType::class, [ - 'label' => "Couleur de Fond de l'Entête", - 'required' => false, - 'attr' => ['class' => 'pick-a-color'], - ]) - ->add('colorheaderfont', TextType::class, [ - 'label' => "Couleur du Texte de l'Entête", - 'required' => false, - 'attr' => ['class' => 'pick-a-color'], - ]) - ->add('colorbodyback', TextType::class, [ - 'label' => 'Couleur de Fond du Corps', - 'required' => false, - 'attr' => ['class' => 'pick-a-color'], - ]) - ->add('colorbodyfont', TextType::class, [ - 'label' => 'Couleur du Texte du Corps', - 'required' => false, - 'attr' => ['class' => 'pick-a-color'], - ]) - - ->add('idicon', HiddenType::class, ['mapped' => false, 'data' => $options['idicon']]); - - foreach ($options['param']['fields'] as $field) { - if ('string' == $field['type']) { - $builder - ->add($field['id'], TextType::class, [ - 'label' => $field['label'], - 'mapped' => false, - 'label_attr' => ['loc' => $field['loc']], - 'data' => $field['value'], - 'required' => ('true' == $field['mandatory']), - ]); - } elseif ('integer' == $field['type']) { - $builder - ->add($field['id'], IntegerType::class, [ - 'label' => $field['label'], - 'mapped' => false, - 'label_attr' => ['loc' => $field['loc']], - 'data' => $field['value'], - 'required' => ('true' == $field['mandatory']), - ]); - } elseif ('boolean' == $field['type']) { - $builder - ->add($field['id'], ChoiceType::class, [ - 'label' => $field['label'], - 'mapped' => false, - 'label_attr' => ['loc' => $field['loc']], - 'data' => $field['value'], - 'required' => ('true' == $field['mandatory']), - 'choices' => ['Non' => 0, 'Oui' => 1], - ]); - } elseif ('desktopmode' == $field['type']) { - $builder - ->add($field['id'], ChoiceType::class, [ - 'label' => $field['label'], - 'mapped' => false, - 'label_attr' => ['loc' => $field['loc']], - 'data' => $field['value'], - 'required' => ('true' == $field['mandatory']), - 'choices' => ['Très Petit' => '0', 'Petit' => '1', 'Moyen' => '2', 'Grand' => '3', 'Liste' => '4'], - ]); - } elseif ('modelist' == $field['type']) { - $builder - ->add($field['id'], ChoiceType::class, [ - 'label' => $field['label'], - 'mapped' => false, - 'label_attr' => ['loc' => $field['loc']], - 'data' => $field['value'], - 'required' => ('true' == $field['mandatory']), - 'choices' => ['Pavet' => '0', 'Liste' => '1'], - ]); - } elseif ('withbookmark' == $field['type']) { - $builder - ->add($field['id'], ChoiceType::class, [ - 'label' => $field['label'], - 'mapped' => false, - 'label_attr' => ['loc' => $field['loc']], - 'data' => $field['value'], - 'required' => ('true' == $field['mandatory']), - 'choices' => ['Favoris + Items' => '0', 'Items uniquement' => '1', 'Favoris uniquement' => '2'], - ]); - } elseif ('itemcategory' == $field['type']) { - $id = $field['value']; - $categorys = $this->container->get('doctrine.orm.entity_manager')->getRepository("App\Entity\Itemcategory")->findAll(); - $choices = []; - foreach ($categorys as $category) { - $choices[$category->getLabel()] = $category->getId(); - } - - $builder - ->add($field['id'], ChoiceType::class, [ - 'label' => $field['label'], - 'mapped' => false, - 'label_attr' => ['loc' => $field['loc']], - 'data' => $id, - 'required' => ('true' == $field['mandatory']), - 'choices' => $choices, - 'placeholder' => '-- Sélectionnez une catégorie --', - ]); - } elseif ('alertcategory' == $field['type']) { - $id = $field['value']; - $categorys = $this->container->get('doctrine.orm.entity_manager')->getRepository("App\Entity\Alertcategory")->findAll(); - $choices = []; - foreach ($categorys as $category) { - $choices[$category->getLabel()] = $category->getId(); - } - - $builder - ->add($field['id'], ChoiceType::class, [ - 'label' => $field['label'], - 'mapped' => false, - 'label_attr' => ['loc' => $field['loc']], - 'data' => $id, - 'required' => ('true' == $field['mandatory']), - 'choices' => $choices, - 'placeholder' => '-- Sélectionnez une catégorie --', - ]); - } elseif ('appexternal' == $field['type']) { - $id = $field['value']; - $appexternals = $this->container->get('doctrine.orm.entity_manager')->getRepository("App\Entity\Appexternal")->findAll(); - $choices = []; - foreach ($appexternals as $appexternal) { - $choices[$appexternal->getName()] = $appexternal->getId(); - } - - $builder - ->add($field['id'], ChoiceType::class, [ - 'label' => $field['label'], - 'mapped' => false, - 'label_attr' => ['loc' => $field['loc']], - 'data' => $id, - 'required' => ('true' == $field['mandatory']), - 'choices' => $choices, - 'placeholder' => '-- Sélectionnez une application --', - ]); - } elseif ('apponly' == $field['type']) { - $builder - ->add($field['id'], ChoiceType::class, [ - 'label' => $field['label'], - 'mapped' => false, - 'label_attr' => ['loc' => $field['loc']], - 'data' => $field['value'], - 'required' => ('true' == $field['mandatory']), - 'choices' => ['Documents + Tâches' => '0', 'Documents uniquement' => '1', 'Tâches uniquement' => '2'], - ]); - } elseif ('target' == $field['type']) { - $builder - ->add($field['id'], ChoiceType::class, [ - 'label' => $field['label'], - 'mapped' => false, - 'label_attr' => ['loc' => $field['loc']], - 'data' => $field['value'], - 'required' => ('true' == $field['mandatory']), - 'choices' => ['Nouvel onglet/fenêtre' => '_blank', 'iFrame' => 'frame', 'Onglet courant' => '_self'], - ]); - } elseif ('ckeditor' == $field['type']) { - $builder - ->add($field['id'], CKEditorType::class, [ - 'config_name' => 'full_config', - 'label' => $field['label'], - 'mapped' => false, - 'label_attr' => ['loc' => $field['loc']], - 'data' => $field['value'], - 'required' => ('true' == $field['mandatory']), - 'config' => ['filebrowserUploadRoute' => 'app_'.$options['access'].'_pagewidget_upload'], - ]); - } elseif ('clock' == $field['type']) { - $builder - ->add($field['id'], ChoiceType::class, [ - 'label' => $field['label'], - 'mapped' => false, - 'label_attr' => ['loc' => $field['loc']], - 'data' => $field['value'], - 'required' => ('true' == $field['mandatory']), - 'choices' => ['Analogique' => '0', 'Numérique' => '1'], - ]); - } - } - } - - public function configureOptions(OptionsResolver $resolver) - { - $resolver->setDefaults([ - 'data_class' => 'App\Entity\Pagewidget', - 'param' => [], - 'mode' => 'string', - 'access' => 'string', - 'idicon' => 'string', - ]); - } -} diff --git a/src/Form/PagewidgetslideType.php b/src/Form/PinType.php similarity index 51% rename from src/Form/PagewidgetslideType.php rename to src/Form/PinType.php index 7013c26..8a887e6 100644 --- a/src/Form/PagewidgetslideType.php +++ b/src/Form/PinType.php @@ -2,17 +2,16 @@ namespace App\Form; +use FOS\CKEditorBundle\Form\Type\CKEditorType; use Symfony\Component\Form\AbstractType; -use Symfony\Component\Form\Extension\Core\Type\ChoiceType; use Symfony\Component\Form\Extension\Core\Type\HiddenType; -use Symfony\Component\Form\Extension\Core\Type\IntegerType; use Symfony\Component\Form\Extension\Core\Type\SubmitType; use Symfony\Component\Form\Extension\Core\Type\TextareaType; use Symfony\Component\Form\Extension\Core\Type\TextType; use Symfony\Component\Form\FormBuilderInterface; use Symfony\Component\OptionsResolver\OptionsResolver; -class PagewidgetslideType extends AbstractType +class PinType extends AbstractType { public function buildForm(FormBuilderInterface $builder, array $options) { @@ -22,44 +21,33 @@ class PagewidgetslideType extends AbstractType 'attr' => ['class' => 'btn btn-success'], ]) - ->add('title', TextType::class, [ + ->add('image', HiddenType::class, ['empty_data' => 'noimage.png']) + + ->add('name', TextType::class, [ 'label' => 'Titre', - 'required' => false, ]) - ->add('subtitle', TextareaType::class, [ + ->add('subname', TextareaType::class, [ 'label' => 'Sous Titre', 'required' => false, - 'attr' => ['rows' => '4'], + 'attr' => ['rows' => 5], ]) - ->add('roworder', IntegerType::class, [ - 'label' => 'Ordre', - ]) - - ->add('url', TextType::class, [ - 'label' => 'URL', + ->add('description', CkeditorType::class, [ + 'config_name' => 'full_config', + 'label' => 'Description', 'required' => false, - ]) - - ->add('target', ChoiceType::class, [ - 'label' => 'Ouvrir le lien dans', - 'choices' => [ - 'Nouvel onglet/fenêtre' => '_blank', - 'iFrame' => 'frame', - 'Onglet courant' => '_self', + 'config' => [ + 'height' => '600px', + 'filebrowserUploadRoute' => 'app_ckupload', ], - ]) - - ->add('image', HiddenType::class, [ - 'label' => 'image', ]); } public function configureOptions(OptionsResolver $resolver) { $resolver->setDefaults([ - 'data_class' => 'App\Entity\Pagewidgetslide', + 'data_class' => 'App\Entity\Pin', 'mode' => 'string', ]); } diff --git a/src/Form/TagType.php b/src/Form/TagType.php new file mode 100644 index 0000000..406c52a --- /dev/null +++ b/src/Form/TagType.php @@ -0,0 +1,51 @@ +add('submit', SubmitType::class, [ + 'label' => 'Valider', + 'attr' => ['class' => 'btn btn-success'], + ]) + + ->add('id', TextType::class, [ + 'label' => 'Tag', + ]) + + ->add('childs', Select2EntityType::class, [ + 'label' => 'Lié aux childs', + 'class' => 'App:Child', + 'multiple' => true, + 'remote_route' => 'app_child_select', + 'primary_key' => 'id', + 'text_property' => 'name', + 'minimum_input_length' => 0, + 'page_limit' => 100, + 'allow_clear' => true, + 'delay' => 250, + 'cache' => false, + 'cache_timeout' => 60000, + 'language' => 'fr', + 'placeholder' => 'Selectionner des childs', + ]); + } + + public function configureOptions(OptionsResolver $resolver) + { + $resolver->setDefaults([ + 'data_class' => 'App\Entity\Tag', + 'mode' => 'string', + ]); + } +} diff --git a/src/Form/Type/FaChoiceType.php b/src/Form/Type/FaChoiceType.php deleted file mode 100644 index 24e0d18..0000000 --- a/src/Form/Type/FaChoiceType.php +++ /dev/null @@ -1,74 +0,0 @@ -fontawesomeIconsFile = $fontawesomeIconsFile; - } - - public function buildView(FormView $view, FormInterface $form, array $options) - { - // Pass this flag is necessary to render the label as raw. - // See below the twig field template for more details. - $view->vars['raw_label'] = true; - } - - public function configureOptions(OptionsResolver $resolver) - { - $resolver->setDefaults([ - 'attr' => [ - // It's the key of the solution and can be done in many ways. - // Now, the rendered + {% for childtype in childtypes %} + + {% endfor %} + + + + + + +{% endblock %} + +{% block localscript %} + +{% endblock %} + diff --git a/templates/Child/search.html.twig b/templates/Child/search.html.twig new file mode 100644 index 0000000..9bfa2ab --- /dev/null +++ b/templates/Child/search.html.twig @@ -0,0 +1,387 @@ +{% extends "base.html.twig" %} +{% block localstyle %} + +{% endblock %} + +{% block body %} + +

    +
    +
    + + + + + + + + + + + {% if is_granted('ROLE_ADMIN') %} + + + {% endif %} +
    + +
    +
    +
    +
    + + +
    +
    + + + +
    +
    + + +
    +
    +
    +
    +
    + +
    + {% set idchildtype=-100 %} + {% set idparent=-100 %} + {% set tbtag=[] %} + {% set tbname=[] %} + + {% for child in childs %} + {% if loop.first %} +

    {{ child.childtype.name|replace({"Embed ":""}) }}

    + + {% if not nopagination %} +
    + {% endif %} + + {% if not isalpha and child.childtype.id!=30 %} +
    +
    +
    + {% endif %} + {% endif %} + + {% if isalpha or child.childtype.id==30 %} + {% if child.idparent != idparent %} + {% if not loop.first %}
    {% endif %} +

    {{ child.nameparent }}

    +
    +
    +
    + {% set idparent=child.idparent %} + {% set tbname = tbname|merge({("MAP"~child.idparent):child.nameparent}) %} + {% endif %} + {% endif %} + + {% set tagsclass="" %} + {% for tag in child.tags %} + {% set tagid=tag.id|replace({" ":""}) %} + {% if tag.id not in tbtag %} + {% set tbtag = tbtag|merge({(tagid):tag.id}) %} + {% endif %} + {% set tagsclass=tagsclass~" tag-"~tagid %} + {%endfor%} + + {% if child.childtype.id==10 %} + + {% set url = "/"~appAlias~"/uploads/child/"~child.id~"/"~child.filename %} +

    {{ child.name }}

    + En savoir plus + + + + {% elseif child.childtype.id==12 or child.childtype.id==13 or child.childtype.id==30 %} + {% if child.childtype.id==12 or child.childtype.id==30 %} + {% set background="/"~appAlias~"/uploads/child/"~child.id~"/thumb/"~child.filename %} + {% else %} + {% set background=child.url %} + {% endif %} + + {% set style="height:auto;background-position: center ; background-size: cover; background-image: url("~background~")" %} + +
    +
    +
    + {% elseif child.childtype.id==16 or child.childtype.id==17 %} + {% set style="" %} + {%if child.image %} + {% set background=child.image|replace({"**appAlias**":appAlias}) %} + {% set style="height:auto;background-position: center ; background-size: cover; background-image: url("~background~")" %} + {% else %} + + {%endif%} + +
    +
    +
    {{ child.name }}
    +
    +
    +
    + {%else%} + {% set style="" %} + {%if child.image %} + {% set background=child.image|replace({"**appAlias**":appAlias}) %} + {% set style="height:auto;background-position: center ; background-size: cover; background-image: url("~background~")" %} + {%endif%} + +
    +
    +
    {{ child.name }}
    +
    +
    +
    + {% endif %} + + {% if loop.last %} +
    + {% endif %} + {%endfor%} + + {% if not nopagination %} +
    + {% endif %} +
    +
    +
    + {% if isalpha %} + A + B + C + D + E + F + G + H + I + J + K + L + M + N + O + P + Q + R + S + T + U + V + W + X + Y + Z +

    + {% endif %} + + {% if isalpha %} +
    + Afficher Tout + {% for key, name in tbname %} + {{name}} + {% endfor %} +
    + {%else%} + Afficher Tout + {% for key, tag in tbtag %} + {{tag}} + {% endfor %} + {%endif%} +
    +
    +
    +{% endblock %} + +{% block localscript %} + +{% endblock %} diff --git a/templates/Child/upload.html.twig b/templates/Child/upload.html.twig new file mode 100644 index 0000000..ee9ff78 --- /dev/null +++ b/templates/Child/upload.html.twig @@ -0,0 +1,80 @@ +{% extends 'base.html.twig' %} + +{% block encoretags %} + {{ encore_entry_link_tags('dropzone') }} +{% endblock %} + + +{% block body %} +

    + Upload child{% if typeupload!="all" %} = {{ typeupload }}{%endif%} +

    + + {% if idchild is defined %} + Annuler + {% else %} + Annuler + {% endif %} + +
    +
    +{% endblock %} + + +{% block localscript %} +{{ encore_entry_script_tags('dropzone') }} + + +{% endblock %} \ No newline at end of file diff --git a/templates/Child/video.html.twig b/templates/Child/video.html.twig new file mode 100644 index 0000000..9f3500e --- /dev/null +++ b/templates/Child/video.html.twig @@ -0,0 +1,115 @@ + +{% extends 'base.html.twig' %} + +{% block title %}{{app.session.get("appname")}} - {{child.name}}{% endblock %} + +{% block useractions %} + {% if is_granted('ROLE_ADMIN') %} +
  1. + +
  2. + {% endif %} +{% endblock %} + +{% block body %} +

    {{child.name}}

    + {% if child.subname %}
    {{child.subname}}
    {% endif %} + +
    + {% if child.childtype.id==14 or child.childtype.id==18 %} + {% set url = "/"~appAlias~"/uploads/child/"~child.id~"/"~child.filename %} + + {% elseif child.childtype.id==10 %} + {% set url = "/"~appAlias~"/uploads/child/"~child.id~"/"~child.filename %} + + {% else %} + + {% endif %} +
    + + {% for attributorder in child.childtype.childtypeattributs %} + {% if attributorder.childattribut.name in child.attributs|keys and not child.attributs[attributorder.childattribut.name] is empty %} + {{ attributorder.childattribut.label }} = {{ child.attributs[attributorder.childattribut.name]}}
    + {% endif %} + {% endfor %} + +
    {{child.description|raw}}
    + + {% set separator="g" %} + {%if otherpages %} +
    + + {% if separator=="d" %} {% set separator="g" %} {%else%} {% set separator="d" %} {%endif%} +
    + +
    +

    Articles associés

    +
    +
    +
    + {% for page in otherpages %} + {% set style="" %} + {%if page.image %} + {% set background=page.image|replace({"**appAlias**":appAlias}) %} + {% set style="height:auto;background-position: center ; background-size: cover; background-image: url("~background~")" %} + {%endif%} + +
    +
    +
    {{ page.name }}
    +
    +
    +
    + {% endfor %} +
    +
    + {% endif %} +{% endblock %} + +{% block localscript %} + +{% endblock %} + + + diff --git a/templates/Child/view.html.twig b/templates/Child/view.html.twig new file mode 100644 index 0000000..661a759 --- /dev/null +++ b/templates/Child/view.html.twig @@ -0,0 +1,240 @@ + +{% extends 'base.html.twig' %} + +{% block title %}{{app.session.get("appname")}} - {{child.name}}{% endblock %} + +{% block menuuser %} + {% if is_granted('ROLE_ADMIN') %} +
  3. + +
  4. + {% endif %} +{% endblock %} + +{% block beforebody %} + {% if not child.childheaders is empty %} + + {% endif %} +{% endblock %} + +{% block body %} + {% set haveside=true %} + {% if catparent!="blog" and + child.tags is empty and + contacts is empty and + ressources is empty and + links is empty %} + {% set haveside=false %} + {% endif %} + + {%if pages and pages|length > 1%} +
    + {% for page in pages %} + + {{ page.name }} + + {% endfor %} +
    + {% endif %} + +
    + {%if haveside %} +
    +
    + {% endif %} + +

    {{child.name}}

    + {% if child.subname %}
    {{child.subname}}
    {% endif %} + +
    +
    + {% if child.childtype.haveurl and child.url %}Site = {{child.url}}
    {%endif%} +
    + +
    + {{child.description|raw}} +
    + + {% if images %} +
    +

    Galerie Photos

    +
    +
    +
    + {% for image in images %} + {% if image.childtype.id==12 %} + {% set background=path("app_minio_image",{file:"child/"~image.id~"/thumb/"~image.filename}) %} + {% else %} + {% set background=image.url %} + {% endif %} + + {% set style="height:auto;background-position: center ; background-size: cover; background-image: url("~background~")" %} + + {% endfor %} +
    +
    + {% endif %} + + {% if videos %} +
    +

    Videos

    +
    + {% for video in videos %} + {% if video.childtype.id==14 %} + {% set url = path("app_minio_image",{file:"child/"~video.id~"/"~video.filename }) %} + + {% else %} + + {% endif %} + {% endfor %} +
    +
    + {% endif %} + + {% if bibliographys %} +
    + + {% if separator=="d" %} {% set separator="g" %} {%else%} {% set separator="d" %} {%endif%} +
    + + + {% endif %} +
    + + {% if haveside %} +
    +
    +
    + {% if not child.tags is empty %} +
    + {% for tag in child.tags %} + {% if loop.first %} +

    Tags

    + {%endif%} + + {{tag.id}} + {% endfor %} +
    + {% endif %} + +
    +

    Autres Publications

    + {% for otherchidblog in child.childblogs[0].blog.childblogs[0] %} + {{otherchidblog.child.name}}
    + {% endfor %} +
    + {% if not ressources is empty %} +
    +

    Ressources

    + {% for ressource in ressources %} + {% if ressource.childtype.id==16 %} + {% set filename="/"~appAlias~"/uploads/child/"~ressource.id~"/"~ressource.filename %} + {% else %} + {% set filename=ressource.url %} + {% endif %} + + +
    + +
    + {{ ressource.name}}
    + {{ ressource.subname}} +
    +
    +
    + {% endfor %} +
    + {% endif %} + + {% if not links is empty %} + + {% endif %} +
    + + {% if is_granted('ROLE_ADMIN') %} +
    + + {% if not parent.externalcode is empty %} + {{parent.externalcode}} = {{parent.externalid}}
    + {%endif%} +
    +
    +
    + {% endif %} +
    +
    + {% endif %} + +
    +{% endblock %} + + + diff --git a/templates/Itemcategory/edit.html.twig b/templates/Childheader/edit.html.twig old mode 100755 new mode 100644 similarity index 65% rename from templates/Itemcategory/edit.html.twig rename to templates/Childheader/edit.html.twig index 1445def..6e325a9 --- a/templates/Itemcategory/edit.html.twig +++ b/templates/Childheader/edit.html.twig @@ -1,27 +1,30 @@ + {% extends 'base.html.twig' %} {% block body %} {{ form_start(form) }}

    - {% if mode=="update" %} - Modification Catégorie d'Item = {{itemcategory.label}} - {% elseif mode=="submit" %} - Création Catégorie d'Item + {% if mode=="submit" %} + Création tag + {% else %} + Modification tag {% endif %}

    -

    - {{ form_widget(form.submit) }} - Annuler + {{ form_widget(form.submit) }} + + Annuler + {% if mode=="update" %} - + data-confirm="Êtes-vous sûr de vouloir supprimer cet enregistrement ?"> Supprimer - {% endif %} -

    + {% endif %} + +

    {% if app.session.flashbag.has('error') %}
    @@ -40,21 +43,20 @@ {% endfor %}
    {% endif %} - +
    Informations
    - {{ form_row(form.label) }} + {{ form_row(form.credit) }}
    - - - {{ form_end(form) }} {% endblock %} -{% block localjavascript %} -{% endblock %} + + + + diff --git a/templates/Childheader/image.html.twig b/templates/Childheader/image.html.twig new file mode 100644 index 0000000..417abf9 --- /dev/null +++ b/templates/Childheader/image.html.twig @@ -0,0 +1,64 @@ + +{% extends 'base.html.twig' %} + +{% block body %} + {% set url="/"~appAlias~"/uploads/childheader/"~childheader.child.id~"/"~childheader.filename|replace({"thumb_":""}) %} + + +{% endblock %} + +{% block localscript %} + +{% endblock %} + + + diff --git a/templates/Config/edit.html.twig b/templates/Config/edit.html.twig index 2d0f09b..fc0e13e 100755 --- a/templates/Config/edit.html.twig +++ b/templates/Config/edit.html.twig @@ -16,7 +16,7 @@ {% if mode=="update" and not config.required %} Supprimer @@ -68,6 +68,11 @@ Modifier + {% elseif config.type=="image" %} +
    + + Modifier +
    {% endif %} {{ form_row(form.help) }} diff --git a/templates/Icon/upload.html.twig b/templates/Config/image.html.twig similarity index 70% rename from templates/Icon/upload.html.twig rename to templates/Config/image.html.twig index 09d8eac..ab5ea9a 100755 --- a/templates/Icon/upload.html.twig +++ b/templates/Config/image.html.twig @@ -1,4 +1,4 @@ -{% extends 'base.html.twig' %} +{% extends "base.html.twig" %} {% block encoretags %} {{ encore_entry_link_tags('dropzone') }} @@ -8,7 +8,7 @@ Annuler
    {% endblock %} - - {% block localscript %} {{ encore_entry_script_tags('dropzone') }} - -{% endblock %} diff --git a/templates/File/list.html.twig b/templates/File/list.html.twig deleted file mode 100644 index 6c5c61f..0000000 --- a/templates/File/list.html.twig +++ /dev/null @@ -1,346 +0,0 @@ -{% extends 'base.html.twig' %} - -{% block localstyle %} - -{% endblock %} -{% block body %} - -
    - - - -
    - -
    - {% for dir in folders %} -
    -
    -
    - - - -
    -

    {{ dir.basename }}

    -
    -
    - -
    - {% if canadd %} - {% if fgtrash %} - - - - - - - - {% else %} - - - - - {% endif %} - {% endif %} -
    -
    -
    -
    - {% endfor %} - - {% for file in files %} -
    -
    -
    - - - -
    -

    {{ file.basename }}

    -
    le {{ file.LastModified|date("d/m/Y H:i")}}
    -
    -
    - -
    - {% if canadd %} - {% if fgtrash %} - - - - - - - - {% else %} - - - - - {% endif %} - {% endif %} -
    -
    -
    -
    - {% endfor %} -
    - - - -{% endblock %} - - -{% block localscript %} - -{% endblock %} - - - diff --git a/templates/File/redirect.html.twig b/templates/File/redirect.html.twig deleted file mode 100644 index b9389a4..0000000 --- a/templates/File/redirect.html.twig +++ /dev/null @@ -1,22 +0,0 @@ -{% extends 'base.html.twig' %} - -{% block localstyle %} - -{% endblock %} - -{% block localscript %} - - - -{% endblock %} - - - - diff --git a/templates/File/upload.html.twig b/templates/File/upload.html.twig deleted file mode 100644 index 2ecf7ed..0000000 --- a/templates/File/upload.html.twig +++ /dev/null @@ -1,74 +0,0 @@ -{% extends 'base.html.twig' %} - -{% block encoretags %} - {{ encore_entry_link_tags('dropzone') }} -{% endblock %} - -{% block localstyle %} - -{% endblock %} - -{% block body %} - Annuler - - -
    -{% endblock %} - - -{% block localscript %} - {{ encore_entry_script_tags('dropzone') }} - - -{% endblock %} - diff --git a/templates/Home/home.html.twig b/templates/Home/home.html.twig index abbfac2..7eefa63 100755 --- a/templates/Home/home.html.twig +++ b/templates/Home/home.html.twig @@ -1,21 +1,86 @@ {% extends "base.html.twig" %} -{% block body %} - {% if app.user %} -
    -
    -

    Chat #1

    - {{ render(path("app_publish_sample",{id:1})) }} -
    +{# +https://cdn.pixabay.com/photo/2020/08/09/14/25/business-5475661_960_720.jpg +#} +{% block localstyle %} + +{% endblock %} + +{% block beforebody %} + +
    +
    + +
    +
    + + +
    +

    {{app.session.get("appname")}}

    + {{app.session.get("appsubname")}} +
    - {% else %} -
    - -

    {{app.session.get('appname')}}

    -
    {{app.session.get('appdescription')|raw}}
    -
    - {% endif %} + +
    + +
    + + {% if not app.session.get("appdescription") is empty %} +
    + {{app.session.get("appdescription")|raw}} +
    + {% endif %} +
    + + {% endblock %} diff --git a/templates/Icon/edit.html.twig b/templates/Icon/edit.html.twig deleted file mode 100755 index 662cd54..0000000 --- a/templates/Icon/edit.html.twig +++ /dev/null @@ -1,78 +0,0 @@ -{% extends 'base.html.twig' %} - -{% block body %} -{{ form_start(form) }} - {% if not inframe %} -

    - {% if mode=="update" %} - Modification Icône - {% elseif mode=="submit" %} - Création Icône - {% endif %} -

    - {%endif%} - - {{ form_widget(form.submit) }} - Annuler - - {% if mode=="update" and not issystem %} - - Supprimer - - {% endif %} - -

    - - {% if app.session.flashbag.has('error') %} -
    - Erreur
    - {% for flashMessage in app.session.flashbag.get('error') %} - {{ flashMessage }}
    - {% endfor %} -
    - {% endif %} - - {% if app.session.flashbag.has('notice') %} -
    - Information
    - {% for flashMessage in app.session.flashbag.get('notice') %} - {{ flashMessage }}
    - {% endfor %} -
    - {% endif %} -
    -
    - Informations -
    - -
    -
    - - {{ form_widget(form.label) }} - {% if mode=="submit" or not issystem %} - Modifier - {%endif%} -
    - - {% if mode=="submit" or not issystem %} -
    - Privilégiez des images carrées de minimum 90px par 90px et avec un fond transparent -
    - {%endif%} - - {{ form_row(form.tags) }} - -
    -
    - - - {% if auditUse and mode=="update" and (access=="admin" or access=="modo" or access=="audit") %} -
    - {{ render(path("app_"~access~"_audit_renderid",{entityname:"Icon",entityid:icon.id})) }} -
    - {% endif %} -{{ form_end(form) }} -{% endblock %} diff --git a/templates/Icon/list.html.twig b/templates/Icon/list.html.twig deleted file mode 100644 index 3dd930c..0000000 --- a/templates/Icon/list.html.twig +++ /dev/null @@ -1,25 +0,0 @@ -{% extends "base.html.twig" %} - -{% block body %} - {% if not inframe %} -

    Gestion des Icônes

    - {% endif %} - {% if auditUse and (access=="admin" or access=="audit") %} - Audit - {% endif %} - -

    - Ajouter - {% if inframe %} - Fermer - {% endif %} -

    - -
    - {% for icon in icons %} - - {% endfor %} -
    -{% endblock %} - - diff --git a/templates/Icon/select.html.twig b/templates/Icon/select.html.twig deleted file mode 100644 index 30a9287..0000000 --- a/templates/Icon/select.html.twig +++ /dev/null @@ -1,70 +0,0 @@ -{% extends 'base.html.twig' %} - -{% block body %} -
    - - -
    - - - - {% if iconsuser is not empty %} -

    Mes Icônes

    - {% for icon in iconsuser %} - {% set tag = "" %} - {% if icon.tags %} - {% set tag = icon.tags %} - {% endif %} - {% if icon.label starts with 'icon/icon_' %} - {% set tag = tag ~ icon.label|replace({'icon/icon_':'', '.png':''}) %} - {% endif %} - - - {% endfor %} - -

    Icônes Communs

    - {% endif %} - {% for icon in icons %} - {% set tag = "" %} - {% if icon.tags %} - {% set tag = icon.tags %} - {% endif %} - {% if icon.label starts with 'icon/icon_' %} - {% set tag = tag ~ icon.label|replace({'icon/icon_':'', '.png':''}) %} - {% endif %} - - {% endfor %} -
    -
    -{% endblock %} - -{% block localscript %} - -{% endblock %} - - diff --git a/templates/Include/sidebaradmin.html.twig b/templates/Include/sidebaradmin.html.twig index 8d18f70..7d97131 100755 --- a/templates/Include/sidebaradmin.html.twig +++ b/templates/Include/sidebaradmin.html.twig @@ -67,33 +67,43 @@ { 'id': 'sidebar-portal', 'icon': 'fa fa-door-closed', - 'name' : 'PORTAIL', + 'name' : 'NINEBLOG', 'items' : [ { - icon: 'fa fa-copy fa-fw', - route: 'app_admin_page_template', - name: 'Modèles de Page', + icon: 'fas fa-paper-plane', + route: 'app_blog', + name: 'Blog', }, { - icon: 'fa fa-file fa-fw', - route: 'app_admin_page_portal', - name: 'Pages', - }, + icon: 'fas fa-tag', + route: 'app_typeblog', + name: 'Type de Blog', + }, { - icon: 'fa fa-desktop', - route: 'app_admin_item', - name: 'Items', - }, + icon: 'fas fa-file-alt', + route: 'app_page', + name: 'Page', + }, { - icon: 'fa fa-bell', - route: 'app_admin_alert', - name: 'Annonces', - }, + icon: 'fas fa-tag', + route: 'app_typepage', + name: 'Type de Page', + }, { - icon: 'fa fa-bug', - route: 'app_admin_icon', - name: 'Icônes', - }, + icon: 'fas fa-bars', + route: 'app_menu', + name: 'Menu', + }, + { + icon: 'fas fa-thumbtack', + route: 'app_pin', + name: 'Pin', + }, + { + icon: 'fas fa-tag', + route: 'app_tag', + name: 'Tag', + }, ] }, { diff --git a/templates/Include/style.css.twig b/templates/Include/style.css.twig index f3e0392..dbc4f2e 100755 --- a/templates/Include/style.css.twig +++ b/templates/Include/style.css.twig @@ -2,6 +2,7 @@ :root{ --colorbgbodylight: {{ app.session.get('colorbgbodylight')|raw }}; --colorbgbodydark: {{ app.session.get('colorbgbodydark')|raw }}; + --colorbgbodyimportant: {{ app.session.get('colorbgbodyimportant')|raw }}; --colorfttitlelight: {{ app.session.get('colorfttitlelight')|raw }}; --colorfttitledark: {{ app.session.get('colorfttitledark')|raw }}; --colorftbodylight: {{ app.session.get('colorftbodylight')|raw }}; @@ -16,7 +17,9 @@ --colorbgbodylight-darker: {{ app.session.get('colorbgbodylight-darker')|raw }}; --colorbgbodydark-darker: {{ app.session.get('colorbgbodydark-darker')|raw }}; + --colorfttitlelight-darker: {{ app.session.get('colorfttitlelight-darker')|raw }}; + --colorfttitledark-lighter: {{ app.session.get('colorfttitledark-lighter')|raw }}; --colorbgbodydark-rgb: {{ app.session.get('colorbgbodydark-rgb')|raw }}; } diff --git a/templates/Item/edit.html.twig b/templates/Item/edit.html.twig deleted file mode 100755 index 40094dd..0000000 --- a/templates/Item/edit.html.twig +++ /dev/null @@ -1,142 +0,0 @@ -{% extends 'base.html.twig' %} - -{% block body %} -{{ form_start(form) }} -

    - {% if mode=="update" %} - Modification Item = {{item.title}} - {% elseif mode=="submit" %} - Création Item - {% endif %} -

    - - {{ form_widget(form.submit) }} - Annuler - - {% if mode=="update" %} - - Supprimer - - {% endif %} - -

    - - {% if app.session.flashbag.has('error') %} -
    - Erreur
    - {% for flashMessage in app.session.flashbag.get('error') %} - {{ flashMessage }}
    - {% endfor %} -
    - {% endif %} - - {% if app.session.flashbag.has('notice') %} -
    - Information
    - {% for flashMessage in app.session.flashbag.get('notice') %} - {{ flashMessage }}
    - {% endfor %} -
    - {% endif %} - - -
    -
    -
    -
    - Informations -
    - -
    - {{ form_row(form.title) }} - {{ form_row(form.subtitle) }} - {{ form_row(form.url) }} -
    le mot clé #login# sera remplacé par le login de l'utilisateur
    - {{ form_row(form.target) }} -
    Attention certains sites n'acceptent pas d'être encapsulés dans une frame. Si vous ne voyez pas votre site apparaître, veuillez changer de cible.
    - - {{ form_row(form.essential) }} - {{ form_row(form.protected) }} - {{ form_row(form.content) }} -
    -
    -
    - - -
    -
    -
    - Affectations -
    - -
    - {{ form_row(form.itemcategory) }} - {{ form_row(form.roles) }} - {{ form_row(form.groups) }} -
    -
    - -
    -
    - Appararence -
    - -
    - {{ form_row(form.color) }} - -
    - {% if item.icon %} - - {% endif %} -
    - - -
    - {{ form_row(form.idicon) }} - Selectionner un Icône - Détacher l'Icône -
    -
    -
    -
    -
    -{{ form_end(form) }} -{% endblock %} - -{% block localscript %} - -{% endblock %} diff --git a/templates/Item/list.html.twig b/templates/Item/list.html.twig deleted file mode 100644 index 4df27c6..0000000 --- a/templates/Item/list.html.twig +++ /dev/null @@ -1,230 +0,0 @@ -{% extends 'base.html.twig' %} - -{% block localstyle %} - -{% endblock %} - -{% block body %} -

    - Gestion des Items -

    - -

    - Ajouter un Item - Ajouter une Categorie -

    - -
    -
    - {% for itemcategory in itemcategorys %} -
    - - -
    - {% for item in itemcategory.items %} - - {% endfor %} -
    -
    - {% endfor %} -
    - - - -
    - -{% endblock %} - -{% block localscript %} - -{% endblock %} - diff --git a/templates/Menu/edit.html.twig b/templates/Menu/edit.html.twig new file mode 100644 index 0000000..063e0c7 --- /dev/null +++ b/templates/Menu/edit.html.twig @@ -0,0 +1,103 @@ + +{% extends 'base.html.twig' %} + +{% block body %} +{{ form_start(form) }} +

    + {% if mode=="submit" %} + Création blogtype + {% else %} + Modification blogtype + {% endif %} +

    + + {{ form_widget(form.submit) }} + + Annuler + + {% if mode=="update" and blogtype.id>0 %} + + Supprimer + + {% endif %} + +

    + + {% if app.session.flashbag.has('error') %} +
    + Erreur
    + {% for flashMessage in app.session.flashbag.get('error') %} + {{ flashMessage }}
    + {% endfor %} +
    + {% endif %} + + {% if app.session.flashbag.has('notice') %} +
    + Information
    + {% for flashMessage in app.session.flashbag.get('notice') %} + {{ flashMessage }}
    + {% endfor %} +
    + {% endif %} + +
    +
    + Informations +
    + +
    + {{ form_row(form.childtype) }} + {{ form_row(form.blog) }} + {{ form_row(form.blogtype) }} + {{ form_row(form.page) }} + {{ form_row(form.pagetype) }} +
    +
    +{{ form_end(form) }} +{% endblock %} + +{% block localscript %} + +{% endblock %} + + + + diff --git a/templates/Menu/list.html.twig b/templates/Menu/list.html.twig new file mode 100644 index 0000000..ece1259 --- /dev/null +++ b/templates/Menu/list.html.twig @@ -0,0 +1,62 @@ +{% extends "base.html.twig" %} + +{% block body %} +

    + menus +

    + + {% for menu in menus %} +
    +
    + {{menu.name}} + +
    +
      + {% for menuchild in menu.menuchilds %} +
      + +
      + {% if menuchild.childtype == "blog" %} + {{menuchild.blog.name}} + {% elseif menuchild.childtype == "blogtype" %} + {{menuchild.blogtype.name}} + {% elseif menuchild.childtype == "page" %} + {{menuchild.page.name}} + {% elseif menuchild.childtype == "pagetype" %} + {{menuchild.pagetype.name}} + {% endif %} +
      {{menuchild.childtype}} +
      + + + +
      + {% endfor %} +
    +
    + {% endfor %} +{% endblock %} + +{% block localscript %} + +{% endblock %} diff --git a/templates/Page/application.html.twig b/templates/Page/application.html.twig deleted file mode 100644 index c8657b6..0000000 --- a/templates/Page/application.html.twig +++ /dev/null @@ -1,334 +0,0 @@ - -{% extends '@CadolesCore/base.html.twig' %} - -{% set color = app.session.get('color') %} -{% set colormain = color['main'] %} - -{% block pagewrapper %} -
    -
    -
    qsdfqsdfqsd
    - -
    - {% if bookmarks is not empty %} -
    - {% if items is not empty %} -

    Favoris

    - {% else %} -

    - {% endif %} - -
    - {% else %} - - {% endif %} - - {% set mycategs = [] %} - {% for itemcategory in itemcategorys %} - {% set haveitem=false %} - - {% for item in items if item.itemcategory==itemcategory %} - - {% if loop.index ==1 %} - {% set mycategs = mycategs|merge({ (loop.index) : itemcategory}) %} - {% endif %} - {% endfor %} - {% endfor %} - - {% for itemcategory in mycategs %} - {% set haveitem=false %} - - {% for item in items if item.itemcategory==itemcategory %} - - {% if loop.index ==1 %} - {% set haveitem=true %} - - {% if mycategs|length > 1 or bookmarks is not empty %} -

    {{ itemcategory.label }}

    - {% else %} -

    - {% endif %} - - - {% endif %} - {% endfor %} -
    -
    -{% endblock %} - -{% block localjavascript %} - $('document').ready(function(){ - // Ajustement des frames - $(window).resize(function() { - AjustFrame(); - }); - - - // Création des grilles d'items - var optiongrid={columnWidth: '.grid-sizer', itemSelector: '.grid-item', gutter: '.grid-gutter-sizer'}; - $('body').imagesLoaded(function() { - var grid = $('.grid').masonry(optiongrid); - }); - - // Preview item de bureau - $( ".grid .item-preview" ).click(function() { - if($(this).parent().children(".grid-item-body").css('display') == 'none') { - $(this).html(''); - heightbody=$(this).parent().children(".grid-item-body").height()+30; - heightitem=$(this).parent().parent().height(); - - - $(this).parent().children(".grid-item-body").show(); - $(this).parent().parent().css("width","100%"); - - $(this).parent().parent().css("height",heightitem+heightbody); - $(this).parent().children(".grid-item-content").css("height",heightitem+heightbody); - $(this).parent().children(".item-preview").css("height",heightitem+heightbody); - - var grid = $('.grid').masonry(optiongrid); - } - else { - $(this).html(''); - - $(this).parent().children(".grid-item-body").hide(); - $(this).parent().parent().css("width",""); - $(this).parent().parent().css("height",""); - $(this).parent().children(".grid-item-content").css("height",""); - $(this).parent().children(".item-preview").css("height",""); - - var grid = $('.grid').masonry(optiongrid); - } - }); - - // Sur click item à sonder - {% if activate_widsonde %} - $( ".linktosonde" ).click(function() { - title=$(this).attr("data-sonde"); - //$.getScript( "{{ widsonde_url }}?appli="+title ); - }); - {% endif %} - - }); - - - // Ajout d'un bookmark - function addBookmark(idwidget,touser) { - var url="{{ path('cadoles_portal_user_bookmark_submit',{idpage:0,idwidget:'xx',touser:'yy'})}}"; - url=url.replace('xx',idwidget); - url=url.replace('yy',touser); - - $(location).attr('href', url); - } - - // Modifciation d'un bookmark - function modBookmark(idbookmark) { - var url="{{ path('cadoles_portal_user_bookmark_update',{idpage:0,id:'xx'})}}"; - - url=url.replace('xx',idbookmark); - $(location).attr('href', url); - } - - // Ajouter un item aux bookmark - function heartBookmark(iditem) { - var idbookmark; - - $.ajax({ - method: "POST", - url: "{{ path('cadoles_portal_user_bookmark_heart') }}", - data: { - iditem:iditem - }, - success: function(idbookmark) { - location.reload(); - } - }); - - } - - // Supprimer un fichier - function delFile(directory,filename) { - var r = confirm("Confirmez-vous la suppression de ce fichier ?"); - if (r == true) { - $.ajax({ - method: "POST", - url: "{{ path('cadoles_core_user_file_delete') }}", - data: { - directory:directory, - filename:filename - }, - success: function() { - location.reload(); - } - }); - } - } - - // Ajustement des frames - function AjustFrame() { - $('.frameajust').iframeAutoHeight({ - minHeight: 500, // Sets the iframe height to this value if the calculated value is less - heightOffset: 0, // Optionally add some buffer to the bottom - callback: function(callbackObject) { $(this).parent().css("height",callbackObject.newFrameHeight) ;} - }); - - if($(".frameitem").length>0) { - var heightbody = $('html').height(); - var heightheader = $('.header').height(); - if($('.pagemenu').css("display")=="none") - var heightmenu = 0; - else - var heightmenu = $('.pagemenu').height(); - - var heightframe = heightbody-heightheader-heightmenu; - - $(".frameitem").height(heightframe); - } - - } - - - // Affichage d'un Flux - function showFlux(idwidget, id) { - if(id=="all") - $(".widget[data-id="+idwidget+"]").find(".feed").show(); - else { - $(".widget[data-id="+idwidget+"]").find(".feed").hide(); - $(".widget[data-id="+idwidget+"]").find(".flux-"+id).show(); - } - - var optiongrid={columnWidth: '.grid-sizer',itemSelector: '.grid-item'}; - var grid = $('.grid').masonry(optiongrid); - } - - // Affichage des frames associés aux items de bureau - function resizeFrame() { - var iFrame = document.getElementById('frameContent'); - - var heightbody = $('html').height(); - var heightheader = $('.header').height(); - if($('#appmenu').css("display")=="none") - var heightmenu = 0; - else - var heightmenu = $('#appmenu').height(); - - - var heightframe = heightbody-heightheader-heightmenu; - - $(".pageframe").each(function( index ) { - $(this).height(heightframe); - }); - } - - - function showFrameitem(id,url,forcereload) { - $(".pageframe").hide(); - - // Si force le rechargement et frame existante on la détruit - if(forcereload&&$("#frameitem-"+id).length) - $("#frameitem-"+id).remove(); - - // Si la frame en cours existe déjà on l'affiche - if($("#frameitem-"+id).length) - $("#frameitem-"+id).show(); - // Sinon on la génère - else - $("#pagecontainer").append(""); - - - resizeFrame(); - } - -{% endblock %} diff --git a/templates/Page/default.html.twig b/templates/Page/default.html.twig deleted file mode 100644 index 1f24738..0000000 --- a/templates/Page/default.html.twig +++ /dev/null @@ -1,141 +0,0 @@ -{% extends 'base.html.twig' %} - -{% block localstyle %} -.thumbnail { - text-align:center; -} - -.thumbnail img { - width:200px; - border: 5px solid #fff; - border-radius: 10px; -} - -.caption p { - text-align:justify; - font-size:14px; - word-wrap: break-word; - -} - -.caption ul { - margin-top:-10px; - padding-left: 20px; -} - -.caption li { - text-align:left; - font-size:14px; - word-wrap: break-word; - font-style: italic; - -} - -h3 { - margin-top:10px; -} -{% endblock %} - - -{% block body %} -
    - - -

    {{ app.session.get('appname') }}

    -
    - -
    - - {% if not app.user and moderegistration!="none" and appMasteridentity=="SQL"%} - Mot de passe oublié ? - {% endif %} -
    - -
    -
    -
    - - -
    -

    Portail
    Profilé

    -

    Tous les éléments du portail peuvent être distribués en fonction du profil de l'utilisateur.

    -

    Il est possible de définir le profil de l'utilisateur en fonction : -

      -
    • De son groupe d'appartenance
    • -
    • D'attributs Annuaire
    • -
    • D'attributs SSO
    • -
    -

    -

    En fonction du profil de l'utilisateur, il est possible de distribuer : -

      -
    • Des pages en onglet
    • -
    • Des Flux RSS
    • -
    • Des Annonces
    • -
    • Des Applications Web
    • -
    • Des Calendriers
    • -
    -

    -
    -
    -
    - -
    -
    - - -
    -

    Portail
    Personnalisable

    -

    En fonction de la configuration et de leur profil, les utilisateurs du portail sont libres de créer leur propre page.

    -

    Les pages de l'utilisateur pouvant prendre plusieurs formes : -

      -
    • Une page pointant sur l'adresse d'un autre site
    • -
    • Une page construite par l'utilisateur via l'utilisation d'un éditeur riche
    • -
    • Une page constituée de widgets qu'il dispose selon son libre choix
    • -
    -

    -
    -
    -
    - - -
    -
    - - -
    -

    Portail
    Evolutif

    -

    Ninegate est évolutif dans le sens où, vous disposerez d'une large bibliothèque de widgets qui composeront vos pages.

    -

    Voici quelques exemples : -

      -
    • Widget URL
    • -
    • Widget Flux RSS
    • -
    • Widget Editeur de texte
    • -
    • Widget Gestionnaire de tâches
    • -
    • Widget Calendriers
    • -
    • Widget Favoris
    • -
    • Widget Dépôt de Fichiers
    • -
    • Et bien d'autres encore
    • -
    -
    -
    -
    - -
    -
    - - -
    -

    Portail
    Open Source

    -

    Ce projet est opensource -

      -
    • Vous pouvez à tout moment modifier le code de votre portail
    • -
    • Distribuer {{ app.session.get('appname') }}
    • -
    -

    -

    Ninegate est développé dans le cadre du projet Envole. Vous pourrez trouver le code source de Ninegate sur la forge du projet

    -

    Ninegate est propulsé par la société Cadoles

    -
    -
    -
    -
    -{% endblock %} \ No newline at end of file diff --git a/templates/Page/edit.html.twig b/templates/Page/edit.html.twig new file mode 100644 index 0000000..649478f --- /dev/null +++ b/templates/Page/edit.html.twig @@ -0,0 +1,83 @@ + +{% extends 'base.html.twig' %} + +{% block body %} +{{ form_start(form) }} +

    + {% if mode=="submit" %} + Création page + {% else %} + Modification page + {% endif %} +

    + + {{ form_widget(form.submit) }} + + + {% if from=="child" %} + Annuler + {% else %} + Annuler + {% endif %} + + {% if mode=="update" and page.id>0%} + + Supprimer + + {% endif %} + +

    + + {% if app.session.flashbag.has('error') %} +
    + Erreur
    + {% for flashMessage in app.session.flashbag.get('error') %} + {{ flashMessage }}
    + {% endfor %} +
    + {% endif %} + + {% if app.session.flashbag.has('notice') %} +
    + Information
    + {% for flashMessage in app.session.flashbag.get('notice') %} + {{ flashMessage }}
    + {% endfor %} +
    + {% endif %} + +
    +
    +
    +
    + Informations +
    + +
    + {{ form_row(form.name) }} + {{ form_row(form.pagetype) }} +
    +
    +
    + +
    +
    +
    + + +{{ form_end(form) }} +{% endblock %} + +{% block localscript %} + +{% endblock %} + + + diff --git a/templates/Page/home.html.twig b/templates/Page/home.html.twig new file mode 100644 index 0000000..061bab4 --- /dev/null +++ b/templates/Page/home.html.twig @@ -0,0 +1,204 @@ + +{% extends 'base.html.twig' %} + + +{% block localstyle %} + +{% endblock %} + +{% block beforebody %} + {%if heros %} + + {% endif %} +{% endblock %} + +{% block useractions %} + {% if is_granted('ROLE_ADMIN') %} +
  5. + +
  6. + {% endif %} +{% endblock %} + +{% block body %} +
    +

    Actualités

    +
    +
    +
    + {% for page in pages %} + {% if not page.childpages is empty %} + {% set background="" %} + {% if not page.childpages[0].child.childheaders is empty and page.childpages[0].child.childheaders[0] %} + {% set background="/"~appAlias~"/uploads/childheader/"~page.childpages[0].child.id~"/"~page.childpages[0].child.childheaders[0].filename %} + {% endif %} + + {% set style="height:auto;background-position: center ; background-size: cover; background-image: url("~background~")" %} + +
    +
    +
    + {{ page.childpages[0].child.name }} +
    {{ page.pagetype.name }}
    + + {% if page.childpages[0].child.subname %} + {{ page.childpages[0].child.subname|nl2br }}
    + {% endif %} + {% for tag in page.childpages[0].child.tags %} + {% if loop.first %}
    {%endif%} + #{{tag.id}} + {% endfor %} +
    + +
    +
    +
    +
    + {% endif %} + {% endfor %} +
    +
    +{% endblock %} + +{% block localscript %} + +{% endblock %} \ No newline at end of file diff --git a/templates/Page/list.html.twig b/templates/Page/list.html.twig index c282575..c03dd24 100644 --- a/templates/Page/list.html.twig +++ b/templates/Page/list.html.twig @@ -1,36 +1,42 @@ -{% extends 'base.html.twig' %} - +{% extends "base.html.twig" %} {% block body %}

    - Gestion des Pages + pages

    - - Ajouter une Page -
    - - -
    -

    +

    Ajouter

    - Liste des Pages + Liste des pages
    - - - + + + + + - - - + + + {% for page in pages %} + + + + + + + + {% endfor %} +
    ActionOrdre
    ActionIDDateType NomCatégoriePropriétaire
    + + {{page.id}}{{page.submitdate|date("Y-m-d")}}{{page.pagetype.name}}{{page.name}}
    @@ -40,51 +46,13 @@ {% block localscript %} {% endblock %} + diff --git a/templates/Page/menugroupe.html.twig b/templates/Page/menugroupe.html.twig deleted file mode 100644 index fc04186..0000000 --- a/templates/Page/menugroupe.html.twig +++ /dev/null @@ -1,69 +0,0 @@ - {% if not inmenu %} - - {% else %} - {% for groupshared in groups %} - {% if groupshared.pagesshared|length == 1 %} - {% set page = groupshared.pagesshared[0] %} - {% set forcereload=true %} - {% if page.pagecategory.id==1 %} - {% set forcereload=page.toreload %} - {% endif %} - - {% set isactive="" %} - {% if entity.id is defined and page.id==entity.id %} - {% set isactive="class='active'" %} - {% endif %} - - - {% else %} - - {% endif %} - {% endfor %} - {% endif %} \ No newline at end of file diff --git a/templates/Page/pages.html.twig b/templates/Page/pages.html.twig deleted file mode 100644 index 9e4748c..0000000 --- a/templates/Page/pages.html.twig +++ /dev/null @@ -1,461 +0,0 @@ - -{% extends 'base.html.twig' %} - -{% block localstyle %} - -{% endblock %} - -{% block menuapp %} - - - - - {% if groups|length > 0 and groups|length < 10 %} -
    - - {% endif %} - {% endfor %} - - {% elseif groups|length > 0 %} - - {% endif %} - -{% endblock %} - -{% block menuuser %} - {% if canadd and app.user %} - - {% endif %} - - - - - - {% endblock %} - -{% block body %} -
    - - - - - - -{% endblock %} - -{% block localscript %} - -{% endblock %} diff --git a/templates/Page/submit.html.twig b/templates/Page/submit.html.twig deleted file mode 100644 index 46abd92..0000000 --- a/templates/Page/submit.html.twig +++ /dev/null @@ -1,88 +0,0 @@ -{% extends 'base.html.twig' %} - -{% block body %} -{{ form_start(form) }} -

    - Nouvelle Page -

    - -

    - {{ form_widget(form.submit) }} - {% if access=="admin" %} - Annuler - {% else %} - Annuler - {% endif %} -

    - - {% if app.session.flashbag.has('error') %} -
    - Erreur
    - {% for flashMessage in app.session.flashbag.get('error') %} - {{ flashMessage }}
    - {% endfor %} -
    - {% endif %} - - {% if app.session.flashbag.has('notice') %} -
    - Information
    - {% for flashMessage in app.session.flashbag.get('notice') %} - {{ flashMessage }}
    - {% endfor %} -
    - {% endif %} - -
    -
    - Informations -
    - -
    - {{ form_row(form.name) }} - {{ form_row(form.pagecategory) }} - {{ form_row(form.usage) }} - {% if form.user is defined %} - {{ form_row(form.user) }} - {% endif %} - - {{ form_row(form.page) }} - {{ form_row(form.groups) }} - - {{ form_row(form.roworder) }} - {{ form_row(form.fonticon) }} - {{ form_row(form.maxwidth) }} -
    -
    -{{ form_end(form) }} -{% endblock %} - -{% block localscript %} - -{% endblock %} \ No newline at end of file diff --git a/templates/Page/updateeditor.html.twig b/templates/Page/updateeditor.html.twig deleted file mode 100644 index 3d8f89b..0000000 --- a/templates/Page/updateeditor.html.twig +++ /dev/null @@ -1,72 +0,0 @@ -{% extends '@CadolesCore/base.html.twig' %} - -{% block pagewrapper %} -{{ form_start(form) }} -

    - {% if mode=="update" %} - Modification Page Editeur = {{entity.name}} - {% elseif mode=="submit" %} - Création Page Editeur - {% endif %} -

    - -

    - {{ form_widget(form.submit) }} - {% if access=="config" %} - Annuler - {% else %} - Annuler - {% endif %} - - {% if mode=="update" %} - - Supprimer - - {% endif %} -

    - - {% if app.session.flashbag.has('error') %} -
    - Erreur
    - {% for flashMessage in app.session.flashbag.get('error') %} - {{ flashMessage }}
    - {% endfor %} -
    - {% endif %} - - {% if app.session.flashbag.has('notice') %} -
    - Information
    - {% for flashMessage in app.session.flashbag.get('notice') %} - {{ flashMessage }}
    - {% endfor %} -
    - {% endif %} - -
    - {% if form.roles is defined %} -
    - {% else %} -
    - {% endif %} - - {{ form_row(form.name) }} - {{ form_row(form.roworder) }} - {{ form_row(form.fonticon) }} - {{ form_row(form.maxwidth) }} - {{ form_row(form.html) }} -
    - - {% if form.roles is defined %} -
    - {{ form_row(form.user) }} - {{ form_row(form.roles) }} - {{ form_row(form.groups) }} -
    - {% endif %} -
    -{{ form_end(form) }} -{% endblock %} \ No newline at end of file diff --git a/templates/Page/updatetool.html.twig b/templates/Page/updatetool.html.twig deleted file mode 100644 index 12adcb5..0000000 --- a/templates/Page/updatetool.html.twig +++ /dev/null @@ -1,66 +0,0 @@ -{% extends '@CadolesCore/base.html.twig' %} - -{% block pagewrapper %} -{{ form_start(form) }} -

    - Modification Page {{ entity.pagecategory.name}} = {{entity.name}} -

    - -

    - {{ form_widget(form.submit) }} - {% if access=="config" %} - Annuler - {% else %} - Annuler - {% endif %} - - {% if mode=="update" %} - - Supprimer - - {% endif %} -

    - - {% if app.session.flashbag.has('error') %} -
    - Erreur
    - {% for flashMessage in app.session.flashbag.get('error') %} - {{ flashMessage }}
    - {% endfor %} -
    - {% endif %} - - {% if app.session.flashbag.has('notice') %} -
    - Information
    - {% for flashMessage in app.session.flashbag.get('notice') %} - {{ flashMessage }}
    - {% endfor %} -
    - {% endif %} - -
    - {% if form.roles is defined %} -
    - {% else %} -
    - {% endif %} - - {{ form_row(form.name) }} - {{ form_row(form.roworder) }} - {{ form_row(form.fonticon) }} -
    - - {% if form.roles is defined %} -
    - {{ form_row(form.user) }} - {{ form_row(form.roles) }} - {{ form_row(form.groups) }} -
    - {% endif %} -
    -{{ form_end(form) }} -{% endblock %} \ No newline at end of file diff --git a/templates/Page/updateurl.html.twig b/templates/Page/updateurl.html.twig deleted file mode 100644 index 6c9b25b..0000000 --- a/templates/Page/updateurl.html.twig +++ /dev/null @@ -1,76 +0,0 @@ -{% extends '@CadolesCore/base.html.twig' %} - -{% block pagewrapper %} -{{ form_start(form) }} -

    - {% if mode=="update" %} - Modification Page URL = {{entity.name}} - {% elseif mode=="submit" %} - Création Page URL - {% endif %} -

    - -

    - {{ form_widget(form.submit) }} - {% if access=="config" %} - Annuler - {% else %} - Annuler - {% endif %} - - {% if mode=="update" %} - - Supprimer - - {% endif %} -

    - - {% if app.session.flashbag.has('error') %} -
    - Erreur
    - {% for flashMessage in app.session.flashbag.get('error') %} - {{ flashMessage }}
    - {% endfor %} -
    - {% endif %} - - {% if app.session.flashbag.has('notice') %} -
    - Information
    - {% for flashMessage in app.session.flashbag.get('notice') %} - {{ flashMessage }}
    - {% endfor %} -
    - {% endif %} - -
    - {% if form.roles is defined %} -
    - {% else %} -
    - {% endif %} - - {{ form_row(form.name) }} - {{ form_row(form.url) }} - le mot clé #login# sera remplacé par le login de l'utilisateur
    - Attention certains sites n'acceptent pas d'être encapsulés dans une frame.

    - - {{ form_row(form.toreload) }} - {{ form_row(form.roworder) }} - {{ form_row(form.fonticon) }} - {{ form_row(form.maxwidth) }} -
    - - {% if form.roles is defined %} -
    - {{ form_row(form.user) }} - {{ form_row(form.roles) }} - {{ form_row(form.groups) }} -
    - {% endif %} -
    -{{ form_end(form) }} -{% endblock %} \ No newline at end of file diff --git a/templates/Page/updatewidget.html.twig b/templates/Page/updatewidget.html.twig deleted file mode 100644 index eb8e6eb..0000000 --- a/templates/Page/updatewidget.html.twig +++ /dev/null @@ -1,552 +0,0 @@ -{% extends 'base.html.twig' %} - -{% block localstyle %} - - -{% endblock %} -{% block body %} -{{ form_start(form) }} -

    - {% if mode=="update" %} - {% if usage=="template" %} - Modification Modèle de Page = {{page.name}} - {% else %} - Modification Page Widget = {{page.name}} - {% endif %} - {% elseif mode=="submit" %} - Création Page Widget - {% endif %} -

    - -

    - {{ form_widget(form.submit) }} - {% if access=="admin" %} - Annuler - {% else %} - Annuler - {% endif %} - - {% if mode=="update" %} - - Supprimer - - {% endif %} - -

    - - {% if app.session.flashbag.has('error') %} -
    - Erreur
    - {% for flashMessage in app.session.flashbag.get('error') %} - {{ flashMessage }}
    - {% endfor %} -
    - {% endif %} - - {% if app.session.flashbag.has('notice') %} -
    - Information
    - {% for flashMessage in app.session.flashbag.get('notice') %} - {{ flashMessage }}
    - {% endfor %} -
    - {% endif %} - -
    - {% if form.roles is defined %} -
    - {% else %} -
    - {% endif %} -
    -
    - Informations -
    - -
    - {{ form_row(form.name) }} - {{ form_row(form.roworder) }} - {{ form_row(form.fonticon) }} - {{ form_row(form.maxwidth) }} - {{ form_row(form.template) }} -
    -
    -
    - - {% if form.roles is defined %} -
    -
    -
    - Affectations -
    -
    - {{ form_row(form.user) }} - {{ form_row(form.roles) }} - {{ form_row(form.groups) }} -
    -
    -
    - {% endif %} -
    - -
    -
    - Template de Mise en Page -
    -
    -
    -
    -
    -{{ form_end(form) }} -{% endblock %} - - -{% block localscript %} - - -{% endblock %} \ No newline at end of file diff --git a/templates/Page/vieweditor.html.twig b/templates/Page/vieweditor.html.twig deleted file mode 100644 index f974bd5..0000000 --- a/templates/Page/vieweditor.html.twig +++ /dev/null @@ -1,23 +0,0 @@ - -{% extends '@CadolesCore/base.html.twig' %} - -{% block pagewrapper %} - {% if access=="config" %} - - {% endif %} - -
    - {{ entity.html | raw }} -
    -{% endblock %} - -{% block localjavascript %} - $('document').ready(function(){ - }); - -{% endblock %} diff --git a/templates/Page/viewurl.html.twig b/templates/Page/viewurl.html.twig deleted file mode 100644 index a9c887d..0000000 --- a/templates/Page/viewurl.html.twig +++ /dev/null @@ -1,59 +0,0 @@ - -{% extends '@CadolesCore/base.html.twig' %} - -{% block localstyle %} - #pageiframe { margin: 0px -30px;} -{% endblock %} - -{% if app.user %} - {% set username = app.user.username %} -{% else %} - {% set username = "" %} -{% endif %} - -{% block pagewrapper %} - {% if access=="config" %} - - {% endif %} - -
    - -
    -{% endblock %} - - -{% block localjavascript %} - $(window).resize(function() { - resizeFrame(); - }); - - $('document').ready(function(){ - resizeFrame(); - }); - - function resizeFrame() { - $("body").css("overflow-y","hidden"); - $(".col-md-10").css("padding","0"); - - var iFrame = document.getElementById('frameContent'); - - var heightbody = $('html').height(); - var heightheader = $('.header').height(); - if($('.pagemenu').css("display")=="none") - var heightmenu = 0; - else - var heightmenu = $('.pagemenu').height(); - - - var heightframe = heightbody-heightheader-heightmenu; - - if($("#frameContent").length>0) { - $("#frameContent").height(heightframe); - } - } -{% endblock %} diff --git a/templates/Page/viewwidget.html.twig b/templates/Page/viewwidget.html.twig deleted file mode 100644 index e9ea46d..0000000 --- a/templates/Page/viewwidget.html.twig +++ /dev/null @@ -1,598 +0,0 @@ - -{% extends 'base.html.twig' %} - -{% block menuuser %} - {% if access=="admin" %} -
  7. -
  8. -
  9. - {% endif %} -{% endblock %} - -{% block body %} -
    - -
    - - - - - {% if access!="all" %} - - {% endif %} -{% endblock %} - -{% block localscript %} - -{% endblock %} diff --git a/templates/Pagetemplate/list.html.twig b/templates/Pagetemplate/list.html.twig deleted file mode 100644 index c4c6979..0000000 --- a/templates/Pagetemplate/list.html.twig +++ /dev/null @@ -1,58 +0,0 @@ -{% extends 'base.html.twig' %} - - -{% block body %} -

    - Gestion des Modèles de Page -

    - -

    - Ajouter un Modèle -

    - - {% if app.session.flashbag.has('error') %} -
    - Erreur
    - {% for flashMessage in app.session.flashbag.get('error') %} - {{ flashMessage }}
    - {% endfor %} -
    - {% endif %} - -
    -
    - Liste des Modèles -
    - -
    -
    - - - - - - - - - -
    ActionOrdreNomPour
    -
    -
    -
    -{% endblock %} - -{% block localscript %} - -{% endblock %} diff --git a/templates/Pagetype/edit.html.twig b/templates/Pagetype/edit.html.twig new file mode 100644 index 0000000..9b184ca --- /dev/null +++ b/templates/Pagetype/edit.html.twig @@ -0,0 +1,108 @@ + +{% extends 'base.html.twig' %} + +{% block body %} +{{ form_start(form) }} +

    + {% if mode=="submit" %} + Création pagetype + {% else %} + Modification pagetype + {% endif %} +

    + + {{ form_widget(form.submit) }} + + Annuler + + {% if mode=="update" and pagetype.id>0%} + + Supprimer + + {% endif %} + +

    + + {% if app.session.flashbag.has('error') %} +
    + Erreur
    + {% for flashMessage in app.session.flashbag.get('error') %} + {{ flashMessage }}
    + {% endfor %} +
    + {% endif %} + + {% if app.session.flashbag.has('notice') %} +
    + Information
    + {% for flashMessage in app.session.flashbag.get('notice') %} + {{ flashMessage }}
    + {% endfor %} +
    + {% endif %} + +
    +
    + Informations +
    + +
    + {{ form_row(form.name) }} + {{ form_row(form.sortby) }} + {{ form_row(form.description) }} + + {% set image= "noimage.png" %} + {% if pagetype.image %} + {% set image= pagetype.image %} + {% endif %} + +
    +
    + {{ form_widget(form.image) }} + + Modifier +
    +
    +
    +{{ form_end(form) }} +{% endblock %} + +{% block localscript %} + +{% endblock %} + + + diff --git a/templates/Pagetype/home.html.twig b/templates/Pagetype/home.html.twig new file mode 100755 index 0000000..54c2ae9 --- /dev/null +++ b/templates/Pagetype/home.html.twig @@ -0,0 +1,55 @@ +{% extends "base.html.twig" %} + +{% block localstyle %} + +{% endblock %} + +{% block beforebody %} + +
    +
    + +
    +
    + + +
    +

    {{pagetype.name}}

    +
    +
    + + {% if not pagetype.description is empty %} +
    + {{pagetype.description|raw}} +
    + {% endif %} + +
    + + + + +{% endblock %} diff --git a/templates/Pagetype/list.html.twig b/templates/Pagetype/list.html.twig new file mode 100644 index 0000000..d15e28a --- /dev/null +++ b/templates/Pagetype/list.html.twig @@ -0,0 +1,52 @@ +{% extends "base.html.twig" %} + +{% block body %} +

    + pagetypes +

    + +

    Ajouter

    + +
    +
    + Liste des pagetypes +
    + +
    +
    + + + + + + + + + {% for pagetype in pagetypes %} + + + + + {% endfor %} + +
    ActionNom
    + + {{pagetype.name}}
    +
    +
    +
    +{% endblock %} + +{% block localscript %} + +{% endblock %} + diff --git a/templates/Pagetype/upload.html.twig b/templates/Pagetype/upload.html.twig new file mode 100755 index 0000000..018d06b --- /dev/null +++ b/templates/Pagetype/upload.html.twig @@ -0,0 +1,38 @@ +{% extends "base.html.twig" %} + +{% block encoretags %} + {{ encore_entry_link_tags('dropzone') }} +{% endblock %} + +{% block body %} + Annuler + +
    +
    +{% endblock %} + +{% block localscript %} + {{ encore_entry_script_tags('dropzone') }} + + +{% endblock %} diff --git a/templates/Pagewidget/ckeditor.html.twig b/templates/Pagewidget/ckeditor.html.twig deleted file mode 100644 index 2b9effe..0000000 --- a/templates/Pagewidget/ckeditor.html.twig +++ /dev/null @@ -1,115 +0,0 @@ -{% extends 'base.html.twig' %} - -{% block body %} -{{ form_start(form) }} -

    - Modification Widget -

    - -

    - {{ form_widget(form.submit) }} - Annuler -

    - - {% if app.session.flashbag.has('error') %} -
    - Erreur
    - {% for flashMessage in app.session.flashbag.get('error') %} - {{ flashMessage }}
    - {% endfor %} -
    - {% endif %} - - {% if app.session.flashbag.has('notice') %} -
    - Information
    - {% for flashMessage in app.session.flashbag.get('notice') %} - {{ flashMessage }}
    - {% endfor %} -
    - {% endif %} - - -
    -
    Informations
    -
    - {{ form_row(form.ckeditor) }} -
    -
    - -{{ form_end(form) }} -{% endblock %} - -{% block localscript %} - -{% endblock %} \ No newline at end of file diff --git a/templates/Pagewidget/edit.html.twig b/templates/Pagewidget/edit.html.twig deleted file mode 100644 index aa19c82..0000000 --- a/templates/Pagewidget/edit.html.twig +++ /dev/null @@ -1,172 +0,0 @@ -{% extends 'base.html.twig' %} - -{% block body %} -{{ form_start(form) }} -

    - {% if mode=="update" or mode=="updatetemplate" %} - Modification Widget - {% elseif mode=="submit" or mode=="submittemplate" %} - Création Widget - {% endif %} -

    - -

    - {{ form_widget(form.submit) }} - Annuler -

    - - {% if app.session.flashbag.has('error') %} -
    - Erreur
    - {% for flashMessage in app.session.flashbag.get('error') %} - {{ flashMessage }}
    - {% endfor %} -
    - {% endif %} - - {% if app.session.flashbag.has('notice') %} -
    - Information
    - {% for flashMessage in app.session.flashbag.get('notice') %} - {{ flashMessage }}
    - {% endfor %} -
    - {% endif %} - -
    -
    -
    -
    Informations
    -
    - {{ form_row(form.name) }} -
    -
    -
    - -
    -
    -
    Informations
    -
    -
    - {% if entity.icon.label %} - - {% endif %} -
    - -
    - {{ form_row(form.idicon) }} - Selectionner un Icône - Détacher l'Icône -
    -
    -
    -
    -
    -
    -
    Informations
    -
    -
    -
    - {{ form_row(form.autoajust) }} - {{ form_row(form.height) }} - {{ form_row(form.border) }} - {{ form_row(form.opened) }} -
    - -
    - {{ form_row(form.viewheader) }} - {{ form_row(form.colorheaderback) }} - {{ form_row(form.colorheaderfont) }} - {{ form_row(form.colorbodyback) }} - {{ form_row(form.colorbodyfont) }} -
    - -
    - -
    - -
    - {{ form_widget(form) }} -
    -
    -
    -
    -
    -
    - -{{ form_end(form) }} -{% endblock %} - -{% block localscript %} - -{% endblock %} \ No newline at end of file diff --git a/templates/Pagewidget/viewalert.html.twig b/templates/Pagewidget/viewalert.html.twig deleted file mode 100644 index 086289b..0000000 --- a/templates/Pagewidget/viewalert.html.twig +++ /dev/null @@ -1,42 +0,0 @@ -{% set widgetname="alert" %} -{% extends 'Pagewidget/widget.twig' %} -{% block widgetbody %} - {% for alert in alerts %} - {% if loop.first %} -
    - {% endif %} -
    -
    -
    - - -
    - {% if alert.fghideable and app.user %} - - {%endif%} - -
    -
    - -
    - {{ alert.content|raw }} -
    -
    -
    - - {% if loop.last %} -
    - {% endif %} - {% endfor %} -{% endblock %} - diff --git a/templates/Pagewidget/viewblog.html.twig b/templates/Pagewidget/viewblog.html.twig deleted file mode 100644 index 181d573..0000000 --- a/templates/Pagewidget/viewblog.html.twig +++ /dev/null @@ -1,101 +0,0 @@ - -{% import "Pagewidget/constants.twig" as constants %} - -{% set stylewidget = constants.mystylewidget(entity) %} -{% set stylewidgetmenu = constants.mystylewidgetmenu(entity) %} -{% set stylewidgetheader = constants.mystylewidgetheader(entity) %} -{% set stylewidgetbody = constants.mystylewidgetbody(entity) %} -{% set stylewidgetbodyreverse = constants.mystylewidgetbodyreverse(entity) %} - -{%if mini %} - -{% else %} -
    -
    - {% if canupdate %} - - - {% endif %} - - {% if access=="config" %} - - {% else %} - {% if canadd %} - {% set idblog = "" %} - {% set url= path('app_user_blogarticle_submit') %} - {% if usage=="group" and firstblog is defined %} - {% set url= path('app_user_blogarticle_submit',{idblog:firstblog,page:entity.page.id}) %} - {% endif %} - - - {% endif %} - - {% set url= path('app_user_blog_view') %} - {% if usage=="group" and firstblog is defined %} - {% set url= path('app_user_blog_view',{id:firstblog}) %} - {% endif %} - - - {% endif %} - - {% if look=="list" %} - - {% else %} - - {% endif %} -
    - -
    - {% if entity.icon %} - - {% else %} - - {% endif %} - {{ entity.name }} -
    - - {% if blogarticles|length >= 1 %} - - {% endif %} -
    -{% endif %} - - diff --git a/templates/Pagewidget/viewbookmark.html.twig b/templates/Pagewidget/viewbookmark.html.twig deleted file mode 100644 index 035f218..0000000 --- a/templates/Pagewidget/viewbookmark.html.twig +++ /dev/null @@ -1,90 +0,0 @@ -{% set widgetname="bookmark" %} -{% extends 'Pagewidget/widget.twig' %} - -{% block widgetaction %} - {% if canadd %} - - {% endif %} -{% endblock %} - -{% block widgetbody %} -
    - {% for bookmark in bookmarks %} - {% set havebookmark=true %} - {% if bookmark.item %} - {% set bookmarktitle = bookmark.item.title %} - {% set bookmarksubtitle = bookmark.item.subtitle %} - {% set bookmarkbackgroundcolor = bookmark.item.color ? bookmark.item.color : app.session.get('colorbgbodydark')|raw %} - {% set bookmarktarget = bookmark.item.target %} - {% set bookmarkurl = ( bookmark.item.protected and not app.user ? path("app_login") : bookmark.item.url|replace({'#login#': username}) ) %} - {% set bookmarkcontent = bookmark.item.content %} - {% set bookmarkicon = (bookmark.item.icon ? bookmark.item.icon.label : "icon/icon_pin.png") %} - {% else %} - {% set bookmarktitle = bookmark.title %} - {% set bookmarksubtitle = bookmark.subtitle %} - {% set bookmarkbackgroundcolor = bookmark.color ? bookmark.color : app.session.get('colorbgbodydark')|raw %} - {% set bookmarktarget = bookmark.target %} - {% set bookmarkurl = bookmark.url|replace({'#login#': username}) %} - {% set bookmarkcontent = null %} - {% set bookmarkicon = bookmark.icon ? bookmark.icon.label : "icon/icon_pin.png" %} - {% endif %} - -
    -
    -
    - {% if bookmarktarget == 'frame' %} - - {% else %} - - {% endif %} - - -
    -

    {{ bookmarktitle }}

    -
    {{ bookmarksubtitle|nl2br }}
    -
    -
    - -
    - {% if canadd %} - {% if bookmark.item %} - - {% else %} - - - {% endif %} - {% endif %} - - {% if bookmarkcontent %} - - {% endif %} -
    -
    - -
    {{ bookmarkcontent|raw }}
    -
    -
    - {% endfor %} - - {% if canadd %} - - {% endif %} -
    -{% endblock %} - - - diff --git a/templates/Pagewidget/viewcalendar.html.twig b/templates/Pagewidget/viewcalendar.html.twig deleted file mode 100644 index 531a6a6..0000000 --- a/templates/Pagewidget/viewcalendar.html.twig +++ /dev/null @@ -1,100 +0,0 @@ -{% import "Pagewidget/constants.twig" as constants %} - -{% set stylewidget = constants.mystylewidget(entity) %} -{% set stylewidgetmenu = constants.mystylewidgetmenu(entity) %} -{% set stylewidgetheader = constants.mystylewidgetheader(entity) %} -{% set stylewidgetbody = constants.mystylewidgetbody(entity) %} - -{%if mini %} - -{% else %} -
    -
    - {% if canupdate %} - - - {% endif %} - {% if access=="config" %} - - {% else %} - {% set url= path('app_'~access~'_calendar_view') %} - {% if usage=="group" and firstcalendar is defined %} - {% set url= path('app_'~access~'_calendar_view',{id:firstcalendar}) %} - {% endif %} - - {% endif %} - - {% if look=="list" %} - - {% else %} - - {% endif %} -
    - -
    - {% if entity.icon %} - - {% else %} - - {% endif %} - {{ entity.name }} -
    - - {% set firstflux="" %} - - {% if events|length >= 1 %} -
    - {% set monthsel = "" %} - {% for i in 0..(nbday-1) %} - {% set dateeventstart = 'now'|date_modify("+"~i~" day midnight") %} - {% set dateeventend = 'now'|date_modify("+"~(i+1)~" day midnight") %} - - {% set fgaffday=false %} - {% for event in events %} - {% if event.start< dateeventend and event.end>=dateeventstart %} - - {% if monthsel == "" or dateeventstart|date("Y-m")!=monthsel %} - {% set monthsel = dateeventstart|date("Y-m") %} - {% set libmonth = constants.libmonth(dateeventstart|date("m")) %} -

    {{ libmonth ~ " " ~ dateeventstart|date("Y") }}

    - {% endif %} - - {% if not fgaffday %} - {% set fgaffday=true %} - {% set libday = constants.libday(dateeventstart|date("N")) %} -
    {{ libday ~ " " ~ dateeventstart|date("d/m/Y") }}
    - {% endif %} - -
    - {{ event.name }} = - {% if not event.allDay %} - {{ event.start | date("H:i") }} - - {%endif%} - {{ event.title }} -
    - {% endif %} - - {% endfor %} - - {% endfor %} - - {% if url is defined %} - - {% endif %} -
    - {% endif %} -
    -{% endif %} - - - diff --git a/templates/Pagewidget/vieweditor.html.twig b/templates/Pagewidget/vieweditor.html.twig deleted file mode 100644 index f7abbe4..0000000 --- a/templates/Pagewidget/vieweditor.html.twig +++ /dev/null @@ -1,28 +0,0 @@ -{% set widgetname="editor" %} -{% extends 'Pagewidget/widget.twig' %} - -{% block widgetaction %} - {% if canadd %} - - {% endif %} -{% endblock %} - -{% block widgetbody %} - {% if html is empty and canadd %} -
    -
    - Modifier votre texte -
    - {% else %} -
    - {{ html | raw }} -
    - {% endif %} - -{% endblock %} - - - - - - diff --git a/templates/Pagewidget/viewfile.html.twig b/templates/Pagewidget/viewfile.html.twig deleted file mode 100644 index 3665846..0000000 --- a/templates/Pagewidget/viewfile.html.twig +++ /dev/null @@ -1,15 +0,0 @@ -{% set widgetname="file" %} -{% extends 'Pagewidget/widget.twig' %} - -{% block widgetaction %} - {% if canupdate %} - - {% endif %} -{% endblock %} - -{% block widgetbody %} - -{% endblock %} - - - diff --git a/templates/Pagewidget/viewflux.html.twig b/templates/Pagewidget/viewflux.html.twig deleted file mode 100644 index ae4cefd..0000000 --- a/templates/Pagewidget/viewflux.html.twig +++ /dev/null @@ -1,141 +0,0 @@ -{% set theme = app.session.get('theme') %} -{% if theme is not empty %} - {{ include('@Theme/'~theme~'/function.html.twig') }} -{% endif %} - -{% import "@CadolesPortal/Pagewidget/constants.twig" as constants %} - -{% set stylewidget = constants.mystylewidget(entity) %} -{% set stylewidgetmenu = constants.mystylewidgetmenu(entity) %} -{% set stylewidgetheader = constants.mystylewidgetheader(entity) %} -{% set stylewidgetbody = constants.mystylewidgetbody(entity) %} -{% set color = app.session.get('color') %} - -{% set colorbodyfont = entity.colorbodyfont %} -{% if colorbodyfont is null %} - {% set colorbodyfont = color['fontcolorhover'] %} -{% endif %} - -{% set colorbodyback = entity.colorbodyback %} -{% if colorbodyback is null %} - {% set colorbodyback = color['main'] %} -{% endif %} - -{% set colorbodyfont = entity.colorbodyfont %} -{% if colorbodyfont is null %} - {% if colorbodyback==color['fontcolorhover'] %} - {% set colorbodyfont = color['main'] %} - {% else %} - {% set colorbodyfont = color['fontcolorhover'] %} - {% endif %} -{% endif %} - -{% if modelist==0 %} - {% set stylegrid="grid-preview" %} -{% elseif modelist==1 %} - {% set stylegrid="grid-list" %} -{% endif %} - -{%if mini %} - -{% else %} -
    -
    - {% if canupdate %} - - - {% endif %} - - {% if look=="list" %} - - {% else %} - - {% endif %} -
    - -
    - {% if entity.icon %} - - {% else %} - - {% endif %} - {{ entity.name }} -
    - - {% set firstflux="" %} - -
    - {% if fluxs is defined %} - {% if fluxs|length > 1 %} -
    Tout
    - - {% for flux in fluxs %} - {% set stylefeed = "background-color: #" ~ color['main'] ~ ";" %} - {% if flux.color is not null %} - {% set stylefeed = "background-color: #" ~ flux.color ~ ";" %} - {% endif %} - -
    {{ flux.title }}
    - {% endfor %} - {% endif %} - {% endif %} - -
    - {% for feed in feeds %} - {% if loop.index==1 %} -
    -
    - {% endif %} - - - {% set stylecolor = "background-color: #" ~ color['main'] ~ ";" %} - {% if feed.color is defined and feed.color is not null %} - {% set stylecolor = "background-color: #" ~ feed.color ~ ";" %} - {% endif %} - {% set stylefeed = "" %} - {% if feed.image is not null and feed.image != ""%} - {% set stylefeed = stylefeed ~ "background: url(" ~ feed.image ~ ") no-repeat center; background-size: cover;" %} - {% endif %} - - - - {% endfor %} -
    -
    -
    -{% endif %} - - - diff --git a/templates/Pagewidget/viewframe.html.twig b/templates/Pagewidget/viewframe.html.twig deleted file mode 100644 index 18c8661..0000000 --- a/templates/Pagewidget/viewframe.html.twig +++ /dev/null @@ -1,77 +0,0 @@ -{% set theme = app.session.get('theme') %} -{% if theme is not empty %} - {{ include('@Theme/'~theme~'/function.html.twig') }} -{% endif %} - -{% import "@CadolesPortal/Pagewidget/constants.twig" as constants %} - -{% set stylewidget = constants.mystylewidget(entity) %} -{% set stylewidgetmenu = constants.mystylewidgetmenu(entity) %} -{% set stylewidgetheader = constants.mystylewidgetheader(entity) %} -{% set stylewidgetbody = constants.mystylewidgetbody(entity) %} -{% set stylewidgetbodyframe = constants.mystylewidgetbodyframe(entity) %} -{% set stylewidgetbodyimage = constants.mystylewidgetbodyimage(entity) %} - -{% set color = app.session.get('color') %} -{% set colorbodyback = entity.colorbodyback %} -{% if colorbodyback is null %} - {% set colorbodyback = color['main'] %} -{% endif %} - -{% set colorbodyfont = entity.colorbodyfont %} -{% if colorbodyfont is null %} - {% set colorbodyfont = color['fontcolorhover'] %} -{% endif %} - -{%if mini %} - -{% else %} -
    - -
    - {% if canupdate %} - - - {% endif %} - - {% if look=="list" %} - - {% else %} - - {% endif %} -
    - - - - {% if onheader %} -
    - -
    - {% else %} -
    - {% if entity.icon %} - - {% else %} - - {% endif %} - {{ entity.name }} -
    - -
    - -
    - {% endif %} -
    -{% endif %} - - diff --git a/templates/Pagewidget/viewgalery.html.twig b/templates/Pagewidget/viewgalery.html.twig deleted file mode 100644 index 39514e9..0000000 --- a/templates/Pagewidget/viewgalery.html.twig +++ /dev/null @@ -1,23 +0,0 @@ -{% set widgetname="galery" %} -{% extends 'Pagewidget/widget.twig' %} - -{% block widgetaction %} - {% if canadd %} - - {% endif %} -{% endblock %} - -{% block widgetbody %} - {% if canadd %} - Ajouter des Images - {% endif %} - - -{% endblock %} \ No newline at end of file diff --git a/templates/Pagewidget/viewinfo.html.twig b/templates/Pagewidget/viewinfo.html.twig deleted file mode 100644 index d8a9c25..0000000 --- a/templates/Pagewidget/viewinfo.html.twig +++ /dev/null @@ -1,64 +0,0 @@ -{% set widgetname="info" %} -{% extends 'Pagewidget/widget.twig' %} - -{% block widgetmenu %} -{% endblock %} - -{% block widgetbody %} - {% for group in entity.page.groups %} - {% if entity.page.groups|length > 1 or not widgethaveheader %} -

    {{group.label}}

    - {% endif %} - {% if group.description %} - {{ group.description|nl2br}} -

    - {% endif %} -
    - {% for member in group.users %} -
    -
    -
    - -
    -
    -
    - {% endfor %} - - {%if canupdate %} - - {% endif %} -
    - {% endfor %} - - {% if entity.page.groups|length == 0 and entity.page.user %} -
    - -
    - {% endif %} -{% endblock %} diff --git a/templates/Pagewidget/viewitem.html.twig b/templates/Pagewidget/viewitem.html.twig deleted file mode 100644 index 3d88bb5..0000000 --- a/templates/Pagewidget/viewitem.html.twig +++ /dev/null @@ -1,174 +0,0 @@ -{% set widgetname="item" %} -{% extends 'Pagewidget/widget.twig' %} - -{% block widgetaction %} - {% if canadd %} - - {% endif %} -{% endblock %} - -{% block widgetbody %} - {% set havemenu=false %} - {% set havebookmark=false %} - - {% if menu and withbookmark!= 2 and (canadd or bookmarks is not empty or itemcategorys|length > 1) %} - {% set havemenu=true %} -
    - {% if menuall %} -
    Tout
    - {% endif %} - - {% if bookmarks is not empty or canadd %} -
    - {% endif %} - - {% for itemcategory in itemcategorys %} -
    {{itemcategory.label}}
    - {% endfor %} -
    - {% endif %} - - {% if search %} - {% set havemenu=true %} -
    -
    -   -
    - -
    - {% endif %} - - {% if (bookmarks is not empty or canadd ) and (withbookmark==0 or withbookmark==2) %} - {% if withbookmark==0 or itemcategorys|length > 1 %} -

    Favoris

    - {% endif %} -
    - {% for bookmark in bookmarks %} - {% set havebookmark=true %} - {% if bookmark.item %} - {% set bookmarktitle = bookmark.item.title %} - {% set bookmarksubtitle = bookmark.item.subtitle %} - {% set bookmarkbackgroundcolor = bookmark.item.color ? bookmark.item.color : app.session.get('colorbgbodydark')|raw %} - {% set bookmarktarget = bookmark.item.target %} - {% set bookmarkurl = ( bookmark.item.protected and not app.user ? path("app_login") : bookmark.item.url|replace({'#login#': username}) ) %} - {% set bookmarkcontent = bookmark.item.content %} - {% set bookmarkicon = (bookmark.item.icon ? bookmark.item.icon.label : "icon/icon_pin.png") %} - {% else %} - {% set bookmarktitle = bookmark.title %} - {% set bookmarksubtitle = bookmark.subtitle %} - {% set bookmarkbackgroundcolor = bookmark.color ? bookmark.color : app.session.get('colorbgbodydark')|raw %} - {% set bookmarktarget = bookmark.target %} - {% set bookmarkurl = bookmark.url|replace({'#login#': username}) %} - {% set bookmarkcontent = null %} - {% set bookmarkicon = bookmark.icon ? bookmark.icon.label : "icon/icon_pin.png" %} - {% endif %} - -
    -
    -
    - {% if bookmarktarget == 'frame' %} - - {% else %} - - {% endif %} - - -
    -

    {{ bookmarktitle }}

    -
    {{ bookmarksubtitle|nl2br }}
    -
    -
    - -
    - {% if canadd %} - {% if bookmark.item %} - - {% else %} - - - {% endif %} - {% endif %} - - {% if bookmarkcontent %} - - {% endif %} -
    -
    - -
    {{ bookmarkcontent|raw }}
    -
    -
    - {% endfor %} - - {% if (canadd) %} - - {% endif %} -
    - {% endif %} - - {% for itemcategory in itemcategorys %} - {% if itemcategorys|length > 1 or havebookmark or canadd %}

    {{itemcategory.label}}

    {% endif %} -
    - {% for item in items %} - {% if item.itemcategory==itemcategory %} -
    -
    -
    - {% set url=item.url|replace({'#login#': username}) %} - {% if item.protected and not app.user %} - {% set url=path('app_login') %} - {% endif %} - - {% if item.target == 'frame' %} - - {% else %} - - {% endif %} - - {% if item.icon %} - - {% else %} - - {% endif %} - -
    -

    {{ item.title }}

    -
    {{ item.subtitle|nl2br }}
    -
    -
    - -
    - {% if canadd %} - - {% endif %} - - {% if item.content %} - - {% endif %} -
    -
    - -
    {{ item.content|raw }}
    -
    -
    - {% endif %} - {% endfor %} -
    - {% endfor %} -{% endblock %} - - diff --git a/templates/Pagewidget/viewitemessential.html.twig b/templates/Pagewidget/viewitemessential.html.twig deleted file mode 100644 index 25c615d..0000000 --- a/templates/Pagewidget/viewitemessential.html.twig +++ /dev/null @@ -1,131 +0,0 @@ -{% set widgetname="itemessential" %} -{% extends 'Pagewidget/widget.twig' %} - -{% block widgetaction %} - {% if canadd %} - - {% endif %} -{% endblock %} - - -{% block widgetbody %} -
    - {% for bookmark in bookmarks %} - {% set havebookmark=true %} - {% if bookmark.item %} - {% set bookmarktitle = bookmark.item.title %} - {% set bookmarksubtitle = bookmark.item.subtitle %} - {% set bookmarkbackgroundcolor = bookmark.item.color ? bookmark.item.color : app.session.get('colorbgbodydark')|raw %} - {% set bookmarktarget = bookmark.item.target %} - {% set bookmarkurl = ( bookmark.item.protected and not app.user ? path("app_login") : bookmark.item.url|replace({'#login#': username}) ) %} - {% set bookmarkcontent = bookmark.item.content %} - {% set bookmarkicon = (bookmark.item.icon ? bookmark.item.icon.label : "icon/icon_pin.png") %} - {% else %} - {% set bookmarktitle = bookmark.title %} - {% set bookmarksubtitle = bookmark.subtitle %} - {% set bookmarkbackgroundcolor = bookmark.color ? bookmark.color : app.session.get('colorbgbodydark')|raw %} - {% set bookmarktarget = bookmark.target %} - {% set bookmarkurl = bookmark.url|replace({'#login#': username}) %} - {% set bookmarkcontent = null %} - {% set bookmarkicon = bookmark.icon ? bookmark.icon.label : "icon/icon_pin.png" %} - {% endif %} - -
    -
    -
    - {% if bookmarktarget == 'frame' %} - - {% else %} - - {% endif %} - - -
    -

    {{ bookmarktitle }}

    -
    {{ bookmarksubtitle|nl2br }}
    -
    -
    - -
    - {% if canadd %} - {% if bookmark.item %} - - {% else %} - - - {% endif %} - {% endif %} - - {% if bookmarkcontent %} - - {% endif %} -
    -
    - -
    {{ bookmarkcontent|raw }}
    -
    -
    - {% endfor %} - - {% for item in items %} -
    -
    -
    - {% set url=item.url|replace({'#login#': username}) %} - {% if item.protected and not app.user %} - {% set url=path('app_login') %} - {% endif %} - - {% if item.target == 'frame' %} - - {% else %} - - {% endif %} - - {% if item.icon %} - - {% else %} - - {% endif %} - -
    -

    {{ item.title }}

    -
    {{ item.subtitle|nl2br }}
    -
    -
    - -
    - {% if canadd %} - - {% endif %} - - {% if item.content %} - - {% endif %} -
    -
    - -
    {{ item.content|raw }}
    -
    -
    - {% endfor %} - - -
    -{% endblock %} - - diff --git a/templates/Pagewidget/viewlink.html.twig b/templates/Pagewidget/viewlink.html.twig deleted file mode 100644 index 7001240..0000000 --- a/templates/Pagewidget/viewlink.html.twig +++ /dev/null @@ -1,23 +0,0 @@ -{% set widgetname="link" %} -{% extends 'Pagewidget/widget.twig' %} - -{% block widgetbody %} - {% set url=url|replace({'#login#': username}) %} - {% if target == 'frame' %} - - {% else %} - - {% endif %} - - {% if entity.icon %} - - {% else %} - - {% endif %} - - -
    {{ entity.name }}
    -
    -{% endblock %} - - diff --git a/templates/Pagewidget/viewproject.html.twig b/templates/Pagewidget/viewproject.html.twig deleted file mode 100644 index 7e9d80c..0000000 --- a/templates/Pagewidget/viewproject.html.twig +++ /dev/null @@ -1,133 +0,0 @@ -{% import "Pagewidget/constants.twig" as constants %} - -{% set stylewidget = constants.mystylewidget(entity) %} -{% set stylewidgetmenu = constants.mystylewidgetmenu(entity) %} -{% set stylewidgetheader = constants.mystylewidgetheader(entity) %} -{% set stylewidgetbody = constants.mystylewidgetbody(entity) %} -{% set stylewidgetbodyreverse = constants.mystylewidgetbodyreverse(entity) %} - - - -{%if mini %} - -{% else %} -
    -
    - {% if canupdate %} - - - {% endif %} - - {% if access=="config" %} - - {% elseif app.user %} - {% set idproject = "" %} - {% set urladd= path('app_user_projecttask_submit') %} - {% set urlview= path('app_user_project_view') %} - {% if usage=="group" and firstproject is defined %} - {% set urladd= path('app_user_projecttask_submit',{idproject:firstproject,page:entity.page.id}) %} - {% set urlview= path('app_user_project_view',{id:firstproject}) %} - {% endif %} - - - {% endif %} - - {% if look=="list" %} - - {% else %} - - {% endif %} -
    - -
    - {% if entity.icon %} - - {% else %} - - {% endif %} - {{ entity.name }} -
    - - {% if projecttasks|length >= 1 %} - - {% endif %} -
    -{% endif %} - - - diff --git a/templates/Pagewidget/viewslide.html.twig b/templates/Pagewidget/viewslide.html.twig deleted file mode 100644 index af73412..0000000 --- a/templates/Pagewidget/viewslide.html.twig +++ /dev/null @@ -1,52 +0,0 @@ -{% set widgetname="slide" %} -{% extends 'Pagewidget/widget.twig' %} - -{% block widgetaction %} - {% if canadd %} - - {% endif %} -{% endblock %} - -{% block widgetbody %} -{% set intervalmilli = interval * 1000 %} - -
    - {% if slides is empty and canadd %} -
    -
    - Gérer le Carrousel -
    - {% endif %} - - {% for slide in slides %} - {% if slide.url is not empty %} - {% set url=slide.url|replace({'#login#': username}) %} - {% if slide.target == 'frame' %} - - {% else %} - - {% endif %} - {% endif %} -
    -
    - {% if slide.title is not empty %} -

    {{slide.title}}

    - {% endif %} - - {% if slide.subtitle is not empty %} - {{slide.subtitle}} - {% endif %} -
    -
    - - {% if slide.url is not empty %} -
    - {% endif %} - {% endfor %} -
    - -{% endblock %} - - - - diff --git a/templates/Pagewidget/viewurl.html.twig b/templates/Pagewidget/viewurl.html.twig deleted file mode 100644 index 2001de5..0000000 --- a/templates/Pagewidget/viewurl.html.twig +++ /dev/null @@ -1,11 +0,0 @@ -{% set widgetname="url" %} -{% extends 'Pagewidget/widget.twig' %} - -{% block widgetbody %} - {% if imagemedia %} - - {% else %} - - {% endif %} -{% endblock %} - diff --git a/templates/Pagewidget/widget.twig b/templates/Pagewidget/widget.twig deleted file mode 100644 index 023cb52..0000000 --- a/templates/Pagewidget/widget.twig +++ /dev/null @@ -1,101 +0,0 @@ -{% set widgethaveheader=entity.viewheader %} - -{% if widgetname=="alert" and canupdate and alerts|length ==0 %} - {% set widgethaveheader=true %} -{% endif %} -{% if widgetname=="item" and canupdate and items|length==0 and withbookmark==1 %} - {% set widgethaveheader=true %} -{% endif %} -{% if widgetname=="bookmark" and canadd and bookmarks|length==0 %} - {% set widgethaveheader=true %} -{% endif %} -{% if widgetname=="editor" and canadd and html is empty %} - {% set widgethaveheader=true %} -{% endif %} - - -{% set viewwidget=true %} -{% if not widgethaveheader and widgetname=="alert" and not canupdate and alerts|length ==0 %} - {% set viewwidget=false %} -{% endif %} -{% if not widgethaveheader and widgetname=="item" and not canupdate and items|length ==0 and withbookmark==1 %} - {% set viewwidget=false %} -{% endif %} -{% if not widgethaveheader and widgetname=="bookmark" and not canadd and bookmarks|length ==0 %} - {% set viewwidget=false %} -{% endif %} -{% if not widgethaveheader and widgetname=="editor" and not canadd and html is empty %} - {% set viewwidget=false %} -{% endif %} - - - - -{%if widgethaveheader %} -{% set widgetstyle=(entity.colorheaderback ? "border-color:"~entity.colorheaderback~";" : "border-color:var(--colorbgbodydark);") %} -{% set widgetstylemenu=(entity.colorheaderback ? "background-color:"~entity.colorheaderback~";" : "background-color:var(--colorbgbodydark);")~(entity.colorheaderfont ? "color:"~entity.colorheaderfont~";" : "color:var(--colorfttitledark);") %} -{%else%} -{% set widgetstyle=(viewwidget ? "display:block;" : "display:none;")~(entity.colorbodyback ? "border-color:"~entity.colorbodyback~";" : "border-color:var(--colorbgbodydark);") %} -{% set widgetstylemenu="margin:-26px 0px 0px 0px; padding: 1px 10px; background-color:var(--colorbgbodydark); color: var(--colorfttitledark); border-radius: 5px;" %} -{%endif%} - -{% set widgetstyleheader=(entity.colorheaderback ? "background-color:"~entity.colorheaderback~";" : "background-color:var(--colorbgbodydark);")~(entity.colorheaderfont ? "color:"~entity.colorheaderfont~";" : "color:var(--colorfttitledark);") %} -{% set widgetstylebody=(entity.colorbodyback ? "background-color:"~entity.colorbodyback~";" : "background-color:var(--colorbgbodylight);")~(entity.colorbodyfont ? "color:"~entity.colorbodyfont~";" : "color:var(--colorfttitlelight);")~(entity.isopened ? "display:block;" : "display:none;")~(widgetname=="url" ? "padding:0px;" : "")~(not widgethaveheader and not entity.border ? "padding-top: 0px;" : "")~(entity.autoajust ? "" : "height:"~entity.height~"px;") %} -{% set widgeicon= entity.icon ? path('app_minio_image',{file:entity.icon.label}) : path('app_minio_image',{file:"icon/icon_pin.png"}) %} - -{% if modedesktop is defined %} - {% if modedesktop==0 %} - {% set itemsize="item-verysmall" %} - {% elseif modedesktop==1 %} - {% set itemsize="item-small" %} - {% elseif modedesktop==2 %} - {% set itemsize="item-medium" %} - {% elseif modedesktop==3 %} - {% set itemsize="item-large" %} - {% elseif modedesktop==4 %} - {% set itemsize="item-list" %} - {% endif %} -{% endif %} - -{% if app.user %} - {% set username = app.user.username %} -{% else %} - {% set username = "" %} -{% endif %} - -{% set colorbodyfont = "color: var(--colorfttitlelight)" %} -{% if entity.colorbodyfont is not null %} - {% set colorbodyfont = "color: " ~ entity.colorbodyfont %} -{% endif %} - - -
    -
    - {% if canupdate and not widgethaveheader %} - - {% endif %} - - {% block widgetaction %} - {% endblock %} - - {% if canupdate %} - - - {% endif %} -
    - - {%if widgethaveheader %} -
    - - {{ entity.name }} -
    - {%endif%} - -
    - {% block widgetbody %} - {% endblock %} -
    -
    - - - diff --git a/templates/Pagewidgetslide/edit.html.twig b/templates/Pagewidgetslide/edit.html.twig deleted file mode 100755 index 111e1e8..0000000 --- a/templates/Pagewidgetslide/edit.html.twig +++ /dev/null @@ -1,67 +0,0 @@ -{% extends 'base.html.twig' %} - -{% block body %} -{{ form_start(form) }} -

    - {% if mode=="update" %} - Modification Carrousel - {% elseif mode=="submit" %} - Création Carrousel - {% endif %} -

    - - {{ form_widget(form.submit) }} - Annuler - - {% if mode=="update" %} - - Supprimer - - {% endif %} - -

    - - {% if app.session.flashbag.has('error') %} -
    - Erreur
    - {% for flashMessage in app.session.flashbag.get('error') %} - {{ flashMessage }}
    - {% endfor %} -
    - {% endif %} - - {% if app.session.flashbag.has('notice') %} -
    - Information
    - {% for flashMessage in app.session.flashbag.get('notice') %} - {{ flashMessage }}
    - {% endfor %} -
    - {% endif %} - - -
    -
    - {{ form_row(form.title) }} - {{ form_row(form.subtitle) }} - -
    - - Modifier -
    -
    - - -
    - {{ form_row(form.roworder) }} - {{ form_row(form.url) }} - le mot clé #login# sera remplacé par le login de l'utilisateur

    - {{ form_row(form.target) }} -
    -
    -{{ form_end(form) }} -{% endblock %} - diff --git a/templates/Pagewidgetslide/list.html.twig b/templates/Pagewidgetslide/list.html.twig deleted file mode 100644 index 643da46..0000000 --- a/templates/Pagewidgetslide/list.html.twig +++ /dev/null @@ -1,18 +0,0 @@ -{% extends 'base.html.twig' %} - -{% block body %} -

    Gestion des Carrousels

    - -

    - Ajouter - Retour -

    - - - {% for pagewidgetslide in pagewidgetslides %} - - - - {% endfor %} -{% endblock %} - diff --git a/templates/Pin/edit.html.twig b/templates/Pin/edit.html.twig new file mode 100644 index 0000000..8363047 --- /dev/null +++ b/templates/Pin/edit.html.twig @@ -0,0 +1,71 @@ + +{% extends 'base.html.twig' %} + +{% block body %} +{{ form_start(form) }} +

    + {% if mode=="submit" %} + Création pin + {% else %} + Modification pin + {% endif %} +

    + + {{ form_widget(form.submit) }} + + Annuler + + {% if mode=="update" %} + + Supprimer + + {% endif %} + +

    + + {% if app.session.flashbag.has('error') %} +
    + Erreur
    + {% for flashMessage in app.session.flashbag.get('error') %} + {{ flashMessage }}
    + {% endfor %} +
    + {% endif %} + + {% if app.session.flashbag.has('notice') %} +
    + Information
    + {% for flashMessage in app.session.flashbag.get('notice') %} + {{ flashMessage }}
    + {% endfor %} +
    + {% endif %} + +
    + {% set image= "noimage.png" %} + {% if pin.image %} + {% set image= pin.image %} + {% endif %} + + {{ form_widget(form.image) }} + Modifier +
    + +
    +
    + Informations +
    + +
    + {{ form_row(form.name) }} + {{ form_row(form.subname) }} + {{ form_row(form.description) }} +
    +
    +{{ form_end(form) }} +{% endblock %} + + diff --git a/templates/Pin/list.html.twig b/templates/Pin/list.html.twig new file mode 100644 index 0000000..a11377a --- /dev/null +++ b/templates/Pin/list.html.twig @@ -0,0 +1,55 @@ +{% extends "base.html.twig" %} + +{% block body %} +

    + pins +

    + +

    Ajouter

    + +
    +
    + Liste des pins +
    + +
    +
    + + + + + + + + + + {% for pin in pins %} + + + + + + {% endfor %} + +
    ActionIDNom
    + + {{pin.id}}{{pin.name}}
    +
    +
    +
    +{% endblock %} + +{% block localscript %} + + +{% endblock %} + diff --git a/templates/Pin/view.html.twig b/templates/Pin/view.html.twig new file mode 100644 index 0000000..f7a0f99 --- /dev/null +++ b/templates/Pin/view.html.twig @@ -0,0 +1,13 @@ +{% extends "base.html.twig" %} + +{% block body %} + {% set image= "noimage.png" %} + {% if image %} + {% set image= pin.image %} + {% endif %} + + + {% if pin.subname %}{{ pin.subname }}{%endif%}

    + {{pin.description|raw}} +{% endblock %} + diff --git a/templates/Pagetemplate/submit.html.twig b/templates/Tag/edit.html.twig similarity index 61% rename from templates/Pagetemplate/submit.html.twig rename to templates/Tag/edit.html.twig index 88c71b5..d0e30eb 100644 --- a/templates/Pagetemplate/submit.html.twig +++ b/templates/Tag/edit.html.twig @@ -1,15 +1,30 @@ + {% extends 'base.html.twig' %} {% block body %} {{ form_start(form) }}

    - Nouveau Modèle de Page + {% if mode=="submit" %} + Création tag + {% else %} + Modification tag + {% endif %}

    + + {{ form_widget(form.submit) }} -

    - {{ form_widget(form.submit) }} - Annuler -

    + Annuler + + {% if mode=="update" %} + + Supprimer + + {% endif %} + +

    {% if app.session.flashbag.has('error') %}
    @@ -35,11 +50,13 @@
    - {{ form_row(form.name) }} - {{ form_row(form.parentfor) }} - {{ form_row(form.roworder) }} - {{ form_row(form.maxwidth) }} + {{ form_row(form.id) }} + {{ form_row(form.childs) }}
    {{ form_end(form) }} {% endblock %} + + + + diff --git a/templates/Tag/list.html.twig b/templates/Tag/list.html.twig new file mode 100644 index 0000000..2a66fbc --- /dev/null +++ b/templates/Tag/list.html.twig @@ -0,0 +1,52 @@ +{% extends "base.html.twig" %} + +{% block body %} +

    + tags +

    + +

    Ajouter

    + +
    +
    + Liste des tags +
    + +
    +
    + + + + + + + + + {% for tag in tags %} + + + + + {% endfor %} + +
    ActionID
    + + {{tag.id}}
    +
    +
    +
    +{% endblock %} + +{% block localscript %} + +{% endblock %} + diff --git a/templates/base.html.twig b/templates/base.html.twig index a3b15e8..716f2cf 100755 --- a/templates/base.html.twig +++ b/templates/base.html.twig @@ -83,16 +83,50 @@ {% endif %}
    {% endif %} + {% block beforebody %} + {% endblock %} +
    {% if usesidebar is defined and usesidebar %} {% if is_granted('ROLE_ADMIN') %} @@ -183,8 +224,62 @@
    + + {% block localscript %}{% endblock %}