From f4df3e9b9df3d54ce58796f923da70ff7e566018 Mon Sep 17 00:00:00 2001 From: polo Date: Tue, 26 Aug 2025 01:15:33 +0200 Subject: =?UTF-8?q?s=C3=A9paration=20bloc=20/=20mise=20en=20page,=20bloc?= =?UTF-8?q?=20sp=C3=A9cial=20pour=20les=20actus,=20renommage=20de=20classe?= =?UTF-8?q?s,=20fichiers,=20etc?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/controller/ArticleController.php | 2 +- src/controller/PageManagementController.php | 18 +++++-- src/installation.php | 9 ++++ src/model/Blocks.php | 38 ++++++++++++++ src/model/entities/Article.php | 2 + src/model/entities/NodeData.php | 12 +++++ src/model/entities/Presentation.php | 31 ++++++++++++ src/view/ArticleBuilder.php | 62 ----------------------- src/view/BlogBuilder.php | 70 -------------------------- src/view/GaleryBuilder.php | 2 +- src/view/GridBuilder.php | 76 ---------------------------- src/view/MainBuilder.php | 34 ++----------- src/view/NewBuilder.php | 11 ++--- src/view/NewsBlockBuilder.php | 76 ++++++++++++++++++++++++++++ src/view/PostBlockBuilder.php | 77 +++++++++++++++++++++++++++++ src/view/PostBuilder.php | 62 +++++++++++++++++++++++ src/view/templates/article.php | 14 ------ src/view/templates/blog.php | 11 ----- src/view/templates/grid.php | 11 ----- src/view/templates/news_block.php | 11 +++++ src/view/templates/post.php | 14 ++++++ src/view/templates/post_block.php | 11 +++++ 22 files changed, 367 insertions(+), 287 deletions(-) create mode 100644 src/model/Blocks.php create mode 100644 src/model/entities/Presentation.php delete mode 100644 src/view/ArticleBuilder.php delete mode 100644 src/view/BlogBuilder.php delete mode 100644 src/view/GridBuilder.php create mode 100644 src/view/NewsBlockBuilder.php create mode 100644 src/view/PostBlockBuilder.php create mode 100644 src/view/PostBuilder.php delete mode 100644 src/view/templates/article.php delete mode 100644 src/view/templates/blog.php delete mode 100644 src/view/templates/grid.php create mode 100644 src/view/templates/news_block.php create mode 100644 src/view/templates/post.php create mode 100644 src/view/templates/post_block.php (limited to 'src') diff --git a/src/controller/ArticleController.php b/src/controller/ArticleController.php index 3b39335..078754a 100644 --- a/src/controller/ArticleController.php +++ b/src/controller/ArticleController.php @@ -49,7 +49,7 @@ class ArticleController $date->setTimestamp($timestamp); $article = new Article($content, $date); // le "current" timestamp est obtenu par la BDD - $article_node = new Node('article', 'i' . (string)$timestamp, [], count($node->getChildren()) + 1, $node, $node->getPage(), $article); + $article_node = new Node('post', 'i' . (string)$timestamp, [], count($node->getChildren()) + 1, $node, $node->getPage(), $article); } $entityManager->persist($article_node); diff --git a/src/controller/PageManagementController.php b/src/controller/PageManagementController.php index f84c528..50ce193 100644 --- a/src/controller/PageManagementController.php +++ b/src/controller/PageManagementController.php @@ -6,6 +6,7 @@ declare(strict_types=1); use App\Entity\Page; use App\Entity\Node; use App\Entity\NodeData; +use App\Entity\Presentation; //use App\Entity\Image; use Doctrine\Common\Collections\ArrayCollection; use Doctrine\ORM\EntityManager; @@ -136,8 +137,7 @@ class PageManagementController $main = $director->getNode(); $position = count($main->getChildren()) + 1; // position dans la fraterie - $blocks = ['blog', 'grid', 'calendar', 'galery', 'form']; // même liste dans FormBuilder.php - if(!in_array($_POST["bloc_select"], $blocks, true)) // 3è param: contrôle du type + if(!in_array($_POST["bloc_select"], Blocks::getNameList(), true)) // 3è param: contrôle du type { header("Location: " . new URL(['page' => $_GET['page'], 'error' => 'bad_bloc_type'])); die; @@ -163,7 +163,7 @@ class PageManagementController $entityManager->persist($bulk_data[0]); } - $bloc = new Node( + $block = new Node( $_POST["bloc_select"], null, [], $position, @@ -171,9 +171,17 @@ class PageManagementController $page); $data = new NodeData( ['title' => trim(htmlspecialchars($_POST["bloc_title"]))], - $bloc); + $block); - $entityManager->persist($bloc); + // valeurs par défaut + if($_POST["bloc_select"] === 'post_block'){ + $data->setPresentation($entityManager->find('App\Entity\Presentation', 1)); // pas génial l'utilisation de l'index dans la table + } + elseif($_POST["bloc_select"] === 'news_block'){ + $data->setPresentation($entityManager->find('App\Entity\Presentation', 2)); + } + + $entityManager->persist($block); $entityManager->persist($data); $entityManager->flush(); header("Location: " . new URL(['page' => $_GET['page'], 'action' => 'modif_page'])); diff --git a/src/installation.php b/src/installation.php index 5adb697..dd3aa35 100644 --- a/src/installation.php +++ b/src/installation.php @@ -7,6 +7,7 @@ use App\Entity\Page; use App\Entity\Node; use App\Entity\NodeData; use App\Entity\Image; +use App\Entity\Presentation; use Doctrine\Common\Collections\ArrayCollection; use Doctrine\ORM\EntityManager; @@ -116,6 +117,10 @@ function makeStartPage(EntityManager $entityManager){ $head_new_page = new Node('head', NULL, ['css_array' => ['body', 'head', 'nav', 'new_page', 'foot'], 'js_array' => ['main', 'new_page']], 1, NULL, $new_page, NULL); $bloc_new_page = new Node('new_page', NULL, [], 1, $main, $new_page, NULL); + /* -- table presentation -- */ + $list = new Presentation('list'); + $grid = new Presentation('grid'); + /* -- table image -- */ // paramètres: file_name, file_path, file_path_mini, mime_type, alt $favicon = new Image("favicon48x48.png", NULL, "assets/favicon48x48.png", "image/png", "favicon"); @@ -162,6 +167,10 @@ function makeStartPage(EntityManager $entityManager){ $entityManager->persist($bloc_edit_menu); $entityManager->persist($head_new_page); $entityManager->persist($bloc_new_page); + + /* -- table presentation -- */ + $entityManager->persist($list); + $entityManager->persist($grid); /* -- table image -- */ $entityManager->persist($favicon); diff --git a/src/model/Blocks.php b/src/model/Blocks.php new file mode 100644 index 0000000..f6475cd --- /dev/null +++ b/src/model/Blocks.php @@ -0,0 +1,38 @@ + self::$types[$i], 'name' => self::$names[$i]]; + } + return $blocks; + } + + static public function getNameFromType(string $type): string + { + for($i=0; $i < count(self::$types); $i++){ + if(self::$types[$i] === $type){ + return self::$names[$i]; + } + } + return 'server side error'; + } +} \ No newline at end of file diff --git a/src/model/entities/Article.php b/src/model/entities/Article.php index 14028ec..5412497 100644 --- a/src/model/entities/Article.php +++ b/src/model/entities/Article.php @@ -1,5 +1,7 @@ id_node_data; } + public function getPresentation(): Presentation + { + return $this->presentation; + } + public function setPresentation(Presentation $presentation): void + { + $this->presentation = $presentation; + } public function getData(): array { return $this->data; diff --git a/src/model/entities/Presentation.php b/src/model/entities/Presentation.php new file mode 100644 index 0000000..73b6a6a --- /dev/null +++ b/src/model/entities/Presentation.php @@ -0,0 +1,31 @@ +name_presentation = $name; + } + + public function getName(): string + { + return $this->name_presentation; + } +} \ No newline at end of file diff --git a/src/view/ArticleBuilder.php b/src/view/ArticleBuilder.php deleted file mode 100644 index 3b9de87..0000000 --- a/src/view/ArticleBuilder.php +++ /dev/null @@ -1,62 +0,0 @@ -getName() . '.php'; - - if(file_exists($viewFile)) - { - // id (timestamp) - if(!empty($node->getAttributes())) - { - extract($node->getAttributes()); - } - - // html - $title = $node->getArticle()->getTitle(); - $html = $node->getArticle()->getContent(); - $id = $node->getArticleTimestamp(); - - // partage - $share_link = new URL(['page' => CURRENT_PAGE], $id); - $share_js = 'onclick="copyInClipBoard(\'' . $share_link . '\')"'; - $share_button = '

' . "\n"; - - // modifier un article - $admin_buttons = ''; - if($_SESSION['admin']) - { - $modify_js = 'onclick="openEditor(\'' . $id . '\')"'; - $modify_article = '

' . "\n"; - - $up_js = 'onclick="switchPositions(\'' . $id . '\', \'up\')"'; - $up_button = '

' . "\n"; - - $down_js = 'onclick="switchPositions(\'' . $id . '\', \'down\')"'; - $down_button = '

' . "\n"; - - $delete_js = 'onclick="deleteArticle(\'' . $id . '\')"'; - $delete_article = '

' . "\n"; - - $close_js = 'onclick="closeEditor(\'' . $id . '\')"'; - $close_editor = ''; - - $submit_js = 'onclick="submitArticle(\'' . $id . '\')"'; - $submit_article = ''; - - $admin_buttons = $modify_article . $up_button . $down_button . $delete_article . $close_editor . $submit_article; - } - - ob_start(); - require($viewFile); - $this->html .= ob_get_clean(); - } - } -} diff --git a/src/view/BlogBuilder.php b/src/view/BlogBuilder.php deleted file mode 100644 index d646d5f..0000000 --- a/src/view/BlogBuilder.php +++ /dev/null @@ -1,70 +0,0 @@ -getName() . '.php'; - - if(file_exists($viewFile)) - { - if(!empty($node->getNodeData()->getData())) - { - extract($node->getNodeData()->getData()); - } - - // ajouter un article - $new_article = ''; - if($_SESSION['admin']) - { - $id = 'n' . $this->id_node; - $js = 'onclick="openEditor(\'' . $id . '\')"'; - - $share_button = ''; - $html = ''; - - $new_button = '

' . "\n" . - '

'; - - $modify_js = 'onclick="openEditor(\'' . $id . '\')"'; - $modify_article = '' . "\n"; - - $up_js = 'onclick="switchPositions(\'' . $id . '\', \'up\')"'; - $up_button = '' . "\n"; - - $down_js = 'onclick="switchPositions(\'' . $id . '\', \'down\')"'; - $down_button = '' . "\n"; - - $delete_js = 'onclick="deleteArticle(\'' . $id . '\')"'; - $delete_article = '' . "\n"; - - $close_js = 'onclick="closeEditor(\'' . $id . '\')"'; - $close_editor = ''; - - $submit_js = 'onclick="submitArticle(\'' . $id . '\', \'\', clone' . $this->id_node . ')"'; - $submit_article = ''; - - $admin_buttons = $new_button . $modify_article . $up_button . $down_button . $delete_article . $close_editor . $submit_article; - - // squelette d'un nouvel article - ob_start(); - require self::VIEWS_PATH . 'article.php'; - $new_article = ob_get_clean(); - } - - // articles existants - $this->useChildrenBuilder($node); - $content = $this->html; - - ob_start(); - require $viewFile; - $this->html = ob_get_clean(); // pas de concaténation ici, on écrase - } - } -} \ No newline at end of file diff --git a/src/view/GaleryBuilder.php b/src/view/GaleryBuilder.php index f2dafc2..749cb30 100644 --- a/src/view/GaleryBuilder.php +++ b/src/view/GaleryBuilder.php @@ -54,7 +54,7 @@ class GaleryBuilder extends AbstractBuilder // squelette d'un nouvel article ob_start(); - require self::VIEWS_PATH . 'article.php'; + require self::VIEWS_PATH . 'post.php'; $new_article = ob_get_clean(); } diff --git a/src/view/GridBuilder.php b/src/view/GridBuilder.php deleted file mode 100644 index 30a9040..0000000 --- a/src/view/GridBuilder.php +++ /dev/null @@ -1,76 +0,0 @@ -getName() . '.php'; - - if(file_exists($viewFile)) - { - if(!empty($node->getNodeData()->getData())) - { - extract($node->getNodeData()->getData()); - } - - // ajouter un article - $new_article = ''; - if($_SESSION['admin']) - { - $id = 'n' . $this->id_node; - $js = 'onclick="openEditor(\'' . $id . '\')"'; - - $share_button = ''; - $html = ''; - - if(Director::$page_path->getLast()->getEndOfPath() === 'accueil'){ - $new_button = '

-

'; - } - else{ - $new_button = '

' . "\n" . - '

'; - } - - $modify_js = 'onclick="openEditor(\'' . $id . '\')"'; - $modify_article = '' . "\n"; - - $up_js = 'onclick="switchPositions(\'' . $id . '\', \'up\')"'; - $up_button = '' . "\n"; - - $down_js = 'onclick="switchPositions(\'' . $id . '\', \'down\')"'; - $down_button = '' . "\n"; - - $delete_js = 'onclick="deleteArticle(\'' . $id . '\')"'; - $delete_article = '' . "\n"; - - $close_js = 'onclick="closeEditor(\'' . $id . '\')"'; - $close_editor = ''; - - $submit_js = 'onclick="submitArticle(\'' . $id . '\', \'\', clone' . $this->id_node . ')"'; - $submit_article = ''; - - $admin_buttons = $new_button . $modify_article . $up_button . $down_button . $delete_article . $close_editor . $submit_article; - - // squelette d'un nouvel article - ob_start(); - require self::VIEWS_PATH . 'article.php'; - $new_article = ob_get_clean(); - } - - // articles existants - $this->useChildrenBuilder($node); - $content = $this->html; - - ob_start(); - require $viewFile; // utilise $content - $this->html = ob_get_clean(); // nouveau contenu - } - } -} \ No newline at end of file diff --git a/src/view/MainBuilder.php b/src/view/MainBuilder.php index 889df37..d7a0dfa 100644 --- a/src/view/MainBuilder.php +++ b/src/view/MainBuilder.php @@ -36,13 +36,13 @@ class MainBuilder extends AbstractBuilder $this->html .= $builder->render(); } else{ - // si action = "modif_page", affiche des commandes pour modifier + // si action = "modif_page", affiche des commandes supplémentaires if($_SESSION['admin'] && self::$modif_mode){ // ajouter un contrôle du champ in_menu $this->viewEditBlocks($node); } - // cas normal + // dans tous les cas $this->useChildrenBuilder($node); } @@ -53,42 +53,18 @@ class MainBuilder extends AbstractBuilder private function viewEditBlocks($node): void { $viewFile = self::VIEWS_PATH . $node->getName() . '.php'; // mode modification uniquement - - // blocs disponibles, même liste dans post.php - $blocks = [ // créer une classe pour ça? - ['type' => 'blog', 'name' => 'Blog'], - ['type' => 'grid', 'name' => 'Grille'], - ['type' => 'calendar', 'name' => 'Calendrier'], - ['type' => 'galery', 'name' => 'Galerie'], - ['type' => 'form', 'name' => 'Formulaire']]; - - function getBlockName(array $blocks, string $type){ // créer une classe pour ça? - for($i=0; $i < count($blocks); $i++){ - if($blocks[$i]['type'] === $type){ - return $blocks[$i]['name']; - } - } - } + $blocks = Blocks::getTypeNamePairs(); $options = ''; for($i = 0; $i < count($blocks); $i++){ $options .= '\n"; } - // blabla - /*$this->html .= '' . "\n";*/ - //$page_id = Director::$page_path->getLast()->getId(); $head_node = null; foreach(ViewController::$root_node->getChildren() as $first_level_node){ if($first_level_node->getName() === 'head'){ - $head_node = $first_level_node; // normallement c'est le 1er enfant + $head_node = $first_level_node; // normalement c'est le 1er enfant break; } } @@ -97,7 +73,7 @@ class MainBuilder extends AbstractBuilder foreach($node->getChildren() as $child_node){ // renommage d'un bloc $bloc_edit .= '
-

+

'. "\n"; // déplacement d'un bloc diff --git a/src/view/NewBuilder.php b/src/view/NewBuilder.php index c410eb7..fc6ade6 100644 --- a/src/view/NewBuilder.php +++ b/src/view/NewBuilder.php @@ -35,21 +35,18 @@ class NewBuilder extends AbstractBuilder $content = ''; // page article unique - if(Director::$page_path->getLast()->getEndOfPath() === 'article') - { + if(Director::$page_path->getLast()->getEndOfPath() === 'article'){ $content = $node->getArticle()->getContent(); - $from_to_button = '

'; + $from_to_button = '

'; } // page d'accueil (avec des news) - else - { - $from_to_button = '

'; + else{ + $from_to_button = '

'; } $date_object = $node->getArticle()->getDateTime(); // class DateTime $date = 'le ' . str_replace(':', 'h', $date_object->format('d-m-Y à H:i')); - //$date = str_replace(':', 'h', $date_object->format('d-m-Y à H:i')); // partage $share_link = new URL(['page' => 'article', 'id' => $id]); diff --git a/src/view/NewsBlockBuilder.php b/src/view/NewsBlockBuilder.php new file mode 100644 index 0000000..eebeadb --- /dev/null +++ b/src/view/NewsBlockBuilder.php @@ -0,0 +1,76 @@ +getName() . '.php'; // = news_block.php, actuellement identique à post_block.php + + if(file_exists($viewFile)) + { + if(!empty($node->getNodeData()->getData())) + { + extract($node->getNodeData()->getData()); + } + + $presentation = $node->getNodeData()->getPresentation()->getName(); // affichage list ou grid + + // exécution de la stratégie (utilisation d'une méthode ou d'une classe) + $section_class = $presentation; + $section_child_class = $presentation === 'grid' ? 'grid_columns' : ''; + + // ajouter un article + $new_article = ''; + if($_SESSION['admin']) + { + $id = 'n' . $this->id_node; + + $share_button = ''; + + $new_button = '

'; + + $modify_js = 'onclick="openEditor(\'' . $id . '\')"'; + $modify_article = '' . "\n"; + + $up_js = 'onclick="switchPositions(\'' . $id . '\', \'up\')"'; + $up_button = '' . "\n"; + + $down_js = 'onclick="switchPositions(\'' . $id . '\', \'down\')"'; + $down_button = '' . "\n"; + + $delete_js = 'onclick="deleteArticle(\'' . $id . '\')"'; + $delete_article = '' . "\n"; + + $close_js = 'onclick="closeEditor(\'' . $id . '\')"'; + $close_editor = ''; + + $submit_js = 'onclick="submitArticle(\'' . $id . '\', \'\', clone' . $this->id_node . ')"'; + $submit_article = ''; + + $html = ''; + $admin_buttons = $new_button . $modify_article . $up_button . $down_button . $delete_article . $close_editor . $submit_article; + + // post vide mis là pour le bouton "Nouvel article" => déplace vers page "article" + ob_start(); + require self::VIEWS_PATH . 'post.php'; // nécéssite $admin_buttons et $html + $new_article = ob_get_clean(); + } + + // articles existants + $this->useChildrenBuilder($node); + $content = $this->html; + + ob_start(); + require $viewFile; // utilise $content + $this->html = ob_get_clean(); // nouveau contenu + } + } +} \ No newline at end of file diff --git a/src/view/PostBlockBuilder.php b/src/view/PostBlockBuilder.php new file mode 100644 index 0000000..fadae31 --- /dev/null +++ b/src/view/PostBlockBuilder.php @@ -0,0 +1,77 @@ +getName() . '.php'; + $viewFile = self::VIEWS_PATH . 'post_block.php'; // actuellement identique à news_block.php + + if(file_exists($viewFile)) + { + if(!empty($node->getNodeData()->getData())) + { + extract($node->getNodeData()->getData()); + } + + $presentation = $node->getNodeData()->getPresentation()->getName(); // affichage list ou grid + + // exécution de la stratégie (utilisation d'une méthode ou d'une classe) + $section_class = $presentation; + $section_child_class = $presentation === 'grid' ? 'grid_columns' : ''; + + // ajouter un article + $new_article = ''; + if($_SESSION['admin']) + { + $id = 'n' . $this->id_node; + + $share_button = ''; + + $new_button = '

' . "\n" . '

'; + + $modify_js = 'onclick="openEditor(\'' . $id . '\')"'; + $modify_article = '' . "\n"; + + $up_js = 'onclick="switchPositions(\'' . $id . '\', \'up\')"'; + $up_button = '' . "\n"; + + $down_js = 'onclick="switchPositions(\'' . $id . '\', \'down\')"'; + $down_button = '' . "\n"; + + $delete_js = 'onclick="deleteArticle(\'' . $id . '\')"'; + $delete_article = '' . "\n"; + + $close_js = 'onclick="closeEditor(\'' . $id . '\')"'; + $close_editor = ''; + + $submit_js = 'onclick="submitArticle(\'' . $id . '\', \'\', clone' . $this->id_node . ')"'; + $submit_article = ''; + + $html = ''; + $admin_buttons = $new_button . $modify_article . $up_button . $down_button . $delete_article . $close_editor . $submit_article; + + // squelette d'un nouvel article + ob_start(); + require self::VIEWS_PATH . 'post.php'; + $new_article = ob_get_clean(); + } + + // articles existants + $this->useChildrenBuilder($node); + $content = $this->html; + + ob_start(); + require $viewFile; + $this->html = ob_get_clean(); // pas de concaténation ici, on écrase + } + } +} \ No newline at end of file diff --git a/src/view/PostBuilder.php b/src/view/PostBuilder.php new file mode 100644 index 0000000..03a6990 --- /dev/null +++ b/src/view/PostBuilder.php @@ -0,0 +1,62 @@ +getName() . '.php'; + + if(file_exists($viewFile)) + { + // id (timestamp) + if(!empty($node->getAttributes())) + { + extract($node->getAttributes()); + } + + // html + $title = $node->getArticle()->getTitle(); + $html = $node->getArticle()->getContent(); + $id = $node->getArticleTimestamp(); + + // partage + $share_link = new URL(['page' => CURRENT_PAGE], $id); + $share_js = 'onclick="copyInClipBoard(\'' . $share_link . '\')"'; + $share_button = '' . "\n"; + + // modifier un article + $admin_buttons = ''; + if($_SESSION['admin']) + { + $modify_js = 'onclick="openEditor(\'' . $id . '\')"'; + $modify_article = '

' . "\n"; + + $up_js = 'onclick="switchPositions(\'' . $id . '\', \'up\')"'; + $up_button = '

' . "\n"; + + $down_js = 'onclick="switchPositions(\'' . $id . '\', \'down\')"'; + $down_button = '

' . "\n"; + + $delete_js = 'onclick="deleteArticle(\'' . $id . '\')"'; + $delete_article = '

' . "\n"; + + $close_js = 'onclick="closeEditor(\'' . $id . '\')"'; + $close_editor = ''; + + $submit_js = 'onclick="submitArticle(\'' . $id . '\')"'; + $submit_article = ''; + + $admin_buttons = $modify_article . $up_button . $down_button . $delete_article . $close_editor . $submit_article; + } + + ob_start(); + require($viewFile); + $this->html .= ob_get_clean(); + } + } +} diff --git a/src/view/templates/article.php b/src/view/templates/article.php deleted file mode 100644 index 5cf35c2..0000000 --- a/src/view/templates/article.php +++ /dev/null @@ -1,14 +0,0 @@ - -
-
-
- -
-
- -
-
- -
-
-
\ No newline at end of file diff --git a/src/view/templates/blog.php b/src/view/templates/blog.php deleted file mode 100644 index dfb65b5..0000000 --- a/src/view/templates/blog.php +++ /dev/null @@ -1,11 +0,0 @@ - -
-

- - -
- -
-
\ No newline at end of file diff --git a/src/view/templates/grid.php b/src/view/templates/grid.php deleted file mode 100644 index 71c052b..0000000 --- a/src/view/templates/grid.php +++ /dev/null @@ -1,11 +0,0 @@ - -
-

- - -
- -
-
\ No newline at end of file diff --git a/src/view/templates/news_block.php b/src/view/templates/news_block.php new file mode 100644 index 0000000..d88d780 --- /dev/null +++ b/src/view/templates/news_block.php @@ -0,0 +1,11 @@ + +
+

+ + +
+ +
+
\ No newline at end of file diff --git a/src/view/templates/post.php b/src/view/templates/post.php new file mode 100644 index 0000000..5cf35c2 --- /dev/null +++ b/src/view/templates/post.php @@ -0,0 +1,14 @@ + +
+
+
+ +
+
+ +
+
+ +
+
+
\ No newline at end of file diff --git a/src/view/templates/post_block.php b/src/view/templates/post_block.php new file mode 100644 index 0000000..d88d780 --- /dev/null +++ b/src/view/templates/post_block.php @@ -0,0 +1,11 @@ + +
+

+ + +
+ +
+
\ No newline at end of file -- cgit v1.2.3