tri sur des Champs Personnalisés dans un override (surcharge)

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

  • [RÉGLÉ] tri sur des Champs Personnalisés dans un override (surcharge)

    Bonjour à tous,

    Petite question orientée PHP... et tri.
    Imaginez un site de festival qui présente des séances de films.
    Dans Joomla, on a donc une série de Champs Personnalisés pour chacune des séances :
    * champ Date (jour&heure)
    * champ Salle
    * champ Zone Texte (commentaire libre)
    * etc

    Potentiellement, il y a jusqu'à 10 séances par film par exemple.
    Au départ, les séances sont saisies dans l'ordre... sauf que parfois les programmateurs arrivent en dernière minute et que donc il faut "intercaler" de nouvelles séances.

    Actuellement, vu qu'il faut saisir les séances dans l'ordre, ça oblige donc à resaisir une série de champs pour les X séances à décaler.

    Bref, vu que le cas se présente de plus en plus souvent, le plus facile/sympa serait de pouvoir trier simplement dans l'override sur base du champ Date (jour+heure) des 10 séances.
    Genre une petite boucle donc.
    Comment faire ça le plus proprement possible, sachant que l'override ressemble à ceci (là je montre pour les séances 1 et 2, mais il y en a 10) ?

    Merciii d'avance pour les suggestions

    Code PHP:
                <?php if (!empty($this->item->jcfields[17]->value)): ?>

                <!--sceance 1-->
                <div class="line-sceance">
                  <div class="left-seance">
                    <div class="date"><?php echo strftime("%A %d/%m",strtotime($this->item->jcfields[17]->value));?>
                      <span class="heure"><?php echo strftime("%HH%M",strtotime($this->item->jcfields[17]->value));?>
                      </span>
                    </div>
                    <div class="prix"><?php echo @$this->item->jcfields[18]->value?></div>
                  </div>
                  <div class="right-seance">
                    <div class="lieu"><?php echo @$this->item->jcfields[60]->value?></div>
                    <div class="commentaire"><?php echo @$this->item->jcfields[19]->value?></div>
                  </div>
                </div>
                <?php endif; ?>

                <?php if (!empty($this->item->jcfields[21]->value)): ?>
                <!--sceance 2-->
                <div class="line-sceance">
                  <div class="left-seance">
                    <div class="date"><?php echo strftime("%A %d/%m",strtotime($this->item->jcfields[21]->value));?>
                      <span class="heure"><?php echo strftime("%HH%M",strtotime($this->item->jcfields[21]->value));?>
                      </span>
                    </div>
                    <div class="prix"><?php echo @$this->item->jcfields[22]->value?></div>
                  </div>
                  <div class="right-seance">
                    <div class="lieu"><?php echo @$this->item->jcfields[61]->value?></div>
                    <div class="commentaire"><?php echo @$this->item->jcfields[23]->value?></div>
                  </div>
                </div>
                <?php endif; ?>
    Dernière édition par woluweb à 17/10/2018, 13h22
    Présentations : slides.woluweb.be | Coordonnées complètes : www.woluweb.be

    Un message d’erreur sur votre site Joomla... ayez le reflexe de consulter la base de connaissance : https://kb.joomla.fr

    Ce forum, vous l'aimez ? Il vous a sauvé la vie ? Vous y apprenez régulièrement ? Alors adhérer à l'AFUJ, l'Association Francophone des Utilisateurs de Joomla : https://www.joomla.fr/association/adherer

  • #2
    Cela va faire gros troll, mais tu comprends pourquoi j'adore Flexicontent et ses champs ?
    Xavier
    Chabi01 - http://www.xlformation.com

    Commentaire


    • #3
      Salut chabi01
      Dis, depuis la nouvelle version de vBulletin, je ne trouve plus le bouton "bloquer 24h un modo impertinent". Tu peux m'aider ? :P
      Présentations : slides.woluweb.be | Coordonnées complètes : www.woluweb.be

      Un message d’erreur sur votre site Joomla... ayez le reflexe de consulter la base de connaissance : https://kb.joomla.fr

      Ce forum, vous l'aimez ? Il vous a sauvé la vie ? Vous y apprenez régulièrement ? Alors adhérer à l'AFUJ, l'Association Francophone des Utilisateurs de Joomla : https://www.joomla.fr/association/adherer

      Commentaire


      • #4
        Impossible ! Si je m'arrête sur tes "petites barres" sous ton pseudo, il est marqué "Woluweb est vraiment gentil"
        Sinon, après ta question, j'ai fureté à droite à gauche sur les forum en anglais et cela ne semble pas intégré le tri ?

        Allez, j'ai une question pour ta question
        - Tes champs sont tous différents ? Tu peux lister tes champs ? Si je devais faire un tri (en sachant que dans Flexicontent tu choisis ton tri et c'est fait ) en php, je ferai un tableau (array) de toutes les valeurs et je trierai le tableau avant de le restituer trié...

        Xavier
        fatimaperau aime ceci.
        Chabi01 - http://www.xlformation.com

        Commentaire


        • #5
          Ben oui, c'est l'idée : un Array puis un tri
          Sauf que je parle français, néerlandais et anglais... mais moins bien PHP.
          Donc un petit exemple "propre" me mettrait le pied à l'étrier (et c'est pour ça que je mettais l'extrait de mon override)
          Présentations : slides.woluweb.be | Coordonnées complètes : www.woluweb.be

          Un message d’erreur sur votre site Joomla... ayez le reflexe de consulter la base de connaissance : https://kb.joomla.fr

          Ce forum, vous l'aimez ? Il vous a sauvé la vie ? Vous y apprenez régulièrement ? Alors adhérer à l'AFUJ, l'Association Francophone des Utilisateurs de Joomla : https://www.joomla.fr/association/adherer

          Commentaire


          • #6
            Bon, histoire d'être constructif, je regarde vite fait ton histoire
            Pour que je ne dises pas de bêtises, il faut que je comprenne bien comment tu as fait au départ.

            Corrige moi si je me trompe :
            Pour chaque article, tu as un champ que tu rends 2 fois dans ton code, une fois en date, une fois en heure.

            Ce qui veux dire si je comprends bien que tu as pour chaque article créé :
            - 10 champs date (pour la date et l'heure)
            - 1 champ lieux (ou plus ?)
            - 1 champ prix (ou plus ?)
            - 1 champ commentaire (ou plus ?)

            Je ne crois pas (mais je peux me tromper puisque je n'utilise pas les custom fields de Joomla ) que les champs puissent avoir du "multi-value" comme dans Flexicontent, correct ?

            Xav
            Chabi01 - http://www.xlformation.com

            Commentaire


            • #7
              Bon, sans attendre ta réponse et en imaginant que tes valeurs sont dans 10 variables différentes (et sans avoir tester le code !), voilà ce que m'inspire alors ton histoire :
              10 custom fields, récupération des 10 valeurs dans un tableau unique, tri descendant du tableau (rsort), restitution des valeurs triées
              Code:
              $montableau=array($item->jcFields['champvaleur1']->rawvalue, $item->jcFields['champvaleur2']->rawvalue, $item->jcFields['champvaleur3']->rawvalue, $item->jcFields['champvaleur4']->rawvalue, $item->jcFields['champvaleur5']->rawvalue, $item->jcFields['champvaleur6']->rawvalue, $item->jcFields['champvaleur7']->rawvalue, $item->jcFields['champvaleur8']->rawvalue, $item->jcFields['champvaleur9']->rawvalue, $item->jcFields['champvaleur10']->rawvalue);
              
              rsort($montableau);
              echo "Date et heure des sessions";
              foreach ($montableau as $key => $val) {
              echo strftime("%A %d/%m",strtotime($val);
              echo ' - ';
              echo strftime("%HH%M",strtotime($val);
              echo '<br/>';
              }
              ?>
              Si c'est pas à côté de la plaque (parce que j'ai pô compris la question), cela pourra peut être t'aider

              Xav
              Chabi01 - http://www.xlformation.com

              Commentaire


              • #8
                Grand merci le troll !

                C'est presque ça, sauf que c'est en 2 dimensions :
                - date1, date2, date3, ... date10
                - lieu1, ... lieu10
                - commentaire1, ... commentaire10

                Il faut bien trier sur la date, mais il faut que les lieux et commentaires suivent.
                Et que la boucle permette pour chaque évènement d'affiche sa date, son lieu, son commentaire
                Présentations : slides.woluweb.be | Coordonnées complètes : www.woluweb.be

                Un message d’erreur sur votre site Joomla... ayez le reflexe de consulter la base de connaissance : https://kb.joomla.fr

                Ce forum, vous l'aimez ? Il vous a sauvé la vie ? Vous y apprenez régulièrement ? Alors adhérer à l'AFUJ, l'Association Francophone des Utilisateurs de Joomla : https://www.joomla.fr/association/adherer

                Commentaire


                • #9
                  Hello, this is the troll
                  En fait, ce que tu me dis, c'est que tu as besoin de trier un tableau à 2 dimensions (mais on peut faire autant de dimensions que l'on veut dans l'absolu).
                  Essaye sur cette base (attention, encore une fois, écris sur bloc note et pas testé !!) :
                  Code:
                  $montableau=array(
                  'dateetlieu' =>
                  array($item->jcFields['champdate1']->rawvalue, $item->jcFields['champlieu1']->rawvalue),
                  array($item->jcFields['champdate2']->rawvalue, $item->jcFields['champlieu2']->rawvalue),
                  array($item->jcFields['champdate3']->rawvalue, $item->jcFields['champlieu3']->rawvalue),
                  array($item->jcFields['champdate4']->rawvalue, $item->jcFields['champlieu4']->rawvalue),
                  array($item->jcFields['champdate5']->rawvalue, $item->jcFields['champlieu5']->rawvalue),
                  array($item->jcFields['champdate6']->rawvalue, $item->jcFields['champlieu6']->rawvalue),
                  array($item->jcFields['champdate7']->rawvalue, $item->jcFields['champlieu7']->rawvalue),
                  array($item->jcFields['champdate8']->rawvalue, $item->jcFields['champlieu8']->rawvalue),
                  array($item->jcFields['champdate9']->rawvalue, $item->jcFields['champlieu9']->rawvalue),
                  array($item->jcFields['champdate10']->rawvalue, $item->jcFields['champlieu10']->rawvalue)
                  );
                  
                  
                  rsort($montableau);
                  echo "Date et heure des sessions";
                  
                  foreach ($montableau as $section => $items)
                  foreach ($items as $cle => $valeur)
                  echo strftime("%A %d/%m",strtotime($valeur);
                  echo ' - ';
                  echo strftime("%HH%M",strtotime($valeur);
                  echo '<br/>';
                  
                  ?>
                  Je ne me souviens plus si rsort va classer le tableau ou si il vaut mieux passer sur un tableau associatif (avec un tri associatif).
                  Essaye déjà ça : si quelqu'un voit une erreur au niveau du code, qu'il ne se gène pas pour intervenir !!

                  Xav
                  Chabi01 - http://www.xlformation.com

                  Commentaire


                  • #10
                    Merci chabi01 !

                    C'est con, j'avais posté il y a 30 minutes une réponse... mais dans un autre thread. aargh.

                    Revoici ce que j'écrivais (on se rejoint) :

                    C'est beau un forum : on pose une question, un modo donne un début de solution... et avec un peu de curiosité, parce que justement on a été mis sur la bonne piste, on trouve la solution tout seul

                    Comme mon tableau était multidimensionnel, je devais aller un cran plus loin.
                    Dans le même temps, c'est facile pour la lisibilité d'avoir un tableau par "variable" ("jour", "prix", "commentaire", "lieu").

                    Hé bien on peut combiner les deux grâce à array_multisort.

                    Voici donc ce à quoi je suis arrivé (mais si vous avez encore des suggestions d'amélioration, je suis toujours preneur !)

                    Code PHP:
                    <?php
                    $ar1 
                    = array(dazf);
                    $ar2 = array(41266);
                    $ar3 = array(deuxiemepremierquatriemetroisieme);
                    array_multisort($ar1$ar2$ar3);


                    foreach (
                    $ar1 as $key => $val) {
                    echo 
                    $ar1[$key] . ' - ' $ar2[$key] . ' - ' $ar3[$key] . '<br/>';
                    }

                    // print_r($ar1);
                    // print_r($ar2);
                    ?>
                    Présentations : slides.woluweb.be | Coordonnées complètes : www.woluweb.be

                    Un message d’erreur sur votre site Joomla... ayez le reflexe de consulter la base de connaissance : https://kb.joomla.fr

                    Ce forum, vous l'aimez ? Il vous a sauvé la vie ? Vous y apprenez régulièrement ? Alors adhérer à l'AFUJ, l'Association Francophone des Utilisateurs de Joomla : https://www.joomla.fr/association/adherer

                    Commentaire


                    • #11
                      Effectivement, tu as ici un tableau associatif, pas un tableau multidimensionnel
                      Chabi01 - http://www.xlformation.com

                      Commentaire


                      • #12
                        C'est ça !
                        Du coup, c'est assez lisible : un tableau par Champ et une seule boucle.

                        Tu m'auras fait faire des progrès. Pour mon tout 1er array c'est pas mal
                        Présentations : slides.woluweb.be | Coordonnées complètes : www.woluweb.be

                        Un message d’erreur sur votre site Joomla... ayez le reflexe de consulter la base de connaissance : https://kb.joomla.fr

                        Ce forum, vous l'aimez ? Il vous a sauvé la vie ? Vous y apprenez régulièrement ? Alors adhérer à l'AFUJ, l'Association Francophone des Utilisateurs de Joomla : https://www.joomla.fr/association/adherer

                        Commentaire


                        • #13
                          Tu as utilisé quoi alors, le multidimensionnel ou les tableaux séparés que tu tries en associatif ?

                          Sinon (et toute personne un peu versé dans Joomla devrait je pense avoir ce bouquin pour "aller plus loin"), je te conseille fortement ce bouquin :
                          Les développeurs de sites web interactif trouveront dans cette version actualisée les techniques fondamentales utiles pour optimiser, sécuriser et créer un site fonctionnel adapté également à la navigation mobile.


                          C'est un must, des exemples à en plus finir, pratiquement tout est abordé. Quand j'avais eu ce bouquin, je l'avais dévoré et même maintenant, il me sert de référence systématique.
                          Il vaut chaque centimes dépensés !

                          Xavier
                          manu93fr aime ceci.
                          Chabi01 - http://www.xlformation.com

                          Commentaire


                          • #14
                            Merci pour la référence chabi01

                            Concrètement, voici mon override au complet (enfin, la partie concernée), après réécriture.
                            Bref, je suis parti sur les 4 tableaux en associatif.
                            (si tu vois qu'on peut encore améliorer ça, n'hésite pas. C'est toujours chouette d'apprendre )

                            Et aussi une petite capture d'écran :
                            Cliquez sur l'image pour l'afficher en taille normale

Nom : 2018-10-17_16h32_04.png 
Affichages : 40 
Taille : 165,4 Ko 
ID : 1989625

                            Code PHP:
                                     <div class="seances">
                                       <h3>
                                         <?php echo JText::_('FILM_TITRE_SCEANCES'); ?>
                                       </h3>
                                       <div class="liste-sceances">
                                        <?php setlocale(LC_TIME"fr_FR"); ?>


                                        <?php // il y a 10 séances avec 4 champs (date, prix, commentaire et lieu) et on fait donc 4 tableaux
                                        
                            $date = array($this->item->jcfields[17]->value,$this->item->jcfields[21]->value,$this->item->jcfields[25]->value,$this->item->jcfields[29]->value,$this->item->jcfields[36]->value,$this->item->jcfields[40]->value,$this->item->jcfields[44]->value,$this->item->jcfields[48]->value,$this->item->jcfields[52]->value,$this->item->jcfields[56]->value);
                                        
                            $prix = array($this->item->jcfields[18]->value,$this->item->jcfields[22]->value,$this->item->jcfields[26]->value,$this->item->jcfields[30]->value,$this->item->jcfields[35]->value,$this->item->jcfields[39]->value,$this->item->jcfields[43]->value,$this->item->jcfields[47]->value,$this->item->jcfields[51]->value,$this->item->jcfields[55]->value);
                                        
                            $comm = array($this->item->jcfields[19]->value,$this->item->jcfields[23]->value,$this->item->jcfields[27]->value,$this->item->jcfields[31]->value,$this->item->jcfields[34]->value,$this->item->jcfields[38]->value,$this->item->jcfields[42]->value,$this->item->jcfields[46]->value,$this->item->jcfields[50]->value,$this->item->jcfields[54]->value);
                                        
                            $lieu = array($this->item->jcfields[60]->value,$this->item->jcfields[61]->value,$this->item->jcfields[62]->value,$this->item->jcfields[63]->value,$this->item->jcfields[64]->value,$this->item->jcfields[65]->value,$this->item->jcfields[66]->value,$this->item->jcfields[67]->value,$this->item->jcfields[68]->value,$this->item->jcfields[69]->value);
                                        
                            array_multisort($date$prix$lieu$comm); // on trie le tableau selon la date... et tous les autres tableaux adaptent correctement leur ordre en fonction. ATTENTION, comme on trie sur la date et qu'il y a des dates vides, ce sont d'abord les dates vides qui apparaissent dans le tri
                                        // si on voulait trier dans l'autre sens, pour avoir d'abord les dates les plus lointaines :
                                        // array_multisort($date, SORT_DESC, $prix, SORT_DESC, $lieu, SORT_DESC, $comm, SORT_DESC);
                                        
                            foreach ($date as $key => $val) {
                                        
                            // echo $date[$key] . ' - ' . $prix[$key] . ' - ' . $lieu[$key] . ' - ' . $comm[$key] . '<br/>';
                                        
                            ?>

                                            <?php if (!empty($date[$key])): ?>
                                            <div class="line-sceance">
                                              <div class="left-seance">
                                                <div class="date"><?php echo strftime("%A %d/%m",strtotime($date[$key]));?>
                                                  <span class="heure"><?php echo strftime("%HH%M",strtotime($date[$key]));?>
                                                  </span>
                                                </div>
                                                <div class="prix"><?php echo $prix[$key]; ?></div>
                                              </div>
                                              <div class="right-seance">
                                                <div class="lieu"><?php echo $lieu[$key]; ?></div>
                                                <div class="commentaire"><?php echo $comm[$key]; ?></div>
                                              </div>
                                            </div>
                                            <?php endif; ?>

                                        <?php //foreach ?>

                                       </div>
                                     </div>
                            Dernière édition par woluweb à 17/10/2018, 15h32
                            manu93fr aime ceci.
                            Présentations : slides.woluweb.be | Coordonnées complètes : www.woluweb.be

                            Un message d’erreur sur votre site Joomla... ayez le reflexe de consulter la base de connaissance : https://kb.joomla.fr

                            Ce forum, vous l'aimez ? Il vous a sauvé la vie ? Vous y apprenez régulièrement ? Alors adhérer à l'AFUJ, l'Association Francophone des Utilisateurs de Joomla : https://www.joomla.fr/association/adherer

                            Commentaire


                            • #15
                              Alors déjà, super au niveau du partage ! Ce post va surement servir à beaucoup qui utilises les custom fields
                              Sinon, je me pose une question (réflexe de programmation).
                              Scénario : le gars te rentre 5 dates, 1 lieu (parce qu'il pense que ce n'est pas la peine de répéter si le lieu est identique) et 2 commentaires (pour certaines sessions qui ont besoin d'un commentaire).
                              Comment se comporte alors ton script ? Est-ce que le tableau génère un blanc ou une erreur ?

                              Dans les 2 cas, il serait peut être intéressant d'ajouter des conditions avant de faire le rendu final : tu as simplement une boucle qui tourne tant que "date" n'est pas vide mais vérifie ce qui se passe avec une saisie "exotique" faite à l'arrache de tes utilisateurs...

                              Chabi01 - http://www.xlformation.com

                              Commentaire

                              Annonce

                              Réduire
                              Aucune annonce pour le moment.

                              Partenaire de l'association

                              Réduire

                              Hébergeur Web PlanetHoster
                              Travaille ...
                              X