Probleme de _getlist() dans mon modèle

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

  • [RÉGLÉ] Probleme de _getlist() dans mon modèle

    Bonjour,
    Je viens exposer mon problème qui doit se situer au niveau du _getList() de mon modèle,
    Quand je fait afficher mon datamodele qui contient le résultat d'une requête par l'attribut $row->id par exemple, on ne voit rien à l'affichage alors que j'ai exécuté la requête dans MySql et elle retourne bien une ligne dans ce cas les mais pourrai venir à en retourner plusieurs dans le futur.

    Dans modele :
    Code:
    var $_activites ;
    	
    	function getActivites(){
          if (empty( $this->_activites )){
            $query = ' SELECT DISTINCT jos_competences_activites.id, jos_competences_activites.code, jos_competences_activites.libelle 
    						FROM jos_competences_activites, jos_competences_metieractivites, jos_competences_metier
    						WHERE NOT jos_competences_activites.id 
    							IN (SELECT DISTINCT id_activites FROM jos_competences_metieractivites) ';
            $this->_activites = $this->_getList( $query ) ;
          }
          return $this->_activites ;
        }
    Dans le view.html :
    Code:
    $datamodelactivites =& $this->get('Activites');
    $this->assignRef('datamodelactivites', $datamodelactivites);
    Puis dans le default.php :
    Code:
    <?php
    					$k = 0;
    					//on boucle pour passer toutes les activites que possede la BDD activites de nom lié au metier.
    					for ($i=0 ; $i < count( $this->datamodelactivites ) ; $i++){
    						$row = &$this->datamodelactivites[$i];
    						?>
    							<OPTION value=<?php echo $row->id?>>
    									code : <?php echo $row->code; ?> | libelle :  <?php echo $row->libelle; ?> | id : <?php echo $row->id ;
    						
    						$k = 1 - $k;
    					}
    				?>
    Le <OPTION> viens du fait que je m'en sert pour faire un select multiple en html si quelqu'un aurai la solution à mon soucis

    Je me demande si le soucis ne vient pas du _getList() qui retournerai une éventuelle liste mais qui la le hasard fait que la requête ne sélectionne qu'une seule ligne.

    Merci d'avance
    Pierrelesek
    Dernière édition par pierrelesek à 20/12/2011, 16h06

  • #2
    Re : Probleme de _getlist() dans mon modèle

    J'ai la nette impression que _getList() ne supporte pas quand la requête ne renvoi qu'une ligne :s car si je supprime les condition de ma requête sa m'affiche bien le contenu de la table mysql :s

    Commentaire


    • #3
      Re : Probleme de _getlist() dans mon modèle

      J'ai déjà rencontré ce souci avec la méthode getObjectList()
      Mes échanges sur ce forum sont sur ce sujet.
      Il va falloir conditionner le traitement de ton retour en fonction du nombre d'enregistrements renvoyés par MySQL.

      Tiens nous au jus

      Commentaire


      • #4
        Re : Probleme de _getlist() dans mon modèle

        J'ai essayé en traitant séparément si il n'y a qu'une ligne :
        Code:
        function getActivitesnonlies(){
        		if (empty( $this->_activitesnonlies )){
        			$query = 'SELECT DISTINCT jos_competences_activites.id, jos_competences_activites.code, jos_competences_activites.libelle 
        							FROM jos_competences_activites, jos_competences_metieractivites, jos_competences_metier
        							WHERE NOT jos_competences_activites.id 
        								IN (SELECT id_activites FROM jos_competences_metieractivites)' ;
        			$this->_activitesnonlies = $this->_getList( $query ) ;
        			
        			$nombre = $this->_getListCount($query) ;
        			echo $nombre ;
        			if($nombre < 1){
        				$db =& $this->getDBO();
        				$db->setQuery($query);
        				$_activitesnonlies = $db->loadObject();
        			}
        		}
        		return $this->_activitesnonlies ;
            }
        Mais sa ne marche pas peut être la une mauvaise utilisation du loadobject()

        Commentaire


        • #5
          Re : Probleme de _getlist() dans mon modèle

          j'essai d'afficher le contenu de mon datamodel si il ne contient pas plus d'une ligne par sa :
          Code:
          $this->datamodelactivitesnonlies->id
          sa me dit "trying to get a property to a non-object..." :/

          Commentaire


          • #6
            Re : Probleme de _getlist() dans mon modèle

            Comme proposé par GrandSchtroumpf dans le sujet pointé plus haut, essaye avec :
            Code PHP:
            $this->datamodelactivitesnonlies[0]->id 

            Commentaire


            • #7
              Re : Probleme de _getlist() dans mon modèle

              Quand j'essai d'utiliser la méthode de grandschtroumf sa me dit :

              undefined offset : 0

              Commentaire


              • #8
                Re : Probleme de _getlist() dans mon modèle

                Bonjour,
                non pas d'index il s'agit d'un loadObject donc il ramène une seule ligne. Et même le "trying to get a property to a non-object" nous dit qu'il ne ramène pas de ligne du tout ce qui est logique puisque on est dans le cas ($nombre < 1) donc la listbox remplie avec la requête était vide...
                ... et je préfère ne pas savoir ce que tu es en train de faire dans ton code !
                Schtroumpfe toi le Schtroumpf t'aidera.
                Je ne schtroumpfe pas aux demandes de schtroumpf par MP.

                Commentaire


                • #9
                  Re : Probleme de _getlist() dans mon modèle

                  Je ne fait rien de très méchant, je récupère de simple données d'une base de données et je ne comprend pas pourquoi sur mysql la requête marche très bien mais pas la :/

                  Commentaire


                  • #10
                    Re : Probleme de _getlist() dans mon modèle

                    Re,
                    hum...
                    Code PHP:
                    function getActivitesnonlies(){ 
                    on définit une fonction, chouette.

                    Code PHP:
                        if (empty( $this->_activitesnonlies )){ 
                    si la liste activitesnonlies est vide :

                    Code PHP:
                    $query 'SELECT DISTINCT jos_competences_activites.id, jos_competences_activites.code, jos_competences_activites.libelle 
                        FROM jos_competences_activites, jos_competences_metieractivites, jos_competences_metier
                        WHERE NOT jos_competences_activites.id 
                        IN (SELECT id_activites FROM jos_competences_metieractivites)' 

                    on met une requête SQL dans $query. En passant elle fait le produit catésien de 3 tables sans clause de jointure, ça fait peur...

                    [php]$this->_activitesnonlies = $this->_getList( $query ) ;[/QUOTE]
                    et on recharge la liste à partir de $query

                    Code PHP:
                    $nombre $this->_getListCount($query) ;
                    echo 
                    $nombre 
                    on récupère dans $nombre le nombre d'éléments de la liste et on l'affiche. Tu vois combien d'ailleurs ?

                    Code PHP:
                    if($nombre 1){
                        
                    $db =& $this->getDBO();
                        
                    $db->setQuery($query);
                        
                    $_activitesnonlies $db->loadObject();

                    c'est là que j'ai du mal : ce code ne sert triplement à rien :
                    1. si $nombre est < 1 il vaut 0, donc le getlist n'a rien remené avec $query, pourquoi diable ce qui est dans le if en ramenrait plus ?
                    2.$_activitesnonlies n'est pas exploité par la suite,
                    3. loadobject ramène uniquement la 1ère ligne, il faudrait un loadobjectlist pour ramener le tout
                    Code PHP:

                    fin du if empty

                    Code PHP:
                    return $this->_activitesnonlies 
                    termine la fonction et renvoie activitesnonlies, ce qui ne sert à rien, il est défini au niveau de l'objet donc il a déjà été mis à jour

                    Code PHP:
                     
                    fin de la fonction.
                    Dernière édition par Grand Schtroumpf à 21/12/2011, 15h14
                    Schtroumpfe toi le Schtroumpf t'aidera.
                    Je ne schtroumpfe pas aux demandes de schtroumpf par MP.

                    Commentaire


                    • #11
                      Re : Probleme de _getlist() dans mon modèle

                      les Jointures SQL sont des manières de rendre une énorme requête plus propre mais elle sont pas forcément obligatoire pour arriver à ses fins

                      et l'affiche de $nombre me renvoi 0 et donc le if($nombre < 1) a été un petit délire personnel vue que l'API est assée mal développé je me suis dit si _getList() renvoi une liste on pourrai imaginer que si il renvoi qu'une ligne elle retourne 0 car elle a pas retourné de liste du coup je fait un traitement pour récupérer qu'une ligne.
                      c'étais un petit test personnel qui j’avoue dans la logique est complètement nul

                      Ceci dit avant que j'ajoute cette condition (car elle y était pas au début de ce post), ma requête me retournait 0 ligne d'après le count

                      Je suis perdu, je sent que je vais refaire ma requête avec des jointures au cas où mais la fonction setQuery doit envoyer la requête pure qu'on lui a passé je pense pas qu'elle y fasse de traitement

                      Du coup j'ai changé de piste de réflexions sur mon projet sa me rendais fou, je le ré attaquerai quand j'aurai une piste

                      Commentaire


                      • #12
                        Re : Probleme de _getlist() dans mon modèle

                        Ma requête techniquement elle est testé et retesté donc fonctionner elle fonctionne et je pense pas que j'arriverai a la refaire avec des jointures car en réalité elle affiche tout ce qui n'est pas relié en fait les 3 table que j'utilise ce sont la table metier, metieractivites et activite donc la table metieractivites est la table intermediaire pour une liaison n:m
                        Et ce que je veut faire c'est afficher toutes les activites qui ne sont pas liées à un métier en particulier dont je rajoute (un WHERE id_metier = "l'id du metier en questions" ) dans ma sous requete.

                        Commentaire


                        • #13
                          Re : Probleme de _getlist() dans mon modèle

                          Re,
                          les Jointures SQL sont des manières de rendre une énorme requête plus propre mais elle sont pas forcément obligatoire pour arriver à ses fins
                          Oui pour aller de Paris à Lille, tu peux indifféremment décider de marcher vers le nord et continuer tout droit ou idem en partant vers le sud. Les deux solutions fonctionnent mais il y en a une plus rapide que l'autre...
                          Le "distinct" cache la misère mais tu fais le produit cartésiens des trois tables ce qui est très couteux en ressources, pour rien puisque en fait c'est le "not in" qui fait tout le boulot. Si tu as de la chance le moteur de MySQL vire ce qui ne sert à rien (à commencer par jos_competences_metier mais ce n'est pas gagné.

                          Et ce que je veut faire c'est afficher toutes les activites qui ne sont pas liées à un métier en particulier dont je rajoute (un WHERE id_metier = "l'id du metier en questions" ) dans ma sous requete.
                          Donc :
                          Code:
                          SELECT DISTINCT a.id, a.code, a.libelle  
                          FROM #__competences_activites a
                          WHERE NOT a.id  
                          IN (SELECT id_activites FROM #__competences_metieractivites)
                          ou (en principe plus rapide si les bons index existent) :
                          Code:
                          SELECT DISTINCT a.id, a.code, a.libelle  
                          FROM #__competences_activites a LEFT JOIN   #__competences_metieractivites ma
                          ON a.id  = ma.id_activites 
                          WHERE ma.id_activites  = null )
                          note au passage les #_ au lieu du prefixe cablé en dur et l'utilisation des alias

                          Donc il devrait rester environ dans ton code :
                          Code PHP:
                          function getActivitesnonlies(){
                              
                          $query 'SELECT ....' ;
                              
                          $db =& $this->getDBO();
                              
                          $db->setQuery($query);
                              
                          $activitesnonlies $db->loadObjectList();
                              return 
                          $activitesnonlies ;

                          Schtroumpfe toi le Schtroumpf t'aidera.
                          Je ne schtroumpfe pas aux demandes de schtroumpf par MP.

                          Commentaire


                          • #14
                            Re : Probleme de _getlist() dans mon modèle

                            Voila ma fonction :
                            Code:
                            function getActivitesnonlies(){
                            	
                            	if (empty( $this->_Activitesnonlies )){
                            		if($this->_unMetier->id == 0){
                            			$query = 'SELECT DISTINCT a.id, a.code, a.libelle  
                            				FROM #__competences_activites a
                            					WHERE NOT a.id  
                            					IN (SELECT id_activites 
                                                                    FROM #__competences_metieractivites )' ;
                            		}else {
                            			$query = 'SELECT DISTINCT a.id, a.code, a.libelle  
                            				FROM #__competences_activites a
                            					WHERE NOT a.id  
                            					IN (SELECT id_activites 
                                                                    FROM #__competences_metieractivites                                  
                                                                    WHERE id_metier = '.$this->_unMetier->id.')' ;
                            		}
                            		$db =& $this->getDBO(); 
                            		$db->setQuery($query); 
                            		$_Activitesnonlies = $db->loadObjectList();
                            	}
                            }
                            ne fait pas gaffe au grand if id == 0 cest pour quand je créé un metier et dans ce cas la j'affiche la liste de toutes la activités car aucune n'es lié

                            Et j'ai toujours rien à l'écran

                            De quoi me faire péter un boulard ,

                            D'ailleurs sympa pour les alias car j'y pensais plus et les préfixes c'était une erreur de ma part entre l'utilisation de l'exécuteur de requête directement dans mysql

                            J'ai même essayé la requête en dur en php en faisant ma connection manuelle et tout dans le désespoir de ma journée de boulot
                            Dernière édition par pierrelesek à 21/12/2011, 17h54

                            Commentaire


                            • #15
                              Re : Probleme de _getlist() dans mon modèle

                              Re,
                              encore faudrait-il faire un return de $_Activitesnonlies qui est une variable locale de ta fonction...
                              Après il faudrait tracer un peu pour voir si $_Activitesnonlies est vide ou pas, puis voir comment tout ça est appelé.
                              Schtroumpfe toi le Schtroumpf t'aidera.
                              Je ne schtroumpfe pas aux demandes de schtroumpf par MP.

                              Commentaire

                              Annonce

                              Réduire
                              1 sur 2 < >

                              C'est [Réglé] et on n'en parle plus ?

                              A quoi ça sert ?
                              La mention [Réglé] permet aux visiteurs d'identifier rapidement les messages qui ont trouvé une solution.

                              Merci donc d'utiliser cette fonctionnalité afin de faciliter la navigation et la recherche d'informations de tous sur le forum.

                              Si vous deviez oublier de porter cette mention, nous nous permettrons de le faire à votre place... mais seulement une fois
                              Comment ajouter la mention [Réglé] à votre discussion ?
                              1 - Aller sur votre discussion et éditer votre premier message :


                              2 - Cliquer sur la liste déroulante Préfixe.

                              3 - Choisir le préfixe [Réglé].


                              4 - Et voilà… votre discussion est désormais identifiée comme réglée.

                              2 sur 2 < >

                              Assistance au forum - Outil de publication d'infos de votre site

                              Compatibilité: PHP 4.1,PHP4, 5, 6DEV MySQL 3.2 - 5.5 MySQLi from 4.1 ( @ >=PHP 4.4.9)

                              Support Version de Joomla! : | J!3.0 | J!2.5.xx | J!1.7.xx | J!1.6.xx | J1.5.xx | J!1.0.xx |

                              Version française (FR) D'autres versions sont disponibles depuis la version originale de FPA

                              UTILISER À VOS PROPRES RISQUES :
                              L'exactitude et l'exhaustivité de ce script ainsi que la documentation ne sont pas garanties et aucune responsabilité ne sera acceptée pour tout dommage, questions ou confusion provoquée par l'utilisation de ce script.

                              Problèmes connus :
                              FPA n'est actuellement pas compatible avec des sites Joomla qui ont eu leur fichier configuration.php déplacé en dehors du répertoire public_html.

                              Installation :

                              1. Téléchargez l'archive souhaitée : http://afuj.github.io/FPA/

                              Archive zip : https://github.com/AFUJ/FPA/zipball/master

                              2. Décompressez le fichier de package téléchargé sur votre propre ordinateur (à l'aide de WinZip ou d'un outil de décompression natif).

                              3. Lisez le fichier LISEZMOI inclus pour toutes les notes de versions spécifiques.

                              4. LIRE le fichier de documentation inclus pour obtenir des instructions d'utilisation détaillées.

                              5. Téléchargez le script fpa-fr.php à la racine de votre site Joomla!. C'est l'endroit que vous avez installé Joomla et ce n'est pas la racine principale de votre serveur. Voir les exemples ci-dessous.

                              6. Exécutez le script via votre navigateur en tapant: http:// www. votresite .com/ fpa-fr.php
                              et remplacer www. votresite .com par votre nom de domaine


                              Exemples:
                              Joomla! est installé dans votre répertoire web et vous avez installé la version française du fichier FPA:
                              Télécharger le script fpa-fr.php dans: /public_html/
                              Pour executer le script: http://www..com/fpa-fr.php

                              Joomla! est installé dans un sous-répertoire nommé "cms" et vous avez installé la version française du fichier FPA:
                              Télécharger le script fpa-fr.php dans: /public_html/cms/
                              Pour executer le script: http://www..com/cms/fpa-fr.php

                              En raison de la nature très sensible de l'information affichée par le script FPA, il doit être retiré immédiatement du serveur après son utilisation.

                              Pour supprimer le script de votre site, utilisez le lien de script de suppression fourni en haut de la page du script. Si le lien de suppression échoue pour supprimer le script, utilisez votre programme FTP pour le supprimer manuellement ou changer le nom une fois que le script a généré les données du site et le message publié sur le forum. Si le script est toujours présent sur le site, il peut être utilisé pour recueillir suffisamment d'informations pour pirater votre site. Le retrait du script empêche des étrangers de l'utiliser pour jeter un oeil à la façon dont votre site est structuré et de détecter les défauts qui peuvent être utilisé à vos dépends.
                              Voir plus
                              Voir moins

                              Partenaire de l'association

                              Réduire

                              Hébergeur Web PlanetHoster
                              Travaille ...
                              X