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 02/12/2011, 19h10   #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 Optimisation arbre de mot-cles

bonjour,

j'ai mis en place un arbre de mot-clé dans mon site.

Je souhaite optimiser un arbre de mot-clé classé par ordre alphabétique (A-B-C-D...) et un autre arbre classé par l'administrateur.

La version alphabétique est longue à l'affichage, plus il y a de mot-clé, plus c'est long, ici une centaines de mots.

type calls time (ms) time (%)
Component "motsclefs/arbomc" 1 73.99 5
Partial "motsclefs/_arbomc" 1 384.58 30

Quant à la version Admin, elle demande trop de ressources pour l'affichage.

Voici mon fichier component pour le module concerné :
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
class motsclefsComponents extends sfComponents
{
 
  public function executeArbomc(sfWebRequest $request)
  {
	//Version alphabétique
	if(sfConfig::get('app_arbomc') == 'alpha')
	{
		$this->tri = 'alpha';
 
		$this->motsclefs = Doctrine::getTable('motsclef')
							->createQuery('a')
							->leftJoin('a.Translation t')
							->where('t.lang = ?',$this->getUser()->getCulture())
							->orderBy('t.intitule')
							->execute();
	}
 
	//Version tri par admin
	if(sfConfig::get('app_arbomc') == 'admin')
	{
		$this->tri = 'admin';
 
		$this->motsclefs = Doctrine::getTable('motsclef')
							->createQuery('a')
							->leftJoin('a.Translation t')
							->where('t.lang = ?',$this->getUser()->getCulture())
							->orderBy('t.intitule')
							->execute();
	}
  }
}
Voici mon template :

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
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
<!-- VERSION ALPHABETIQUE -->
<?php if($tri == 'alpha' && $motsclefs->count() > 0): ?>
	<!-- Tableau des lettres de l'alphabet, des chiffres, etc... -->
	<?php $tablettre = array('0-9','A','B','C','D','E','F','G','H','I','J','K','L','M','N','O','P','Q','R','S','T','U','V','W','X','Y','Z'); ?>
	<?php $tabchiffre = array('0','1','2','3','4','5','6','7','8','9'); ?>
	<?php $tabmc = array(); ?>
 
	<!-- 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; ?>
 
	<ul id="tree">
		<?php foreach($tablettre as $i => $valeur): ?>
 
			<?php $nb = 0; $ok=false;?>
				<?php foreach($tabmc as $j => $motsclef): ?>
					<?php if($motsclef['Intitule']{0} == $valeur)
						  {
							if($nb == 0)
							{
								echo "<li><strong>".$valeur."</strong><ul>";
								$ok = true;
							}
 
							unset($tabmc[$j]);
							echo "<li><a href='".url_for('recherche_show_motsclef',$motsclef['Identifiant'])."' title='".$motsclef['Intitule']."'>".$motsclef['Intitule']."</a></li>"; 
						  }
						  else 
						  {
							if(in_array($motsclef['Intitule']{0},$tabchiffre))
							{
								if($nb == 0)
								{
									echo "<li><strong>0-9</strong><ul>";
									$ok = true;
								}
 
								unset($tabmc[$j]);
								echo "<li><a href='".url_for('recherche_show_motsclef',$motsclef['Identifiant'])."' title='".$motsclef['Intitule']."'>".$motsclef['Intitule']."</a></li>"; 
							}
							else
							{
								break;
							}
						  }
					?>
					<?php $nb++; ?>
				<?php endforeach; ?>	
				<?php if($ok) echo "</ul></li>"; ?>
		<?php endforeach; ?>
	</ul>
<?php endif; ?>	
 
<!-- VERSION ADMIN A OPTIMISER (optimisée car unset sur le tableau mais tri bulle à changer en tri plus performant !) -->
<?php if($tri == 'admin' && $motsclefs->count() > 0): ?>
	<?php $affichage = ''; ?>
 
	<!-- Fonction récursive -->
	<?php 
	function getChildren($affichage, $tabmc, $parent, $type)
	{
		$aenfants = false;
		$enfants = array();
 
		//Récupération des enfants
		foreach($tabmc as $i => $valeur)
		{
			if($valeur->getMotclef_id() == $parent->getId())
			{
				$aenfants = true;
				$enfants[] = $valeur;
				unset($tabmc[$i]);
			}
		}
 
		//Si il a des enfants
		if($aenfants)
		{
			if($type == 'base')
				$affichage .= "<li><a href='".url_for('recherche_show_motsclef',$parent)."' title='".$parent->getIntitule()."'><strong>".ucFirst($parent->getIntitule())."</strong></a><ul>";
			else
				$affichage .= "<li><a href='".url_for('recherche_show_motsclef',$parent)."' title='".$parent->getIntitule()."'>".ucFirst($parent->getIntitule())."</a><ul>";
 
			foreach($enfants as $enfant) //Pour chaque enfant
			{
				$affichage = getChildren($affichage, $tabmc, $enfant, 'nonbase'); //Appel récursif
			}
 
			$affichage .= "</ul></li>";
		}
		else
		{
			if($type == 'base')
				$affichage .= "<li><a href='".url_for('recherche_show_motsclef',$parent)."' title='".$parent->getIntitule()."'><strong>".$parent->getIntitule()."</strong></a></li>";
			else
				$affichage .= "<li><a href='".url_for('recherche_show_motsclef',$parent)."' title='".$parent->getIntitule()."'>".$parent->getIntitule()."</a></li>";
		}
 
		return $affichage;
	}
	?> 
 
	<!-- Parcours des mots-clés pour mise en tableau -->
	<?php foreach($motsclefs as $motsclef): ?>
		<?php $tabmc[] = $motsclef; ?>
	<?php endforeach; ?>
 
	<!-- Création de la variable d'affichage avec appel de la fonction récursive -->
	<?php
	foreach($tabmc as $i => $valeur)
	{
		if($valeur->getMotclef_id() == null)
		{
			$affichage = getChildren($affichage, $tabmc, $valeur, 'base');
			unset($tabmc[$i]);
		}
	}
	?>
 
	<ul id="tree">
		<?php echo $affichage; ?>
	</ul>
<?php endif; ?>
pixworld est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 05/12/2011, 12h15   #2
Membre chevronné
 
Avatar de kenny.kev
 
Homme
Inscription : janvier 2007
Messages : 575
Détails du profil
Informations personnelles :
Sexe : Homme
Âge : 27
Localisation : France, Indre et Loire (Centre)

Informations professionnelles :
Secteur : High Tech - Multimédia et Internet

Informations forums :
Inscription : janvier 2007
Messages : 575
Points : 690
Points : 690
Envoyer un message via MSN à kenny.kev
Très souvent les problèmes de perf viennent du Poste ou les développements sont effectués.

Ensuite tu fais trop de métier dans la partie template (presque tout ce que tu fais dans le template devrais être dans le componant).

Ensuite tu as surement des indexes à mettre en place sur tes tables.

Enfin si tu es amené à traiter une très grosse quantité de données, il n'est pas forcément judicieux d'utiliser des objets. Exécute le traitement sur un tableau se sera plus rapide.
kenny.kev est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 05/12/2011, 14h24   #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
Merci Kenny,

d'après ce que tu m'indiques, il faudrait donc que je sorte les données de la requête SQL sous forme de tableau.

Est-il possible de créer le tableau dans le component et d’exécuter l'affichage dans le template ?
pixworld est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 05/12/2011, 16h14   #4
Membre chevronné
 
Avatar de kenny.kev
 
Homme
Inscription : janvier 2007
Messages : 575
Détails du profil
Informations personnelles :
Sexe : Homme
Âge : 27
Localisation : France, Indre et Loire (Centre)

Informations professionnelles :
Secteur : High Tech - Multimédia et Internet

Informations forums :
Inscription : janvier 2007
Messages : 575
Points : 690
Points : 690
Envoyer un message via MSN à kenny.kev
oui doctrine te propel permettent entre autre de te retourné le résultat sous forme de tableau ou d'objet.

par exemple en faisant comme ceci :
Code php :
$this->motsclefs = $this->motsclefs->toArray();

ensuite dans la vue tu fait ça :
Code php :
$motsclefs->getRawValue();
La tu retrouve ton tableau.
kenny.kev est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 08/12/2011, 16h05   #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
bonjour,

j'ai mis en place la requête suivante :

Code :
1
2
3
4
5
6
7
8
		$this->motsclefs = Doctrine::getTable('motsclef')
							->createQuery('a')
							->leftJoin('a.Translation t')
							->where('t.lang = ?',$this->getUser()->getCulture())
							->orderBy('t.intitule')
							->execute();
 
		$this->motsclefs = $this->motsclefs->toArray();
Si je fais un print_r de

Code :
<? $motsclefs = $motsclefs->getRawValue();?>
J'obtiens les éléments suivants :

Code :
[3] => Array ( [id] => 495 [motclef_id] => [Translation] => Array ( [fr] => Array ( [id] => 495 [intitule] => Amusement [lang] => fr [slug] => amusement ) ) ) [4] => Array ( [id] => 488 [motclef_id] => [Translation] => Array ( [fr] => Array ( [id] => 488 [intitule] => Arbre [lang] => fr [slug] => arbre ) ) )
Comment puis-je récupérer mon intitule dans ma boucle ?

Code :
1
2
3
4
5
<?php foreach($motsclefs as $j => $motsclef): ?>
 
<?php $Intitule=$motsclef['intitule'];
 
<?php endforeach; ?>

Merci.
pixworld est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 08/12/2011, 18h18   #6
Membre chevronné
 
Avatar de kenny.kev
 
Homme
Inscription : janvier 2007
Messages : 575
Détails du profil
Informations personnelles :
Sexe : Homme
Âge : 27
Localisation : France, Indre et Loire (Centre)

Informations professionnelles :
Secteur : High Tech - Multimédia et Internet

Informations forums :
Inscription : janvier 2007
Messages : 575
Points : 690
Points : 690
Envoyer un message via MSN à kenny.kev
tu fais un var_dump() ou un print_r() de $motsclef tu auras ta réponse
kenny.kev est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 08/12/2011, 18h28   #7
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
voila ce que me sort un print_r de motsclef :

Code :
Array ( [id] => 589 [motclef_id] => [Translation] => Array ( [fr] => Array ( [id] => 589 [intitule] => 2009 [lang] => fr [slug] => 2009 ) ) )
j'ai donc essayé comme suit pour récupérer mon intitule :

Code :
echo $motsclef['intitule'];
il m'indique une erreur :

Code :
Notice: Undefined index: intitule in /home/
Quelle serait la bonne syntaxe pour récupérer l'intitule ?
pixworld est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 08/12/2011, 18h40   #8
Invité régulier
 
Homme
Inscription : octobre 2011
Messages : 4
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France

Informations forums :
Inscription : octobre 2011
Messages : 4
Points : 5
Points : 5
Bonsoir,
Vu le retour de print_r(), je serais tenté d'écrire ça :
Code :
echo $motsclef['Translation']['fr']['intitule'];
A+
Psou78 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 08/12/2011, 18h40   #9
Membre chevronné
 
Avatar de kenny.kev
 
Homme
Inscription : janvier 2007
Messages : 575
Détails du profil
Informations personnelles :
Sexe : Homme
Âge : 27
Localisation : France, Indre et Loire (Centre)

Informations professionnelles :
Secteur : High Tech - Multimédia et Internet

Informations forums :
Inscription : janvier 2007
Messages : 575
Points : 690
Points : 690
Envoyer un message via MSN à kenny.kev
il est 3 niveau en dessous.
$motsclef['Translation']['fr']['intitule'];
kenny.kev est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 08/12/2011, 19h37   #10
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
Très bien merci,

cela donne une optimisation :

Citation:
type calls time (ms) time (%)
Component "motsclefs/arbomc" 1 95.98 11
Partial "motsclefs/_arbomc" 1 11.61 1
alors que précédemment :

Citation:
type calls time (ms) time (%)
Component "motsclefs/arbomc" 1 73.99 5
Partial "motsclefs/_arbomc" 1 384.58 30

Le temps d'éxécution du composant a un peu augmenté, mais l'affichage a été divisé par 30.

merci.
pixworld est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 09/12/2011, 10h51   #11
Membre chevronné
 
Avatar de kenny.kev
 
Homme
Inscription : janvier 2007
Messages : 575
Détails du profil
Informations personnelles :
Sexe : Homme
Âge : 27
Localisation : France, Indre et Loire (Centre)

Informations professionnelles :
Secteur : High Tech - Multimédia et Internet

Informations forums :
Inscription : janvier 2007
Messages : 575
Points : 690
Points : 690
Envoyer un message via MSN à kenny.kev
Vois pour remplacer le par Tu devrais encore amélioré les perf.
Je m'explique que tu fais une execute() Doctrine génère des objets et ensuite tu fais un toArray() pour avoir un tableau alors qu'avec le fetchAll() tu ne passe pas par l'étape objet tu as directement un tableau.
kenny.kev est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 09/12/2011, 11h47   #12
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
bonjour,

vous vouliez plutot dire :

car

ne fonctionne pas chez moi.

Exemple :

Code :
1
2
3
4
5
6
	 $this->categorys = Doctrine::getTable('category')
      ->createQuery('a')
	  ->leftJoin('a.Translation t')
	  ->where('a.actif = 1')
	  ->orderBy('a.position ASC')
      ->fetchArray();
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 15h21.


 
 
 
 
Partenaires

Hébergement Web