Boucle foreach buggée ?

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

  • [RÉGLÉ] Boucle foreach buggée ?

    Bonjour,

    En cours de développement d'un composant Joomla 1.5, je me retrouve bloqué sur un problème des plus étranges ...
    Depuis ma vue, je récupère des données BDD, ci-dessous la fonction de mon modèle :
    Code PHP:
        function &getContacts()
        {
            if ( empty( 
    $this->_contacts ) )
            {
                
    $query ' SELECT id_entreprise, id_genre, nom, prenom, tel, mail, interlocuteur, id_fonction'.
                        
    ' FROM contacts'.
                        
    ' WHERE id_entreprise = '.$this->_id .
                        
    ' ORDER BY nom';
                
    $this->_db->setQuery $query );
                
    $this->_contacts $this->_db->loadObjectList();
            }
            
            if ( !
    $this->_contacts )
            {
                
    $this->_contacts = new stdClass();            
                
    $this->_contacts->id_entreprise                0;
                
    $this->_contacts->id_fonction                1;
                
    $this->_contacts->id_genre                    1;
                
    $this->_contacts->nom                        '';
                
    $this->_contacts->prenom                    '';
                
    $this->_contacts->tel                        '';
                
    $this->_contacts->mail                        '';
                
    $this->_contacts->interlocuteur                0;
            }
            
            return 
    $this->_contacts;
        } 
    Dans ma vue je glisse ces données à mon template, que je récupère avec $this->contacts dans une boucle foreach. Sur une modification d'enregistrement, tout va bien, ma liste de contacts se charge nickel.

    En création d'enregistrement par contre, cas où le modèle crée une instance de stdClass() avec des données de base, le foreach boucle 8 fois !
    Un count($this->contacts) me renvoi bien 1 ...
    Un truc étrange : 8 et le nombre d'enregistrements de la table fonction utilisée pour générer un des SELECT du template ...

    Ci-dessous un bout du template en espérant que quelqu'un puisse m'éclairer ... d'avance merci
    Code PHP:
    foreach ( $this->contacts as $contact )
    {
    ?>
    <tr class='contactGsf'>
        <td>
            <select id='id_genre' name='id_genre'>
                <?php
                
    foreach ( $this->genres as $genre )
                {
                    if ( 
    $genre->id_genre == $contact->id_genre )
                    { 
    $sel 'selected '; }
                    else
                    { 
    $sel ''; }
                
    ?>    
                    <option <?php echo $sel?>value="<?php echo $genre->id_genre?>">
                        <?php echo $genre->libelle?>
                    </option>
                <?php
                
    }
                
    ?>
            </select>
        </td>
        <td>
            <input class="inputbox" type="text" name="nom" id="nom" size="35" maxlength="150" value="<?php echo $contact->nom?>" />
        </td>
        <td>
            <input class="inputbox" type="text" name="prenom" id="prenom" size="35" maxlength="150" value="<?php echo $contact->prenom?>" />
        </td>
        <td>
            <select id='id_fonction' name='id_fonction'>
                <?php
                
    foreach ( $this->fonctions as $fonction )
                {
                    if ( 
    $contact->id_fonction == $fonction->id_fonction )
                    { 
    $sel 'selected '; }
                    else
                    { 
    $sel ''; }
                
    ?>    
                    <option <?php echo $sel?>value="<?php echo $fonction->id_fonction?>">
                        <?php echo $fonction->libelle?>
                    </option>
                <?php
                
    }
                
    ?>
            </select>
        </td>
        <td>
            <input class="inputbox" type="text" name="tel" id="tel" size="30" maxlength="30" value="<?php echo $contact->tel?>" />
        </td>
        <td>
            <input class="inputbox" type="text" name="mail" id="mail" size="35" maxlength="150" value="<?php echo $contact->mail?>" />
        </td>
        <td align="center">
            <input type="checkbox" <?php echo $checkM?> name="interlocuteur" id="interlocuteur" value="<?php echo $contact->interlocuteur?>" />
        </td>
    </tr>
    <?php
    }
    ?>
    Dernière édition par Benzouye à 29/11/2011, 18h11

  • #2
    Re : Boucle foreach buggée ?

    Envoyé par Benzouye Voir le message
    En création d'enregistrement par contre, cas où le modèle crée une instance de stdClass() avec des données de base, le foreach boucle 8 fois !
    Un count($this->contacts) me renvoi bien 1 ...
    $this->contacts est un objet de type stdClass et cet objet a 8 propriétés (cf. ton modèle) donc un foreach sur $this->contacts boucle sur les propriétés de cet objet (c'est normal).

    Si count($this->contacts) renvoie 1 c'est que count() doit mer*** avec les objets (?). La soluce consiste à caster l'objet en array :
    Code PHP:
    count( (array) $this->contacts
    PHP is a popular general-purpose scripting language that powers everything from your blog to the most popular websites in the world.
    Fly06_Fr (http://www.fly06.fr/)
    -------------------------------------------
    Classe MooTools pour Recherche Asynchrone (Ajax) : http://forum.joomla.fr/showthread.ph...one-%28Ajax%29

    Commentaire


    • #3
      Re : Boucle foreach buggée ?

      Bonjour,
      8 c'est surtout le nombre de champs que tu initialises :
      Code PHP:
                  $this->_contacts->id_entreprise                0
                  
      $this->_contacts->id_fonction                1
                  
      $this->_contacts->id_genre                    1
                  
      $this->_contacts->nom                        ''
                  
      $this->_contacts->prenom                    ''
                  
      $this->_contacts->tel                        ''
                  
      $this->_contacts->mail                        ''
                  
      $this->_contacts->interlocuteur                0
      il doit falloir cibler un $this->_contacts[1] ou un truc du genre.
      Dans quel but initilises-tu un faux contact (ha ha) ?
      Schtroumpfe toi le Schtroumpf t'aidera.
      Je ne schtroumpfe pas aux demandes de schtroumpf par MP.

      Commentaire


      • #4
        Re : Boucle foreach buggée ?

        Merci pour vos réponses !

        Ce que vous m'annoncez est troublant puisque si j'édite un enregistrement existant qui n'a qu'un seul contact enregistré (première partie de ma fonction getContacts), tout se passe bien ... le foreach fonctionne bien, et non pas 8 fois pour les 8 champs ...

        En fait j'initialise un "faux contact" pour que dans mon formulaire, s'affiche au moins une ligne de contact vierge. J'ai ensuite un JS qui ajoute de nouvelles lignes de contacts si besoin.

        Comment puis-je faire pour traiter de la même façon (avec le même formulaire) la création d'un nouvel enregistrement et la modification d'un existant ?
        Puis-je modifier le modèle pour que l'initialisation du contact vierge retourne la même chose que le LoadObjectList ?

        Encore merci !

        Commentaire


        • #5
          Re : Boucle foreach buggée ?

          Re,
          Ce que vous m'annoncez est troublant puisque si j'édite un enregistrement existant qui n'a qu'un seul contact enregistré (première partie de ma fonction getContacts), tout se passe bien ... le foreach fonctionne bien, et non pas 8 fois pour les 8 champs ...
          évidemement, tu ne passes pas dans le if ( !$this->_contacts ) . Ce que je dit c'est que l'assignation des champs $this->_contacts->colonne= valeur; n'est pas correcte et crée une nouvelle entrée de tableau à chaque fois. Enlèves-en deux et tu tomberas à 6 lignes...
          Je n'ai pas la syntaxe exacte en tête ça doit ressembler comme je l'ai écrit plus haut à $this->_contacts[1]->colonne= valeur
          Dernière édition par Grand Schtroumpf à 30/11/2011, 10h47
          Schtroumpfe toi le Schtroumpf t'aidera.
          Je ne schtroumpfe pas aux demandes de schtroumpf par MP.

          Commentaire


          • #6
            Re : Boucle foreach buggée ?

            Yop ! J'ai donc modifié l'initialisation comme ci-dessous, et ça roule !

            Code PHP:
            if ( !$this->_contacts )
                    {
                        
            //$this->_contacts = new stdClass();            
                        
            $this->_contacts[1]->id_entreprise                0;
                        
            $this->_contacts[1]->id_fonction                1;
                        
            $this->_contacts[1]->id_genre                    1;
                        
            $this->_contacts[1]->nom                        '';
                        
            $this->_contacts[1]->prenom                        '';
                        
            $this->_contacts[1]->tel                        '';
                        
            $this->_contacts[1]->mail                        '';
                        
            $this->_contacts[1]->interlocuteur_mecaloire    0;
                    } 
            Merci !

            EDIT : d'ailleurs j'ai mis _contacts[1] alors que [0] doit fonctionner ...
            Dernière édition par Benzouye à 30/11/2011, 10h34

            Commentaire

            Annonce

            Réduire
            Aucune annonce pour le moment.

            Partenaire de l'association

            Réduire

            Hébergeur Web PlanetHoster
            Travaille ...
            X