IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Langage PHP Discussion :

récupérer toutes les valeurs dans une boucle


Sujet :

Langage PHP

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Avril 2003
    Messages
    249
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2003
    Messages : 249
    Points : 66
    Points
    66
    Par défaut récupérer toutes les valeurs dans une boucle
    Bonjour
    je pensais avoir trouvé une alternative à un problème, mais je viens de m'apercevoir que je ne récupère pas toutes les valeurs de case à cocher

    DEBUG
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    array(1) {
      ["row0"]=>
      array(2) {
        ["field110"]=>
        string(3) "119"
        ["field112"]=>
        array(2) {
          [0]=>
          string(12) "réalisation"
          [1]=>
          string(16) "édition DVD ..."
        }
      }
    }
    string(12) "réalisation"
    Kamea Meah( réalisation )
    J'arrive bien à récupérer la 1ère valeur sur 4 , mais pas la 2ème.
    Voir le code actuel qui devra fonctionner en php > 8.2

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    if ('films-pros' === $field->name && 'subform' === $field->type) { 
    		echo "<br /><b><span><i class='fa fa-link fa-1x' aria-hidden='true'></i></span> Pro(s) en lien avec ce film : </b>"; 
    		$field_value = json_decode($this->item->jcfields[111]->rawvalue, true);
    		echo '<pre>', var_dump($field_value), '</pre>'; // ok	
    		$app = Factory::getApplication();
    		$factory = $app->bootComponent('com_content')->getMVCFactory();    
    	 	$table = $factory->createTable('Article', 'Table'); 		
     
    		foreach ($field->subform_rows as $subform_row) {
    		    foreach ($subform_row as $subField) {	 
    		        if ('film-pro-lie' === $subField->fieldname) 
    			{
    		            	$titre_art = $subField->value;
    				$article_id = $field_value['row0']['field110']; 
    				$table->load($article_id); /* obligé de mettre ces 2 lignes ici */	
    				$item_catid = $table->catid;
    				//echo '<pre>', var_dump($article_id), '</pre>';$field_value['row0']['field112']; Nu ide
     
    				$film_type_pro = $field_value['row0']['field112'][0];				
    				echo '<pre>', var_dump($film_type_pro), '</pre>'; 		            	
    		            	echo HTMLHelper::link(
    		                Route::link("site", "index.php?option=com_content&view=article&id={$article_id}&catid={$item_catid}"),
    		                $titre_art  ."( " .$film_type_pro ." )");	                
     
    		        }
     
    		    }
     
     
     
     
    		}
     
    	    }

  2. #2
    Membre du Club
    Profil pro
    Inscrit en
    Avril 2003
    Messages
    249
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2003
    Messages : 249
    Points : 66
    Points
    66
    Par défaut
    Bonjour
    je vois que la demande a eu pas mal d'affichage, néanmoins est-ce que ce n'est pas clair? ce qui a été le cas dans le passé
    @+

  3. #3
    Membre éclairé
    Homme Profil pro
    Autre
    Inscrit en
    Juillet 2021
    Messages
    381
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Autre

    Informations forums :
    Inscription : Juillet 2021
    Messages : 381
    Points : 764
    Points
    764
    Par défaut
    Bonjour Hervé,

    Difficile de donner un code tout fait car on ne connait pas bien la structure des données, nous n'avons pas accès aux données d'exemple et je ne suis pas sûr d'avoir bien compris le résultat final attendu.

    Concernant les cases à cocher, puisque tu peux avoir plusieurs cases cochées, il faut parcourir la liste des cases avec une boucle.
    Sur la ligne $film_type_pro = $field_value['row0']['field112'][0]; tu récupères uniquement la première case (index 0). Il faut faire une boucle sur la variable $field_value['row0']['field112'] pour parcourir les cases.


    Je ne suis pas sûr de t'avoir vraiment aidé ma précédente intervention : je vois que tu as repris l'exemple d'utilisation des boucles foreach pour parcourir les custom fields, mais je crains que tu mélanges cette approche avec l'accès direct via les identifiants des custom fields.

    Les identifiants des custom fields (field110, field112) sont des identifiants techniques provenant de la base de données (clés primaires).
    Si tu utilises plusieurs bdd (une pour le site en ligne et une pour le site en dev par exemple) et/ou que tu modifies la structure des custom fields, les identifiants seront alors différents et tu devras adapter ton code avec les nouveaux identifiants.

    L'utilisation d'une boucle permet de parcourir les custom fields en faisant une comparaison sur le nom du champ et pas sur son identifiant.
    Puisque les noms des champs ne devraient pas changer, le code fonctionnera correctement même si les identifiants sont différents.

    Il est mieux de choisir une seule approche : soit on accède aux champs via leurs identifiants (plus simple mais le code n'est pas portable), soit on accède aux champs via leurs noms (plus compliqué mais meilleure portabilité du code).
    A part rendre le code plus complexe, il ne semble pas y avoir d'interet à mélanger les 2 approches.


    Dans tous les cas, l'utilisation des fields de type subform répétable entraine l'utilisation de boucle pour parcourir les entrées du subform, ce qui implique une complexité algorithmique non-négligeable : 3 boucles imbriquées peuvent vite devenir un casse-tête, d'autant plus si tu es débutant en algorithmie.


    Enfin, ce n'est surement pas la réponse attendue mais je pense que c'est le meilleur conseil : tu ne devrais pas avoir besoin de faire tout ce code pour réaliser ton besoin (bien que ce dernier ne soit pas clairement défini).
    De ce que je comprends, tu veux créer des relations entre différents articles Joomla pour les afficher les liens des articles en relation.
    Ca tombe bien puisque le CMS permet nativement de faire cela : tu peux utiliser les catégories et/ou les tags pour organiser tes articles, puis utiliser les modules du CMS (mod_articles_category par exemple) pour afficher les articles en relations sur la vue article.
    Tu pourrais aussi utiliser le module mod_related_items qui utilise les mots-clés des articles pour créer les relations.

    A moins d'avoir un besoin spécifique non supporté nativement par le CMS, il serait mieux d'utiliser les fonctionnalités de ce dernier sans devoir toucher au code.
    Tu arriveras surement plus vite au résultat souhaité (bien que l'organisation des articles et la configuration initiale des modules prennent un certain temps) et de manière plus fiable/stable.
    Tu pourras toujours faire des surcharges de template pour modifier le code afin de personnaliser l'affichage du site, mais il serait surement mieux d'utiliser le code natif du CMS pour la partie fonctionnelle du site.

  4. #4
    Membre du Club
    Profil pro
    Inscrit en
    Avril 2003
    Messages
    249
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2003
    Messages : 249
    Points : 66
    Points
    66
    Par défaut
    Bonjour Pytet
    Merci pour ce long retour. Tu as bien suivi une partie de la démarche ,
    Pour en avoir discuté avec plusieurs personnes dont des dev' joomla; J'en arrive à la conclusion que mon besoin ne peut pas être fait nativement (ça j'y crois vraiment). J'avais fais pas mal d'essais y compris avec des extensions de regular labs ...

    Maintenant je ne peux plus changer l'architecture alors que je commence à communiquer pour faire de l'ajout de contenu via des batchs (fichier csv) auprès de partenaires sur un site fonctionnel.

    Je viens juste de m'apercevoir que cela n'était pas pleinement fonctionnel, car la plupart des fiches 'pro de films" dans ce cas, n'ont qu'une seule case de cocher et je n'avais pas vérifier le cas où plusieurs cases étaient cochées

    J'avoue aussi que je suis fatigué d'avoir passé de nombreux jours la dessus; C'est presque bon, même si j'ai du faire des compromis en mettant le même terme dans le contenu

    je suis conscient que ce n'est pas optimal (mélange de code) mais j'ai jonglé avec les bouts de code fournis par différentes personnes qui n'ont pas pris en compte l'ensemble et je ne suis pas dev'

    Il me semble qu'effectivement je dois faire une boucle sur la variable $field_value['row0']['field112'] mais j'ai encore du mal

    Je ne sais pas ce qu'il manque pour améliorer la compréhension.


    le résultat attendu étant l'affichage d'un lien de type:
    Code html : Sélectionner tout - Visualiser dans une fenêtre à part
    <a href="/professionnel-film/kamea-meah">Kamea Meah( réalisation - diffusion, distribution - édition DVD ... )</a>

    je joins à tout hasard l'image du champ personnalisé de l'id 112:
    Nom : Capture d’écran du 2023-07-27 14-50-15.png
Affichages : 81
Taille : 51,6 Ko

  5. #5
    Membre éclairé
    Homme Profil pro
    Autre
    Inscrit en
    Juillet 2021
    Messages
    381
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Autre

    Informations forums :
    Inscription : Juillet 2021
    Messages : 381
    Points : 764
    Points
    764
    Par défaut
    Puisque tu veux récupérer la liste des cases cochées sous forme d'une chaine de caractères ("réalisation - diffusion, distribution..."), tu peux essayer d'utiliser la fonction implode à la place d'une boucle sur le tableau $field_value['row0']['field112'].

    Je n'ai pas de Joomla sous la main pour tester donc le code est à vérifier, dans l'idée :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    <?php
    // initialise la table avant la boucle
    $app = Factory::getApplication();
    $factory = $app->bootComponent("com_content")->getMVCFactory();
    $table = $factory->createTable("Article", "Table");
     
    foreach ($this->item->jcfields as $field) {
        if ("films-pros" === $field->name && "subform" === $field->type) {
            echo "<br /><b><span><i class='fa fa-link fa-1x' aria-hidden='true'></i></span> Pro(s) en lien avec ce film : </b>";
            $field_value = json_decode($this->item->jcfields[111]->rawvalue, true);
     
            foreach ($field->subform_rows as $subform_row) {
                foreach ($subform_row as $subField) {
                    if ("film-pro-lie" === $subField->fieldname) {
                        $titre_art = $subField->value;
                        $article_id = $field_value["row0"]["field110"];
     
                        $table->load($article_id);
                        $item_catid = $table->catid;
     
                        $film_types_pro = implode(", ", $field_value["row0"]["field112"]);
     
                        echo HTMLHelper::link(
                            Route::_("index.php?option=com_content&view=article&id={$article_id}&catid={$item_catid}"),
                            $titre_art . "(" . $film_types_pro . ")"
                        );
                    }
                }
            }
        }
    }

  6. #6
    Membre du Club
    Profil pro
    Inscrit en
    Avril 2003
    Messages
    249
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2003
    Messages : 249
    Points : 66
    Points
    66
    Par défaut
    C'est génial , c'est super
    Tu as même allégé le code
    Merci
    Cela me soulage, car j'ai actuellement plusieurs projets en parallèle qui n'avance pas ou si peu! et résoudre ce projet bénévole (et cette partie technique un peu en dehors de mon champ de compétences) qui trainait depuis des mois me fait du bien

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Récupérer toutes les valeurs d'une liste déroulante
    Par christgh dans le forum Langage
    Réponses: 4
    Dernier message: 10/12/2008, 22h17
  2. lecture de tout les valeur dans une table
    Par warning dans le forum VB.NET
    Réponses: 7
    Dernier message: 05/11/2008, 16h17
  3. Comment récupérer toutes les valeurs dans :params avec form_tag ?
    Par Didier Pitre dans le forum Ruby on Rails
    Réponses: 0
    Dernier message: 17/04/2008, 11h33
  4. Concaténer les valeurs dans une boucle
    Par philippef dans le forum Langage
    Réponses: 4
    Dernier message: 28/08/2007, 21h08
  5. [RegEx] Regex : récupérer toutes les occurences dans une chaîne
    Par Poulpynette dans le forum Langage
    Réponses: 1
    Dernier message: 10/10/2006, 11h14

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo