aboutsummaryrefslogtreecommitdiff
path: root/src/model/Model.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/model/Model.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/model/Model.php')
-rw-r--r--src/model/Model.php312
1 files changed, 0 insertions, 312 deletions
diff --git a/src/model/Model.php b/src/model/Model.php
deleted file mode 100644
index 15ff12a..0000000
--- a/src/model/Model.php
+++ /dev/null
@@ -1,312 +0,0 @@
1<?php
2// src/model/Model.php
3//
4// à l'occaz, faire des classes métiers: NodeModel = celle-ci
5// puis PageModel, puis éventuellement UserModel, EmailModel (le calendrier a déjà EventDTO)
6
7declare(strict_types=1);
8
9use Doctrine\ORM\EntityManager;
10use App\Entity\Page;
11use App\Entity\Node;
12use App\Entity\Presentation;
13use Doctrine\ORM\QueryBuilder;
14use Symfony\Component\HttpFoundation\Request;
15
16class Model
17{
18 private EntityManager $entityManager;
19 static public Menu $menu; // pour NavBuilder
20 static public ?Path $page_path = null; // pour $current dans NavBuilder et pour BreadcrumbBuilder
21 private Page $page;
22 private ?Node $node;
23 private Node $article;
24
25 public function __construct(EntityManager $entityManager)
26 {
27 $this->entityManager = $entityManager;
28 $this->node = new Node; // instance mère "vide" ne possédant rien d'autre que des enfants
29 }
30
31 // à déplacer dans Path ou un truc comme ça?
32 // couper Model en deux classes NodeModel et PageModel?
33 public function makeMenuAndPaths(): void // lit la table "page"
34 {
35 self::$menu = new Menu($this->entityManager);
36 self::$page_path = new Path();
37 $this->page = self::$page_path->getLast();
38 }
39
40 public function getNode(): Node
41 {
42 return $this->node;
43 }
44 public function getArticleNode(): Node
45 {
46 return $this->article;
47 }
48
49 // affichage d'une page ordinaire
50 public function getWholePageData(Request $request): void // lit la table "node" + jointures
51 {
52 $id = CURRENT_PAGE === 'article' ? htmlspecialchars($request->query->get('id')) : '';
53
54 if($id === ''){ // page "normale"
55 // récupérer tous les noeuds sauf les articles
56 $dql = "SELECT n FROM App\Entity\Node n WHERE n.name_node != 'new' AND n.name_node != 'post' AND (n.page = :page OR n.page IS null)";
57 $bulk_data = $this->entityManager
58 ->createQuery($dql)
59 ->setParameter('page', $this->page)
60 ->getResult();
61
62 foreach($bulk_data as $parent_block){
63 // groupes d'articles triés par bloc, permet de paginer par bloc
64 if(Presentation::hasPresentation($parent_block->getName())){ // = post_block ou news_block
65 $bulk_data = array_merge($bulk_data, $this->getNextArticles($parent_block, $request)[0]);
66 }
67
68 // emails
69 if($parent_block->getName() === 'show_emails'){ // show_emails = l'afficheur
70 $parent_block->getNodeData()->setEmails($this->getAllEmails());
71
72 // aller chercher les formulaires à la place (future MAJ?)
73 //$this->getFormsNodeData();
74 }
75 }
76 }
77 else{ // page "article"
78 $dql = 'SELECT n FROM App\Entity\Node n WHERE n.page = :page OR n.page IS null OR n.id_node = :id';
79 $bulk_data = $this->entityManager
80 ->createQuery($dql)
81 ->setParameter('page', $this->page)
82 ->setParameter('id', $id)
83 ->getResult();
84 }
85
86 $this->makeNodeTree($bulk_data);
87 }
88
89 // récupération d'articles
90 public function getNextArticles(Node $parent_block, Request $request): array
91 {
92 $qb = $this->entityManager->createQueryBuilder();
93 $qb->select('n')
94 ->from('App\Entity\Node', 'n')
95 ->where('n.parent = :parent')
96 ->setParameter('parent', $parent_block);
97
98 if($parent_block->getName() === 'post_block'){
99 $qb->orderBy('n.position');
100 }
101 elseif($parent_block->getName() === 'news_block'){
102 $qb->join('n.article', 'a');
103 if($parent_block->getNodeData()->getChronoOrder() ?? false){ // ordre antichrono par défaut
104 $qb->orderBy('a.date_time', 'ASC');
105 }
106 else{
107 $qb->orderBy('a.date_time', 'DESC');
108 }
109 }
110
111 // pagination
112 $limit = $parent_block->getNodeData()->getPaginationLimit(); // = 12 par défaut si = null en BDD
113 $this->paginateWithCursor($qb, $parent_block, $request->query->get('last_article'));
114 $result = $qb->getQuery()->getResult();
115
116 // il reste des articles à récupérer SI on vient d'en récupérer trop
117 // ET on gère le cas particulier de $limit <= 0
118 $truncated = false;
119 if(count($result) > $limit && $limit > 0){ // si nb résultat > limit > 0
120 $truncated = true;
121 array_pop($result); // compenser le $limit + 1 dans paginateWithCursor
122 }
123
124 return [$result, $truncated]; // besoin exceptionnel de retourner deux valeurs
125 }
126
127 private function paginateWithCursor(QueryBuilder $qb, Node $parent_block, ?string $last_article): void
128 {
129 //var_dump($last_article);
130 $limit = $parent_block->getNodeData()->getPaginationLimit(); // = 12 par défaut si = null en BDD
131
132 if($limit > 0){ // si 0 ou moins pas de pagination
133 // nombres de "pages" d'articles
134 $nb_pages = $this->getNumberOfPages($parent_block, $limit);
135 $parent_block->getNodeData()->setNumberOfPages($nb_pages > 1 ? $nb_pages : 1);
136
137 // adaptation de la requête
138 if($parent_block->getName() === 'post_block'){
139 $qb->andWhere('n.position > :last_position')
140 ->setParameter('last_position', empty($last_article) ? 0 : $last_article)
141 ->setMaxResults($limit + 1);
142 }
143 elseif($parent_block->getName() === 'news_block'){
144 $cursor_start = $parent_block->getNodeData()->getChronoOrder() ? '1970-01-01' : '9999-12-31';
145 $qb->andWhere($parent_block->getNodeData()->getChronoOrder() ? 'a.date_time > :date_time' : 'a.date_time < :date_time')
146 ->setParameter('date_time', empty($last_article) ? $cursor_start : $last_article)
147 ->setMaxResults($limit + 1);
148 }
149 }
150 }
151
152 // le Paginator de doctrine le fait aussi si on décidait de s'en servir
153 private function getNumberOfPages(Node $parent_block, int $limit): int
154 {
155 $dql = 'SELECT COUNT(n.id_node) FROM App\Entity\Node n WHERE n.parent = :parent';
156 $nb_articles = $this->entityManager
157 ->createQuery($dql)
158 ->setParameter('parent', $parent_block)
159 ->getSingleScalarResult();
160 return (int)ceil($nb_articles / $limit); // que PHP fasse une division non euclidienne (pas comme en C) nous arrange ici
161 }
162
163 private function makeNodeTree(array $bulk_data): void // $bulk_data = tableau de Node
164 {
165 // puis on les range
166 // (attention, risque de disfonctionnement si les noeuds de 1er niveau ne sont pas récupérés en 1er dans la BDD)
167 foreach($bulk_data as $node){
168 // premier niveau
169 if($node->getParent() == null){
170 $this->node->addChild($node);
171
172 // spécifique page article
173 if($node->getName() === 'main' && $this->page->getEndOfPath() == 'article'){
174 $main = $node;
175 }
176 }
177 // autres niveaux
178 else{
179 $node->getParent()->addChild($node);
180
181 // spécifique page article
182 if($this->page->getEndOfPath() == 'article'){
183 if($node->getName() === 'new'){
184 $new = $node;
185 }
186 }
187 }
188 }
189 if(isset($new)){
190 $main->setAdoptedChild($new);
191 }
192 }
193
194 // le basique
195 public function findNodeById(int $id): bool
196 {
197 $this->node = $this->entityManager->find('App\Entity\Node', $id);
198 return $this->node === null ? false : true;
199 }
200 public function findWhateverNode(string $field, string $value): bool
201 {
202 $queryBuilder = $this->entityManager->createQueryBuilder();
203 $queryBuilder
204 ->select('n')
205 ->from('App\Entity\Node', 'n')
206 ->where("n.$field = :value") // avec le querybuilder, ce truc sale reste sécurisé
207 ->setParameter('value', $value);
208 $result = $queryBuilder->getQuery()->getOneOrNullResult();
209
210 if($result === null){
211 return false;
212 }
213 else{
214 $this->node = $result;
215 return true;
216 }
217 }
218 public function getWhatever(string $class, string $field, string $value): array
219 {
220 // penser au entityManager "repository"
221 $queryBuilder = $this->entityManager->createQueryBuilder();
222 $queryBuilder
223 ->select('n')
224 ->from($class, 'n')
225 ->where("n.$field = :value")
226 ->setParameter('value', $value);
227 return $queryBuilder->getQuery()->getResult();
228 }
229
230 // récupération d'un article pour modification
231 public function makeArticleNode(string $id = '', bool $get_section = false): bool
232 {
233 if($get_section){
234 $dql = 'SELECT n, p FROM App\Entity\Node n LEFT JOIN n.parent p WHERE n.id_node = :id';
235 }
236 else{
237 $dql = 'SELECT n FROM App\Entity\Node n WHERE n.id_node = :id';
238 }
239 // n est l'article et p son $parent
240 $bulk_data = $this->entityManager
241 ->createQuery($dql)
242 ->setParameter('id', $id)
243 ->getResult();
244
245 if(count($bulk_data) === 0){
246 return false;
247 }
248
249 if($get_section){
250 $this->article = $bulk_data[0];
251 $this->findNodeById($bulk_data[0]->getParent()->getId());
252 $this->makeSectionNode();
253 }
254 else{
255 $this->article = $bulk_data[0];
256 }
257
258 return true;
259 }
260
261 // récupération des articles d'un bloc <section> à la création d'un article
262 public function makeSectionNode(): bool
263 {
264 $bulk_data = $this->entityManager
265 ->createQuery('SELECT n FROM App\Entity\Node n WHERE n.parent = :parent')
266 ->setParameter('parent', $this->node)
267 ->getResult();
268
269 foreach($bulk_data as $article){
270 $this->node->addChild($article); // pas de flush, on ne va pas écrire dans la BDD à chaque nouvelle page
271 }
272 return true;
273 }
274
275 public function findUniqueNodeByName(string $name): void // = unique en BDD, donc sans "page" associée
276 {
277 $bulk_data = $this->entityManager
278 ->createQuery('SELECT n FROM App\Entity\Node n WHERE n.name_node = :name')
279 ->setParameter('name', $name)
280 ->getResult();
281 $this->node = $bulk_data[0];
282 }
283
284 public function findItsChildren(): void
285 {
286 $bulk_data = $this->entityManager
287 ->createQuery('SELECT n FROM App\Entity\Node n WHERE n.parent = :parent AND n.page = :page')
288 ->setParameter('parent', $this->node)
289 ->setParameter('page', $this->page)
290 ->getResult();
291 foreach($bulk_data as $child){
292 $this->node->addChild($child);
293 }
294 }
295
296 private function getAllEmails(): array
297 {
298 $dql = 'SELECT e FROM App\Entity\Email e';
299 return $this->entityManager
300 ->createQuery($dql)
301 ->getResult();
302 }
303 /*private function getFormsNodeData(): array
304 {
305 $dql = 'SELECT fd FROM App\Entity\NodeData fd WHERE node.name_node = form';
306 return $this->entityManager
307 ->createQuery($dql)
308 //->setParameter('page', $this->page)
309 ->getResult();
310 }*/
311 //private function getEmailsBySender(string $sender): array
312}