From df3612ed7e6691530503f79483d2fdbc032d01b8 Mon Sep 17 00:00:00 2001 From: polo-pc-greta Date: Thu, 27 Mar 2025 10:13:03 +0100 Subject: mise en ligne github --- src/view/AbstractBuilder.php | 52 ++++++++++++++ src/view/ArticleBuilder.php | 60 ++++++++++++++++ src/view/BlogBuilder.php | 49 +++++++++++++ src/view/BreadcrumbBuilder.php | 53 ++++++++++++++ src/view/FooterBuilder.php | 64 +++++++++++++++++ src/view/GaleryBuilder.php | 49 +++++++++++++ src/view/GridBuilder.php | 55 +++++++++++++++ src/view/HeadBuilder.php | 68 ++++++++++++++++++ src/view/HeaderBuilder.php | 64 +++++++++++++++++ src/view/LoginBuilder.php | 15 ++++ src/view/MainBuilder.php | 30 ++++++++ src/view/NavBuilder.php | 61 +++++++++++++++++ src/view/NewBuilder.php | 93 +++++++++++++++++++++++++ src/view/ViewBuilder.php | 16 +++++ src/view/password.php | 152 +++++++++++++++++++++++++++++++++++++++++ src/view/templates/article.php | 15 ++++ src/view/templates/blog.php | 6 ++ src/view/templates/footer.php | 15 ++++ src/view/templates/galery.php | 10 +++ src/view/templates/grid.php | 8 +++ src/view/templates/head.php | 11 +++ src/view/templates/header.php | 23 +++++++ src/view/templates/new.php | 21 ++++++ 23 files changed, 990 insertions(+) create mode 100644 src/view/AbstractBuilder.php create mode 100644 src/view/ArticleBuilder.php create mode 100644 src/view/BlogBuilder.php create mode 100644 src/view/BreadcrumbBuilder.php create mode 100644 src/view/FooterBuilder.php create mode 100644 src/view/GaleryBuilder.php create mode 100644 src/view/GridBuilder.php create mode 100644 src/view/HeadBuilder.php create mode 100644 src/view/HeaderBuilder.php create mode 100644 src/view/LoginBuilder.php create mode 100644 src/view/MainBuilder.php create mode 100644 src/view/NavBuilder.php create mode 100644 src/view/NewBuilder.php create mode 100644 src/view/ViewBuilder.php create mode 100644 src/view/password.php create mode 100644 src/view/templates/article.php create mode 100644 src/view/templates/blog.php create mode 100644 src/view/templates/footer.php create mode 100644 src/view/templates/galery.php create mode 100644 src/view/templates/grid.php create mode 100644 src/view/templates/head.php create mode 100644 src/view/templates/header.php create mode 100644 src/view/templates/new.php (limited to 'src/view') diff --git a/src/view/AbstractBuilder.php b/src/view/AbstractBuilder.php new file mode 100644 index 0000000..cd2b361 --- /dev/null +++ b/src/view/AbstractBuilder.php @@ -0,0 +1,52 @@ +getChildren() as $child_node) + { + $builder_name = $this->snakeToPascalCase($child_node->getName()) . 'Builder'; + $builder = new $builder_name($child_node); + $this->html .= $builder->render(); + + // pages spéciales où on n'assemble pas tout + if($builder_name === 'HeadBuilder' && $builder->getStop()) + { + foreach($node->getChildren() as $target_node){ + if($target_node->getName() === 'main'){ + $main_node = $target_node; + break; + } + } + // on construit
et on s'arrête! les autres noeuds sont ignorés + $builder_name = $this->snakeToPascalCase($main_node->getName()) . 'Builder'; + $builder = new $builder_name($main_node); + $this->html .= "\n"; + $this->html .= $builder->render() . "\n"; + $this->html .= "\n"; + break; + } + } + } + + protected function snakeToPascalCase(string $input): string + { + return str_replace('_', '', ucwords($input, '_')); + } + + public function render(): string // = getHTML() + { + return $this->html; + } + public function addHTML(string $html): void + { + $this->html .= $html; + } +} \ No newline at end of file diff --git a/src/view/ArticleBuilder.php b/src/view/ArticleBuilder.php new file mode 100644 index 0000000..989da0d --- /dev/null +++ b/src/view/ArticleBuilder.php @@ -0,0 +1,60 @@ +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_link = new URL(['page' => CURRENT_PAGE, 'id' => $id, 'action' => 'position_up']); + $up_button = '

' . "\n"; + + $down_link = new URL(['page' => CURRENT_PAGE, 'id' => $id, 'action' => 'position_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 new file mode 100644 index 0000000..8c2125f --- /dev/null +++ b/src/view/BlogBuilder.php @@ -0,0 +1,49 @@ +getName() . '.php'; + + if(file_exists($viewFile)) + { + if(!empty($node->getNodeData()->getData())) + { + extract($node->getNodeData()->getData()); + } + + // ajouter un article + $new_article = ''; + $new_article_admin_buttons = ''; + if($_SESSION['admin']) + { + $id = 'new'; + + //$link = new URL(['page' => CURRENT_PAGE, 'action' => 'open_editor']); + $js = 'onclick="openEditor(\'' . $id . '\')"'; + //$new_article = ''; + $new_article = '

' . "\n" . + '

'; + + $close_js = 'onclick="closeEditor(\'' . $id . '\')"'; + $close_editor = '
'; + + $submit_js = 'onclick="submitArticle(\'' . $id . '\')"'; + $submit_article = '
'; + + $new_article_admin_buttons = $close_editor . $submit_article; + } + + $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/BreadcrumbBuilder.php b/src/view/BreadcrumbBuilder.php new file mode 100644 index 0000000..f1fdddf --- /dev/null +++ b/src/view/BreadcrumbBuilder.php @@ -0,0 +1,53 @@ +html = $this->breadcrumbHTML(false); + } + + private function breadcrumbHTML(bool $links = false): string + { + $asset = 'assets/home.svg'; // => BDD? + $breadcrumb_array = Director::$page_path->getArray(); // tableau de Page + $html = ''; + $nb_of_entries = count($breadcrumb_array); + + if($nb_of_entries > 1) + { + // petite maison et flèche + $html .= '\n"; + } + return $html; + } +} \ No newline at end of file diff --git a/src/view/FooterBuilder.php b/src/view/FooterBuilder.php new file mode 100644 index 0000000..49da71c --- /dev/null +++ b/src/view/FooterBuilder.php @@ -0,0 +1,64 @@ +getName() . '.php'; + + if(file_exists($viewFile)) + { + // $adresses postale et e-mail + if(!empty($node->getNodeData()->getData())) + { + extract($node->getNodeData()->getData()); + } + + $this->useChildrenBuilder($node); + $breadcrumb = $this->html; + + // zone admin + $empty_admin_zone = ''; + //$zone_admin = ''; + if($_SESSION['admin']) + { + $div_admin = 'logged_in'; + $empty_admin_zone = 'empty_admin_zone'; + $link_edit_page = new URL(['page' => CURRENT_PAGE, 'action' => 'modif_page']); + $link_new_page = new URL(['from' => CURRENT_PAGE, 'page' => 'nouvelle_page']); + $link_change_paths = new URL(['from' => CURRENT_PAGE, 'page' => 'menu_chemins']); + + $link_change_password = new URL(['from' => CURRENT_PAGE, 'action' => 'modif_mdp']); + isset($_GET['id']) ? $link_change_password->addParams(['id' => $_GET['id']]) : ''; + + $link_logout = new URL(['page' => CURRENT_PAGE, 'action' => 'deconnexion']); + isset($_GET['id']) ? $link_logout->addParams(['id' => $_GET['id']]) : ''; + + $zone_admin = '

Vous êtes en mode administrateur.' . "\n" . + '' . "\n" . + '' . "\n" . + '' . "\n" . + '' . "\n" . + '

' . "\n"; + } + else + { + $div_admin = 'logged_out'; + $zone_admin = ''; + if(Director::$page_path->getLast()->getEndOfPath() === 'article' && isset($_GET['id'])){ + $zone_admin = ''; + } + else{ + $zone_admin = ''; + } + } + + ob_start(); + require $viewFile; + $this->html = ob_get_clean(); + } + } +} \ No newline at end of file diff --git a/src/view/GaleryBuilder.php b/src/view/GaleryBuilder.php new file mode 100644 index 0000000..89be2b1 --- /dev/null +++ b/src/view/GaleryBuilder.php @@ -0,0 +1,49 @@ +getName() . '.php'; + + if(file_exists($viewFile)) + { + if(!empty($node->getNodeData()->getData())) + { + extract($node->getNodeData()->getData()); + } + + // ajouter un article + $new_article = ''; + $new_article_admin_buttons = ''; + if($_SESSION['admin']) + { + $id = 'new'; + + //$link = new URL(['page' => CURRENT_PAGE, 'action' => 'open_editor']); + $js = 'onclick="openEditor(\'' . $id . '\')"'; + //$new_article = ''; + $new_article = '

' . "\n" . + '

'; + + $close_js = 'onclick="closeEditor(\'' . $id . '\')"'; + $close_editor = '
'; + + $submit_js = 'onclick="submitArticle(\'' . $id . '\')"'; + $submit_article = '
'; + + $new_article_admin_buttons = $close_editor . $submit_article; + } + + $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/GridBuilder.php b/src/view/GridBuilder.php new file mode 100644 index 0000000..6e16d46 --- /dev/null +++ b/src/view/GridBuilder.php @@ -0,0 +1,55 @@ +getName() . '.php'; + + if(file_exists($viewFile)) + { + if(!empty($node->getNodeData()->getData())) + { + extract($node->getNodeData()->getData()); + } + + // ajouter un article + $new_article = ''; + $new_article_admin_buttons = ''; + if($_SESSION['admin']) + { + $id = 'new'; + $js = 'onclick="openEditor(\'' . $id . '\')"'; + + if(Director::$page_path->getLast()->getEndOfPath() === 'accueil') + { + $new_article = '

' . "\n" . + '

'; + } + else + { + $new_article = '

' . "\n" . + '

'; + } + + $close_js = 'onclick="closeEditor(\'' . $id . '\')"'; + $close_editor = '
'; + + $submit_js = 'onclick="submitArticle(\'' . $id . '\')"'; + $submit_article = '
'; + + $new_article_admin_buttons = $close_editor . $submit_article; + } + + $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/HeadBuilder.php b/src/view/HeadBuilder.php new file mode 100644 index 0000000..c31c930 --- /dev/null +++ b/src/view/HeadBuilder.php @@ -0,0 +1,68 @@ +getName() . '.php'; + + if(file_exists($viewFile)) + { + // css et js + if(!empty($node->getAttributes())) + { + extract($node->getAttributes()); + } + + // pages spéciales où on n'assemble pas tout + $this->stop = isset($stop) ? $stop : false; + $css = ''; + foreach($css_array as $name) + { + $css .= '' . "\n"; + } + $js = ''; + foreach($js_array as $name) + { + $js .= '' . "\n"; + } + + // tinymce, nécéssite un script de copie dans composer.json + if($_SESSION['admin']){ + $css .= '' . "\n"; + $js .= '' . "\n"; + $js .= '' . "\n"; + } + + // titre et description + if(!empty($node->getNodeData()->getData())) + { + extract($node->getNodeData()->getData()); + } + + // favicon + foreach($node->getNodeData()->getImages() as $image) + { + if(str_contains($image->getFileName(), 'favicon')) + { + $favicon = rtrim($image->getFilePathMini(), '/'); + $alt = $image->getAlt(); + } + } + + ob_start(); + require $viewFile; + $this->html .= ob_get_clean(); + } + } + + public function getStop(): bool + { + return $this->stop; + } +} diff --git a/src/view/HeaderBuilder.php b/src/view/HeaderBuilder.php new file mode 100644 index 0000000..252958a --- /dev/null +++ b/src/view/HeaderBuilder.php @@ -0,0 +1,64 @@ +getChildren(); + foreach($children as $child) + { + if($child->getName() === 'nav') + { + $this->nav = $child; + $nav_builder = new NavBuilder($this->nav); + $nav = $nav_builder->render(); + } + } + + $viewFile = self::VIEWS_PATH . $node->getName() . '.php'; + + if(file_exists($viewFile)) + { + // titre et description + if(!empty($node->getNodeData()->getData())) + { + extract($node->getNodeData()->getData()); + } + + // attributs, aucun pour l'instant + if(!empty($node->getAttributes())) + { + extract($node->getAttributes()); + } + + // header logo + réseaux sociaux + $targets = ['logo', 'facebook', 'instagram', 'fond_piscine']; + $i = 0; + foreach($node->getNodeData()->getImages() as $image) + { + if(str_contains($image->getFileName(), $targets[$i])) + { + $var = $targets[$i]; + $$var = rtrim($image->getFilePathMini(), '/'); + $var .= '_alt'; // ex: logo_alt + $$var = $image->getAlt(); + } + $i++; + } + + // générer HTML réseaux sociaux + // + + ob_start(); + require $viewFile; + $this->html .= ob_get_clean(); + } + } +} \ No newline at end of file diff --git a/src/view/LoginBuilder.php b/src/view/LoginBuilder.php new file mode 100644 index 0000000..ac9910f --- /dev/null +++ b/src/view/LoginBuilder.php @@ -0,0 +1,15 @@ +html .= "
\n"; + + if(Director::$page_path->getLast()->getEndOfPath() === 'article'){ + if($node->getTempChild() == null){ + $new = new Node; + } + else{ + $new = $node->getTempChild(); + } + //$builder_name = $this->snakeToPascalCase($new->getName()) . 'Builder'; + $builder_name = 'NewBuilder'; + $builder = new $builder_name($new); + $this->html .= $builder->render(); + } + else{ + $this->useChildrenBuilder($node); + } + + $this->html .= "
\n"; + } +} diff --git a/src/view/NavBuilder.php b/src/view/NavBuilder.php new file mode 100644 index 0000000..e7254b1 --- /dev/null +++ b/src/view/NavBuilder.php @@ -0,0 +1,61 @@ +html .= ''; + } + + private function navMainHTML(Page $nav_data, array $current): string + { + $nav_html = ''; + static $level = 0; + + foreach($nav_data->getChildren() as $data) + { + $class = ''; + if(isset($current[$level]) && $data->getEndOfPath() === $current[$level]->getEndOfPath()){ + $class = ' current'; + } + + if(count($data->getChildren()) > 0) // titre de catégorie + { + $nav_html .= '' . "\n"; + } + else + { + $target = ''; + if(str_starts_with($data->getEndOfPath(), 'http')) // lien vers autre site + { + $link = $data->getEndOfPath(); // $link = chaine + $target = ' target="_blank"'; + } + elseif($data->getEndOfPath() != '') // lien relatif + { + $link = new URL(['page' => $data->getPagePath()]); // $link = objet + } + /*else + { + echo "else page d'accueil" . '
'; + $link = new URL; // page d'accueil + }*/ + + $nav_html .= '
  • ' . $data->getPageName() . '

  • ' . "\n"; + } + } + return $nav_html; + } +} \ No newline at end of file diff --git a/src/view/NewBuilder.php b/src/view/NewBuilder.php new file mode 100644 index 0000000..605c174 --- /dev/null +++ b/src/view/NewBuilder.php @@ -0,0 +1,93 @@ +getName() . '.php'; + + if(file_exists($viewFile)) + { + // id (timestamp) + if(!empty($node->getAttributes())) + { + extract($node->getAttributes()); + } + + // html, date + $title = $node->getArticle()->getTitle(); + $preview = $node->getArticle()->getPreview(); + $id = $node->getArticleTimestamp(); + $content = ''; + + // page article unique + if(Director::$page_path->getLast()->getEndOfPath() === 'article') + { + $content = $node->getArticle()->getContent(); + $from_to_button = '

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

    '; + } + + + $date_object = $node->getArticle()->getDateTime(); // class DateTime + $date = 'le ' . str_replace(':', 'h', $date_object->format('d-m-Y à H:i')); + + // partage + $share_link = new URL(['page' => CURRENT_PAGE], $id); + isset($_GET['id']) ? $share_link->addParams(['id' => $_GET['id']]) : ''; + $share_js = 'onclick="copyInClipBoard(\'' . $share_link . '\')"'; + $share_button = '

    ' . "\n"; + + // modifier un article + $admin_buttons = ''; + if($_SESSION['admin']) + { + if(Director::$page_path->getLast()->getEndOfPath() === 'article'){ + $modify_js = 'onclick="openEditor(\'' . $id . '\')"'; + $modify_article = '

    ' . "\n"; + + $up_button = '

    ' . "\n"; + $down_button = '

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

    ' . "\n"; + + $close_js = 'onclick="closeEditor(\'' . $id . '\')"'; + $close_editor = ''; + + $submit_js = 'onclick="submitArticle(\'' . $id . '\')"'; + $submit_article = ''; + } + else{ + $modify_article = '

    ' . "\n"; + + $up_link = new URL(['page' => CURRENT_PAGE, 'id' => $id, 'action' => 'position_up']); + $up_button = '

    ' . "\n"; + + $down_link = new URL(['page' => CURRENT_PAGE, 'id' => $id, 'action' => 'position_down']); + $down_button = '

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

    ' . "\n"; + + $close_editor = ''; + $submit_article = ''; + + $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/ViewBuilder.php b/src/view/ViewBuilder.php new file mode 100644 index 0000000..acac972 --- /dev/null +++ b/src/view/ViewBuilder.php @@ -0,0 +1,16 @@ +useChildrenBuilder($root_node); + } +} diff --git a/src/view/password.php b/src/view/password.php new file mode 100644 index 0000000..0ff717c --- /dev/null +++ b/src/view/password.php @@ -0,0 +1,152 @@ + +

    Montrez que vous n'êtes pas un robot.
    + + +

    + 'connexion']); +isset($_GET['from']) ? $link->addParams(['from' => $_GET['from']]) : ''; +isset($_GET['id']) ? $link->addParams(['id' => $_GET['id']]) : ''; +ob_start(); +?> +
    +

    +

    +

    +

    + + + + +
    + +
    +

    +

    +

    +

    + + + + +
    + 'modif_mdp']); +isset($_GET['from']) ? $link->addParams(['from' => $_GET['from']]) : ''; +isset($_GET['id']) ? $link->addParams(['id' => $_GET['id']]) : ''; +ob_start(); +?> +
    + +

    + +

    + + +

    + + +
    + + + + + + + <?= $title ?> + + + + + + + + +
    +

    +

    + '

    Erreur au test anti-robot, veuillez saisir un nombre entier.

    ', + 'bad_solution_captcha' => '

    Erreur au test anti-robot, veuillez réessayer.

    ', + 'bad_login_or_password' => '

    Saisir un Identifiant (e-mail) et un mot de passe.

    ', + 'bad_password' => '

    Mauvais mot de passe, veuillez réessayer.

    ', + 'forbidden_characters' => '

    Caractères interdits: espaces, tabulations, sauts CR/LF.

    ' +]; + +$warning_messages = [ + 'message_disconnect' => "

    N'oubliez de cliquer sur 'déconnexion' quand vous aurez fini.

    ", + //'message_cookie' => "

    Ce site utilise un cookie « obligatoire » lorsque vous êtes connecté ainsi que sur cette page.
    Il sera supprimé à votre déconnexion ou dès que vous aurez quitté le site.

    ", + 'private_browsing' =>"

    Au fait? Vous n'utilisez pas votre propre ordinateur ou téléphone?
    + Utilisez la navigation privée.

    " +]; + + +// confirmation modification du mot de passe +$page = isset($_GET['from']) ? $_GET['from'] : 'accueil'; +$id = isset($_GET['id']) ? ', \'' . $_GET['id'] . '\'' : ''; +$js = "newPassword('" . $page . "'" . $id . ");"; +ob_start(); +?> + + +addParams(['page' => $_GET['from'] ]) : ''; +isset($_GET['id']) ? $link->addParams(['id' => $_GET['id']]) : ''; +ob_start(); +if(isset($_GET['from'])) // exclue la "création du mot de passe" +{ +?> +

    + + + +

    + +
    +
    +

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

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


    +
    +

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

    + + +
    +

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

    + + +
    + +
    +
    \ No newline at end of file diff --git a/src/view/templates/head.php b/src/view/templates/head.php new file mode 100644 index 0000000..1ebb17e --- /dev/null +++ b/src/view/templates/head.php @@ -0,0 +1,11 @@ + + + + + <?= $title ?> + + + + + + \ No newline at end of file diff --git a/src/view/templates/header.php b/src/view/templates/header.php new file mode 100644 index 0000000..fa55cea --- /dev/null +++ b/src/view/templates/header.php @@ -0,0 +1,23 @@ + +
    +
    +
    + +
    + +
    + +
    +

    +

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

    + +
    +
    + +
    +
    + +
    +
    +

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