Modification du mode de tri des contenus

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

  • [RÉGLÉ] Modification du mode de tri des contenus

    Bonjour,

    j'essaie de modifier une vue "catégory" de Joomla.

    Un dernier détail me pose problème :

    - dans le fichier xml de ma vue, je peux modifier le champs "orderby_sec" ( celui qui permet de choisir l'ordre d'affichage des artcles)

    Je voudrais pouvoir les trier selon un champs personnalisé, je reajoute donc une ligne en fin des options :

    Code:
    				<field
    					name="orderby_sec"
    					type="list"
    					label="JGLOBAL_ARTICLE_ORDER_LABEL"
    					description="JGLOBAL_ARTICLE_ORDER_DESC"
    					useglobal="true"
    					>
    					<option value="front">COM_CONTENT_FEATURED_ORDER</option>
    					<option value="rdate">JGLOBAL_MOST_RECENT_FIRST</option>
    					<option value="date">JGLOBAL_OLDEST_FIRST</option>
    					<option value="alpha">JGLOBAL_TITLE_ALPHABETICAL</option>
    					<option value="ralpha">JGLOBAL_TITLE_REVERSE_ALPHABETICAL</option>
    					<option value="author">JGLOBAL_AUTHOR_ALPHABETICAL</option>
    					<option value="rauthor">JGLOBAL_AUTHOR_REVERSE_ALPHABETICAL</option>
    					<option value="hits">JGLOBAL_MOST_HITS</option>
    					<option value="rhits">JGLOBAL_LEAST_HITS</option>
    					<option value="random">JGLOBAL_RANDOM_ORDER</option>
    					<option value="order">JGLOBAL_ORDERING</option>
    					<option	value="rorder">JGLOBAL_REVERSE_ORDERING</option>
    					<option value="vote" requires="vote">JGLOBAL_VOTES_DESC</option>
    					<option value="rvote" requires="vote">JGLOBAL_VOTES_ASC</option>
    					<option value="rank" requires="vote">JGLOBAL_RATINGS_DESC</option>
    					<option value="rrank" requires="vote">JGLOBAL_RATINGS_ASC</option>
    					[B]<option value="dateAgenda" requires="vote">Date dans l'agenda</option>[/B]
    				</field>
    Qui m'ajoute une valeur "dateAgenda" dans mes paramètres passés au trigger du :

    Code:
    $dispatcher->trigger('onContentPrepare', array($this->category->extension . '.categories', &$this->category, &$this->params, 0));
    Mais étonnament si je fais un var_dump de mon "$this->lead_items " AVANT le trigger onContentPrepare j'ai déjà l'affichage de mes articles (j'en déduis qu'ils sont chargés avant ...) mais alors comment le paramètre de tri "orderby_sec" interagit pour changer l'ordre des articles vue que le chargement est déjà fait ?

    Si quelqu'un a une idée ?

    Bonne journée

  • #2
    Re : Modification du mode de tri des contenus

    Bonjour,

    Le "orderby_sec" est géré directement dans le code du com_content/helpers/query.php (appelé par _buildContentOrderBy du fichier com_content\models\category.php).

    Donc, si vous souhaitez ajouter un paramètre, il faut donc modifier ces fichiers donc passer par une surcharge du composant.

    Pascal
    If anything can go wrong, it will...If I can help, I will ..https://conseilgouz.com

    Commentaire


    • #3
      Re : Modification du mode de tri des contenus

      Merci pour ton aide, c'est effectivement ce que j'ai vu en grattant en mode debug ...

      Comme je désire trier sur une date qui est dans un champs personnalisé ça risque de compliquer un peu que de rajouter une ligne de Query.

      Est-ce que par hasard, du moment que j'ai l'objet "$this->lead_items" dans ma surcharge de "blog.php" il ne serait pas possible de modifier l'ordre des éléments de ce tableau d'objets directement dans la surcharge de la vue ?

      Un peu bourrin , mais comme c'est pour une vue spécifique...avec une sorte de "ArrayObject::asort" ?

      Bonne soirée

      Olivier

      Commentaire


      • #4
        Re : Modification du mode de tri des contenus

        Bonjour Olivier,

        En creusant un peu, j'ai trouvé un plugin qui semble permettre d'adapter ce que vous souhaitez au niveau d'un composant standard : https://gruz.ml/en/extensions/mvcoverride.html

        C'est basé sur un plugin développé par Ghazal : https://github.com/ghazal/plg_mvcoverride

        Gardez à l'idée qu'il ne faut pas modifier directement les composants standards Joomla, car, tout est remis d'aplomb à chaque mise à jour (presque tous les mois...).

        Pascal
        If anything can go wrong, it will...If I can help, I will ..https://conseilgouz.com

        Commentaire


        • #5
          Re : Modification du mode de tri des contenus

          J'ai tout de même un soucis avec un champ personnalisé en clé de tri.

          En effet, les champs personnalisés sont renseignés par un plugin sur un événement "onContentPrepare", c'est-à-dire largement après la requête initiale utilisant les conditions de tri orderby_sec.

          Donc, il faut effectivement aller "mouliner" la liste des documents trouvés au niveau de la view dans la méthode display du view.html.php en allant dans $item->jcfields pour trouver votre zone date.

          Remarque: j'ai fait un petit essai et la date récupérée est au format jj/mm/aa, donc à reformatter en quantième si vous souhaitez trier.

          Bref, que du plaisir.....

          Pascal

          PS: si vous modifiez uniquement le fichier view.html.php, on est revenu dans une surcharge "simple", donc, peut-être pas besoin du plugin évoqué dans le message précédent...
          Dernière édition par pmleconte à 09/10/2017, 11h33
          If anything can go wrong, it will...If I can help, I will ..https://conseilgouz.com

          Commentaire


          • #6
            Re : Modification du mode de tri des contenus

            Bonjour,

            En fait, j'ai fait quelques tests et le plus simple est quand même de passer par une surcharge simple.

            Donc, j'ai récupéré le fichier blog.php à partir du répertoire components\com_content\views\category\tmpl. Je l'ai copié dans mon répertoire <template>/html/com_content/category.

            Ensuite, j'ai "joué" avec une zone personnalisé (ladate) qui contenait ..... une date en modifiant le fichier comme suit:

            Code PHP:
            <?php
            /**
             * @package     Joomla.Site
             * @subpackage  com_content
             *
             * @copyright   Copyright (C) 2005 - 2017 Open Source Matters, Inc. All rights reserved.
             * @license     GNU General Public License version 2 or later; see LICENSE.txt
             */

            defined('_JEXEC') or die;

            JHtml::addIncludePath(JPATH_COMPONENT '/helpers');

            JHtml::_('behavior.caption');

            $dispatcher JEventDispatcher::getInstance();

            $this->category->text $this->category->description;
            $dispatcher->trigger('onContentPrepare', array($this->category->extension '.categories', &$this->category, &$this->params0));
            $this->category->description $this->category->text;

            $results $dispatcher->trigger('onContentAfterTitle', array($this->category->extension '.categories', &$this->category, &$this->params0));
            $afterDisplayTitle trim(implode("\n"$results));

            $results $dispatcher->trigger('onContentBeforeDisplay', array($this->category->extension '.categories', &$this->category, &$this->params0));
            $beforeDisplayContent trim(implode("\n"$results));

            $results $dispatcher->trigger('onContentAfterDisplay', array($this->category->extension '.categories', &$this->category, &$this->params0));
            $afterDisplayContent trim(implode("\n"$results));

            // on commence par les favoris

            $newarray = array();
            foreach (
            $this->lead_items as $item) {
                if (
            is_array($item->jcfields)) {
                    foreach (
            $item->jcfields as $field) {
                        if(
            $field->name == "ladate") { // <== champ personnalisé servant de clé
                            
            $ladate $field->value;
                            
            $ladate date("Ymd",strtotime(str_replace("/",".",$ladate)));
                            
            $newarray[$ladate] = $item;
                        }
                    }
                }
            }
            ksrort($newarray); // tri plus récent en premier
            $this->lead_items = array();
            foreach (
            $newarray as $item) {
                
            $this->lead_items[] = $item;
            }
            // ensuite, on prend les intro.
            $newarray = array();
            foreach (
            $this->intro_items as $item) {
                if (
            is_array($item->jcfields)) {
                    foreach (
            $item->jcfields as $field) {
                        if(
            $field->name == "ladate") { // <== champ personnalisé servant de clé
                            
            $ladate $field->value;
                            
            $ladate date("Ymd",strtotime(str_replace("/",".",$ladate)));
                            
            $newarray[$ladate] = $item;
                        }
                    }
                }
            }
            krsort($newarray); // tri plus récent en premier
            $this->intro_items = array();
            foreach (
            $newarray as $item) {
                
            $this->intro_items[] = $item;
            }
            ?>..........
            Attention: si la date est absente, on obtient une date 1970/....

            Pascal
            If anything can go wrong, it will...If I can help, I will ..https://conseilgouz.com

            Commentaire


            • #7
              Re : Modification du mode de tri des contenus

              Bonjour,

              en premier lieu je tiens à te remercier pour ton aide.

              J'ai jeté un oeil sur ton code, en le mettant "brut de décoffrage" il me manque toujours un élément :

              - si j'ai 4 entrées agenda, il m'en sort 3 , etc.

              Par contre en reprenant ton code, je l'ai adapté pour ajouter une propriété "dateTri" auy objets de "$this->lead_items" avec la date du champs personnalisé, je peux ensuite faire un "usort" et de comparer les dates pour les trier.

              J'ai toutes mes entrées et triées par date et la condition permet de lier le tri au champ de sélection dans l'interface de paramètre du lien de menu.

              Code:
              ...
              $afterDisplayContent = trim(implode("\n", $results));
              //*****************************************************************
              
              //var_dump( $this->params);
              // valeur de cle de tri venant de la surcharge de "agenda.xml"
              if( $this->params['orderby_sec']=="dateAgenda"){ // si on veut un tri sur le champ "ag-date"
              
              	// fonction de comparaison des dates 
              	//-------------------------------------------------
              	function comparedate($a, $b) {
              		return strcmp($a->dateTri, $b->dateTri);
              	}
              	//------------------------------------------------
              
              	if (!empty($this->lead_items)){ // si il y a des entrées agendas 
              			foreach ($this->lead_items as &$item){
              					// boucler sur les jcfields
              					if (is_array($item->jcfields)) {
              						foreach ($item->jcfields as $field) {
              							if($field->name == "ag-date") { // <== champ personnalisé servant de clé
              								$ladateAgenda = $field->value;
              								$date = DateTime::createFromFormat('d/m/y', $ladateAgenda);
              								// ajout de la propriété "dateTri"
              								$item->dateTri = $date->format('y-m-d');
              							}
              						}
              					} 	
              			}
              		// tri du tableau
              		usort($this->lead_items, 'comparedate');
              	}
              
              //*************************************************************************************************
              }
              ?> 
              <div class="blog ...
              Je me suis largement inspiré de ton code, merci encore pour ton aide

              Olivier

              Commentaire

              Annonce

              Réduire
              Aucune annonce pour le moment.

              Partenaire de l'association

              Réduire

              Hébergeur Web PlanetHoster
              Travaille ...
              X