summaryrefslogtreecommitdiff
path: root/src/controller
diff options
context:
space:
mode:
authorpolo <ordipolo@gmx.fr>2025-04-06 12:18:49 +0200
committerpolo <ordipolo@gmx.fr>2025-04-06 12:18:49 +0200
commit68b6058e2a27fc251c117c4efeb141392a0c9736 (patch)
tree5c029b2c147bd14f777765d41bc623582c81daa2 /src/controller
parente4a325c9d5c07f09bc18b7e366ffb82b82c43502 (diff)
downloadcms-68b6058e2a27fc251c117c4efeb141392a0c9736.zip
nouvel article, boutons dans les builders, makeArticleNode, JS MAJ page, tri quand déplacement ou suppression
Diffstat (limited to 'src/controller')
-rw-r--r--src/controller/Director.php93
-rw-r--r--src/controller/Security.php2
-rw-r--r--src/controller/ajax.php88
3 files changed, 135 insertions, 48 deletions
diff --git a/src/controller/Director.php b/src/controller/Director.php
index 5ff8f47..db84661 100644
--- a/src/controller/Director.php
+++ b/src/controller/Director.php
@@ -13,17 +13,29 @@ class Director
13 static public Menu $menu_data; // pour NavBuilder 13 static public Menu $menu_data; // pour NavBuilder
14 static public Path $page_path; // pour BreadcrumbBuilder 14 static public Path $page_path; // pour BreadcrumbBuilder
15 private Page $page; 15 private Page $page;
16 private Node $root_node; 16 private Node $node;
17 private Node $article;
17 18
18 public function __construct(EntityManager $entityManager) 19 public function __construct(EntityManager $entityManager, bool $for_display = false)
19 { 20 {
20 $this->entityManager = $entityManager; 21 $this->entityManager = $entityManager;
21 self::$menu_data = new Menu($entityManager); // Menu est un modèle mais pas une entité 22 if($for_display){
22 self::$page_path = new Path(); 23 self::$menu_data = new Menu($entityManager); // Menu est un modèle mais pas une entité
23 $this->page = self::$page_path->getLast(); 24 self::$page_path = new Path();
24 $this->root_node = new Node; // instance mère "vide" ne possédant rien d'autre que des enfants 25 $this->page = self::$page_path->getLast();
26 }
27 $this->node = new Node; // instance mère "vide" ne possédant rien d'autre que des enfants
25 } 28 }
26 29
30 public function getNode(): Node
31 {
32 return $this->node;
33 }
34 public function getArticleNode(): Node
35 {
36 return $this->article;
37 }
38
27 public function makeRootNode(string $id = ''): void 39 public function makeRootNode(string $id = ''): void
28 { 40 {
29 // on récupère toutes les entrées 41 // on récupère toutes les entrées
@@ -44,25 +56,10 @@ class Director
44 ->setParameter('id', $id) 56 ->setParameter('id', $id)
45 ->getResult(); 57 ->getResult();
46 } 58 }
47 $this->feedObjects($bulk_data); 59 $this->feedRootNodeObjects($bulk_data);
48 }
49
50 public function makeArticleNode(string $id = ''): bool
51 {
52 $bulk_data = $this->entityManager
53 ->createQuery('SELECT n FROM App\Entity\Node n WHERE n.article_timestamp = :id')
54 ->setParameter('id', $id)
55 ->getResult();
56
57 if(count($bulk_data) === 0){
58 return false;
59 }
60
61 $this->root_node = $bulk_data[0];
62 return true;
63 } 60 }
64 61
65 private function feedObjects(array $bulk_data): void // $bulk_data = tableau de Node 62 private function feedRootNodeObjects(array $bulk_data): void // $bulk_data = tableau de Node
66 { 63 {
67 // puis on les range 64 // puis on les range
68 // (attention, risque de disfonctionnement si les noeuds de 1er niveau ne sont pas récupérés en 1er dans la BDD) 65 // (attention, risque de disfonctionnement si les noeuds de 1er niveau ne sont pas récupérés en 1er dans la BDD)
@@ -71,7 +68,7 @@ class Director
71 // premier niveau 68 // premier niveau
72 if($node->getParent() == null) 69 if($node->getParent() == null)
73 { 70 {
74 $this->root_node->addChild($node); 71 $this->node->addChild($node);
75 72
76 // spécifique page article 73 // spécifique page article
77 if($node->getName() === 'main' && $this->page->getEndOfPath() == 'article'){ 74 if($node->getName() === 'main' && $this->page->getEndOfPath() == 'article'){
@@ -94,8 +91,50 @@ class Director
94 } 91 }
95 } 92 }
96 93
97 public function getRootNode(): Node 94 // récupération d'un article pour modification
98 { 95 public function makeArticleNode(string $id = '', bool $get_section = false): bool
99 return $this->root_node; 96 {
97 if($get_section){
98 $dql = 'SELECT n, p FROM App\Entity\Node n LEFT JOIN n.parent p WHERE n.article_timestamp = :id';
99 }
100 else{
101 $dql = 'SELECT n FROM App\Entity\Node n WHERE n.article_timestamp = :id';
102 }
103 // n est l'article et p son $parent
104 $bulk_data = $this->entityManager
105 ->createQuery($dql)
106 ->setParameter('id', $id)
107 ->getResult();
108
109 if(count($bulk_data) === 0){
110 return false;
111 }
112
113 if($get_section){
114 $this->article = $bulk_data[0];
115 $this->makeSectionNode($bulk_data[0]->getParent()->getId());
116 }
117 else{
118 $this->article = $bulk_data[0];
119 }
120
121 return true;
122 }
123
124 // récupération des articles d'un bloc <section> à la création d'un article
125 public function makeSectionNode(int $section_id): bool
126 {
127 $section = $this->entityManager->find('App\Entity\Node', (string)$section_id);
128
129 $bulk_data = $this->entityManager
130 ->createQuery('SELECT n FROM App\Entity\Node n WHERE n.parent = :parent')
131 ->setParameter('parent', $section)
132 ->getResult();
133
134 foreach($bulk_data as $article){
135 $section->addChild($article); // pas de flush, on ne va pas écrire dans la BDD à chaque nouvelle page
136 }
137 $this->node = $section;
138 return true;
100 } 139 }
101} 140}
diff --git a/src/controller/Security.php b/src/controller/Security.php
index 818a2bd..f9092e2 100644
--- a/src/controller/Security.php
+++ b/src/controller/Security.php
@@ -9,7 +9,7 @@ class Security
9 'safe'=>1, // protection contre les élements et attributs dangereux 9 'safe'=>1, // protection contre les élements et attributs dangereux
10 10
11 // liste blanche d'éléments HTML 11 // liste blanche d'éléments HTML
12 'elements'=> 'h1, h2, h3, h4, h5, h6, p, s, em, span, strong, a, ul, ol, li, sup, sub, code, blockquote, div, pre, table, caption, colgroup, col, tbody, tr, th, td, figure, img, figcaption, iframe, small', 12 'elements'=> 'h1, h2, h3, h4, h5, h6, p, br, s, em, span, strong, a, ul, ol, li, sup, sub, code, blockquote, div, pre, table, caption, colgroup, col, tbody, tr, th, td, figure, img, figcaption, iframe, small',
13 13
14 // liste noire d'attributs HTML 14 // liste noire d'attributs HTML
15 'deny_attribute'=> 'id, class' // on garde 'style' 15 'deny_attribute'=> 'id, class' // on garde 'style'
diff --git a/src/controller/ajax.php b/src/controller/ajax.php
index 86acd39..b5c2e51 100644
--- a/src/controller/ajax.php
+++ b/src/controller/ajax.php
@@ -3,6 +3,9 @@
3 3
4declare(strict_types=1); 4declare(strict_types=1);
5 5
6use App\Entity\Article;
7use App\Entity\Node;
8
6// détection des requêtes de tinymce 9// détection des requêtes de tinymce
7if($_SERVER['CONTENT_TYPE'] === 'application/json' && isset($_GET['action'])) 10if($_SERVER['CONTENT_TYPE'] === 'application/json' && isset($_GET['action']))
8{ 11{
@@ -15,13 +18,44 @@ if($_SERVER['CONTENT_TYPE'] === 'application/json' && isset($_GET['action']))
15 if(json_last_error() === JSON_ERROR_NONE) 18 if(json_last_error() === JSON_ERROR_NONE)
16 { 19 {
17 $id = $json['id']; 20 $id = $json['id'];
18 $id[0] = 'i';
19 $content = Security::secureString($json['content']); 21 $content = Security::secureString($json['content']);
20
21 $director = new Director($entityManager); 22 $director = new Director($entityManager);
23
24 // nouvel article
25 if($id[0] === 'n')
26 {
27 if($content === ''){
28 echo json_encode(['success' => false, 'message' => 'pas de données à sauvegarder']);
29 die;
30 }
31 $section_id = (int)substr($id, 1); // id du bloc <section>
32 $director->makeSectionNode($section_id);
33 $node = $director->getNode(); // = <section>
34
35 $timestamp = time();
36 $date = new \DateTime;
37 $date->setTimestamp($timestamp);
38
39 $article = new Article($content, $date); // le "current" timestamp est obtenu par la BDD
40 $article_node = new Node('article', 'i' . (string)$timestamp, [], count($node->getChildren()) + 1, $node, $node->getPage(), $article);
41
42 $entityManager->persist($article_node);
43 $entityManager->flush();
44
45 // id_node tout juste généré
46 //$article_node->getId();
47
48 echo json_encode(['success' => true, 'article_id' => $article_node->getArticleTimestamp()]);
49 die;
50 }
51 // modification article
52 else{
53 $id[0] = 'i'; // id de l'article node
54 }
55
22 if($director->makeArticleNode($id)) // une entrée est trouvée 56 if($director->makeArticleNode($id)) // une entrée est trouvée
23 { 57 {
24 $node = $director->getRootNode(); 58 $node = $director->getArticleNode(); // article
25 switch($json['id'][0]){ 59 switch($json['id'][0]){
26 case 'i': 60 case 'i':
27 $node->getArticle()->setContent($content); 61 $node->getArticle()->setContent($content);
@@ -42,8 +76,9 @@ if($_SERVER['CONTENT_TYPE'] === 'application/json' && isset($_GET['action']))
42 $entityManager->flush(); 76 $entityManager->flush();
43 echo json_encode(['success' => true]); 77 echo json_encode(['success' => true]);
44 } 78 }
45 else{ 79 else
46 echo json_encode(['success' => false, 'message' => 'Aucune entrée trouvée en BDD']); 80 {
81 echo json_encode(['success' => false, 'message' => 'article non identifié']);
47 } 82 }
48 } 83 }
49 else{ 84 else{
@@ -53,16 +88,18 @@ if($_SERVER['CONTENT_TYPE'] === 'application/json' && isset($_GET['action']))
53 } 88 }
54 elseif($_GET['action'] === 'delete_article' && isset($json['id'])) 89 elseif($_GET['action'] === 'delete_article' && isset($json['id']))
55 { 90 {
56 $id = $json['id'];
57
58 $director = new Director($entityManager); 91 $director = new Director($entityManager);
59 $director->makeArticleNode($id); 92 $director->makeArticleNode($json['id'], true);
60 $node = $director->getRootNode(); 93 $article = $director->getArticleNode();
61 $entityManager->remove($node); 94 $section = $director->getNode();
95
96 $entityManager->remove($article);
97 $section->removeChild($article);
98 $section->sortChildren(true); // régénère les positions
62 $entityManager->flush(); 99 $entityManager->flush();
63 100
64 // test avec une nouvelle requête qui ne devrait rien trouver 101 // test avec une nouvelle requête qui ne devrait rien trouver
65 if(!$director->makeArticleNode($id)) 102 if(!$director->makeArticleNode($json['id']))
66 { 103 {
67 echo json_encode(['success' => true]); 104 echo json_encode(['success' => true]);
68 105
@@ -78,14 +115,25 @@ if($_SERVER['CONTENT_TYPE'] === 'application/json' && isset($_GET['action']))
78 elseif($_GET['action'] === 'switch_positions' && isset($json['id1']) && isset($json['id2'])) 115 elseif($_GET['action'] === 'switch_positions' && isset($json['id1']) && isset($json['id2']))
79 { 116 {
80 $director = new Director($entityManager); 117 $director = new Director($entityManager);
81 $director->makeArticleNode($json['id1']); 118 $director->makeArticleNode($json['id1'], true);
82 $node1 = $director->getRootNode(); 119 $article1 = $director->getArticleNode();
83 $director->makeArticleNode($json['id2']); 120 $section = $director->getNode();
84 $node2 = $director->getRootNode(); 121
85 122 $section->sortChildren(true); // régénère les positions avant inversion
86 $tmp = $node1->getPosition(); 123
87 $node1->setPosition($node2->getPosition()); 124 $article2;
88 $node2->setPosition($tmp); 125 foreach($section->getChildren() as $child){
126 if($child->getArticleTimestamp() === $json['id2']) // type string
127 {
128 $article2 = $child;
129 break;
130 }
131 }
132
133 // inversion
134 $tmp = $article1->getPosition();
135 $article1->setPosition($article2->getPosition());
136 $article2->setPosition($tmp);
89 $entityManager->flush(); 137 $entityManager->flush();
90 138
91 echo json_encode(['success' => true]); 139 echo json_encode(['success' => true]);
@@ -99,7 +147,7 @@ if($_SERVER['CONTENT_TYPE'] === 'application/json' && isset($_GET['action']))
99 147
100 $director = new Director($entityManager); 148 $director = new Director($entityManager);
101 $director->makeArticleNode($id); 149 $director->makeArticleNode($id);
102 $node = $director->getRootNode(); 150 $node = $director->getArticleNode();
103 $node->getArticle()->setDateTime($date); 151 $node->getArticle()->setDateTime($date);
104 $entityManager->flush(); 152 $entityManager->flush();
105 153