aboutsummaryrefslogtreecommitdiff
path: root/src/controller/MenuAndPathsController.php
diff options
context:
space:
mode:
authorpolo <ordipolo@gmx.fr>2026-10-23 00:47:32 +0200
committerpolo <ordipolo@gmx.fr>2026-10-23 00:47:32 +0200
commitf27cca08ff786ceff1870147f6d6bad14d71117f (patch)
treed36597a72025313d6faf4ed228755fa267ebe2f6 /src/controller/MenuAndPathsController.php
parentc7309f900ef05bd5cb313110ec159b761af394ec (diff)
downloadcms-f27cca08ff786ceff1870147f6d6bad14d71117f.tar.gz
cms-f27cca08ff786ceff1870147f6d6bad14d71117f.tar.bz2
cms-f27cca08ff786ceff1870147f6d6bad14d71117f.zip
dossiers avec majuscule, namespace pour toutes les classes, autoload psr-4, UserDataService::createZip déplacé dans Backup
Diffstat (limited to 'src/controller/MenuAndPathsController.php')
-rw-r--r--src/controller/MenuAndPathsController.php219
1 files changed, 0 insertions, 219 deletions
diff --git a/src/controller/MenuAndPathsController.php b/src/controller/MenuAndPathsController.php
deleted file mode 100644
index 9bd6ad1..0000000
--- a/src/controller/MenuAndPathsController.php
+++ /dev/null
@@ -1,219 +0,0 @@
1<?php
2// src/controller/MenuAndPathsController.php
3
4declare(strict_types=1);
5
6use App\Entity\Page;
7use Doctrine\ORM\EntityManager;
8use Symfony\Component\HttpFoundation\JsonResponse;
9use Symfony\Component\HttpFoundation\RedirectResponse;
10
11class MenuAndPathsController
12{
13 static public function newUrlMenuEntry(EntityManager $entityManager): RedirectResponse
14 {
15 Model::$menu = new Menu($entityManager);
16 $previous_page = Model::$menu->findPageById((int)$_POST["location"]); // (int) à cause de declare(strict_types=1);
17 $parent = $previous_page->getParent();
18
19 $url_input = trim($_POST["url_input"]); // faire htmlspecialchars à l'affichage
20 if(!filter_var($url_input, FILTER_VALIDATE_URL) || !str_starts_with($url_input, 'http')){
21 // utiliser une flash error
22 return new RedirectResponse((string)new URL(['page' => $_GET['from'], 'error' => 'invalide_url']));
23 }
24
25 $page = new Page(
26 trim(htmlspecialchars($_POST["label_input"])),
27 $url_input, '',
28 true, true, false,
29 $previous_page->getPosition(),
30 $parent); // peut et DOIT être null si on est au 1er niveau
31
32 // on a donné à la nouvelle entrée la même position qu'à la précédente,
33 // addChild l'ajoute à la fin du tableau "children" puis on trie
34 // exemple avec 2 comme position demandée: 1 2 3 4 2 devient 1 2 3 4 5 et la nouvelle entrée sera en 3è position
35 if(!$parent){
36 $parent = Model::$menu;
37 }
38 $parent->addChild($page); // true pour réindexer les positions en BDD
39 $parent->reindexPositions();
40
41 $entityManager->persist($page);
42 $entityManager->flush();
43 return new RedirectResponse((string)new URL(['page' => $_GET['from']]));
44 }
45
46 // on pourrait utiliser FormValidation ici
47 static public function editUrl(EntityManager $entityManager, array $json): JsonResponse
48 {
49 $url_data = trim($json['input_data']); // garder htmlspecialchars pour l'affichage
50 $page = $entityManager->find('App\Entity\Page', $json['id']);
51
52 if(!$page){
53 return new JsonResponse(['success' => false, 'message' => "id invalide"]);
54 }
55 elseif(!in_array($json['field'], ['url_name', 'url_content'])){
56 return new JsonResponse(['success' => false, 'message' => "champ invalide"]);
57 }
58 elseif($json['field'] === 'url_content' && (!filter_var($url_data, FILTER_VALIDATE_URL) || !str_starts_with($url_data, 'http'))){
59 return new JsonResponse(['success' => false, 'message' => "la chaîne envoyée n'est pas une URL valide"]);
60 }
61 else{
62 if($json['field'] === 'url_name'){
63 $page->setPageName($url_data);
64 }
65 elseif($json['field'] === 'url_content'){
66 $page->setEndOfPath($url_data);
67 }
68 $entityManager->flush();
69 return new JsonResponse(['success' => true, 'url_data' => $url_data]);
70 }
71 }
72
73 static public function deleteUrlMenuEntry(EntityManager $entityManager): RedirectResponse
74 {
75 Model::$menu = new Menu($entityManager);
76 $page = Model::$menu->findPageById((int)$_POST["delete"]);
77 $parent = $page->getParent();
78 if($parent == null){
79 $parent = Model::$menu;
80 }
81
82 $parent->removeChild($page); // suppression de $children avant de trier
83 $parent->reindexPositions();
84
85 $entityManager->remove($page); // suppression en BDD
86 $entityManager->flush();
87 return new RedirectResponse((string)new URL(['page' => $_GET['from']]));
88 }
89
90 static public function MoveOneLevelUp(EntityManager $entityManager, array $json): JsonResponse
91 {
92 $id = $json['id'];
93 $page = Model::$menu->findPageById((int)$id);
94
95 $parent = $page->getParent(); // peut être null
96 if($parent === null){
97 // 1er niveau: ne rien faire
98 return new JsonResponse(['success' => false, 'message' => 'nothing to do']);
99 }
100 // BDD
101 else{
102 $page->setPosition($parent->getPosition() + 1); // nouvelle position
103
104 // 2ème niveau: le parent devient $menu, puis null après tri
105 if($parent->getParent() === null){
106 // connexion dans les deux sens
107 $page->setParent(Model::$menu); // => pour la persistance
108
109 //Model::$menu->addChild($page); // => pour sortChildren
110 $page->getParent()->addChild($page); // => pour sortChildren
111 $page->getParent()->sortChildren(true); // positions décaléees des nouveaux petits frères
112 $page->setParent(null);
113
114 // affichage
115 $page->setPagePath($page->getEndOfPath());
116 $page->fillChildrenPagePath();
117 }
118 // 3ème niveau et plus
119 else{
120 $page->setParent($parent->getParent()); // nouveau parent
121 $page->getParent()->addChild($page); // => pour sortChildren
122 $page->getParent()->sortChildren(true); // positions décaléees des nouveaux petits frères
123 $page->fillChildrenPagePath($page->getParent()->getPagePath());
124 }
125 $entityManager->flush();
126
127 // affichage
128 $parent->removeChild($page);
129 $nav_builder = new NavBuilder();
130 $menu_builder = new MenuBuilder(null, false);
131 return new JsonResponse(['success' => true, 'nav' => $nav_builder->render(), 'menu_buttons' => $menu_builder->render()]);
132 }
133 }
134
135 static public function MoveOneLevelDown(EntityManager $entityManager, array $json): JsonResponse
136 {
137 $id = $json['id'];
138 $page = Model::$menu->findPageById((int)$id);
139
140 $parent = $page->getParent(); // peut être null
141 if($parent === null){
142 $parent = Model::$menu;
143 }
144
145 // BDD
146 $parent->sortChildren(true); // trie et réindexe par sécurité: 1, 2, 3...
147 if($page->getPosition() > 1){
148 foreach($parent->getChildren() as $child){
149 if($child->getPosition() === $page->getPosition() - 1){
150 // refus si $parent est une adresse, ça va casser le lien, exemple: index.php?page=chemin/http://un_site_web.fr/vers/ici
151 if(str_starts_with($child->getEndOfPath(), 'http')){
152 return new JsonResponse(['success' => false, 'error' => 'new_parent_is_a_link']);
153 }
154
155 $page->setParent($child);
156 break;
157 }
158 }
159 $page->setPosition(count($page->getParent()->getChildren()) + 1);
160 }
161 $entityManager->flush();
162
163 // affichage
164 $parent->removeChild($page);
165 $page->getParent()->addChild($page);
166 $page->fillChildrenPagePath($page->getParent()->getPagePath()); // variable non mappée $page_path
167 $nav_builder = new NavBuilder();
168 $menu_builder = new MenuBuilder(null, false);
169
170 return new JsonResponse(['success' => true, 'nav' => $nav_builder->render(), 'menu_buttons' => $menu_builder->render()]);
171 }
172
173 static public function SwitchPositions(EntityManager $entityManager, array $json): JsonResponse
174 {
175 $id1 = $json['id1'];
176 $id2 = $json['id2'];
177
178 // vérifier qu'ils ont le même parent
179 $page1 = Model::$menu->findPageById((int)$id1);
180 $page2 = Model::$menu->findPageById((int)$id2);
181
182 // double le contrôle fait en JS
183 if($page1->getParent() === $page2->getParent()) // comparaison stricte d'objet (même instance du parent?)
184 {
185 // inversion
186 $tmp = $page1->getPosition();
187 $page1->setPosition($page2->getPosition());
188 $page2->setPosition($tmp);
189 Model::$menu->sortChildren(true); // modifie tableau children
190 $entityManager->flush();
191
192 // nouveau menu
193 $nav_builder = new NavBuilder();
194 return new JsonResponse(['success' => true, 'nav' => $nav_builder->render()]);
195 }
196 else{
197 return new JsonResponse(['success' => false]);
198 }
199 }
200
201 static public function displayInMenu(EntityManager $entityManager, array $json): JsonResponse
202 {
203 $id = $json['id'];
204 $checked = $json['checked'];
205
206 $page = Model::$menu->findPageById((int)$id);
207 if($page->isHidden() === $checked){
208 $page->setHidden(!$checked);
209 $entityManager->flush();
210
211 // nouveau menu
212 $nav_builder = new NavBuilder();
213 return new JsonResponse(['success' => true, 'nav' => $nav_builder->render()]);
214 }
215 else{
216 return new JsonResponse(['success' => false]);
217 }
218 }
219} \ No newline at end of file