From 28698982ff6dc67a331788c2637bce8689121769 Mon Sep 17 00:00:00 2001 From: polo-pc-greta Date: Thu, 8 May 2025 12:32:34 +0200 Subject: =?UTF-8?q?modif=20page,=20cr=C3=A9ation=20d'un=20bloc?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- public/css/main.css | 52 +++++++++++++++++++++++++++++++++++++++++- public/css/menu.css | 6 +---- public/index.php | 6 +++++ src/controller/Director.php | 26 ++++++++++++++++++--- src/controller/Security.php | 4 +++- src/controller/post.php | 47 ++++++++++++++++++++++++++++++++------ src/model/Menu.php | 2 +- src/model/Path.php | 5 +++- src/view/AbstractBuilder.php | 2 ++ src/view/ArticleBuilder.php | 2 ++ src/view/BlogBuilder.php | 2 ++ src/view/BreadcrumbBuilder.php | 2 ++ src/view/FooterBuilder.php | 2 ++ src/view/GaleryBuilder.php | 2 ++ src/view/GridBuilder.php | 2 ++ src/view/HeadBuilder.php | 2 ++ src/view/HeaderBuilder.php | 2 ++ src/view/LoginBuilder.php | 2 ++ src/view/MainBuilder.php | 49 +++++++++++++++++++++++++++++++++++++++ src/view/MenuBuilder.php | 4 +++- src/view/NewBuilder.php | 2 ++ src/view/password.php | 2 ++ src/view/templates/article.php | 1 + src/view/templates/blog.php | 1 + src/view/templates/footer.php | 1 + src/view/templates/galery.php | 1 + src/view/templates/grid.php | 1 + src/view/templates/head.php | 1 + src/view/templates/header.php | 1 + src/view/templates/menu.php | 1 + src/view/templates/new.php | 1 + 31 files changed, 214 insertions(+), 20 deletions(-) diff --git a/public/css/main.css b/public/css/main.css index c5289f0..93a7bcf 100644 --- a/public/css/main.css +++ b/public/css/main.css @@ -57,7 +57,7 @@ article .logo2 } article img { - max-width: 100%; + width: 100%; height: auto; } @@ -131,4 +131,54 @@ main button:hover article a:hover { cursor: pointer; +} + + + +/* -- mode modification d'une page -- */ +/*.modif_page_explanations +{ + background-color: white; + padding: 10px; + margin: 10px 20px; +} +.modif_page_explanations div +{ + display: flex; + flex-wrap: wrap; + font-size: smaller; +}*/ +.new_bloc +{ + background-color: white; + padding: 10px; + margin: 10px 20px; + +} +.new_bloc p +{ + margin: 5px; +} +.new_bloc #bloc_title +{ + width: 100%; + max-width: 300px; +} +.new_bloc form select, .new_bloc form input[type=submit] +{ + color: #ff1d04; + font-size: medium; + border-radius: 4px; + background-color: white; + border: lightgrey 2px outset; +} +select:hover +{ + cursor: pointer; +} +.new_bloc form input[type=submit]:hover +{ + background-color: #ffff00; + border-radius: 4px; + cursor: pointer; } \ No newline at end of file diff --git a/public/css/menu.css b/public/css/menu.css index 3294c2b..61e8a01 100644 --- a/public/css/menu.css +++ b/public/css/menu.css @@ -37,19 +37,15 @@ { display: flex; flex-wrap: wrap; -} -.menu aside .controls_explanations p -{ font-size: smaller; } -.menu aside img +.menu aside img, .menu aside input { vertical-align: bottom; } .menu aside input { pointer-events: none; /* case non clicable, sauf action au clavier... */ - vertical-align: bottom; } .menu #location, .menu input[type=submit] { diff --git a/public/index.php b/public/index.php index abdac71..9f930fd 100644 --- a/public/index.php +++ b/public/index.php @@ -60,6 +60,12 @@ elseif(isset($_GET['action']) && $_GET['action'] === 'modif_mdp') { changePassword($entityManager); } +elseif($_SESSION['admin'] && isset($_GET['page']) && isset($_GET['action']) && $_GET['action'] === 'modif_page' + && $_GET['page'] !== 'connexion' && $_GET['page'] !== 'article' && $_GET['page'] !== 'menu_chemins') +{ + // les contrôles de la 2è ligne devraient utiliser un tableau + MainBuilder::$modif_mode = true; +} // -- contrôleurs -- $director = new Director($entityManager, true); diff --git a/src/controller/Director.php b/src/controller/Director.php index a2528ed..56a90cb 100644 --- a/src/controller/Director.php +++ b/src/controller/Director.php @@ -16,11 +16,11 @@ class Director private Node $node; private Node $article; - public function __construct(EntityManager $entityManager, bool $for_display = false) + public function __construct(EntityManager $entityManager, bool $get_menu = false) { $this->entityManager = $entityManager; - if($for_display){ - self::$menu_data = new Menu($entityManager); // Menu est un modèle mais pas une entité + if($get_menu){ + self::$menu_data = new Menu($entityManager); self::$page_path = new Path(); $this->page = self::$page_path->getLast(); } @@ -137,4 +137,24 @@ class Director $this->node = $section; return true; } + + public function findNodeByName(string $name): void + { + $bulk_data = $this->entityManager + ->createQuery('SELECT n FROM App\Entity\Node n WHERE n.name_node = :name') + ->setParameter('name', $name) + ->getResult(); + $this->node = $bulk_data[0]; + echo $this->page->getPageName() . ' '; + + $bulk_data = $this->entityManager + ->createQuery('SELECT n FROM App\Entity\Node n WHERE n.parent = :parent AND n.page = :page') + ->setParameter('parent', $this->node) + ->setParameter('page', $this->page) + ->getResult(); + foreach($bulk_data as $child){ + $this->node->addChild($child); + echo $child->getName() . ' '; + } + } } diff --git a/src/controller/Security.php b/src/controller/Security.php index f9092e2..7d592e9 100644 --- a/src/controller/Security.php +++ b/src/controller/Security.php @@ -3,6 +3,8 @@ // // htmlawed nettoie les entrées de l'utilisateur, en particulier le html de l'éditeur +declare(strict_types=1); + class Security { private static $configHtmLawed = array( @@ -14,10 +16,10 @@ class Security // liste noire d'attributs HTML 'deny_attribute'=> 'id, class' // on garde 'style' ); - // faire qu'un certain élément puisse n'avoir que certains attributs, regarder la doc private static $specHtmLawed = ''; + // ATTENTION, n'applique pas htmlspecialchars() !! public static function secureString(string $chaine): string { return trim(htmLawed($chaine, self::$configHtmLawed, self::$specHtmLawed));; diff --git a/src/controller/post.php b/src/controller/post.php index d2e4477..76ac72b 100644 --- a/src/controller/post.php +++ b/src/controller/post.php @@ -3,6 +3,8 @@ declare(strict_types=1); +use App\Entity\Node; +use App\Entity\NodeData; use App\Entity\Page; if($_SERVER['REQUEST_METHOD'] === 'POST' && $_SESSION['admin'] === true) @@ -10,17 +12,48 @@ if($_SERVER['REQUEST_METHOD'] === 'POST' && $_SESSION['admin'] === true) /* -- formulaires HTML classiques -- */ if($_SERVER['CONTENT_TYPE'] === 'application/x-www-form-urlencoded') { - // création d'une entrée de menu avec une URL - if(isset($_POST["label_input"]) && isset($_POST["url_input"]) && isset($_POST["location"])){ - echo $_POST["label_input"] . '
'; - echo $_POST["url_input"] . '
'; - echo $_POST["location"] . '
'; // id entrée précédente + /* -- mode Modification d'une page -- */ + + // ajout d'un bloc dans une page + if(isset($_POST['bloc_title']) && isset($_POST['bloc_select'])){ + $director = new Director($entityManager, true); // on a besoin de page_path qui dépend de menu_data + $page = Director::$page_path->getLast(); + $director->findNodeByName('main'); + $main = $director->getNode(); + $position = count($main->getChildren()) + 1; // position dans la fraterie + + $bloc = new Node( + trim(htmlspecialchars($_POST["bloc_select"])), + null, [], + $position, + $main, + $page); + $data = new NodeData( + ['title' => trim(htmlspecialchars($_POST["bloc_title"]))], + $bloc); + + $entityManager->persist($bloc); + $entityManager->persist($data); + $entityManager->flush(); + header("Location: " . new URL(['page' => $_GET['page'], 'action' => 'modif_page'])); + } + + /* -- page Menu et chemins -- */ + + // création d'une entrée de menu avec une URL + elseif(isset($_POST["label_input"]) && isset($_POST["url_input"]) && isset($_POST["location"])){ 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($_POST["label_input"], $_POST["url_input"], true, true, false, $previous_page->getPosition(), $parent); + $page = new Page( + trim(htmlspecialchars($_POST["label_input"])), + filter_var($_POST["url_input"], FILTER_VALIDATE_URL), + true, true, false, + $previous_page->getPosition(), + $parent); + // on indique pour la nouvelle entrée la même position que la précédente, puis addChild l'ajoute à la fin du tableau "children" avant de déclencher un tri // 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){ @@ -31,7 +64,6 @@ if($_SERVER['REQUEST_METHOD'] === 'POST' && $_SESSION['admin'] === true) $entityManager->persist($page); $entityManager->flush(); - header("Location: " . new URL(['page' => $_GET['from']])); } // suppression d'une entrée de menu avec une URL @@ -54,6 +86,7 @@ if($_SERVER['REQUEST_METHOD'] === 'POST' && $_SESSION['admin'] === true) header("Location: " . new URL(['error' => 'paramètres inconnus'])); } } + /* -- requêtes AJAX -- */ else{ require '../src/controller/ajax.php'; diff --git a/src/model/Menu.php b/src/model/Menu.php index 10cf3d5..9fb8562 100644 --- a/src/model/Menu.php +++ b/src/model/Menu.php @@ -1,5 +1,5 @@ findPage(Director::$menu_data, $path_array); // remplit $this->current_page } catch(Exception $e){} diff --git a/src/view/AbstractBuilder.php b/src/view/AbstractBuilder.php index 285ebc3..76c51ed 100644 --- a/src/view/AbstractBuilder.php +++ b/src/view/AbstractBuilder.php @@ -1,6 +1,8 @@ html .= "
\n"; + // cas particulier de la page article où l'article est greffé sur main if(Director::$page_path->getLast()->getEndOfPath() === 'article'){ // pas censé arriver if(!isset($_GET['id'])){ @@ -31,9 +36,53 @@ class MainBuilder extends AbstractBuilder $this->html .= $builder->render(); } else{ + // si action = "modif_page", affiche des commandes pour modifier + if($_SESSION['admin'] && self::$modif_mode){ + // ajouter un contrôle du champ in_menu + $this->viewEditBlocks($node); + } + $this->useChildrenBuilder($node); } $this->html .= "
\n"; } + + private function viewEditBlocks($node): void + { + // blocs disponibles + $blocs = ['Blog', 'Grille', 'Calendrier', 'Galerie']; // générer ça dynamiquement! + $blocs_true_names = ['blog', 'grid', 'calendar', 'galery']; + + $options = ''; + for($i = 0; $i < count($blocs); $i++){ + $options .= '\n"; + } + + // blabla + /*$this->html .= '' . "\n";*/ + + // ajout d'un nouveau bloc + $this->html .= '
+

Ajouter un bloc dans la page:

+
+

+

+

+ +

+
+
' . "\n"; + foreach($node->getChildren() as $child_node){ + //$this->html .= + } + } } diff --git a/src/view/MenuBuilder.php b/src/view/MenuBuilder.php index 780ca7e..3b96af1 100644 --- a/src/view/MenuBuilder.php +++ b/src/view/MenuBuilder.php @@ -3,6 +3,8 @@ // // page Menu et chemins en mode admin, fonctionne avec menu.js +declare(strict_types=1); + use App\Entity\Node; use App\Entity\Page; @@ -84,7 +86,7 @@ class MenuBuilder extends AbstractBuilder private function unfoldOptions(Page $page): void { foreach($page->getChildren() as $entry){ - $this->options .= '\n"; if(count($entry->getChildren()) > 0){ $this->unfoldOptions($entry); } diff --git a/src/view/NewBuilder.php b/src/view/NewBuilder.php index ac2cf9a..c410eb7 100644 --- a/src/view/NewBuilder.php +++ b/src/view/NewBuilder.php @@ -1,6 +1,8 @@ diff --git a/src/view/templates/article.php b/src/view/templates/article.php index c57c1cb..5cf35c2 100644 --- a/src/view/templates/article.php +++ b/src/view/templates/article.php @@ -1,3 +1,4 @@ +
diff --git a/src/view/templates/blog.php b/src/view/templates/blog.php index e2066c8..dfb65b5 100644 --- a/src/view/templates/blog.php +++ b/src/view/templates/blog.php @@ -1,3 +1,4 @@ +

diff --git a/src/view/templates/footer.php b/src/view/templates/footer.php index a4e3544..52cb1b5 100644 --- a/src/view/templates/footer.php +++ b/src/view/templates/footer.php @@ -1,3 +1,4 @@ +