We launched new forums in March 2019—join us there. In a hurry for help with your website? Get Help Now!
    • 17755
    • 21 Posts
    Bonjour.

    Toujours très novice pour ce qui est de MoDx (mais un peu moins, la pratique aidant), j’ai une petite question à poser. Utilisant Ditto pour mon projet de site (version 2.0.2), je voulais savoir s’il était possible de faire en sorte que les articles publiés par de utilisateurs web (sur une architecture de type blog) soient non-publiés par défaut.

    J’explique le principe du projet : je souhaite que les utilisateurs puissent enrichir le contenu de la façon la plus simple possible (sans back-office de préférence), en écrivant leurs propres textes sous la forme d’articles. Après avoir étudié de nombreuses pistes (synchronisation comptes web user et user, log au manager depuis le front-office, etc...), le plus simple m’est apparu comme étant une architecture blog. Une seule chose m’ennuie : si je veux que les utilisateurs puissent écrire, je voudrais que ce soient des "modérateurs" qui décident de la publication ou non d’un document. Or, si j’ai bien trouvé une fonction Ditto permettant de n’afficher que les articles publiés, je ne vois pas comment faire pour que ces articles ne soient pas automatiquement visibles par TOUS les utilisateurs.

    J’ai bien sûr été voir du côté des Rôles, mais il me semble qu’ils ne concernent que les Utilisateurs (manager)...

    Quelqu’un pourrait-il me donner une idée de la marche à suivre, ou, à défaut, me dire si c’est possible de faire ça ou pas ? Si quelqu’un a également une super solution pour arriver à mes fins sans passer par un système de blog, je suis preneur ! wink
      • 6726
      • 7,075 Posts
      MODx ne comporte pas (encore) de workflow structuré car il est généraliste contrairement à des CMS comme SPIP ou Textpattern qui sont axés "éditorial".

      Ceci dit, il existe des solutions de contournement avec MODx, comme toujours il y a plusieurs façon de faire.

      Outre un plugin spécifique ou un "modifier" pour Ditto (à écrire), il y a parmi les solutions existantes une piste qui me vient immédiatement à l’esprit : utiliser le plugin ManagerManager

      Ca permet de définir la valeur par défaut de published pour une liste de rôle, de template. Il faut jeter un oeil à la doc, mais c’est assez simple au sein du plugin tu défini un certain nombre de règles. Celle qui permet de fixer une valeur par défaut est mm_default :

      [tt]mm_default($field, $value, $roles, $templates, $eval);[/tt]

      Dans ton cas si le rôle en question a l’ID : 2 et que les templates concernés sont 6,9,12 ça donnerai un règle :

      [tt]mm_default(’published’, ’0’, ’2’ , ’6,9,12, ’true’);[/tt]

      Ensuite, il faut que tu masque les champs published et unpublished pour le rôle des éditeurs (les modérateurs, eux ont accès à ces champs) et les templates concernés :

      [tt]mm_hideFields($fields, $roles, $templates);[/tt]

      dans ton cas ça donnerai un truc du genre :

      [tt]mm_hideFields(’unpublished,published’, ’2’, ’6,9,12’);[/tt]

      A vérifier niveau syntaxe car je commence juste à me plonger dans ManagerManager mais c’est très puissant (tu peux aussi bouger des champs d’un onglet à l’autre, créer de nouveau onglet, renommer des champs... en gros customiser complètement l’admin) et tu peux arriver sans beaucoup d’effort à faire ce que tu veux... si il y a un souci, je peux aider smiley

      Avec cette solution, tu n’as pas besoin de modifier tes appels de Ditto, tu simplifies (et tu rationnalise) l’interface en fonction des rôles et tu maitrise le workflow grin

        .: COO - Commerce Guys - Community Driven Innovation :.


        MODx est l'outil id
        • 11975
        • 2,542 Posts
        Idée séduisante ... dommage que ce ne soit pas ce que cherche à faire L_Harmonica grin

        Sa question porte sur les utilisateurs webs

        Ceci dit je n’ai pas non plus de réponses smiley

        :-)
          Made with MODx : [url=http://www.copadel.com]copadel, fruits et l
          • 6726
          • 7,075 Posts
          Effectivement j’avais un doute... dans ce cas ça va être plus compliqué car déjà pour permettre aux web users de publier il faut passer par Front Document Manager donc ça risque d’être beaucoup plus compliqué...

          Ceci dit, c’est une alternative... je ne vois pas trop en quoi le manager devrait effrayer des éditeurs, surtout avec QuickEdit... à moins qu’il n’y ai besoin d’une inscription automatique pour la création des comptes... donc utilisateurs web et désormais, l’incontournable WebLoginPE.

          Au final, il faut bien réflechir à l’intérêt d’investir un temps de développement conséquent vs donner accès (limité) au manager...

            .: COO - Commerce Guys - Community Driven Innovation :.


            MODx est l'outil id
            • 17755
            • 21 Posts
            Tout d’abord, merci pour vos réponses.

            Je vois que vous commencez à entrevoir la complexité de ma situation... grin J’étais parti sur le format blog principalement pour le principe des dossiers dans lesquels étaient rangés les différents textes. Laisser des accès au Manager, par une voie ou une autre, est effectivement le mieux à faire (gestion des droits des utilisateurs), mais dans ce cas il y’a deux problèmes : pas d’inscription automatique (il faudra créer les comptes user manuellement) et création de page anarchique (mes utilisateurs pourront créer leurs pages dans n’importe quelle section).

            Pour le second problème, d’une part il vaut mieux une arborescence foireuse non-publiée que des textes de mauvaise qualité publiés d’office, les admins et modos pourront "faire le ménage". D’autre part, je pense qu’il doit être possible de trouver des solutions pour adapter NewsPublisher à cette nouvelle situation (en gardant le principe des dossiers de type blog).

            Le log sera plus compliqué à gérer. Je vais regarder du côté de WebLoginPE, ManagerLogin (pour, dans l’idéal, que mes utilisateurs se contentent de se connecter depuis le front-office et se servent de QuickEdit) ou encore Web2Manager... le problème étant que, vu mon niveau de connaissances, j’ai beaucoup de mal à rapidement m’adapter et que j’ai très peu de temps devant moi. Cette solution du blog avait l’air bien, pourtant, simple et tout... embarrassed C’est dommage de buter sur ce petit "détail" de la publication. Je m’accorde encore une journée pour réfléchir là-dessus, ensuite je reprends tout. rolleyes
              • 17755
              • 21 Posts
              Hop hop hop : méthode de barbare qui semble très bête, mais qui a l’air de vouloir fonctionner...

              Extrait du code du snippet NewsPublisher d’origine :

                          // format content
                          $content = $modx->stripTags($_POST[$rtcontent],$allowedTags);
                          $content = str_replace('[+user+]',$user,$content);
                          $content = str_replace('[+createdon+]',strftime('%d-%b-%Y %H:%M',$createdon),$content);
                          foreach($_POST as $n=>$v) {
                              if(!empty($badwords)) $v = preg_replace($badwords,'[Filtered]',$v); // remove badwords
                              $v = $modx->stripTags(htmlspecialchars($v));
                              $v = str_replace("\n",'<br />',$v);
                              $content = str_replace('[+'.$n.'+]',$v,$content);
                          }
              
                          $title = mysql_escape_string($modx->stripTags($_POST['pagetitle']));
                          $longtitle = mysql_escape_string($modx->stripTags($_POST['longtitle']));
                          $description = mysql_escape_string($modx->stripTags($_POST['description']));
                          $introtext = mysql_escape_string($modx->stripTags($_POST[$rtsummary],$allowedTags));
                          $pub_date = $_POST['pub_date'];
                          $unpub_date = $_POST['unpub_date'];
                          $published = 1;
              
                          // check published date
                          if($pub_date=="") {
                              $pub_date="0";
                          } else {
                              list($d, $m, $Y, $H, $M, $S) = sscanf($pub_date, "%2d-%2d-%4d %2d:%2d:%2d");
                              $pub_date = strtotime("$m/$d/$Y $H:$M:$S");
              
                              if($pub_date < $createdon) {
                                  $published = 1;
                              }    elseif($pub_date > $createdon) {
                                  $published = 0;	
                              }
                          }
              
                          // check unpublished date
                          if($unpub_date=="") {
                              $unpub_date="0";
                          } else {
                              list($d, $m, $Y, $H, $M, $S) = sscanf($unpub_date, "%2d-%2d-%4d %2d:%2d:%2d");
                              $unpub_date = strtotime("$m/$d/$Y $H:$M:$S");
                              if($unpub_date < $createdon) {
                                  $published = 0;
                              }
                          }
              


              Après "nettoyage" :

                          // format content
                          $content = $modx->stripTags($_POST[$rtcontent],$allowedTags);
                          $content = str_replace('[+user+]',$user,$content);
                          $content = str_replace('[+createdon+]',strftime('%d-%b-%Y %H:%M',$createdon),$content);
                          foreach($_POST as $n=>$v) {
                              if(!empty($badwords)) $v = preg_replace($badwords,'[Filtered]',$v); // remove badwords
                              $v = $modx->stripTags(htmlspecialchars($v));
                              $v = str_replace("\n",'<br />',$v);
                              $content = str_replace('[+'.$n.'+]',$v,$content);
                          }
              
                          $title = mysql_escape_string($modx->stripTags($_POST['pagetitle']));
                          $longtitle = mysql_escape_string($modx->stripTags($_POST['longtitle']));
                          $description = mysql_escape_string($modx->stripTags($_POST['description']));
                          $introtext = mysql_escape_string($modx->stripTags($_POST[$rtsummary],$allowedTags));
                          $pub_date = $_POST['pub_date'];
              //            $unpub_date = $_POST['unpub_date'];
              
              //		Test de publication nulle
              
                          $published = 0;
              
                          // check published date
              //            if($pub_date=="") {
              //                $pub_date="0";
              //            } else {
              //                list($d, $m, $Y, $H, $M, $S) = sscanf($pub_date, "%2d-%2d-%4d %2d:%2d:%2d");
              //                $pub_date = strtotime("$m/$d/$Y $H:$M:$S");
              //
              //                if($pub_date < $createdon) {
              //                    $published = 1;
              //                }    elseif($pub_date > $createdon) {
              //                    $published = 0;	
              //                }
              //            }
              
                          // check unpublished date
              //            if($unpub_date=="") {
              //                $unpub_date="0";
              //            } else {
              //                list($d, $m, $Y, $H, $M, $S) = sscanf($unpub_date, "%2d-%2d-%4d %2d:%2d:%2d");
              //                $unpub_date = strtotime("$m/$d/$Y $H:$M:$S");
              //                if($unpub_date < $createdon) {
              //                    $published = 0;
              //                }
              //            }
              


              Notez que j’ai retiré la possibilité de saisir une date de publication et de fin de publication à l’utilisateur, puisque de toute façon ça ne sera pas de son ressort.

              Voilà, il suffisait de trouver la ligne dans le snippet. Maintenant, je dois tester ça en profondeur. Mais si ça fonctionne, j’aurais validé l’utilisation d’une architecture de ce type, qui permettra de vraiment simplifier la situation : pas besoin de comptes manager, puisque tout se fera depuis de comptes web users...

              Cela ne m’empêchera pas, une fois mon année de M2 validée, de revenir sur cette logique et de rendre les choses plus intéressantes en reprenant l’idée du Manager...

              wink
                • 6726
                • 7,075 Posts
                Edit : Mon post a croisé le tien tongue Ceci dit, ce que je conseille à la fin est à mon avis plus sûr : utiliser FDM plutôt que NewsPublisher...

                Quote from: L_Harmonica at Sep 06, 2007, 06:44 AM
                Je vois que vous commencez à entrevoir la complexité de ma situation... grin J’étais parti sur le format blog principalement pour le principe des dossiers dans lesquels étaient rangés les différents textes.

                Et c’est un bon principe !
                Je ne vois pas de raison de le laisser tomber smiley

                Quote from: L_Harmonica
                Laisser des accès au Manager, par une voie ou une autre, est effectivement le mieux à faire (gestion des droits des utilisateurs), mais dans ce cas il y’a deux problèmes : pas d’inscription automatique (il faudra créer les comptes user manuellement) et création de page anarchique (mes utilisateurs pourront créer leurs pages dans n’importe quelle section).

                Pour l’inscription automatique, il n’est effectivement pas possible (à ma connaissance) et pas souhaitable (sécurité oblige) de le faire pour des utilisateurs du manager.

                Par contre il n’y a pas de problème de création de page anarchique wink
                Il suffit de définir les permissions du manager de telle manière que chaque groupe d’utilisateur n’ai accès qu’au(x) dossier(s) auquel ils sont supposé avoir accès. Par conséquent il ne peuvent pas créer de doc n’importe où...

                Mieux encore, avec le plugin ManagerManager, on peut définir des valeur par défaut (ou une valeur héritée du document parent) pour n’importe quel champ (par exemple le template) et empêcher tout changement en masquant ces mêmes champs aux rôles auquel on veut enlever la liberté de le faire.

                Quote from: L_Harmonica
                Pour le second problème, d’une part il vaut mieux une arborescence foireuse non-publiée que des textes de mauvaise qualité publiés d’office, les admins et modos pourront "faire le ménage". D’autre part, je pense qu’il doit être possible de trouver des solutions pour adapter NewsPublisher à cette nouvelle situation (en gardant le principe des dossiers de type blog).

                A mon avis mieux vaut utiliser FrontDocumentManager que NewsPublisher (plus limité et plus ancien).

                Les fonctions de modération (cf paramètres &moderated, &canpost, &canmoderate, &trusted, &anonymous....) permettent de faire ce que tu souhaite en terme de modération (document non publiés par défaut) avec en plus des paramètres assez poussés (tu peux déterminer qui est modérateur)

                En fait je me suis encore peu servi de FDM mais la doc me laisse à penser que tu peux faire exactement ce que tu souhaites avec !
                Sans passer par le manager...
                  .: COO - Commerce Guys - Community Driven Innovation :.


                  MODx est l&#39;outil id
                  • 17755
                  • 21 Posts
                  Merci pour toutes les infos, David ! wink

                  Cependant, vu les dates de rendu du projet, je ne vais pas pouvoir tester pour le moment la solution du passage de mes utilisateurs par le back-office. Je m’y pencherai cependant très prochainement, pour une éventuelle v2 du site et, grâce à tes conseils, j’escompte bien arriver à quelque chose de correct...

                  Je suis donc resté sur NewsPublisher/Ditto. J’ai néanmoins quelques problèmes.

                  - Tout d’abord, bien que je sois passé en language "francais-utf8" pour Ditto, j’ai toujours quelques petites choses en Anglais ("read more", "September"...) qui apparemment ne sont pas gérées par les fichiers de langue de Ditto. J’ai eu beau chercher (dans les différents snippets et chunks), je n’ai pas pu trouver comment modifier ces éléments... cela est-il possible, et comment ?

                  - J’avais réussi à faire en sorte que les articles soient créés non publiés par NewsPublisher (c’est tout bête), et par la même occasion j’ai retiré les champs Date de publication et Date de fin de publication des formulaires. Cependant, il y’a un léger problème, que je crois lié à ces modifications : les dates de publication ne s’affichent plus dans ma page générée par ditto_blog. Il semble que le [+date+] ne soit pas "rempli". C’est un peu gênant, tout de même. Je crois pourtant me souvenir que ça avait fonctionné, au début, malgré les modifications effectuées. Je sais que, comme ça, sans voir les différents éléments, ce n’est pas simple, mais quelqu’un a-t-il une idée ?

                  - Il faut que j’arrive à instaurer un tri par nom d’auteur et par mot clé (le titre des articles par exemple), en plus du tri par date proposé par défaut. J’ai un peu fouillé partout, mais je ne vois pas vraiment clairement comment faire. Cette question est un peu moins importante que les précédentes, vu que je pense réussir à trouver (si ce n’est pas le cas, je reviendrai demander rolleyes).

                  Voilà, encore beaucoup de questions... je progresse un peu, mais il reste certaines détails assez obscurs pour moi dans MODx. Je ne désespère pas d’arriver à correctement m’en sortir un jour ou l’autre... grin
                    • 6726
                    • 7,075 Posts
                    ... qui viendra plus tôt que tu ne le penses, tu es sur la bonne logique : expérimenter, essayer les X solutions possibles avec MODx et se faire une idée !
                    On apprend beaucoup en faisant ça smiley

                    Pour les éléments de traduction dans Ditto, les éléments qui contrôlent le rendu en français sont :

                    • les chunks et placeholders, voire si PHx est utilisé les modificateur (notamment pour les dates !)
                    • le fichier de langue lui-même (qui normalement comprend toutes les chaînes... à vérifier)
                    • la config PHP : on a pas mal parlé de la nécessite d’utiliser une déclaration setLocale au début dans Ditto : ça marche bien, mais les modificateurs de date de PHx (liés au Date Extenders) sont pas mal non plus

                    Normalement il n’y a aucun élément hardcodé dans le snippet même donc pas utile de le modifier.

                    Pour la date de publication, il faut comprendre qu’elle permet de programmer la mise en ligne de contenus (la date de dépublication permet de déprogrammer celle-ci). Mais, en revanche, sauf s’il est explicitement spécifiée par le créateur de la page, elle n’a pas de valeur par défaut égale à createdon (création du document), ce qui pourtant serait presque plus logique...

                    Et faisable via ManagerManager en affectant comme valeur par défaut de la date de publication (publishedon), celle de création (createdon) via la règle mm_inherit...
                      .: COO - Commerce Guys - Community Driven Innovation :.


                      MODx est l&#39;outil id
                      • 17755
                      • 21 Posts
                      J’ai trouvé pour la date ! laugh

                      C’était tout bête : le format de la date manquait dans le fichier de langue "francais-utf8.inc.php". J’ai simplement recopié la ligne suivante (tirée de "english.inc.php") dans le fichier :

                      $_lang['dateFormat'] = "%d-%b-%y %H:%M";


                      Et ça a l’air de fonctionner. Comme quoi, avec un peu de patience... rolleyes