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

Symfony PHP Discussion :

Exploitation d'un fetchArray [1.x]


Sujet :

Symfony PHP

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Juillet 2010
    Messages
    75
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2010
    Messages : 75
    Par défaut Exploitation d'un fetchArray
    bonjour,
    je rencontre des difficultés pour afficher une liste de mots-clés liés à des fichiers.

    Voici le fichier components.class.php du module fichiers :

    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
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    public function executeMotsclefs(sfWebRequest $request)
      {
    	//Liaison avec la table fichiers_motsclefs dans la langue par défaut
    	$q = Doctrine_Query::create()	
    						->from('fichiersmotsclef f')
    						->addFrom('f.motclef m')
    						->leftJoin('m.Translation t')
    						->where('f.fichier_id = ?',$this->fichier);
     
    	$motsclefs_defaut = $q->fetchArray();
     
    	//Liaison avec la table fichiers_motsclefs dans la langue courantre de l'utilisateur
    	$q = Doctrine_Query::create()	
    						->from('fichiersmotsclef f')
    						->addFrom('f.motclef m')
    						->leftJoin('m.Translation t WITH t.lang = ?', $this->getUser()->getCulture())
    						->where('f.fichier_id = ?',$this->fichier);
     
    	$motsclefs_courant = $q->fetchArray();
     
    	if($motsclefs_defaut)
    	{
    		//Création de la chaine à afficher
    		$chaine = '';
    		$i = 0;
     
    		//Par pertinence
    		foreach(array_reverse($motsclefs_courant, TRUE) as $motsclef=>$valeur)
    		{
     
    			$inter = current($valeur['motclef']['Translation']);
    			$tabcourant[$i] = $inter['intitule'];
    			$i = $i + 1;
    		}
     
    		$i = 0;
     
    		foreach(array_reverse($motsclefs_defaut, TRUE) as $motsclef_courant=>$valeur)
    		{
    			if($i<count($tabcourant))
    			{
    				if($tabcourant[$i] == '')
    				{
    					$inter = current($valeur['motclef']['Translation']);
    					$tabcourant[$i] = $inter['intitule'];
    				}
    			}
    			$i = $i + 1;
    		}
     
    		$this->motsclefs = $tabcourant;
    	}
    	else
    	{
    		$this->motsclefs = 'no';
    	}
      }
    Ce modèle fonctionne bien avec notamment la partie suivante, affichage du libellé :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    $inter = current($valeur['motclef']['Translation']);
    			$tabcourant[$i] = $inter['intitule'];
    Cependant, pour des besoins de routing, je souhaiterais passer non seulement l'intitule du mot-clé mais la variable complète de manière à pouvoir écrire mon routing ainsi dans mon template :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    <a href='".url_for('recherche_show_motsclef',$motsclef['Identifiant'])."' title='".$motsclef['Intitule']."'>".$motsclef['Intitule']."</a>

    Sur une autre portion de code, j'avais ainsi réalisé l'opération d'affichage dans un autre template, mais je n'y arrive pas avec la requête ci-dessus.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    	<!-- Parcours des mots-clés pour mise en tableau -->
    	<?php foreach($motsclefs as $motsclef): ?>
     
    	<?php	$intitule=$motsclef->getIntitule();
    			$id=$motsclef->getId();
    			$mc[$id] = array('Id'=>$id,'Intitule'=>$intitule,'Identifiant'=>$motsclef); ?>
    		<?php array_push($tabmc,$mc[$id]);?>
    	<?php endforeach; ?>
     
    <li><a href='".url_for('recherche_show_motsclef',$motsclef['Identifiant'])."' title='".$motsclef['Intitule']."'>".$motsclef['Intitule']."</a></li>
    Pourriez-vous m'indiquer comment procéder de la sorte avec un fetchArray, j'ai du mal avec l'extraction des données sous cette forme.

    Merci par avance.

  2. #2
    Expert confirmé
    Avatar de Michel Rotta
    Homme Profil pro
    DPO
    Inscrit en
    Septembre 2005
    Messages
    4 954
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : DPO
    Secteur : Distribution

    Informations forums :
    Inscription : Septembre 2005
    Messages : 4 954
    Par défaut
    Je ne suis pas très sur de comprendre ce que tu veux exactement.

    J'ai quelques pistes et questions constructives.

    fait en fait
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    execute(array(), Doctrine_Core::HYDRATE_ARRAY);
    A partir de là, pour plus de souplesse et de précision, je pense que tu aurais intérêt à utiliser la syntaxe avec execute, d'autant que tu as de nombreux hydratateur qui pourraient, pour certains, mieux coller à tes besoins.

    J'ai plus de mal à comprendre l'intérêt de réécrire les données hydratée dans un nouveau tableau. N'est-il réellement pas possible de les récupérer directement de la requête SQL correctement triée ?

    Quant à la gestion du l'url, je ne suis sur que d'une chose, c'est de ne pas avoir compris où tu voulais aller, il faudrait analyser le code a fond, peut-être qu'un exemple de l'url attendue...

  3. #3
    Membre confirmé
    Profil pro
    Inscrit en
    Juillet 2010
    Messages
    75
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2010
    Messages : 75
    Par défaut
    J'ai actuellement un affichage de photos selon des mots-clés qui fonctionne mais le routing ne me plait pas.

    frontend_dev.php/fr/recherche?value=New+york

    Je souhaiterais qu'il deviennent ainsi, j'ai donc modifié le routing et certains modules notamment nuage de mots-clés et arborescence de mots-clés, et ça fonctionne.

    Résultat : frontend_dev.php/fr/tag/1/new-york

    En effet, dans ce cas, je n'ai pas nécessairement besoin de faire un tableau des mots-clés seule la requête pourrait convenir.

    Je vais essayer cette solution, j'ai du mal avec Doctrine.
    Merci pour le lien.
    Merci pour le temps passé.

  4. #4
    Expert confirmé
    Avatar de Michel Rotta
    Homme Profil pro
    DPO
    Inscrit en
    Septembre 2005
    Messages
    4 954
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : DPO
    Secteur : Distribution

    Informations forums :
    Inscription : Septembre 2005
    Messages : 4 954
    Par défaut
    En fait tu veux transformer tes tag :

    mot a mettre en tag

    dans une chaine mot-a-mettre-en-tag que tu enverrais comme un paramètre dans ton url.

    En partant d'une requête travaillée correctement pour n'avoir que ce que tu veux, dans l'ordre que tu veux. En récupérant en hydratant avec : Doctrine_Core::HYDRATE_SINGLE_SCALAR qui retourne un tableau simple (sans nom de champ)(il ne faut qu'un champ dans le select de ton query).

    A partir de là tu fais un implode du tableau pour récupérer ta chaine...
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    //exemple, non vérifié
    $motsclef = implode(
              "-",
              Doctrine_Query::create()	
                        ->from('fichiersmotsclef f')
                        ->select('t.motclef')
                        ->addFrom('f.motclef m')
                        ->leftJoin('m.Translation t')
                        ->orderBy('f.pertinance')
                        ->where('f.fichier_id = ?',$this->fichier)
                        ->execute(array(), Doctrine_Core::HYDRATE_SINGLE_SCALAR)
    );
    Attention, je ne garanti en rien la pertinence de la requête !

    Mais au moins tu as tes données dans le format souhaité et dans un code un peu plus légé.

    Pour récupérer tu n'as plus qu'à utiliser pour récupérer un tableau de tes tag.

  5. #5
    Membre confirmé
    Profil pro
    Inscrit en
    Juillet 2010
    Messages
    75
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2010
    Messages : 75
    Par défaut
    Voici mon fichier component pour lister les mots-clés :

    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
    class fichiersComponents extends sfComponents
    {
      public function executeMotsclefs(sfWebRequest $request)
      {
     
    	//Liaison avec la table fichiers_motsclefs dans la langue courante de l'utilisateur
     
    	$motsclefs = Doctrine::getTable('fichiersmotsclef')
          ->createQuery('f')
    	  ->leftJoin('f.motclef m')
    	  ->leftJoin('m.Translation t')
    	  ->where('f.fichier_id = ?',$this->fichier)
    	  ->andWhere('t.lang = ?',$this->getUser()->getCulture())
    	  ->orderBy('t.intitule ASC')
          ->execute();
     
     
    	if($motsclefs->count() > 0)
    	{		
    		$this->motsclefs = $motsclefs;
    	}
    	else
    	{
    		$this->motsclefs = 'no';
    	}
      }
    }
    Voici mon template pour l'affichage :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    <?php if($motsclefs != 'no') { ?>
    	<?php foreach($motsclefs as $i => $motsclef): ?>
    		<?php 
    			if($i < 2 && $i != $motsclefs->count() - 1)
    				echo "<a href='".url_for('recherche_show_motsclef',$motsclef->getMotclef_id())."' title='".$motsclef->getIntitule()."'>".$motsclef->getIntitule()."</a>,";
    			else
    			{
    				echo "<a href='".url_for('recherche_show_motsclef',$motsclef->getMotclef_id())."' title='".$motsclef->getIntitule()."'>".$motsclef->getIntitule()."</a>";
    				break;
    			}
    		?>
    	<?php endforeach; ?>
    <?php } ?>

    La requête se déroule bien, mais le template bloque pour l'affichage car il ne connait pas "Intitule", alors qu'en faisant la requête dans PHPMyAdmin, il me sort bien une colonne intitule:

    f__fichier_id f__motclef_id m__id m__motclef_id m2__id m2__intitule m2__lang m2__slug
    5 3 3 NULL 3 Baltimore fr baltimore
    5 1 1 NULL 1 New york fr new-york
    5 2 2 NULL 2 Usa fr usa
    Comment récupérer cette colonne, il ne semble connaitre que les éléments de la première jointure.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Unknown record property / related component "intitule" on "fichiersMotsclef"
    J'ai vraiment du mal à comprendre comment récupérer les données après une requête.

  6. #6
    Membre confirmé
    Profil pro
    Inscrit en
    Juillet 2010
    Messages
    75
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2010
    Messages : 75
    Par défaut
    J'ai résolu mon problème d'accès au données de la requête en reprenant un exemple de nos sources.

    component de fichiers

    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
    class fichiersComponents extends sfComponents
    {
      public function executeMotsclefs(sfWebRequest $request)
      {
     
    	//Liaison avec la table fichiers_motsclefs dans la langue courante de l'utilisateur
     
    	$motsclefs = Doctrine::getTable('fichiersmotsclef')
          ->createQuery('f')
    	  ->leftJoin('f.motclef m')
    	  ->leftJoin('m.Translation t')
    	  ->where('f.fichier_id = ?',$this->fichier)
    	  ->andWhere('t.lang = ?',$this->getUser()->getCulture())
    	  ->orderBy('t.intitule ASC')
          ->execute();
     
     
    	if($motsclefs->count() > 0)
    	{		
    		$this->motsclefs = $motsclefs;
    	}
    	else
    	{
    		$this->motsclefs = 'no';
    	}
      }
    }
    et template d'affichage

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    <?php if($motsclefs != 'no') { ?>
    	<?php foreach($motsclefs as $i => $motsclef): ?>
    		<?php 
    			if($i < 2 && $i != $motsclefs->count() - 1)
    				echo "<a href='".url_for('recherche_show_motsclef',$motsclef['motclef'])."' title='".$motsclef['motclef']->getIntitule()."'>".$motsclef['motclef']->getIntitule()."</a>,";
    			else
    			{
    				echo "<a href='".url_for('recherche_show_motsclef',$motsclef['motclef'])."' title='".$motsclef['motclef']->getIntitule()."'>".$motsclef['motclef']->getIntitule()."</a>";
    				break;
    			}
    		?>
    	<?php endforeach; ?>
    <?php } ?>
    Il faut donc appeller :

    $motsclef['motclef']->getIntitule();

    et non pas

    $motsclef->getIntitule();

    Merci pour l'aie

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

Discussions similaires

  1. Exploitation de base sur un serveur Web
    Par Oz-WereWolf dans le forum Installation
    Réponses: 10
    Dernier message: 07/03/2004, 22h52
  2. exploiter un évènement d'un sous composant dans un
    Par bjl dans le forum Composants VCL
    Réponses: 2
    Dernier message: 20/12/2002, 16h44
  3. [VB6] Exploiter un doc PowerPoint avec VB
    Par Tranber dans le forum VB 6 et antérieur
    Réponses: 8
    Dernier message: 04/09/2002, 16h22
  4. [TP7]systeme d'exploitation
    Par numeror dans le forum Turbo Pascal
    Réponses: 10
    Dernier message: 15/08/2002, 08h47
  5. PB mise en exploitation
    Par DiceChris dans le forum CORBA
    Réponses: 21
    Dernier message: 05/07/2002, 16h05

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