From c9aff025aa7e01badaad8467af6165b400cdaac4 Mon Sep 17 00:00:00 2001 From: polo Date: Wed, 22 Oct 2025 15:28:02 +0200 Subject: =?UTF-8?q?possibilit=C3=A9=20d'=C3=A9diter=20le=20texte=20dans=20?= =?UTF-8?q?header=20et=20footer,=20class=20JS=20InputText,=20Model::findWh?= =?UTF-8?q?ateverNode?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- public/assets/close-nb.svg | 1 + public/assets/close.svg | 37 +++++++++++++++++++++++++++ public/css/body.css | 4 +-- public/css/calendar.css | 1 - public/css/foot.css | 14 +++++------ public/css/head.css | 12 +++++++-- public/js/InputText.js | 47 +++++++++++++++++++++++++++++++++++ src/controller/HeadFootController.php | 33 ++++++++++++++++++++++++ src/model/Model.php | 18 ++++++++++++++ src/router.php | 7 +++++- src/view/FooterBuilder.php | 15 +++++++++++ src/view/HeadBuilder.php | 5 +++- src/view/HeaderBuilder.php | 27 ++++++++++++++++++++ src/view/templates/footer.php | 27 ++++++++++++++++---- src/view/templates/header.php | 27 ++++++++++++++++---- 15 files changed, 250 insertions(+), 25 deletions(-) create mode 100644 public/assets/close-nb.svg create mode 100644 public/assets/close.svg create mode 100644 public/js/InputText.js create mode 100644 src/controller/HeadFootController.php diff --git a/public/assets/close-nb.svg b/public/assets/close-nb.svg new file mode 100644 index 0000000..c5a6b6b --- /dev/null +++ b/public/assets/close-nb.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/assets/close.svg b/public/assets/close.svg new file mode 100644 index 0000000..4dfee8c --- /dev/null +++ b/public/assets/close.svg @@ -0,0 +1,37 @@ + + + + + + diff --git a/public/css/body.css b/public/css/body.css index 95f30d4..8ad3a52 100644 --- a/public/css/body.css +++ b/public/css/body.css @@ -188,7 +188,7 @@ button .action_icon:hover { margin-right: 2px; } -section button, section input[type=submit] +button, section input[type=submit] { color: #ff1d04; font-size: medium; @@ -196,7 +196,7 @@ section button, section input[type=submit] background-color: white; border: lightgrey 2px outset; /* rend identiques les boutons firefox et chromium */ } -section button:hover, section input[type=submit]:hover +button:hover, section input[type=submit]:hover { background-color: yellow; border-radius: 4px; diff --git a/public/css/calendar.css b/public/css/calendar.css index 2ff5640..d011f03 100644 --- a/public/css/calendar.css +++ b/public/css/calendar.css @@ -10,7 +10,6 @@ #calendar_zone{ display: flex; gap: 5px; - /*padding: 15px;*/ max-width: 1170px; } #calendar{ diff --git a/public/css/foot.css b/public/css/foot.css index ad86305..8d0a94d 100644 --- a/public/css/foot.css +++ b/public/css/foot.css @@ -11,11 +11,15 @@ footer } footer > div { - margin: auto; max-width: 1200px; display: flex; justify-content: space-around; } + +.contact +{ + margin: 16px 0; /* alignement avec la

autour du logo */ +} .contact a { color: unset; @@ -69,11 +73,6 @@ footer > div margin: 0 3px; }*/ -.contact -{ - padding: 0 15px; -} - .footer_logo img { max-width: 288px; @@ -115,8 +114,7 @@ footer > div } .logged_out { - /*display: none;*/ - justify-content: start; + justify-content: start; /* écrase le space-around dans footer > div */ } .logged_out a { diff --git a/public/css/head.css b/public/css/head.css index be938bb..b173077 100644 --- a/public/css/head.css +++ b/public/css/head.css @@ -24,6 +24,8 @@ header grid-template-columns: 1fr 1fr 1fr; align-items: end; } +/*.header_left_col +{}*/ @media screen and (max-width: 1000px){ .header-content{ padding: 18px 0; @@ -36,7 +38,7 @@ header display: block; padding: 18px; } - .head_logo + #header_logo { display: none; } @@ -74,12 +76,18 @@ header a color: unset; /* ne plus hériter */ text-decoration: none; } +#edit_favicon_zone +{ + margin-bottom: 10px; +} +/*.header_right_col +{}*/ .social { /*align-self: end;*/ /*padding: 4px;*/ } -.social img +.social a img { width: 25px; background-color: #ffffffb3; diff --git a/public/js/InputText.js b/public/js/InputText.js new file mode 100644 index 0000000..ba7e8e4 --- /dev/null +++ b/public/js/InputText.js @@ -0,0 +1,47 @@ +// s'en servir dans menu et chemin +class InputText{ + constructor(name){ + this.name = name; + this.parent = document.getElementById(name); + } + openTextInput(){ + this.parent.querySelector('#' + this.name + '_span').classList.add('hidden'); + this.parent.querySelector('#' + this.name + '_input').classList.remove('hidden'); + this.parent.querySelector('#' + this.name + '_open').classList.add('hidden'); + this.parent.querySelector('#' + this.name + '_submit').classList.remove('hidden'); + this.parent.querySelector('#' + this.name + '_cancel').classList.remove('hidden'); + } + closeTextInput(){ + this.parent.querySelector('#' + this.name + '_span').classList.remove('hidden'); + this.parent.querySelector('#' + this.name + '_input').classList.add('hidden'); + this.parent.querySelector('#' + this.name + '_open').classList.remove('hidden'); + this.parent.querySelector('#' + this.name + '_submit').classList.add('hidden'); + this.parent.querySelector('#' + this.name + '_cancel').classList.add('hidden'); + } + submitTextInput(){ + const new_text = this.parent.querySelector('#' + this.name + '_input').value; + + fetch('index.php?entire_site_edit=' + this.name, { + method: 'POST', + headers: { 'Content-Type': 'application/json' }, + body: JSON.stringify({new_text: new_text}) + }) + .then(response => response.json()) + .then(data => { + if(data.success){ + this.parent.querySelector('#' + this.name + '_span').innerHTML = new_text; + this.closeTextInput(this.name); + } + else{ + console.error("Erreur: le serveur n'a pas enregistré le nouveau texte."); + } + }) + .catch(error => { + console.error('Erreur:', error); + }); + } + cancelTextInput(){ + this.parent.querySelector('#' + this.name + '_input').value = this.parent.querySelector('#' + this.name + '_span').innerHTML; + this.closeTextInput(this.name); + } +} \ No newline at end of file diff --git a/src/controller/HeadFootController.php b/src/controller/HeadFootController.php new file mode 100644 index 0000000..c7a9cec --- /dev/null +++ b/src/controller/HeadFootController.php @@ -0,0 +1,33 @@ + false]); + die; + } + + $model = new Model($entityManager); + if($model->findWhateverNode('name_node', $request_params[0])){ + $node_data = $model->getNode()->getNodeData(); + $node_data->updateData($request_params[1], htmlspecialchars($json['new_text'])); // $request_params[1] n'est pas contrôlé + $entityManager->flush(); + echo json_encode(['success' => true]); + } + else{ + echo json_encode(['success' => false]); + } + die; + } +} \ No newline at end of file diff --git a/src/model/Model.php b/src/model/Model.php index ea8ef71..16061e7 100644 --- a/src/model/Model.php +++ b/src/model/Model.php @@ -185,6 +185,24 @@ class Model $this->node = $this->entityManager->find('App\Entity\Node', $id); return $this->node === null ? false : true; } + public function findWhateverNode(string $field, string $value): bool + { + $queryBuilder = $this->entityManager->createQueryBuilder(); + $queryBuilder + ->select('n') + ->from('App\Entity\Node', 'n') + ->where("n.$field = :value") // avec le querybuilder, ce truc sale reste sécurisé + ->setParameter('value', $value); + $result = $queryBuilder->getQuery()->getOneOrNullResult(); + + if($result === null){ + return false; + } + else{ + $this->node = $result; + return true; + } + } // récupération d'un article pour modification public function makeArticleNode(string $id = '', bool $get_section = false): bool diff --git a/src/router.php b/src/router.php index 7459a0d..1127c81 100644 --- a/src/router.php +++ b/src/router.php @@ -141,11 +141,16 @@ elseif($request->getMethod() === 'POST'){ } } + /* -- site entier (header, footer, favicon) -- */ + elseif($request->query->has('entire_site_edit')){ + $request_params = explode('_', $request->query->get('entire_site_edit')); // header_title, header_description, footer_text, etc + HeadFootController::setTextData($entityManager, $request_params, $json); + } /* -- page Menu et chemins -- */ elseif(isset($_GET['menu_edit'])) { - // ne suit pas la règle, faire ça dans un contrôleur + // ne suit pas la règle, faire ça dans un contrôleur? Model::$menu_data = new Menu($entityManager); // récupération des données // flèche gauche <=: position = position du parent + 1, parent = grand-parent, recalculer les positions diff --git a/src/view/FooterBuilder.php b/src/view/FooterBuilder.php index 0a3f55c..c1e0f7a 100644 --- a/src/view/FooterBuilder.php +++ b/src/view/FooterBuilder.php @@ -26,6 +26,17 @@ class FooterBuilder extends AbstractBuilder $empty_admin_zone = ''; if($_SESSION['admin']) { + $buttons_footer_name = ' + + '; + $buttons_footer_address = ' + + '; + $buttons_footer_email = ' + + '; + + // zone admin $empty_admin_zone = 'empty_admin_zone'; if(MainBuilder::$modif_mode){ $mode = 'modification de page'; @@ -61,6 +72,10 @@ class FooterBuilder extends AbstractBuilder $url->addParams(['id' => $_GET['id']]); } $zone_admin = ''; + + $buttons_footer_name = ''; + $buttons_footer_address = ''; + $buttons_footer_email = ''; } ob_start(); diff --git a/src/view/HeadBuilder.php b/src/view/HeadBuilder.php index b1dfacb..978d9ed 100644 --- a/src/view/HeadBuilder.php +++ b/src/view/HeadBuilder.php @@ -33,8 +33,11 @@ class HeadBuilder extends AbstractBuilder $js .= '' . "\n"; } - // tinymce, nécéssite un script de copie dans composer.json if($_SESSION['admin']){ + // édition éléments sur toutes les pages (header, footer et favicon) + $js .= '' . "\n"; + + // tinymce, nécéssite un script de copie dans composer.json $css .= '' . "\n"; $js .= '' . "\n"; // pour js/tinymce/tinymce.min.js $js .= '' . "\n"; diff --git a/src/view/HeaderBuilder.php b/src/view/HeaderBuilder.php index dc4aec4..5492340 100644 --- a/src/view/HeaderBuilder.php +++ b/src/view/HeaderBuilder.php @@ -77,6 +77,33 @@ class HeaderBuilder extends AbstractBuilder ' . $one_key . '_alt'; } + // boutons mode admin + if($_SESSION['admin']){ + $edit_favicon_hidden = 'hidden'; + $button_favicon = ''; + $button_header_logo = ''; + //$edit_favicon_hidden = ''; + //$favicon = 'assets/favicon48x48.png'; // double le code dans HeadBuilder + //$button_favicon = ''; + //$button_header_logo = ''; + $buttons_header_title = ' + + '; + $buttons_header_description = ' + + '; + //$buttons_social_networks = ''; + $buttons_social_networks = ''; + } + else{ + $edit_favicon_hidden = 'hidden'; + $button_favicon = ''; + $button_header_logo = ''; + $buttons_header_title = ''; + $buttons_header_description = ''; + $buttons_social_networks = ''; + } + ob_start(); require $viewFile; $this->html .= ob_get_clean(); diff --git a/src/view/templates/footer.php b/src/view/templates/footer.php index 1b63edf..dbace6a 100644 --- a/src/view/templates/footer.php +++ b/src/view/templates/footer.php @@ -1,11 +1,28 @@