Comment donner des valeurs initiales aux champs Jlayout

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

  • [Problème] Comment donner des valeurs initiales aux champs Jlayout

    Hello.

    J'utilise dans mes templates de vues des layouts de recherche utilisant cette méthode :


    Tout fonctionne très bien sauf que je n'arrive pas à donner les valeurs initiales des champs.

    La seule formule trouvée est de donner une valeur "default" directement dans le xml du champ de recherche du layout.
    Ce qui ne me convient pas, j'ai besoin de modifier la valeur dynamiquement au premier accès de la vue.

    J'ai par exemple besoin de forcer la valeur list.limit (classe JModelList).

    Or un
    Code PHP:
    $this->setState('list.limit''100'); 
    dans la méthode populatestate du model n'a aucun effet sur le champ correspondant layout qui affiche toujours 25, alors que le nombre d’éléments du tableau $this->items est bien à 100.

    Si quelqu'un à une idée, car pour l'instant mes recherches n'ont rien données de positif.

    Bon WE à tous.
    Dernière édition par roland_d_alsace à 17/06/2017, 18h34
    A tous les utilisateurs de Joomla du très Grand Est de la France et du Jura suisse
    Rejoignez le Joomla Users Groupe Alsace...
    roland_d_alsace va-t-il devenir roland_du_grand_est ?

  • #2
    Re : Comment donner des valeurs initiales aux champs Jlayout

    Hello.

    Pour l'instant la seule formule que j'ai trouvé est de modifier la valeur des champs "filtre" du sous-formulaire (Layout) dans la méthode display de la vue par des
    Code PHP:
    $this->filterForm->setValue 
    Ce n'est pas très propre, et utile uniquement au premier passage dans la vue, mais cela fonctionne.
    Je peux donc initialiser les champs aux valeurs souhaitées.

    Pourtant lors d'un second passage et pour les suivants (après changement des valeurs des filtres), les propriétés 'value' dans champs filtres sont bien initialisées, mais je n'ai pas trouvé par quel mécanisme.

    La question reste donc "ouverte", si quelqu'un a la réponse et connait la méthode à utiliser.

    Bon dev à tous.
    Dernière édition par roland_d_alsace à 17/06/2017, 21h55
    A tous les utilisateurs de Joomla du très Grand Est de la France et du Jura suisse
    Rejoignez le Joomla Users Groupe Alsace...
    roland_d_alsace va-t-il devenir roland_du_grand_est ?

    Commentaire


    • #3
      Re : Comment donner des valeurs initiales aux champs Jlayout

      Je pense que tu n'étais pas loin avec ton premier post. La pagination est un processus géré nativement par Joomla.
      Un composant peut intervenir dessus, mais il faut reprendre le contrôle des valeurs de pagination

      J'affecte ces valeurs en 2 étapes:
      Depuis la vue (view.html.php):
      Code PHP:
          $this->state $state    $this->get('State');
          
      $state->set('context''layout.moncontexte'); 
      et dans le Model, contexte concerné (default, si tu n'en as qu'un)
      C'est dans le GetListQuery ou PrepareQuery (fonction de constitution du query)
      Code PHP:
          protected function prepareQuery(&$query)
          {

              ......
              ......

              
      // Add the list start&limit clause.
              
      $this->setState('list.limit'30);
              
      $this->setState('list.start'5);
              
              return 
      $query;
          } 
      Dans mon cas si je set ces valeurs, ça affecte directement le résultat de la collection, qui démarre à 5 pour 30 items affichés ...
      Le footer de pagination est recalculé en fonction.
      Dernière édition par liubov à 17/06/2017, 23h10
      Developper of JBreeding Manager: http://www.jbreeding.fr/
      J-cook Referral : Service Générateur d'Extensions pour Joomla

      Commentaire


      • #4
        Re : Comment donner des valeurs initiales aux champs Jlayout

        Merci pour ta réponse.

        Toutefois, je pense que je ne me suis pas fait bien comprendre.

        Le problème n'est pas dans le comportement (dans la gestion de la pagination ou des paramètres de filtrage), tout ceci fonctionne bien (idem sans l'utilisation de Jlayout).
        Ici j'utilise le layout de filtrage joomla.searchtools.default par :
        Code PHP:
        echo JLayoutHelper::render('joomla.searchtools.default', array('view' => $this'options' => array('filtersHidden' => 1)); 
        dans le template de la vue.

        Le problème est uniquement dans l'affichage du layout où les valeurs par défaut ne sont pas sélectionnées.
        (Il y a très peu de documentation sur l'utilisation des layout, ce qui fait je je galère un peu).

        Les valeurs retournées par le layout 'searchtools' je les récupère sans soucis dans le model par des (exemple avec un champ de nom filtre_value) :
        Code PHP:
        $filtre_value $this->getUserStateFromRequest($this->context '.filter.filtre_value''filter_filtre_value',$default_value); 
        pour faire les traitements.

        Un autre exemple que la valeur de pagination : avec un filtre de type champ hérité de JFormFieldList avec sélections multiples (mais ceci est vrai pour tous les autres types de champ, j'en ai essayé plusieurs).

        Comment afficher les sélections dans le champ en question lors du premier affichage (ce qui est important si dans ton développement, dans tes paramètres de menus tu as prévu une pré-selection possible -donc différente de "all"- ou si la pré-selection des filtres est liée au contexte).
        Au premier affichage le champ est vide.

        Après un premier affichage, si l'internaute fait une sélection dans les filtres (ou dans la pagination, ou de tout autre champ du layout), quand la vue est ré-affichée, la sélection est ensuite bien affichée.

        C'est uniquement au premier affichage que je n'arrive pas à faire afficher les valeurs initiales (et c'est uniquement un problème d'affichage en utilisant JLayout).

        C'est pour cela que je suis obligé de forcer par
        Code PHP:
        $this->filterForm->setValue(...); 
        , juste pour le premier affichage, ce qui n'est pas normal.
        Dernière édition par roland_d_alsace à 18/06/2017, 09h25
        A tous les utilisateurs de Joomla du très Grand Est de la France et du Jura suisse
        Rejoignez le Joomla Users Groupe Alsace...
        roland_d_alsace va-t-il devenir roland_du_grand_est ?

        Commentaire


        • #5
          Re : Comment donner des valeurs initiales aux champs Jlayout

          Étonnant, car je viens de vérifier. Mes valeurs "défault" de tous mes filtres de collections sont bien pris en compte dès le premier affichage.
          => La valeur défault est bien soumise au Model.
          => Elle est visible dans l'objet (Combo Filter / Search / ...) lors de l'affichage de la collection.

          Je suppose que tu as bien une rubrique "default.filter" dans ton .xml du Model, à la suite de la définition des champs de données?
          Dans mon cas default="1" filtre la Race par défaut dont l'id=1.
          Code PHP:
          <fieldset name="default.filters" addfieldpath="/administrator/components/com_jbreeding/models/fields">
              
              <
          field name="filter_id_race"
                  
          listKey="id"
                  
          labelKey="value"
                  
          type="ckcombo"
                  
          default="1"
                  
          submit="true"
                  
          nullLabel="JBREEDING_FILTER_NULL_RACES"
                  
          class="span-2 element-filter"
                  
          label="JBREEDING_JSEARCH_RACES"
                  
          /> 

          Donc, ta mèthode est la bonne, je ne vois pas comment faire autrement.

          Côté traitement, si ton MVC est dans le standard:
          classe/models/list.php [JModelList]

          Code PHP:
          public function getForm($instance 'default.filters'$loadData true$control null){
                  
          $model CkJModel::getInstance($this->view_item'MyComponentModel');
                  
          $form $model->getForm(null$loadData$control);
          ... 
          c'est ici que tu récupères les valeurs (dont default) :

          -> de type Filter
          Code PHP:
          $form->setValue($filter_name''$value); 
          -> de type Search.
          Code PHP:
          $form->setValue($search_name''$value); 
          les autres type également, si besoin (sorttable, limit, direction, etc ...)
          au final, tu appliques les filtres ...
          Code PHP:
          $fieldSet $form->getFieldset($instance);
          return 
          $fieldSet
          Et ton Layout est maintenant filtré avec les valeurs par defauts.
          Dernière édition par liubov à 18/06/2017, 18h15
          Developper of JBreeding Manager: http://www.jbreeding.fr/
          J-cook Referral : Service Générateur d'Extensions pour Joomla

          Commentaire


          • #6
            Re : Comment donner des valeurs initiales aux champs Jlayout

            Hello.

            J'ai bien des propriétés "default" dans mon xml filter_nomdemavue.xml), mais je veux les modifier dynamiquement.

            Mais ce n'est pas le formatage que tu utilises, Jlayout demande :
            Code:
            <?xml version="1.0" encoding="utf-8"?>
            <form>
                <fields name="filter">
            ....
            En utilisant Jlayout, je n’appelle pas non plus la méthode getform dans le model.
            C'est une vue de type list, hormis le bloc des filtres, je n'utilise donc pas JForm pour l'affichage des Items.

            Le formulaire 'filtre' et ses sous formulaires (les filtres perso sont défini dans le xml filter_nomdemavue.xml) est retourné par l'appel de :
            Code PHP:
            $this->filterForm $this->get('FilterForm'); 
            dans le display de la vue.
            Avec cette instruction le framework de Joomla recherche alors le xml du sous-formulaires de nom filter_nomdemavue.xml dans les layouts de Joomla, puis dans .../com_moncomposant/models/forms/

            Le rendu du formulaire global standard joomla.searchtools.default sera ensuite calculé dans le template de la vue par l'instruction :
            Code PHP:
            echo JLayoutHelper::render('joomla.searchtools.default', array('view' => $this'options' => array('filtersHidden' => 1,))); 
            qui lui même chargera le sous-formulaire contenu dans $this->filterForm.
            (J'ai tracé le déroulement du code).

            Les filtres actifs sont retournées sous forme d'un array par :
            Code PHP:
            $this->activeFilters $this->get('ActiveFilters'); 
            Instruction aussi située dans la méthode display de la vue.

            et bien que dans ce tableau les filtres soient correctement valorisés lors du premier passage (j'ai vérifié le contenu toujours en mode xdebug), l'affichage des valeurs sélectionnées ne se fait pas (sauf si des default figurent dans le xml, auquel cas c'est cette sélection qui sera faite, mais pas en concordance avec la valeur de filtres).

            Par contre l'affichage se fait correctement (donc avec les champs sélectionnés et sans avoir besoin de faire des affectations
            Code PHP:
            $this->filterForm->setValue(...); 
            ) après que l'on ait sélectionné un filtre (donc au minimum au 2ème appel de la vue).

            Es-tu sur que tu utilises la classe Jlayout qui permet de factoriser des "blocs" de formulaires (layouts / sous-formulaires).
            (Et dans ce cas précis layout standard : joomla.searchtools.default dons les fichiers sont situés dans \layouts\joomla\searchtools\default)

            Dans tes explications, j'ai l'impression que tu utilises uniquement Jform et JFormfield et que tu utilises un formulaire unique de ta composition.
            Non ?

            En tous cas merci du temps que tu m'accordes.
            Dernière édition par roland_d_alsace à 18/06/2017, 18h51 Raison: précisions et corrections
            A tous les utilisateurs de Joomla du très Grand Est de la France et du Jura suisse
            Rejoignez le Joomla Users Groupe Alsace...
            roland_d_alsace va-t-il devenir roland_du_grand_est ?

            Commentaire


            • #7
              Re : Comment donner des valeurs initiales aux champs Jlayout

              Ok, effectivement, j'ai lu trop vite, et focalisé sur l'application des filtres, et j'ai zappé ton utilisation de JLayout.

              Oui, effectivement, de mon côté ce sont des instances JForm, et ces processus. Je connais mal JLayout, mais ton post m'intéresse, aussi je reviendrai si j'en apprends un peu plus du côté de mon générateur favori.
              (mais je pense qu'il n'exploite pas encore JLayout ...)
              Developper of JBreeding Manager: http://www.jbreeding.fr/
              J-cook Referral : Service Générateur d'Extensions pour Joomla

              Commentaire


              • #8
                Re : Comment donner des valeurs initiales aux champs Jlayout

                Je ne pense pas non plus.
                J'étais à ta présentation de Cook à Marseille.
                (Je crois d'ailleurs que c'est moi qui a posé le + de question, surtout concernant le code généré...)
                A tous les utilisateurs de Joomla du très Grand Est de la France et du Jura suisse
                Rejoignez le Joomla Users Groupe Alsace...
                roland_d_alsace va-t-il devenir roland_du_grand_est ?

                Commentaire


                • #9
                  Re : Comment donner des valeurs initiales aux champs Jlayout

                  ha yes! ok.

                  J'espère que tu as pu jeté un œil. J'ai transmis l'url de présentation des slides et du composant JDayProgram, dans la dernière version du Builder
                  Developper of JBreeding Manager: http://www.jbreeding.fr/
                  J-cook Referral : Service Générateur d'Extensions pour Joomla

                  Commentaire


                  • #10
                    Re : Comment donner des valeurs initiales aux champs Jlayout


                    et bien que dans ce tableau les filtres soient correctement valorisés lors du premier passage (j'ai vérifié le contenu toujours en mode xdebug), l'affichage des valeurs sélectionnées ne se fait pas (sauf si des default figurent dans le xml, auquel cas c'est cette sélection qui sera faite, mais pas en concordance avec la valeur de filtres).

                    Par contre l'affichage se fait correctement (donc avec les champs sélectionnés et sans avoir besoin de faire des affectations)
                    c'est ça que je ne comprends pas dans ta description.
                    Que ce soit des filtres appelés par JForm ou JLayout, s'il n'y a pas de default="xxx", il ne peut pas y avoir de filtrage de la collection items au premier affichage ?!? sur quelle valeur ?
                    Developper of JBreeding Manager: http://www.jbreeding.fr/
                    J-cook Referral : Service Générateur d'Extensions pour Joomla

                    Commentaire


                    • #11
                      Re : Comment donner des valeurs initiales aux champs Jlayout

                      Envoyé par liubov Voir le message
                      c'est ça que je ne comprends pas dans ta description.
                      Que ce soit des filtres appelés par JForm ou JLayout, s'il n'y a pas de default="xxx", il ne peut pas y avoir de filtrage de la collection items au premier affichage ?!? sur quelle valeur ?
                      L'instruction
                      Code PHP:
                      $this->activeFilters $this->get('ActiveFilters'); 
                      utilisé dans la vue, retourne bien un tableau avec chaque valeur des filtres (nom du filtre en indice).
                      Logiquement elle appelle la méthode getActiveFilters du model (classe mère JModelList si non redéfinie dans la classe fille du model utilisé).

                      Cette méthode getActiveFilters :
                      • recherche les filtres définis dans la propriété $this->filter_fields
                      • regarde si la propriété filter.nom_du_filtre a été definie (et une valeur affectée)
                      • et l'affecte au tableau retourné


                      Et c'est pourquoi je ne comprends pas que Jlayout ne prend pas en compte ces valeurs au premier passage.
                      Ce qui m’oblige à les affecter directement dans le sous-formulaire par un $this->filterForm->setValue.
                      (alors que, j'en suis certain, ce n'est pas la bonne méthode -ou alors un bug peut-être ?-).

                      Classiquement, les filtres sont initialisés par les instructions faites dans la méthode populatestate du model.

                      Code PHP:
                      $this->setState('filter.nom_du_filtre'$valeur_du_filtre); 
                      Filtres dont les noms doivent être bien définis (comme à l’habitude, même sans utiliser JLayout) dans le constructeur du model :
                      Code PHP:
                      public function __construct($config = array())
                          {
                              if (empty(
                      $config['filter_fields'])) {
                                  
                      $config['filter_fields'] = array(
                                      
                      'nom_du_filtre',
                                      
                      'nom_du_filtre2',
                                      ....
                                  );
                              }
                              
                      parent::__construct($config); 
                      Dernière édition par roland_d_alsace à 19/06/2017, 10h51
                      A tous les utilisateurs de Joomla du très Grand Est de la France et du Jura suisse
                      Rejoignez le Joomla Users Groupe Alsace...
                      roland_d_alsace va-t-il devenir roland_du_grand_est ?

                      Commentaire

                      Annonce

                      Réduire
                      Aucune annonce pour le moment.

                      Partenaire de l'association

                      Réduire

                      Hébergeur Web PlanetHoster
                      Travaille ...
                      X