override la modification d un article (état passe à non publié si modification)

Réduire
X
 
  • Filtrer
  • Heure
  • Afficher
Tout effacer
nouveaux messages

  • override la modification d un article (état passe à non publié si modification)

    Bonjour,

    ma demande concerne la surcharge (override) de fonctionnalités. Je souhaite modifier le fonctionnement de Joomla dans sa partie publication d'article :

    Base : lorsqu'un article a été publié, un utilisateur ayant les droits d'édition peut faire des modifications dans cet article.

    Probleme : que cet utilisateur ait ou pas les droits de publication, l'article modifié reste publié.

    souhait : si l'utilisateur n'a pas les droits de publication, alors l'article passe en non publié à l'issue de la modification.

    Solution : modifier le comportement de la fonction store() du fichier libraries/joomla/database/table/content.php. L'idée n'est pas de hacker le code mais de le surcharger. Et c'est là que je reste bloqué : où faut-il créer le nouveau fichier content.php avec la nouvelle fonction store?
    Je suis sur Joomla1.7, j'ai essayé l'arborescence templates/beez_20/html/libraries/joomla/database/table/content.php (j'utilise beez_20) sans succès.
    Je n'ai pas trouvé de doc suffisamment explicite (à mes yeux) pour savoir s'il était possible de trouver une réponse à mon problème et si je m'y prenais de la bonne manière...
    Merci de vos contributions.

  • #2
    Re : override la modification d un article (état passe à non publié si modification)

    je me répond à moi même pour faire état de mes avancées.
    => je m'y prend mal car je ne m'attaque pas au bon fichier. La fonction store peut rester telle qu'elle est, il faut que je modifie la vue pour afficher la variable state=0 lorsque l'utilisateur n'a pas le droit de publication.
    Je pense qu'il faut que je modifie le fichier components/com_content/views/form/tmpl/edit.php
    Code PHP:
    <div class="formelm">
           <?php if ($this->item->params->get('access-change')): ?>
            <?php echo $this->form->getLabel('state'); ?>
            <?php echo $this->form->getInput('state'); ?>
    //la modif ci-apres
        <?php else : ?>
            <?php   //echo $this->form->getInput('state', '', '', '','0'); ?>
                    <input type="hidden" name="jform[state]" value="0"/>
            <?php endif; ?>
    </div>
    Une fois cela au point, je pourrai faire de la surcharge dans le répertoire template pour ne pas modifier le code de Joomla!
    Mais là ça ne marche pas, je n'arrive pas à forcer la valeur de state à 0.
    Une idée ?

    Commentaire


    • #3
      Re : override la modification d un article (état passe à non publié si modification)

      Hum.. mauvaise syntaxe de getInput, il faut utiliser
      Code PHP:
      <?php else : ?>
              <?php   echo $this->form->getInput('state''','0'); ?>
              <?php endif; ?>
      et dans ce cas le code généré affiche
      Code PHP:
                  <div class="formelm">
                              <
      select id="jform_state" name="jform[state]" class="inputbox" disabled="disabled" size="1">
          <
      option value="1">Published</option>

          <
      option value="0" selected="selected">Unpublished</option>
          <
      option value="2">Archived</option>
          <
      option value="-2">Trashed</option>
      </
      select
      mais en sauvegardant l'article, celui-ci reste à l'état publié, la valeur 'Unpublished" n'est donc pas prise en compte. Mystère !

      Commentaire


      • #4
        Re : override la modification d un article (état passe à non publié si modification)

        mes dernières manip :
        je force l'input state à unpublished dans components/com_content/views/form/tmpl/edit.php
        Code PHP:
        <input  type="hidden" name="jform[state]" value="0" /> 
        mais il n'est pas pris en compte car dans getForm() (administrator/components/com_content/models/article.php) on teste canEditState(). Comme mon utilisateur n a pas le droit de publication, les champs featured, ordering, publish_up, publish_down et state sont desactivés (disabled) du formulaire.
        Si je commente le test (lignes 174 à 190 - function getForm), j'ai le fonctionnement désiré.
        Code PHP:
        /*
                if (!$this->canEditState((object) $data)) {
                    // Disable fields for display.
                    $form->setFieldAttribute('featured', 'disabled', 'true');
                    $form->setFieldAttribute('ordering', 'disabled', 'true');
                    $form->setFieldAttribute('publish_up', 'disabled', 'true');
                    $form->setFieldAttribute('publish_down', 'disabled', 'true');
                    $form->setFieldAttribute('state', 'disabled', 'true');

                    // Disable fields while saving.
                    // The controller has already verified this is an article you can edit.
                    $form->setFieldAttribute('featured', 'filter', 'unset');
                    $form->setFieldAttribute('ordering', 'filter', 'unset');
                    $form->setFieldAttribute('publish_up', 'filter', 'unset');
                    $form->setFieldAttribute('publish_down', 'filter', 'unset');
                    $form->setFieldAttribute('state', 'filter', 'unset');
                }
        */ 
        Seulement voila, j'ai une modification de code dans article.php (getForm) que je ne sais pas surcharger.

        Suis-je le seul à vouloir une telle fonctionnalité (un utilisateur qui n a pas le droit de publication peut editer un article et le modifier, mais dans ce cas, l'article passe en etat unpublished)?

        Commentaire


        • #5
          Re : override la modification d un article (état passe à non publié si modification)

          Bon, finalement, ce que je veux faire c'est surcharger la class ContentModelArticle (qui elle même surcharge JModelAdmin). Il faut donc que je crée un fichier qui aura class titi extends ContentModelArticle. Dedans je redéfini canEditState() à ma sauce.
          Reste à trouver où créer ce fichier et comment il s'intègre ...
          Si quelqu'un peut me dire si je vais dans le bon sens (ou pas), je suis preneur.

          Commentaire


          • #6
            [Résolu] : override la modification d un article

            J'ai finalement trouvé une solution.
            Elle passe par la réalisation d'un plugin qui contient le code suivant :

            Code PHP:
                  public function onContentBeforeSave($context, &$element$isNew)
                    {
                    
            $user JFactory::getUser();

                    
            // Check for existing article.
                    
            if (!empty($element->id)) //id of the current edited article
                        
            {
                        
            $state$user->authorise('core.edit.state''com_content.article.'.(int) $element->id); //do the user have edit.state (publish) rigth ?
                        
            if($state==0
                            {    
                            
            $element->state=0//if no, save with status unpublished
                            
            }
                        }
                    } 
            Ce code est exécuté après avoir appuyé sur le bouton save de l'éditeur et avant que la sauvegarde en base ne soit faite. Il teste si l'utilisateur a le droit de publier cet article. S'il n'a pas le droit il force le champ state à 0 => unpublished

            Après avoir vainement essayé de surcharger les modèles, je me suis rabattu sur cette solution de plugin. Toutefois, je n'étonne que la surcharge de modèle ne puisse ce faire. Si j'ai trouvé des posts pour dire que cela était possible, je n'ai par contre trouvé aucun exemple et aucune doc suffisamment complète pour réussir à mettre ce principe en oeuvre. Je suis preneur de toutes infos dans ce sens.

            Merci à tous.

            Commentaire

            Annonce

            Réduire
            Aucune annonce pour le moment.

            Partenaire de l'association

            Réduire

            Hébergeur Web PlanetHoster
            Travaille ...
            X