Sécurité - Limiter l'accès au blog

Bonjour à toutes et à tous,
Je dois réaliser un petit site scolaire à destination des familles qui sera composé de quelques pages statiques d'informations publiques et d'une sorte de magazine (la partie blog de PluXml en fait) accessible aux seuls parents d'élève(s).
Comment faire pour réserver l'accès au blog à une liste modifiable de visiteurs soit environ quatre cents personnes qui auront chacune un identifiant et un code d'accès personnels ?
Sauf erreur de ma part, le greffon MyPrivateStatic ne fonctionne pas dans ce cas.
Un fichier htaccess serait-il la solution la plus simple et où faudrait-il l'installer ?
Merci.

Mots clés:

Réponses

  • cpalocpalo Member
    septembre 2021 modifié

    Bonjour,
    J'avais fait un petit site (il faudrait que j'en fasse une mise à jour !!) à partir du plugin de Brieucs.
    Cela fonctionnait bien et pourrait correspondre à ce que tu recherches
    Cordialement
    https://forum.pluxml.org/discussion/6003/rendre-prive-un-site#latest

  • lubinlubin Member
    septembre 2021 modifié

    Bonjour,
    Je pense que c’est à vous, notamment en tant que modérateur de paramétrer cela et de spécifier les personnes ayant accès au blog.

  • AmadeusAmadeus Member
    septembre 2021 modifié

    Bonjour à toutes et tous,

    Merci Cpalo.
    Je vais tester le greffon si c'est possible avec la version actuelle de PluXml. Plusieurs liens sont cassés sur les pages indiquées mais j'ai pu aller sur le site de Brieucs.

    Merci également d'avoir répondu Lubin.
    Cependant il me semble maintenant que mes explications étaient quelque peu incomplètes.
    Pour le site scolaire en projet, les personnes autorisées à lire le magazine (le blog donc) ne seront jamais des rédacteurs mais uniquement des parents-lecteurs identifiés. Il n'y aura pas de forum non plus.

    Je dois trouver une solution pour autoriser l'accès aux pages d'information générales (de simples pages statiques: accueil et cinq rubriques) à des visiteurs non identifiés ET réserver l'accès aux articles du magazine scolaire (la partie blog toujours) à une liste de parents qui auront reçu chacun un identifiant et un mot de passe personnels qui leur sera demandé lorsqu'ils cliqueront sur le lien/onglet Magazine du menu.
    Pour info, ça fait quand même une liste de 350 à 400 parents !

    L'accès à la rédaction est réservé aux auteurs/rédacteurs des articles.

    Question: SI un fichier htaccess était la seule solution, comment faire pour qu'il ne contrôle que l'accès au blog et laisse libre accès aux pages statiques qui doivent être visibles par tous ?

    Merci encore d'avoir pris le temps de me lire.
    Bonne journée !

  • octobre 2021 modifié

    Bonjour,

    Le squelette de plugin proposé ici à laisser place a un plugin étoffé : VIP ZONE

    https://github.com/gcyrillus/PLX_VIP_ZONE/archive/refs/heads/main.zip

    voir le sujet https://forum.pluxml.org/discussion/7056/plugin-vip-zone-options-de-privatisation-de-votre-pluxml

    cliquer sur détails pour voir le post original.


    ⚠️ edit mise à jour du plugin pour effectivement bien rediriger vers la page initialement demandée 22/09/2021 ⚠️ ZIP


    si cela t’intéresse, je viens de fait un plugin (avec plx v 587) qui te permet de créer un nouveau type de profil dans l'admin (PROFIL_VISITOR) qui une fois loguer est renvoyé sur la racine du site si il y a une tentative d'accéder à l'admin au lieu d'une page du site.

    Une modification des fichiers de ton/tes thème(s) concernant : article.php , article-full-width.php ,categorie.php et categorie-full-width.php avec ce morceau de code suivant est à faire pour filtrer les visiteurs coté catégorie/articles (ou autres page du thème que tu souhaites soumettre a une authentification avant consultation, si pour une page statique, alors il suffit d’insérer ces codes dans la page statique en édition sans avoir à toucher aux fichiers du thèmes):

    <?php if($_SESSION['profil']!='') {}
    else {header('Location: /core/admin/auth.php?page='.$_SERVER['REQUEST_URI']);}
    ?>
    

    Ce code, si présent dans ton thème (ou une page statique), renverra l'utilisateur pas loguer vers le formulaire de connexion en le redirigeant ensuite sur la page d’où il venait.

    le code du plugin pour ceux qui ne veulent pas aller voir sur git-hub : https://github.com/gcyrillus/visitor

    <?php
        if(!defined('PLX_ROOT')) {
            die('oups!');
        }
    
        class visitor extends plxPlugin {
            const HOOKS = array(
                'AdminPrepend',
                'AdminTopEndHead',
                'AdminUsersTop',
                'AdminAuthEndHead',
            );
            const BEGIN_CODE = '<?php' . PHP_EOL;
            const END_CODE = PHP_EOL . '?>';
    
            public function __construct($default_lang) {
            # appel du constructeur de la classe plxPlugin (obligatoire)
            parent::__construct($default_lang);
    
                # Ajoute des hooks
                foreach(self::HOOKS as $hook) {
                    $this->addHook($hook, $hook);
                }
    
               # droits pour accéder à la page config.php et admin.php du plugin
               $this->setConfigProfil(PROFIL_ADMIN);
               $this->setAdminProfil(PROFIL_ADMIN);
            }
    
    
    
                    public function AdminPrepend() {
                echo self::BEGIN_CODE;
    ?>
             const PROFIL_VISITOR = 5;  
    <?php
                echo self::END_CODE;
            }
    
         public function OnDeactivate() {
                # code exécuter à la désactivation du plugin , désactive les comptes Visiteurs.
    
                $deactivateVisitors=simplexml_load_file(PLX_ROOT.PLX_CONFIG_PATH."users.xml") or die("Error: Cannot create object");
                foreach($deactivateVisitors->children() as $users) {
                  if ( $users['profil'] =='5') {
                  $users->attributes()->delete = '1';
                  }
                } 
                $deactivateVisitors->asXml(PLX_ROOT.PLX_CONFIG_PATH."users.xml");
        }
    
            public function AdminTopEndHead() {
                echo self::BEGIN_CODE;
    ?>
                if(isset($_SESSION['profil']) and $_SESSION['profil'] == '5') { header("location: ".$_COOKIE['page']);} 
    <?php
                echo self::END_CODE;
            }
    
            public function AdminUsersTop() {
                echo self::BEGIN_CODE;
    ?>
                # Tableau des profils
                $aProfils = array(
                    PROFIL_ADMIN => L_PROFIL_ADMIN,
                    PROFIL_MANAGER => L_PROFIL_MANAGER,
                    PROFIL_MODERATOR => L_PROFIL_MODERATOR,
                    PROFIL_EDITOR => L_PROFIL_EDITOR,
                    PROFIL_WRITER => L_PROFIL_WRITER,
                    PROFIL_VISITOR => L_PLUGINS_REQUIREMENTS_NONE  // affiche aucun en fr à partir des fichiers lang de PluXml
                );
    
    <?php
                echo self::END_CODE;
            } 
    
            public function AdminAuthEndHead() {
                echo self::BEGIN_CODE;
    ?>
                if(isset($_GET['page'])) {setcookie("page",   $_GET['page']) ;}
    <?php
                echo self::END_CODE;
            }
        }
    

    A voir comme une premiere version stable bêta et une preuve de concept plutôt qu'un plugin aboutit.

    Pour le tester, je te conseille de le faire à partir de 2 navigateurs, l'un comme visiteur et l'autre comme admin . Une fois un visiteur connecté, il n'y a plus d’accès à l'admin pour se déconnecter en l'état actuel de la bêta ;)

    Pour se déconnecter : On peut modifier le thème dans le fichier footer.php sur la ligne avant la balise </footer>, en y insérant ce lien de déconnexion, .

    <?php   if(isset($_SESSION['profil']) and $_SESSION['profil'] == '5') { echo '<a href="/core/admin/auth.php?d=1" class="alert orange">Deconnexion</a>' ;}   ?>
    

    Maintenant 350 à 400 utilisateurs, ça fait chaud à saisir !

    Je ne crois pas que tu puisse filtrer un type d'url avec un seul fichier .htpasswd

    si l'anglais ne te rebutes pas : il ya https://stackoverflow.com/questions/14603568/password-protect-a-specific-url qui peut t’intéresser et complément en français http://httpd.apache.org/docs/current/howto/auth.html et http://aspirine.org/htpasswd.html

    Cordialement

    edit
    fichier config.php , utilise un fichier csv pour mettre à jour de longue liste de nouveaux utilisateur - respecter le format et garder la premiere ligne en entête

    <?php if(!defined("PLX_ROOT")) exit; 
    
    //$plxPlugin->setParam('param2', $_POST['param2'], 'string');
    // configuation : fait un backup du fichier users.xml et enregistre la date de configuration
        if (!file_exists(PLX_ROOT.PLX_CONFIG_PATH.'users.xml.bak')) {
            $file = PLX_ROOT.PLX_CONFIG_PATH.'users.xml';
            $newfile = PLX_ROOT.PLX_CONFIG_PATH.'users.xml.bak';
    
            if (!copy($file, $newfile)) {
                echo "La copie $file du fichier a échoué...\n";
            }
            else {
                $jour = date("d/m/Y");
            $plxPlugin->setParam('set', '<p class="alert yellow"> '.PLX_ROOT.PLX_CONFIG_PATH.'<b>users.xml.bak </b> <i style="color:green"> - '.L_SAVE_FILE_SUCCESSFULLY.' - <b>'.$jour. '</b></i></p>', 'cdata');
            $plxPlugin->saveParams();
            header('Location: parametres_plugin.php?p='.$plugin);
            exit;
            }
        }
    
    if  (@($open = fopen(PLX_PLUGINS.$plugin."/username.csv", "r")) !== FALSE) {
         $fileCsv = file_get_contents(PLX_PLUGINS.$plugin."/username.csv", true);
    }
    else {
        $open = fopen(PLX_PLUGINS.$plugin."/username.csv", "w") ;
        $fileCsv="login ; name ; password ; email\n";
        fwrite($open, $fileCsv);
        fclose($open);
    }
    
    
    
      if(!empty($_GET['ploc'])) {     
        $fileupdate = fopen(PLX_PLUGINS.$plugin."/username.csv", "w")  ;
        fwrite($fileupdate, $_POST['csv']);
        $fileCsv=$_POST['csv'];
        fclose($fileupdate);      
        updateFromCsv(); 
      }
    
        echo '
        <header style="display:flex;align-items:center;gap:1em;"><h2 style="margin:auto 0;">'.L_CONFIG_USERS_UPDATE.'</h2>
        <p class="alert orange" style="margin:0;flex:1;"><b>'. L_PROFIL.':</b> '.L_ADMIN.' == '.L_NO_ENTRY.'</p></header>
        <form action="parametres_plugin.php?p='.$plugin.'&ploc=envoyer" method="post" style="margin:2em;">
        <label for="csv"><b>'.L_COMMENT_EDIT.':</b><br> '.L_MEDIAS_FILENAME.' :<code>username.csv</code> <br> '.L_MEDIAS_DIRECTORY.' <code>/plugins/visitor</code>. </label>
        <textarea name="csv" style="width:100%;height:200px;" name="csv" >'.  $fileCsv . '</textarea>
        <br>
        <input value="'.L_SAVE_FILE.' username.csv & '.L_CONFIG_USERS_UPDATE.'" type="submit">
        </form>';
        echo '<p>'.L_MEDIAS_DOCUMENTS .' & '.L_MEDIAS_DIRECTORY .'</p>';
        echo '<ol><li>'.PLX_ROOT.PLX_CONFIG_PATH.'<b>users.xml</b></li><li>' ;
        echo $plxPlugin->getParam('set').'</li><li>' ;
        echo PLX_PLUGINS.$plugin."/<b>username.csv</b></li></ol>";  
    
    
    class SimpleXMLExtended extends SimpleXMLElement {
    // from https://web.archive.org/web/20110223233311/http://coffeerings.posterous.com/php-simplexml-and-cdata 
      public function addCData($cdata_text) {
        $node = dom_import_simplexml($this); 
        $no   = $node->ownerDocument; 
        $node->appendChild($no->createCDATASection($cdata_text)); 
      } 
    }
    function updateFromCsv() {
    
    // on verfie que nos fichiers sont accessibles
    if ((file_exists(PLX_ROOT.PLX_CONFIG_PATH.'users.xml')) && (($open = fopen(PLX_PLUGINS."visitor/username.csv", "r")) !== FALSE) ) {
    
    
    
    
    
        // on commence avec le fichier csv  
        while (($data = fgetcsv($open, 1000, ";")) !== FALSE)     {        
          $array[] = $data; 
        }  
        fclose($open);
    
        // on recupere le fichier XML
        $xml = file_get_contents(PLX_ROOT.PLX_CONFIG_PATH.'users.xml', true);
    
        // on charge le fichier xml
        $doc = new SimpleXMLExtended($xml); 
        // on compte les enregistrements
        $kids = $doc->children();
        $nbUser = count($kids);
    
    
      // on boucle sur les lignes du fichiers CSV pour récuperer les données et les ajouter aux données existantes 
    
    foreach($array as $i => $line){ 
    
    
            if($i >0) { // on passe la premiere ligne ou sont  stockées les entêtes de colonnes.
                      $nbUser++;
    
                //foreach($line  as $key => $value){
    
    
                $element = $doc->addChild('user'); 
                $element->addAttribute('number', str_pad($nbUser, 3,'0', STR_PAD_LEFT)  );
                $element->addAttribute('active', '1' );
                $element->addAttribute('profil', '5' );
                $element->addAttribute('delete', '0' );  
    
                $login = $element->addChild('login'); 
                $login->addCData($line[0]); 
    
                $name = $element->addChild('name'); 
                $name->addCData($line[1]); 
    
                $infos = $element->addChild('infos'); 
                $infos->addCData(''); 
    
        //$salt='';
        $salt = plxUtils::charAleatoire(10);
    
        //$pwd=$line[2];
        $pwd=sha1($salt.md5($line[2]));         
    
                $password = $element->addChild('password'); 
                $password->addCData($pwd); 
    
    
                $salted = $element->addChild('salt'); 
                $salted->addCData($salt); 
    
                $email = $element->addChild('email'); 
                $email->addCData($line[3]); 
    
                $lang = $element->addChild('lang'); 
                $lang->addCData('fr'); 
    
                $password_token = $element->addChild('password_token'); 
                $password_token->addCData(''); 
    
                $password_token_expiry = $element->addChild('password_token_expiry'); 
                $password_token_expiry->addCData(''); 
                //}
    
           }
          }
                //On refait l'indentation du fichier  parceque c'est plus joli
                $xmlDoc = new DOMDocument ();
                $xmlDoc->preserveWhiteSpace = false;
                $xmlDoc->formatOutput = true;
                $xmlDoc->loadXML ( $doc->asXML() );
                // on sauvegarde le fichier xml mis à jour.
                $xmlDoc->save(PLX_ROOT.PLX_CONFIG_PATH.'users.xml');
                $nbUser = $nbUser -2 ;
    echo '<p class="alert green ">'.L_SAVE_SUCCESSFUL. ' - '.L_CONFIG_USERS_NEW.' <b> '.$nbUser  .'</b></p>';
    
        } else {
            exit(L_SAVE_FILE_ERROR.' user.xml / username.csv.');
        }
    }
    
    ?>
    
    
    


    description du plugin sur github https://github.com/gcyrillus/plx-log-visitor#readme

    N’hésitez pas a forker et commenter.

    Cdt GC


    Cordialement,
    gcyrillus

    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

  • Bonjour à toutes et tous,

    Merci gcyrillus-nomade.
    Je vais suivre tes instructions et regarder le résultat avec attention avant de revenir vers toi pour te faire un retour de mon expérience dès que possible.

    Ce serait peut-être une piste pour le développement de PluXml dont je me sers depuis septembre 2015 pour toutes ses qualités.

    Un statut de Visiteur pourrait être ajouté en natif à la liste des statuts d'utilisateur du site. Ce statut permettrait d'accéder à une zone restreinte du site public qui devrait être préalablement définie par l'administrateur du site.
    Ce Visiteur identifié serait alors autorisé à lire les textes publiés dans la zone protégée par l'accès restreint ( blog complet dans mon cas, ou une rubrique et ses sous-rubriques par exemple) sans jamais accéder à la partie Administration ni pouvoir écrire ou modifier quoi que ce soit.

    En ce qui concerne la saisie des données afférentes à cette catégorie de bénéficiaires de l'accès restreint, ne pourrait-on pas simplement imaginer exporter dans la feuille users.xml (dossier data/configuration/users.xml) les données d'un fichier CSV comportant toutes les entêtes requises dans la page de gestion des utilisateurs de PluXml ?
    De cette manière, la saisie d'un grand nombre d'utilisateurs ne serait plus un problème.

    Tout cela est peut-être plus facile à dire qu'à faire ?

    Merci encore et bon week end.

  • septembre 2021 modifié

    Et bien si tu as un fichier CSV, il devrait être possible a l'aide d'un script de passer tout ça en XML en respectant la structure du fichiers users.xml de PluXml avec le profil PROFIL_VISITOR .

    as tu un exemple de CSV a partager avec des noms et mdp amusants ?

    Pas sur que j'en fasse quelque chose, si se greffer à PluXml me semble trop compliquer pour ce genre de chose . L'idée serait d'automatiser l'ajout d'utilisateur en se servant de ce qui existe déjà (il y a peut-être déjà tout les hooks aux endroits nécessaire).
    j'ai une base pour un CSV a parser et à ajouter à users.xml , si cela t’intéresse.

    J'attends avec curiosité ton retour sur ce que ce squelette peut t'apporter.

    (nouvelles modifs 19/09/21 : une const injecter pour le nouveau profil et un lien de déconnexion à mettre où l'on veut , voir mon post précédent. https://forum.pluxml.org/discussion/comment/62107/#Comment_62107 )

    cdt,
    GC


    Cordialement,
    gcyrillus

    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

  • Ça à l’air facile ce langage, merci pour cette astuce.

  • Re,

    en attendant tes retours , j'ai finalement ajouter la gestion d'un fichier csv dans la page config.php du plugin .

    Nouvelle description du plugin et ZIP (lien inchangé) https://github.com/gcyrillus/visitor/archive/refs/heads/main.zip .


    squelette d'un plugin laissant l’accès à une page après connexion.

    installé le plugin via l'administration.

    cliquez sur configuration.
    Un backup du fichier users.xml est effectué en users.xml.bak et un fichier username.csv est créer dans le répertoire du plugin avec les entêtes suivant:

    login , name , password , email
    

    Ce fichier est chargé et affiché dans un textarea
    Il vous est possible de l’éditer pour y ajouter un nouvel utilisateur par ligne en respectant l'entête .

    Attention il n'y a pas de vérification de doublons , les données qui sont affichées sont les dernières qui ont été enregistrées, il faudra les effacer avant d'ajouter de nouveaux utilisateurs et de soumettre le formulaire.

    Coté administration des utilisateurs :
    Un champ supplémentaire est alors disponible pour les profiles utilisateurs dans l'admin : PROFIL_VISITOR , qui utilise pour les langues : L_NONE pour décrire le profil à aucun )

    Exemple d'usage basique pour obliger a s'identifier pour accéder à une page article ou categorie:

    Ajouter dans les fichiers du thème et en première ligne: article.php et article-full-width.php , idem pour categorie.php et categorie-full-width.php la portion de code suivante qui renverra l'utilisateur sur la page d'authentification pour y accéder.

    <?php if($_SESSION['profil']!='') {}
    else {header('Location: /core/admin/auth.php?page='.$_SERVER['REQUEST_URI']);}
    ?>
    

    Si vous étes logué avec le profil PROFIL_VISITOR, toutes tentatives d’accès à l'administration doit vous renvoyer sur la page d'accueil du site.

    Pour se déconnecter : Vous pouvez ajouter dans le thème ce lien de déconnexion, dans le fichier footer.php sur la ligne avant la balise </footer>.

    <?php   if(isset($_SESSION['profil']) and $_SESSION['profil'] == '5') { echo '<a href="/core/admin/auth.php?d=1" class="alert orange">Déconnexion</a>' ;}   ?>
    

    Cdt


    Cordialement,
    gcyrillus

    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

  • Bonjour à toutes et tous,

    Pour GCyrillus-nomade
    Merci pour tout ce travail. Je viens de tester une nouvelle fois le greffon sur une installation "neuve" de PluXml 587, mais il m'est impossible d'accéder à la configuration du greffon inactif.

    Je l'ai activé malgré tout et le script signale bien entendu l'absence de configuration du greffon, mais, dans les deux cas, activé ou pas, je suis immédiatement renvoyé sur la page d'administration du site où je me trouvais avant d'accéder à la page des greffons.

    Une annonce en haut de page m'indique: "Accès interdit".

    J'ai préparé un fichier CSV avec des visiteurs fictifs.

  • septembre 2021 modifié

    Bonsoir,

    désolé, il manquait bizarrement dans le code en ligne :

            # droits pour accéder à la page config.php et admin.php du plugin
            $this->setConfigProfil(PROFIL_ADMIN);
            $this->setAdminProfil(PROFIL_ADMIN);
    

    J'ai corrigé le code sur github, tu peut reprendre l'archive.

    Si tu le souhaites, je peut tester de mon coté ton fichier CSV, si ce que j'ai mis en place ne correspond pas à ton fichier.
    Vu, j'ai aussi remplacé la virgule , par une double virgule ; pour que cela colle à ton fichier.

    Cela devrait fonctionner , soit en copiant collant le contenu de ton CSV dans le textarea ou en uploadant ton fichier et en le renommant en username.csv dans le repertoire du plugin.

    Edit je viens d'ajouter la fonction onDeactivate() et onActivate() du plugin pour désactiver les profil des visiteur (niveau 5) , je me suis aperçu que ceux-ci passaient par défaut en mode administrateur dans la page d'édition des utilisateurs si le plugin était désactivé. En activant le plugin, les utilisateurs de niveau 5 sont aussi réactivés si il y en a déjà d'enregistrés (22/09/22h10)

    Cdt


    Cordialement,
    gcyrillus

    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

  • Moi, je veux réaliser un site e-commerce pour que je puisse vendre mes fleurs, et je me suis lancé avec Wix, mais le problème, c’est son prix qui est assez considérable.

  • septembre 2021 modifié

    @Ayden29 bonjour, je ne vois pas le rapport avec ce sujet. En effet la gestion des utilisateurs est native dans pluxml et il est possible d'y mettre une surcouche avec un greffon, mais pour du e-commerce, rien de prévu, à la base c'est un moteur de blog.

    Ensuite investir quelques deniers dans un outil à des fin professionnelles et donc une certaine garantie d'efficacité, n'est pas choquant.

    Sinon, tu devrais trouver des plugins pour pluxml pas forcément de dernière génération ni avec une obligation de support de la part des auteurs , mais cela devrait te permettre de tester ton projet à moindre frais, mais ce ne sera pas pérenne.

    Cdt


    Cordialement,
    gcyrillus

    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

  • Salut,

    bien que PluXml puisse le faire, je préfère recommander l'installation de Prestashop (https://www.prestashop.com/fr) pour les sites de e-commerce

  • @gcyrillus-nomade, merci beaucoup pour la réponse. Je vais essayer ceci et je vous ferais un retour après.

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