summaryrefslogtreecommitdiff
path: root/src/controller/MenuAndPathsController.php
blob: d429287b2bdc7d0c7e82b1031233cdb6f4a9ebab (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
<?php
// src/controller/MenuAndPathsController.php

declare(strict_types=1);

use App\Entity\Page;
use Doctrine\ORM\EntityManager;

class MenuAndPathsController
{
    static public function newUrlMenuEntry(EntityManager $entityManager): void
    {
        Director::$menu_data = new Menu($entityManager);
        $previous_page = Director::$menu_data->findPageById((int)$_POST["location"]); // (int) à cause de declare(strict_types=1);
        $parent = $previous_page->getParent();

        $page = new Page(
            trim(htmlspecialchars($_POST["label_input"])),
            filter_var($_POST["url_input"], FILTER_VALIDATE_URL),
            true, true, false,
            $previous_page->getPosition(),
            $parent); // peut et DOIT être null si on est au 1er niveau

        // on a donné à la nouvelle entrée la même position qu'à la précédente,
        // addChild l'ajoute à la fin du tableau "children" puis on trie
        // 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
        if($parent == null){
            $parent = Director::$menu_data;
        }
        $parent->addChild($page); // true pour réindexer les positions en BDD
        $parent->reindexPositions();

        $entityManager->persist($page);
        $entityManager->flush();
        header("Location: " . new URL(['page' => $_GET['from']]));
        die;
    }

    static public function deleteUrlMenuEntry(EntityManager $entityManager): void
    {
        Director::$menu_data = new Menu($entityManager);
        $page = Director::$menu_data->findPageById((int)$_POST["delete"]);
        $parent = $page->getParent();
        if($parent == null){
            $parent = Director::$menu_data;
        }

        $parent->removeChild($page); // suppression de $children avant de trier
        $parent->reindexPositions();

        $entityManager->remove($page); // suppression en BDD
        $entityManager->flush();
        header("Location: " . new URL(['page' => $_GET['from']]));
        die;
    }

	static public function MoveOneLevelUp(EntityManager $entityManager, array $json): void
	{
		$id = $json['id'];
		$page = Director::$menu_data->findPageById((int)$id);

        $parent = $page->getParent(); // peut être null
        if($parent === null){
            // 1er niveau: ne rien faire
            echo json_encode(['success' => false]);
            die;
        }
        // BDD
        else{
            $page->setPosition($parent->getPosition() + 1); // nouvelle position

            // 2ème niveau: le parent devient $menu_data, puis null après tri
            if($parent->getParent() === null){
                // connexion dans les deux sens
                $page->setParent(Director::$menu_data); // => pour la persistance
                
                //Director::$menu_data->addChild($page); // => pour sortChildren
                $page->getParent()->addChild($page); // => pour sortChildren
                //Director::$menu_data->sortChildren(true); // positions décaléees des nouveaux petits frères
                $page->getParent()->sortChildren(true); // positions décaléees des nouveaux petits frères
                $page->setParent(null);

                // affichage
                $page->setPagePath($page->getEndOfPath());
                $page->fillChildrenPagePath();
            }
            // 3ème niveau et plus
            else{
                $page->setParent($parent->getParent()); // nouveau parent
                $page->getParent()->addChild($page); // => pour sortChildren
                $page->getParent()->sortChildren(true); // positions décaléees des nouveaux petits frères
                $page->fillChildrenPagePath($page->getParent()->getPagePath());
            }
            //$parent->sortChildren(true); // positions des enfants restants, inutile si la fonction est récursive?
            $entityManager->flush();
            
            // affichage
            $parent->removeChild($page);
            $nav_builder = new NavBuilder();
	        $menu_builder = new MenuBuilder(null, false);
			echo json_encode(['success' => true, 'nav' => $nav_builder->render(), 'menu_buttons' => $menu_builder->render()]);
			die;
        }
	}

	static public function MoveOneLevelDown(EntityManager $entityManager, array $json): void
	{
		$id = $json['id'];
		$page = Director::$menu_data->findPageById((int)$id);

        $parent = $page->getParent(); // peut être null
        if($parent == null){
            $parent = Director::$menu_data;
        }

        // BDD
        $parent->sortChildren(true); // trie et réindexe par sécurité: 1, 2, 3...
        if($page->getPosition() > 1){
            foreach($parent->getChildren() as $child){
                if($child->getPosition() === $page->getPosition() - 1){
                    $page->setParent($child);
                    break;
                }
            }
            $page->setPosition(count($page->getParent()->getChildren()) + 1);
        }
        $entityManager->flush();

        // affichage
		$parent->removeChild($page);
        $page->getParent()->addChild($page);
        $page->fillChildrenPagePath($page->getParent()->getPagePath()); // variable non mappée $page_path
        $nav_builder = new NavBuilder();
		$menu_builder = new MenuBuilder(null, false);

		echo json_encode(['success' => true, 'nav' => $nav_builder->render(), 'menu_buttons' => $menu_builder->render()]);
		die;
	}

	static public function SwitchPositions(EntityManager $entityManager, array $json): void
	{
		$id1 = $json['id1'];
        $id2 = $json['id2'];

        // vérifier qu'ils ont le même parent
        $page1 = Director::$menu_data->findPageById((int)$id1);
        $page2 = Director::$menu_data->findPageById((int)$id2);

        // double le contrôle fait en JS
        if($page1->getParent() === $page2->getParent()) // comparaison stricte d'objet (même instance du parent?)
        {
        	// inversion
	        $tmp = $page1->getPosition();
	        $page1->setPosition($page2->getPosition());
	        $page2->setPosition($tmp);
	        Director::$menu_data->sortChildren(true); // modifie tableau children 
	        $entityManager->flush();
	        
	        // nouveau menu
	        $nav_builder = new NavBuilder();
	        echo json_encode(['success' => true, 'nav' => $nav_builder->render()]);
        }
        else{
        	echo json_encode(['success' => false]);
        }
	    
	    die;
	}

	static public function displayInMenu(EntityManager $entityManager, array $json): void
	{
		$id = $json['id'];
		$checked = $json['checked'];

		$page = Director::$menu_data->findPageById((int)$id);
		if($page->isHidden() === $checked){
			$page->setHidden(!$checked);
			$entityManager->flush();

			// nouveau menu
			$nav_builder = new NavBuilder();
			echo json_encode(['success' => true, 'nav' => $nav_builder->render()]);
		}
		else{
			echo json_encode(['success' => false]);
		}
		die;
	}
}