Gestion des menus dans PluXml

Je n'ai rien vu dans la doc mais j'ai l'impression que la gestion des menus se fait directement dans le HTML ?

Je me trompe ? ou il y a un plugin pour cela ?

Mon but c'est surtout de permettre au quidam de gérer ses menus et pas simplement un développeur.

Mots clés:

Réponses

  • BKaernelBKaernel Member
    14 oct. modifié

    Du coup, j'ai crée un plugin "vite fait" qui marche assez bien.
    Je peux créer différents menus.
    Puis au choix : Sélectionner des pages, des catégories, des tags ou des urls libres.
    Le hook est donné dans le plugin qu'il faut intégrer manuellement dans le header, le footer ou vous voulez en fait.

    Je vais le tester un peu plus et je le mettrai sur Gitlab, si ça intéresse des gens ?

  • cpalocpalo Member

    Bonjour,
    oui je veux bien regarder ce plugin

  • BKaernelBKaernel Member
    15 oct. modifié

    Je posterais ici le lien. Par contre le hook de sortie est à insérer directement dans le template.
    Du coup, je me demande si en dehors de mon thème c'est vraiment pratique ?

    D'autant que je viens de m'apercevoir qu'il y a déjà un système automatique de menu avec les articles et les catégories.
    D'ailleurs, je ne crois pas avoir vu le chapitre "MENU" dans la DOC. Sauf erreur de ma part.

  • bazooka07bazooka07 PluXml Lead Developer, Moderator

    PluXml a une gestion de menus qui conveint presque à tout le monde :

    • on peut choisir la page d'accueil parmi les pages statiiques
    • les pages statiques peuvent être classées par groupe
    • les articles peuvent classées dans une ou plusieurs catégories, voire pour la page d'accueil
    • on peut afficher la liste des categories dans le menu
    • les plugins peuvent afficher une entrée dans le menu

    Tu peux trouver quelques exemple de thèmes avec le lien suivant :
    https://www.kazimentou.fr/repo/index.php?page=themes

  • BKaernelBKaernel Member

    Dans mes thèmes j'aime bien mettre différents menus (pour dégager le menu principal notamment).
    Un menu dans le footer par exemple, pour les mentions légales, plan du site (RGAA) et autres.
    Du coup, le système PluXml automatique ne me suffira pas. Mais j'entends qu'il suffit au plus grand nombre.
    Pouvoir mettre des URL aussi c'est toujours utiles pour des sites de réservations par exemple.

  • BodieuBodieu Member

    Les menus déroulants à partir des catégories méritent d'etre améliorés :

    • pour avoir de vraies listes déroulantes>
    • pour être compatible avec tous les navigateurs.

    J'ai utilisé l'IA (Mistral l'outil français), pour créer une sidebar qui répond à mon besoin

    Vous pouvez voir le résultat sur nom site https://nobles.bodieu.fr/

    avec le fichier sidebar.php :

    <?php if(!defined('PLX_ROOT')) exit; ?>
    <aside class="main-aside">
    <center>
        <?php eval($plxShow->callHook('log')); ?></Center>
    <?php
    $choix = [];
    if (isset($_GET['liste']) && is_array($_GET['liste'])) {
        $choix = array_values(array_intersect(['Famille','Commune','Lieu','Récents'], $_GET['liste']));
    }
    ?>
    <form method="get" action="" id="form-listes">
        <p><strong>Choisissez une liste :</strong></p>
        <div class="boite-choix">
            <label><input type="checkbox" name="liste[]" value="Famille"  <?= in_array('Famille',  $choix) ? 'checked' : '' ?>> Famille</label>
            <label><input type="checkbox" name="liste[]" value="Commune" <?= in_array('Commune', $choix) ? 'checked' : '' ?>> Commune</label>
            <label><input type="checkbox" name="liste[]" value="Lieu"     <?= in_array('Lieu',     $choix) ? 'checked' : '' ?>> Lieu</label>
            <label><input type="checkbox" name="liste[]" value="Récents"  <?= in_array('Récents',  $choix) ? 'checked' : '' ?>> Récents</label>
        </div>
    </form>
    <style>
    .boite-choix {
        height: calc(5* 1.9em);
        overflow-y: auto;
        border: 1px solid #aaa;
        padding: 0.2em 0.4em;
        margin-bottom: 0.5em;
        background: #fff;
        line-height: 1.9em;
    }
    .boite-choix label {
        display: block;
        cursor: pointer;
        white-space: nowrap;
        color:black ;
    }
    /* Fenêtre à ascenseur pour les listes d'articles */
    .fenetre-liste {
        max-height: 16em;          /* hauteur visible avant défilement */
        overflow-y: auto;          /* l'ascenseur apparaît si besoin */
        border: 1px solid #aaa;
        padding: 0.3em 0.5em;
        margin-bottom: 1em;
        background: #fff;
    }
    .fenetre-liste ul {
        margin: 0;
        padding-left: 1.2em;
    }
    </style>
    <script>
    (function() {
        var form = document.getElementById('form-listes');
        if (!form) return;
        form.addEventListener('change', function() { form.submit(); });
    })();
    </script>
    <?php if (!empty($choix)): ?>
        <?php if (in_array('Famille', $choix)): ?>
        <h3>Liste des familles</h3>
        <div class="fenetre-liste">
            <ul class="nowrap">
                <?php $plxShow->lastArtList('<li class="#art_status"><a href="#art_url" title="#art_title">#art_title</a></li>', 999, 2, '', 'alpha'); ?>
            </ul>
        </div>
        <?php endif; ?>
        <?php if (in_array('Commune', $choix)): ?>
        <h3>Liste des Communes</h3>
        <div class="fenetre-liste">
            <ul class="nowrap">
                <?php $plxShow->lastArtList('<li class="#art_status"><a href="#art_url" title="#art_title">#art_title</a></li>', 999, 3, '', 'alpha'); ?>
            </ul>
        </div>
        <?php endif; ?>
        <?php if (in_array('Lieu', $choix)): ?>
        <h3>Liste des lieux</h3>
        <div class="fenetre-liste">
            <ul class="nowrap">
                <?php $plxShow->lastArtList('<li class="#art_status"><a href="#art_url" title="#art_title">#art_title</a></li>', 999, 4, '', 'alpha'); ?>
            </ul>
        </div>
        <?php endif; ?>
        <?php if (in_array('Récents', $choix)): ?>
        <h3>Récents</h3>
        <div class="fenetre-liste">
            <ul class="nowrap">
                <?php $plxShow->lastArtList('<li><a class="#art_status" href="#art_url">#art_title</a></li>', 999); ?>
            </ul>
        </div>
        <?php endif; ?>
    <?php endif; ?>
        <a href="https://cegenceb.asso.fr/"><img src="<?php $plxShow->template(); ?>/img/logo_CEGENCEB_2022.png" alt="logo_CEGENCEB_2022.png" width=50%/></a>   
    </aside >
    
  • BKaernelBKaernel Member
    20 oct. modifié

    Mélanger du CSS, du HTLM et du PHP via du JS, je me garderais d'appeler ça une amélioration.
    C'est une tambouille qui marche mais ce n'est pas super orthodoxe ! :) IA style quoi...

  • BodieuBodieu Member

    OK. Ce n'est qu'une maquette opérationnelle. Il conviendrait de réécrire ce programme pour avoir en page statique, un menu à 2 niveaux avec ascenceurs....

  • BodieuBodieu Member

    Merci à Mistral IA ;) pour avoir résolu la gestion d'un menu pour avoir les articles de catégories prédéfinies.
    Le IA français semble être très à l'aise avec Pluxml.

    Il vous faut :

    • créer une page statique
    • écrire dans les pages statiques la liste des catégories souhaitées et le n° d'ordre sous la forme
      Famille = 002
      Lieu = 003
      Commune = 004
      (le numéro 001 n'est pas pris en compte !!!)

    • Choisisser le template : static-categorie.php

    Il faut à préalable charger le fichier static-categorie.php dans le dossier de votre theme :

    <?php
    if(!defined('PLX_ROOT')) { exit; }
    include 'header.php';
    ob_start();
    # --- Les listes sont définies dans le CONTENU de la page statique ---
    # Dans l'admin PluXml (Pages statiques > votre page), le champ « Contenu »
    # doit contenir une ligne par liste, au format :
    #     libellé = identifiant de catégorie
    # Exemple :
    #     Famille = 002
    #     Commune = 003
    #     Lieu = 004
    # (les autres lignes du contenu sont ignorées)
    # On récupère le contenu de la page statique
    ob_start();
    $plxShow->staticContent();
    $contenu = ob_get_clean();
    # On en extrait les lignes « libellé = identifiant » valides
    $cats = $plxShow->plxMotor->aCats;
    $categorie = array();
    foreach (preg_split('/\r\n|\r|\n/', trim(strip_tags($contenu))) as $ligne) {
        $ligne = trim($ligne);
        if ($ligne === '' || strpos($ligne, '=') === false) {
            continue;
        }
        list($libelle, $id) = array_map('trim', explode('=', $ligne, 2));
        if ($libelle !== '' && isset($cats[$id])) {
            $categorie[$id] = $libelle;
        }
    }
    # Choix reçu du formulaire (la valeur du bouton radio = identifiant réel)
    # On lit $_POST : le formulaire passe en POST pour ne pas écraser le
    # paramètre d'URL staticX/... (la réécriture d'URL étant désactivée)
    $choix = isset($_POST['categorie']) ? $_POST['categorie'] : (isset($_GET['categorie']) ? $_GET['categorie'] : '');
    if ($choix !== '' && !isset($categorie[$choix])) {
        $choix = '';
    }
    ?>
    <article class="static" id="static-page-<?php echo $plxShow->staticId(); ?>">
    <form method="post" action="" id="form-listes">
        <p><strong>Choisissez une liste :</strong></p>
        <div class="boite-choix">
        <?php foreach ($categorie as $id => $nom) { ?>
        <label><input type="radio" name="categorie" value="<?php echo $id; ?>"<?php if ($choix === (string)$id) echo ' checked'; ?>> <?php echo $nom; ?></label>
        <?php } ?>
        </div>
    </form>
    <?php if ($choix !== '') : ?>
        <h3>Liste &lt;= <?php echo $categorie[$choix]; ?></h3>
        <div class="fenetre-liste">
            <ul class="nowrap">
                <?php $plxShow->lastArtList('<li class="#art_status"><a href="#art_url" title="#art_title">#art_title</a></li>', 999, $choix, '', 'alpha'); ?>
            </ul>
        </div>
    <?php endif; ?>
                    </article>
    <?php
    include 'footer.php';
    ?>
    <script>
    (function() {
        var form = document.getElementById('form-listes');
        if (!form) return;
        form.addEventListener('change', function() { form.submit(); });
    })();
    </script>
    
Connectez-vous ou Inscrivez-vous pour répondre.