From f27cca08ff786ceff1870147f6d6bad14d71117f Mon Sep 17 00:00:00 2001 From: polo Date: Fri, 23 Oct 2026 00:47:32 +0200 Subject: =?UTF-8?q?dossiers=20avec=20majuscule,=20namespace=20pour=20toute?= =?UTF-8?q?s=20les=20classes,=20autoload=20psr-4,=20UserDataService::creat?= =?UTF-8?q?eZip=20d=C3=A9plac=C3=A9=20dans=20Backup?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/Controller/ArticleController.php | 244 +++++++++++++++++++++++++++++++++++ 1 file changed, 244 insertions(+) create mode 100644 src/Controller/ArticleController.php (limited to 'src/Controller/ArticleController.php') diff --git a/src/Controller/ArticleController.php b/src/Controller/ArticleController.php new file mode 100644 index 0000000..075e3b4 --- /dev/null +++ b/src/Controller/ArticleController.php @@ -0,0 +1,244 @@ +query->has('id') && !empty($request->query->get('id')) && $request->query->has('last_article')){ + $id = (int)$request->get('id'); // type et nettoie + $model = new Model($entityManager); + $model->findNodeById($id); + $parent_block = $model->getNode(); + + if(Presentation::hasPresentation($parent_block->getName())){ + $get_articles_return = $model->getNextArticles($parent_block, $request); + $bulk_data = $get_articles_return[0]; + + if($parent_block->getName() === 'post_block'){ + $builder_name = 'App\View\PostBuilder'; + } + elseif($parent_block->getName() === 'news_block'){ + $builder_name = 'App\View\NewBuilder'; + } + else{ + return new JsonResponse(['success' => false, 'error' => 'server side error'], JsonResponse::HTTP_INTERNAL_SERVER_ERROR); + } + + $html = ''; + foreach($bulk_data as $article){ + $builder = new $builder_name($article); + $html .= $builder->render(); + } + + return new JsonResponse(['success' => true, 'html' => $html, 'truncated' => $get_articles_return[1]]); + } + else{ + return new JsonResponse(['success' => false, 'error' => 'server side error'], JsonResponse::HTTP_INTERNAL_SERVER_ERROR); + } + } + else{ + return new JsonResponse(['success' => false, 'error' => 'bad parameters'], JsonResponse::HTTP_BAD_REQUEST); + } + } + + static public function editorSubmit(EntityManager $entityManager, array $json): JsonResponse + { + if(json_last_error() === JSON_ERROR_NONE){ + $id = $json['id']; + if(in_array($id[0], ['t', 'p', 'i', 'd'])){ + $id = substr($id, 1); + } + + $model = new Model($entityManager); + $content = $json['content']; + + // nettoyage + if(is_array($content)){ // cas d'une nouvelle "news" + foreach($content as $one_input){ + $one_input = Security::secureHTML($one_input); + } + } + else{ // autres cas + $content = Security::secureHTML($json['content']); + } + + // nouvel article + if($json['id'][0] === 'n'){ // ici $id est un bloc + $section_id = (int)substr($id, 1); // id du bloc
+ if(!$model->findNodeById($section_id)){ // erreur mauvais id + return new JsonResponse(['success' => false, 'error' => 'article_not_saved, bad id']); + } + $model->makeSectionNode(); + $section = $model->getNode(); + + // ajout d'une news + if(is_array($content)){ + if($section->getPage()->getEndOfPath() !== $json['from']){ // erreur mauvais from + return new JsonResponse(['success' => false, 'error' => 'article_not_saved, bad from']); + } + + $date = new \DateTime($content['d'] . ':' . (new \DateTime)->format('s')); // l'input type="datetime-local" ne donne pas les secondes, on les ajoute: 'hh:mm' . ':ss' + $article = new Article($content['i'], $date, $content['t'], $content['p']); + $article_node = new Node('new', count($section->getChildren()) + 1, $section, $section->getPage(), $article); + } + // ajout d'un post + else{ + $timestamp = time(); + $date = new \DateTime; + $date->setTimestamp($timestamp); + + $article = new Article($content, $date); + $placement = $json['placement'] === 'first' ? 0 : count($section->getChildren()) + 1; // + $article_node = new Node('post', $placement, $section, $section->getPage(), $article); + + if($json['placement'] === 'first'){ + $section->addChild($article_node); + $section->sortChildren(true); // mettre $article_node au début du tableau puis régénérer les positions (0 devient 1, 1 devient 2...) + } + } + + $entityManager->persist($article_node); + $entityManager->flush(); + + return new JsonResponse(['success' => true, 'article_id' => $article_node->getId()]); + } + // modification article + //else{} + + if($model->makeArticleNode($id)){ // une entrée est trouvée + $node = $model->getArticleNode(); + switch($json['id'][0]){ + case 'i': + $node->getArticle()->setContent($content); + break; + case 'p': + $node->getArticle()->setPreview($content); // html de l'éditeur + break; + case 't': + $node->getArticle()->setTitle($content); // html de l'éditeur + break; + case 'd': + return new JsonResponse(['success' => false, 'message' => 'l\'action editor_submit ne supporte pas les dates, utiliser date_submit.']); + default: // modif article simple (id sans lettre devant) + $node->getArticle()->setContent($content); + } + $entityManager->flush(); + return new JsonResponse(['success' => true]); + } + else{ + return new JsonResponse(['success' => false, 'message' => 'article non identifié']); + } + } + else{ + return new JsonResponse(['success' => false, 'message' => 'Erreur de décodage JSON']); + } + } + + static public function deleteArticle(EntityManager $entityManager, Request $request): Response + { + $model = new Model($entityManager); + + if($request->headers->get('Content-Type') === 'application/json'){ + $id = json_decode($request->getContent(), true)['id']; + } + elseif($request->headers->get('Content-Type') === 'application/x-www-form-urlencoded'){ + $id = $request->query->get('id'); + } + // ni JSON ni form, c'est quoi? un POST vide? + else{ + return new Response('la méthode deleteArticle ne peut être appelée de cette manière'); + } + + if(!$model->makeArticleNode($id, true)){ + $params = ['false', "Erreur 500 pas d\'article à supprimer"]; + } + else{ + $article = $model->getArticleNode(); + $section = $model->getNode(); + + $entityManager->remove($article); + $section->removeChild($article); + $section->sortChildren(true); // régénère les positions + + try{ + $entityManager->flush(); + $params = ['true', 'Article supprimé avec succès']; + } + catch(\Exception $e){ + $params = ['false', 'Erreur 500 ' . $e->getMessage()]; + } + } + + if($request->headers->get('Content-Type') === 'application/json'){ + return new JsonResponse( + ['success' => $params[0], 'message' => $params[1]], + $params[0] ? JsonResponse::HTTP_OK : JsonResponse::HTTP_INTERNAL_SERVER_ERROR + ); + } + elseif($request->headers->get('Content-Type') === 'application/x-www-form-urlencoded'){ + $url = new URL(['page' => $request->query->get('from') ?? '', 'success' => $params[0], 'message' => $params[1]]); + return new RedirectResponse((string)$url); + } + else{ + // cas inaccesible + throw new \Exception('la méthode deleteArticle ne peut être appelée de cette manière'); + } + } + + static public function switchPositions(EntityManager $entityManager, array $json): JsonResponse + { + $model = new Model($entityManager); + $model->makeArticleNode($json['id1'], true); + $article1 = $model->getArticleNode(); + $section = $model->getNode(); + + $section->sortChildren(true); // régénère les positions avant inversion + $article2 = null; + foreach($section->getChildren() as $child){ + if((string)$child->getId() === $json['id2']) // type string + { + $article2 = $child; + break; + } + } + + // inversion + $tmp = $article1->getPosition(); + $article1->setPosition($article2->getPosition()); + $article2->setPosition($tmp); + $entityManager->flush(); + + return new JsonResponse(['success' => true]); + } + + static public function dateSubmit(EntityManager $entityManager, array $json): JsonResponse + { + $id = substr($json['id'], 1); + $date = new \DateTime($json['date']); + + $model = new Model($entityManager); + $model->makeArticleNode($id); + $node = $model->getArticleNode(); + $node->getArticle()->setDateTime($date); + $entityManager->flush(); + + return new JsonResponse(['success' => true]); + } +} \ No newline at end of file -- cgit v1.2.3