Précédent   Forum des professionnels en informatique > PHP > Bibliothèques et frameworks > symfony
symfony Forum d'entraide sur le framework PHP symfony. Avant de poster : cours symfony et FAQ symfony
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 21/04/2011, 17h53   #1
Futur Membre du Club
 
FX
Inscription : juillet 2010
Messages : 75
Détails du profil
Informations personnelles :
Nom : FX

Informations forums :
Inscription : juillet 2010
Messages : 75
Points : 17
Points : 17
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 :
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 :
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 :
<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 :
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.
pixworld est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 22/04/2011, 09h43   #2
Modérateur
 
Avatar de Michel Rotta
 
Homme Michel Rotta
Responsable d'exploitation informatique
Inscription : septembre 2005
Messages : 4 913
Détails du profil
Informations personnelles :
Nom : Homme Michel Rotta
Âge : 49
Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

Informations professionnelles :
Activité : Responsable d'exploitation informatique
Secteur : Distribution

Informations forums :
Inscription : septembre 2005
Messages : 4 913
Points : 7 505
Points : 7 505
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 :
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...
__________________
Si tu donnes un poisson à un homme, il mangera un jour. Si tu lui apprends à pêcher, il mangera toujours (Lao Tseu).
  • Pensez à valoriser les réponses pertinantes, cliquez sur le bouton vert +1 pour indiquer votre accord avec la solution proposée.
  • Pensez à utiliser la balise [code] pour afficher du code, elle est cachée sous le bouton [#] dans l'éditeur.
  • Une discussion est terminée ? Alors le bouton est votre ami !
Michel Rotta est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 22/04/2011, 11h39   #3
Futur Membre du Club
 
FX
Inscription : juillet 2010
Messages : 75
Détails du profil
Informations personnelles :
Nom : FX

Informations forums :
Inscription : juillet 2010
Messages : 75
Points : 17
Points : 17
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é.
pixworld est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 22/04/2011, 12h23   #4
Modérateur
 
Avatar de Michel Rotta
 
Homme Michel Rotta
Responsable d'exploitation informatique
Inscription : septembre 2005
Messages : 4 913
Détails du profil
Informations personnelles :
Nom : Homme Michel Rotta
Âge : 49
Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

Informations professionnelles :
Activité : Responsable d'exploitation informatique
Secteur : Distribution

Informations forums :
Inscription : septembre 2005
Messages : 4 913
Points : 7 505
Points : 7 505
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 :
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.
__________________
Si tu donnes un poisson à un homme, il mangera un jour. Si tu lui apprends à pêcher, il mangera toujours (Lao Tseu).
  • Pensez à valoriser les réponses pertinantes, cliquez sur le bouton vert +1 pour indiquer votre accord avec la solution proposée.
  • Pensez à utiliser la balise [code] pour afficher du code, elle est cachée sous le bouton [#] dans l'éditeur.
  • Une discussion est terminée ? Alors le bouton est votre ami !
Michel Rotta est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 22/04/2011, 12h52   #5
Futur Membre du Club
 
FX
Inscription : juillet 2010
Messages : 75
Détails du profil
Informations personnelles :
Nom : FX

Informations forums :
Inscription : juillet 2010
Messages : 75
Points : 17
Points : 17
Voici mon fichier component pour lister les mots-clés :

Code :
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 :
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:

Citation:
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 :
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.
pixworld est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 22/04/2011, 14h52   #6
Futur Membre du Club
 
FX
Inscription : juillet 2010
Messages : 75
Détails du profil
Informations personnelles :
Nom : FX

Informations forums :
Inscription : juillet 2010
Messages : 75
Points : 17
Points : 17
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 :
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 :
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
pixworld est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 12h31.


 
 
 
 
Partenaires

Hébergement Web