[plugin] kzSkinSelect ou choisir parmi un des thèmes installés

bazooka07bazooka07 PluXml Lead Developer, Moderator
décembre 2022 modifié dans Plugins
Allez, un petit dernier pour finir l'année en beauté.

Suite au passage de bâon dans le staff de PluXml, il y a une grande campagne de test sur différents thèmes.
J'ai également quelques thèmes qui trainent au fond de mon disque.

Mais parmi tous les plugins qui trainent dans la nature, je n'ai pas trouvé chaussure à mon pied comme la Belle au Bois Dormant.
J'ai donc plongé les mains dans le cambouis pour avoir un outil qui va bien : le plugin kzSkinSelect.

Vous pouvez passer en revue tous les thèmes installés sur votre serveur de test sans avoir à utiliser de hook personnalisé. Cool !

- Démonstration chez Free.fr avec PluXml 5.8.9
- Démo de Pluxml
- Démonstration chez AlwaysData

Télécharger la dernière version de ce magnifique plugin kzSkinSelect.
- 2022-12-03: version 1.2.5 - Add hook plxMotorPreChauffageBegin
- 2022-11-11: version 1.2.4 - fix FILTER_SANITIZE_STRING obsolète avec PHP 8.1.0
- 2022-11-01: version 1.2.3 - fix quand un template n'existepas
- 2022-08-23: version 1.2.2 - Fix compatiblité PHP 5.6 et Free.fr
- 2021-11-10 : version 1.2.0 - intégration du sélecteur de thèmes dans la sidebar + download à a volée
- 2021-06-02 : diverses optimisations
- 2018-12-30 : Fix erreur dans .htaccess qui empêche l'affichage de l'icône du plugin
- 2018-12-29 : 1ère publication
«1

Réponses

  • Voilà encore de la belle ouvrage et je vais bien sûr tester cela.
    bazooka07 a écrit:
    Nouveauté : mon dépôt de plugins est également sur Github.

    Tu ne pourrait pas en profiter pour faire sur Github, comme Stéphane, un repository compatible qui me permettrait d'afficher automatiquement tous tes plugins (plus mises à jour) sur les pages de mon centre de ressources ?

    Des exemples ici.

    https://ressources.pluxopolis.net/

    En outre, cela me permettrait, comme quelques autres, d'intégrer tes œuvres dans l'administration de mon nouveau plugin jpbMultidepots qui, greffé sur les dépôts compatibles, propose téléchargement, installation, mises à jour et nouveautés des dépôts sélectionnés.
  • bazooka07bazooka07 PluXml Lead Developer, Moderator
    Cela est différent de ce que faisait Stéphane.

    Là c'est un site entièrement statique généré automatiquement sur mon PC avec mon gestionnaire de dépôt de plugins, thèmes, scripts et plus.

    Une fois généré sur mon PC, je fais un git push origin master pour faire la mise à jour du site en ligne.

    Tu as une doc sur les fichiers que tu as besoin pour ton plugin ou il faut que j'analyse ton code ( pas trop le temps pour l'instant ) ?

    As-tu remarqué que mon dépôt gère les thèmes ?
  • bazooka07 a écrit:
    As-tu remarqué que mon dépôt gère les thèmes ?

    Oui, bien sûr et je vais évaluer ça juste après avoir testé kzSkinSelect.

    En fait, je l'ai déjà récupéré en local et commencé à regarder la source mais il me vient une question qui me titille depuis longtemps. Il y a-il moyen de supprimer du dépôt les plugins/thèmes ?

    Sur ton précédent dépôt, cela était facile mais là, plusieurs fichiers sont impactés par la présence d'un plugin et je n'ai pas encore trouvé (quoi que pas encore cherché) comment retirer les items facilement.

    As-tu prévu quelque chose ?
    Suite au passage de bâon dans le staff de PluXml

    Heu...

    Qui c'est ce bâon ?
  • @ Bakooka07

    kzSkinSelect fonctionne parfaitement et un seul mot. Félicitation ! :)
    Tu as une doc sur les fichiers que tu as besoin pour ton plugin ou il faut que j'analyse ton code ( pas trop le temps pour l'instant ) ?

    J'ai envoyé ça en privé.

    J'attaque l'étude de ton nouveau dépôt.
  • Salut,

    Très bon plugin bazooka07, merci ! :)
  • bazooka07bazooka07 PluXml Lead Developer, Moderator
    décembre 2018 modifié
    @jack31,

    3 principes sont appliqués pour gérer mon dépôt de plugins :
    - un seul fichier index.php à installer. Les dossiers et les fichiers images, CSS, .. sont créés automatiquement à la 1ère visite du site
    - on privilégie le protocole FTP pour administrer le dépôt. On évite ainsi les limites imposés par PHP (taille, vitesse). Et puis, c'est le protocole qui est fait pour.
    - les catalogues de plugins, thèmes sont générés automatiquement : nouveaux plugins, catalogue trop vieux ou absent

    les catalogues des plugins, thèmes, ... sont au format JSON et stockés dans le dossier workdir
    les plugins sont à déposer dans le dossier plugins qui est créé automatiquement à la 1ère visite du site ( on sait gérer un dépôt vide )
    pour les thèmes, c'est le dossier thèmes
    idem pour les scripts

    Si on supprime un plugin dans le dossier plugins, il suffit de supprimer le fichier workdir/plugins.json et le dossier workdir/assets/plugins. Ils seront recréés à la prochaine visite du dépôt.

    les images ( icon.*, preview.* ) sont extraites des archives zip et stockées dans les dossiers workdir/assets/plugins, workdir/assets/thèmes, ... Elles sont renommés avec le nom du plugin ou du thème

    index.php sait générer un site statique pour le stocker dans les pages Github. Certainement aussi chez Gitlab.

    Index.php gére la sécurité CORS pour Javascript. Donc les contraintes imposées par certains hébergeurs sur curl() ou file_get_contents peuvent être contournées en Javascript. Y compris avec api.github.com (V3)
  • Tu devance mes questions Bazooka. :)

    Toujours est-il que ça a l'air de fonctionner au poil et que jusqu’ici, il a l'air bien plus pratique que Repositorix.

    Reste à trouver le moyen d'afficher les plugins/thèmes/scripts dans les pages d'un site comme j'ai si bien réussi sur ressources.pluxopolis.net

    Une petite idée en passant.

    N'y aurait-il pas moyen d'afficher une alerte donnant des derniers plugins/thèmes/scripts intégrés dans le repo ?
  • bazooka07bazooka07 PluXml Lead Developer, Moderator

    Bonjour,

    Petite mise à jour de ce plugin :

    • Optimisation du code
    • Bouton plus discret pour changer le style
    • Optimisation CSS

    Télécharger version 1.1.0

  • bazooka07bazooka07 PluXml Lead Developer, Moderator
    juin 2021 modifié

    Petite mise à jour rapide :

    • certains thèmes n'utilisent pas le fichier site.css généré par PluXml. Donc obligé de styler le CSS en dur dans la page HTML
    • PluCss modifie l'aspect de la balise < summary>. Pas cool !

    Même lien de téléchargement que précédemment.

  • Bonsoir,
    J'aurai souhaité afficher le select de thème en haut de la sidebar, et non pas fixé en bas.
    Est-ce qu'il faut que je modifie le plugin pour ajouter un hook, ou bien la possibilité existe-t-elle déjà?
    Cordialement

  • bazooka07bazooka07 PluXml Lead Developer, Moderator

    Bonjour,
    Le plugin ajoute quelques règles CSS avec le hook "ThemeEndHead()".
    L'affichage se fait en position absolue (display: fixed). Pour déplacer le <select>, il suffit de modifier les valeurs de bottom et right. Eventuellement remplacer bottom ou right par top ou left. 1vh correspond à 1% de la hauteur de la fenêtre du navigateur. A remplacer éventuellement par une valeur en rem.

    L'affichage est indépendant de la sidebar. On a aucune garantie que chaque thème présente la même structure HTML
    Pour intégrer le <select> dans la sidebar, il faut modifier le hook "ThemeEndHead()" et utiliser les expressions régulières pour localiser la sidebar dans le flux html.

  • novembre 2021 modifié

    @cpalo Bonjour,

    Tu peut éventuellement aussi modifier le plugin en faisant usage du hook indexEnd pour rechercher une balise et y inserer le formulaire

    exemple de modification désolé @bazooka07 si j'abime ton code
    raccourcie des modifs: ajout du hook themetag() à la volée et utilisation du hook indexEnd à la place de ThemeEndHead pour cibler toute balise aside (inspirer de hookMyTheme ).

    edit ajout d'une constante pour facilement modifier le tag ou string à accrocher pour y inserer le selecteur de théme

        <?php
    
        if (!defined('PLX_ROOT')) { exit; }
    
        /**
         * Permet à un visiteur de tester les différents styles avec un fichier infos.xml
         * présents dans le dossier de thèmes.
         *
         * La boîte de seélection de thèmes s'affiche en base et à droite du site.
         * Il n'y a aucun hook à ajouter aux thèmes. Activez simplement ce plugin pour vos essais.
         *
         * @author  J.P. Pourrez aka Bazooka07
         * hacked  09/11/2021 G.Cyrille  aka gc-nomade aka gcyrillus 
         * ajout du hook themetag() à la volée et utilisation du hook indexEnd à la place de ThemeEndHead
         * @update  2021-06-02
         * @update  2019-11-27
         * @date    2018-12-29
         * */
        class kzSkinSelect extends plxPlugin {
    
            const PREPEND_TO_TAG ='<aside>';// tag à accrocher - si tous les thèmes dispose d'un conteneur avec la chaine exact :  class="sidebar"> cela fonctionne aussi, 
                    // l'occurance(s) à trouver doit matcher exactement case et espaces.
            const TOKEN = __CLASS__ .'-Token';
            const FIELD_NAME = 'kz-token';
            const HOOKS = array(
                'plxMotorDemarrageBegin',
                'plxMotorDemarrageEnd',
                'ThemeTag',
                'IndexEnd',
                'ThemeEndBody',
            );
            const BEGIN_CODE = '<?php # ' . __CLASS__ . PHP_EOL;
            const END_CODE = PHP_EOL . '?>';
    
            private $__currentTheme = false;
    
            public function __construct($default_lang) {
                parent::__construct($default_lang);
                if(!defined('PLX_ADMIN')) {
                    foreach(self::HOOKS as $hook) {
                        $this->addHook($hook, $hook);
                    }
                }
            }
    
            private function _title_theme($filename) {
                if(function_exists('simplexml_load_file')) {
                    $infos = simplexml_load_file($filename);
                    return trim($infos->title->__toString());
                } else {
                    $parser = xml_parser_create(PLX_CHARSET);
                    xml_parser_set_option($parser, XML_OPTION_CASE_FOLDING, 0);
                    xml_parser_set_option($parser, XML_OPTION_SKIP_WHITE, 0);
                    if(xml_parse_into_struct($parser, file_get_contents($filename), $values, $tags) == 1) {
                        xml_parser_free($parser);
                        if(!empty($tags['title'])) {
                            $k = $tags['title'][0];
                            return $values[$k]['value'];
                        }
                    }
                }
                return 'No-title';
            }
    
            /**
             * Traitement du hook plxMotorDemarrageBegin.
             * */
            public function getThemes($themesRoot, $currentTheme) {
                $themes = array();
                // On collecte les thèmes disponibles sur le site
                $pattern = PLX_ROOT . $themesRoot . '*/infos.xml';
                foreach(glob($pattern) as $filename) {
    
                    $root = preg_replace('@/infos.xml$@', '', $filename);
                    $folder = basename($root);
                    $caption = self::_title_theme($filename);
                    if(strtolower($caption) != strtolower($folder)) {
                        $caption .= " ($folder)";
                    }
                    // Tague les thèmes sans aperçu
                    $mark = ' *';
                    foreach(array('jpg', 'jpeg', 'png', 'gif') as $ext) {
                        if(file_exists($root."/preview.$ext")) {
                            $mark = '';
                            break;
                        }
                    }
                    $themes[$folder] = $caption.$mark;
                }
    
                if(count($themes) > 1) {
                    // Plusieurs thèmes sont disponibles
                    asort($themes);
                    $this->__themes = $themes;
                    $this->__currentTheme = $currentTheme;
    
                    $options = array(
                        'options' => array('regexp' => '@^[\da-z]{40}@i')
                    );
                    if(filter_has_var(INPUT_POST, __CLASS__)) {
                        if(isset($_SESSION[self::TOKEN])) {
                            if(
                                empty($_POST[self::FIELD_NAME]) or
                                filter_input(INPUT_POST, self::FIELD_NAME, FILTER_VALIDATE_REGEXP, $options) === false
                            ) {
                                return false;
                            }
    
                            $key = $_POST[self::FIELD_NAME];
                            if(isset($_SESSION[self::TOKEN][$key]) and intval($_SESSION[self::TOKEN][$key]) < time()) {
                                unset($_SESSION[self::TOKEN]);
                                die('Security error : invalid or expired token');
                            }
                            unset($_SESSION[self::TOKEN][$key]);
                            // On change de thème
                            $value = filter_input(INPUT_POST, __CLASS__, FILTER_SANITIZE_STRING);
                            if(!empty($value) and array_key_exists($value, $themes)) {
                                $this->__currentTheme = $value;
                                $_SESSION[__CLASS__] = $value;
                                return $value;
                            }
                        }
                    } elseif(!empty($_SESSION[__CLASS__])) {
                        // On récupère le précèdent choix du visiteur et on l'active s'il existe.
                        $value = $_SESSION[__CLASS__];
                        if(array_key_exists($value, $themes)) {
                            $this->__currentTheme = $value;
                            return $value;
                        }
                    }
                }
    
                return false;
            }
    
            /* ============== Hooks ========================= */
    
            /**
             * Analyse de la situation.
             * valide le choix d'un thème par le visiteur.
             * En mode article, interdit les commentaires dans ce cas précis.
             *
             * Dans le cas contraire, reprend le choix précèdent du visiteur stocké dans une variable de session.
             * */
            public function plxMotorDemarrageBegin() {
                echo self::BEGIN_CODE;
        ?>
        $value = $this->plxPlugins->aPlugins['<?= __CLASS__ ?>']->getThemes(
            $this->aConf['racine_themes'],
            $this->style
        );
    
        if(!empty($value)) {
            $this->style = $value;
        }
    
        if($this->mode == 'article' and filter_has_var(INPUT_POST, '<?= __CLASS__ ?>')) {
            $<?= __CLASS__ ?>Coms = $this->aConf['allow_com'];
            $this->aConf['allow_com'] = false;
        }
    
        # PluXml doit poursuivre son traitement
        return false;
        <?php
                echo self::END_CODE;
            }
    
            /**
             * En mode article, restitue l'autorisation des commentaires.
             * */
            public function plxMotorDemarrageEnd() {
                if(empty($this->__currentTheme)) {
                    # Un seul thème disponible. Retour au fonctionnment standard
                    return;
                }
    
                echo self::BEGIN_CODE;
        ?>
        if(isset($<?= __CLASS__ ?>Coms)) {
            # On restaure l'autorisation des commentaires
            $this->aConf['allow_com'] = $<?= __CLASS__ ?>Coms;
        }
        <?php
                echo self::END_CODE;
            }
    
            /**
             * Quelques rèegle de style CSS
             * */
            public function ThemeEndHead() {
                if($this->__currentTheme === false) { return; }
        ?>
                <style type="text/css">
                    #kzSkinSelect-wrapper {
                        display: block;
                        position: fixed;
                        bottom: 1vh;
                        right: 2rem;
                        padding: 0.25rem;
                        background-color: #bfb658;
                        color: #000;
                        font-family: 'Noto Sans', Arial, Sans-Serif;
                        font-size: 12pt;
                        border-radius: 0.3rem;
                        -webkit-appearance: initial;
                        z-index: 9999;
                    }
    
                    #kzSkinSelect-wrapper summary {
                        display: list-item;
                    }
    
                    #kzSkinSelect-wrapper select {
                        margin: 0;
                        background-color: #fff;
                    }
                </style>
        <?php       
            }
    
    
    
            public function IndexEnd() {
                    $prependToTag = self::PREPEND_TO_TAG;   
                    echo '<?php ';?>
                        ob_start();
                        eval($plxMotor->plxPlugins->callHook('ThemeTag')); # Hook Plugins  
                        $output = str_replace('<?php echo $prependToTag; ?>', ob_get_clean(), $output);
                 ?>
                  <?php 
                }
            public function ThemeTag() {
    
                echo self::PREPEND_TO_TAG ;
                if($this->__currentTheme === false) { return; }
    
                $token = sha1(mt_rand(0, 1000000));
                $_SESSION[self::TOKEN][$token] = time() + 3600; // Date limite pour le token
            ?>
                    <details id="<?= __CLASS__ ?>-wrapper">
                        <summary>Style</summary>
                        <form method="post">
                            <input name="<?= self::FIELD_NAME; ?>" value="<?= $token; ?>" type="hidden" />
        <?php plxUtils::printSelect(__CLASS__, $this->__themes, $this->__currentTheme); ?>
                        </form>
                    </details>
                    <script type="text/javascript">
                        (function() {
                            'use strict';
                            const details = document.getElementById('<?= __CLASS__ ?>-wrapper');
                            const select = document.getElementById('id_<?= __CLASS__ ?>');
    
                            if(details == null || select == null) { return; }
    
                            select.autofocus = true;
                            select.onchange = function(event) {
                                event.preventDefault();
                                if(select.value.trim() != '') {
                                    select.form.submit();
                                }
                            }
                        })();
                    </script>
    
                <?php
            }
        }
    
    

    HS La mise en forme générale sur le forum est vraiment galère ... on en arrive a ne plus savoir s'il faut utiliser du html , du markdown ou un mixe des deux , ni lesquels fonctionnent ensemble selon le moment ou l'on post , j'ai même des post qui ne prennent que le json au moment de la réedition , ça rend un peu schizo, non ?


    Cordialement,
    gcyrillus , simple membre du forum et utilisateur de pluxml

    Mon site PluXml: https://re7net.com | Plugins: https://ressources.pluxopolis.net/banque-plugins/index.php?all_versions | demos sur free http://gcyrillus.free.fr/new | Thèmes: tester et télécharger @ https://pluxthemes.com
    Indiquez [RESOLU] dans le titre de votre question une fois le soucis réglè, Merci

  • Je voyais plutôt quelque chose comme :-1:

    <?php eval($plxShow->callHook('plxShowSkinSelect')) ?>
    

    ou dans une page statique

    <?php echo plxUtils::strCheck('<?php
    global $plxShow;
    eval($plxShow->callHook("plxShowSkinSelect"));
    ?>
    ');
    ?>
    
  • novembre 2021 modifié

    Ce que tu décris est la façon dont est codé pour être utiliser le plugin https://github.com/Pluxopolis/plxMySkinSelect ou le plugin https://github.com/Pluxopolis/plxMySearch , ce n'est pas le cas du plugin de bazooka qui intègre le formulaire à partir du hook ThemeEndBody() , donc invariablement juste avant la fermeture de body , sauf a utiliser le hook IndexEnd et modifier et redévelopper le plugin en conséquences. Le plugin de bazooka est développer pour ceux qui ne veulent ou ne savent pas mettre les mains et la souris dans le code ;)

    La modification que j'ai faites dans le post précédent , n'a changer que le hook utilisé et mis une constante aisément modifiable en debut de script pour t'aider à trouver la chaine la plus pertinente (une balise, une chaine de mots,..) dans tes thèmes pour injecter le sélecteur de thèmes de bazooka07. Je n'ai rien redévelopper, juste tordu un peu avec 2 coups de marteau. peut-etre devrait tu simplement utilise le plugin plxMySkinSelect .. en le reinjectant manuellement dans chacun des thème :(

    cdt


    Cordialement,
    gcyrillus , simple membre du forum et utilisateur de pluxml

    Mon site PluXml: https://re7net.com | Plugins: https://ressources.pluxopolis.net/banque-plugins/index.php?all_versions | demos sur free http://gcyrillus.free.fr/new | Thèmes: tester et télécharger @ https://pluxthemes.com
    Indiquez [RESOLU] dans le titre de votre question une fois le soucis réglè, Merci

  • cpalocpalo Member
    novembre 2021 modifié

    Si j'ai cela en début dans ma sidebar, comment dois-je modifier ton code pour que cela fonctionne.

    <div class="sidebar">
        <div class="block-skin-select">
        Affichage du selecteur de thème
    

    Dans ton code, petite erreur car tu as laissé le css initial ce qui fait apparaitre le selecteur fixé en bas comme dans le plugin original

  • cpalocpalo Member
    novembre 2021 modifié

    L'interêt de kzSkinSelect par rapport à plxMySkinSelect c'est justement le fait qu'on n'ait pas besoin de modifier les thèmes qu'on veut tester.
    Mais effectivement si on veut qu'il soit toujours visible quelque soit le thème, il faut que son affichage ne soit pas lié à un thème.

  • novembre 2021 modifié

    pour placer le selecteur dans <div class="block-skin-select"> il te suffit juste de recopier ce morceau dans la constante ou il y a pour le moment <aside>.

    Pour le CSS, il se trouve injecter dans la fonction public function ThemeEndHead() {} .Tu peut le réecrire ou mettre un lien direct vers une feuille de style à la palce du html/css injecté.

    Tu peut aussi , le vider, voir retirer ce hook du plugin et injecter tes styles dans la config CSS du plugin coté site si tu utilises une version récente de PluXml.
    Cdt


    Cordialement,
    gcyrillus , simple membre du forum et utilisateur de pluxml

    Mon site PluXml: https://re7net.com | Plugins: https://ressources.pluxopolis.net/banque-plugins/index.php?all_versions | demos sur free http://gcyrillus.free.fr/new | Thèmes: tester et télécharger @ https://pluxthemes.com
    Indiquez [RESOLU] dans le titre de votre question une fois le soucis réglè, Merci

  • bazooka07bazooka07 PluXml Lead Developer, Moderator

    Effectivement il faut utiliser le hook ThemeEndBody pour ne pas avoir à modifier tous les thèmes.
    La difficulté est de reconnaitre la sidebar principale dans le contenu généré par PluXml ($output dans index.php)
    Comme il n'y a jamais de recommendation officielle, c'est un peu la foire aux aveugles. Donc on recherche une <aside> ou <div> qui répond à une des conditions suivantes:

    • un id égal à aside ou sidebar, éventuellement avec le préfixe "site-" ou "main-"
    • une class qui contient aside ou sidebar, éventuellement avec le préfixe "site-" ou "main-"

    En cas d'échec, on affiche le sélecteur comme avant, en bas et à droite de la fenêtre. Pour rappel un article peut être affiché sans sidebar.

    En bonus, on peut créer à la volée l'archive zip du thème affiché et la télécharger.
    Télécharger la version 1.2.0 du plugin
    Voir la démo

  • Bonsoir,
    @bazooka07
    Merci pour cette version 1.2 du plugin.
    Je viens de l'installer et la tester rapidement.
    A-priori pas de bug et ça me plait bien.
    @gcyrillus-nomade
    Merci à toi aussi pour ton aide et de cet échange.
    Cela m'a permis de mettre un peu plus les mains dans le "cambouis" et d'apprendre.
    Cordialement

  • Bonjour,
    Actuellement:

    # recherche d'une sidebar principale dans la page html 
        const PATTERNS = array(
            # préférence à l'id
            '#(<(?:div|aside)\b[^>]*\sid="(?:main-|site-)?(?:aside|sidebar)\b[^"]*"[^>]*>)#i', # on cherche un id
            '#(<(?:div|aside)\b[^>]*\sclass="[^"]*\b(?:main-|site-)?(?:sidebar|aside)\b[^"]*">)#i', # on cherche un class
        );
    

    Par rapport à la difficulté de reconnaitre la sidebar principale, ou même l'endroit à insérer dans la sidebar, ne serait-il pas possible d'imposer la création d'un bloc du style

    <div class="block-skinselect" id="skinselect"></div>
    

    Et ensuite à l'intégrateur de placer ce bloc à l'endroit souhaité?

  • bazooka07bazooka07 PluXml Lead Developer, Moderator

    Bonjour,
    Je ne peux pas imposer aux thèmes existants un bloc comme tu le suggères.
    Au mieux, je peux élargir le champ des possibilités sur la structure des pages html générées :

    <?php
    # ...........
    const PATTERNS = array(
            # préférence à l'id
            '#(<div\b[^>]*\sid="(?:kz)?skinselect"[^>]*>)#i',
            '#(<(?:div|aside)\b[^>]*\sid="(?:main-|site-)?(?:aside|sidebar)\b[^"]*"[^>]*>)#i', # priorité aux "id"
            '#<div\b[^>]*\sclass="[^"]*\b(?:kz)?skinselect\b[^"]*">)#i',
            '#(<(?:div|aside)\b[^>]*\sclass="[^"]*\b(?:main-|site-)?(?:sidebar|aside)\b[^"]*">)#i', # on se rabat sur les class
    );
    # ..........
    ?>
    

    Je ne suis pas sûr qu'il y aura beaucoup d'intégrateurs qui feront l'effort de mettre une <div> avec id ou class égaux à "skinselect".
    Par contre, les intégrateurs devraient faire l'effort d'intégrer dans leurs "œuvres" une <div> ou une <aside> avec un id égal à main-sidebar ou site-sidebar.

  • Je me suis mal exprimé; loin de moi de vouloir imposer un tel bloc... peut-être qu'on pourrait prévoir dans la page de config du plugin un choix permettant de choisir la balise et le nom de cette balise pour le contenant.
    Dans mes thèmes j'utilise déjà site-sidebar, donc pas de problème .
    Mais actuellement le plugin l'affiche automatiquement en tête de sidebar dès qu'il rencontre un bloc ayant une classe ou une id telles que tu les as définies.
    Tandis qu'en définissant un bloc tel que je le souhaite, on aurait plus de possibilités pour son affichage:
    un bloc pour le positionnement et un élément (form) pour l'apparence et le contenu .
    D'ailleurs c'est déjà ce que tu as dans ta seconde solution avec le kzSkinSelect-wrapper.

    je viens de tester ton code.. cela provoque une page blanche dès l'accueil du site.

  • bazooka07bazooka07 PluXml Lead Developer, Moderator
    février 2022 modifié

    Oups, il manque une parenthèse à la 3ème ligne du tableau. Je n'avais pas pris le temps de tester et évidemment ça bugue.

    <?php
    # .......
            const PATTERNS = array(
                    # préférence à l'id
                    '#(<div\b[^>]*\sid="(?:kz)?skinselect"[^>]*>)#i',
                    '#(<(?:div|aside)\b[^>]*\sid="(?:main-|site-)?(?:aside|sidebar)\b[^"]*"[^>]*>)#i', # on cherche un id
                    '#(<div\b[^>]*\sclass="[^"]*\b(?:kz)?skinselect\b[^"]*">)#i',
                    '#(<(?:div|aside)\b[^>]*\sclass="[^"]*\b(?:main-|site-)?(?:sidebar|aside)\b[^"]*">)#i', # on cherche un class
            );
    # ......
    ?>
    

    Je préconise d'utiliser un "id". Avec le bloc de code suivant, tu peux installer le sélecteur de thèmes où tu veux :

    <div id="kzSkinSelect"></div>
    

    Le plugin se charge d'ajouter un enfant à <div> pour afficher le sélecteur et un bouton pour télécharger l'archive zip du thème sélectionné.
    Pour l'apparence, c'est plus compliqué car j'ai eu des soucis avec certains thèmes. C'est pourquoi les règles CSS sont "inline" pour être les plus prioritaires. Je n'aime pas trop cette méthode mais je n'ai rien trouvé de plus fiable.

  • cpalocpalo Member
    février 2022 modifié

    Bonsoir,
    Je continuerai à tester car doutes par rapport à certains thèmes .. mais à vérifier
    Par contre,par exemple, sur defaut-enhanced cela fonctionne nickel.
    Merci

  • cpalocpalo Member
    février 2022 modifié

    Bonjour,
    Je viens de tester avec différents thèmes sur une installation "vierge" de PluXml. c'est OK
    y compris avec 2-3 personnalisations au niveau du style.
    La version "aside site-sidebar...." ne me satisfaisait pas trop car en plus on peut avoir plusieurs aside ou sidebar, et suivant les versions mobiles...
    tandis que l'id qu'on peut placer où l'on veut --> permet de l'intégrer tel qu'on le thème dans le thème qu'on réalise,
    pendant que le test1 (aside site-sidebar..) ou à défaut un bloc fixé en dehors du layout.. permet que le skinSelect reste disponible dans les thèmes qu'on teste sans avoir à le smodifier au préalable...
    C'est super.
    Merci

  • bazooka07bazooka07 PluXml Lead Developer, Moderator

    Bonjour,
    version 1.2.3
    Petite correction pour gérer l'absence d'un template, par exemple home-999.php, dans un thème.
    On supprime le cookie $_SESSION['kzSkinSelect'] pour retourner au thème avant sélection par le visiteur.

  • Bonjour
    Après cette mise à jour, j'ai le message d'erreur suivant::

    Deprecated: Constant FILTER_SANITIZE_STRING is deprecated in F:\htdocs\myPluXml\plugins\kzSkinSelect\kzSkinSelect.php on line 167

  • bazooka07bazooka07 PluXml Lead Developer, Moderator

    Bonjour,
    Depuis la version 8.1.0 de PHP FILTER_SANITIZE_STRING est devenu obsolète. Sniff !!!
    https://www.php.net/manual/fr/filter.filters.sanitize.php
    Je vais faire une mise à jour.

  • bazooka07bazooka07 PluXml Lead Developer, Moderator
    novembre 2022 modifié

    @cpalo
    Remplace la ligne contenant FILTER_SANITIZE_STRING par :

    $value = htmlspecialchars($_POST[__CLASS__], ENT_COMPAT | ENT_HTML5);
    

    Cela semble faire le taff.

  • Bonsoir
    A-priori ça régle le problème. Je n'ai plus le message d'erreur.
    Merci

Connectez-vous ou Inscrivez-vous pour répondre.