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 :

Optimisation arbre de mot-cles [1.x]


Sujet :

Symfony PHP

  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 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 : 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
    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 : 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
    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; ?>

  2. #2
    Membre émérite Avatar de kenny.kev
    Homme Profil pro
    Inscrit en
    Janvier 2007
    Messages
    646
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Indre et Loire (Centre)

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

    Informations forums :
    Inscription : Janvier 2007
    Messages : 646
    Par défaut
    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.

  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
    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 ?

  4. #4
    Membre émérite Avatar de kenny.kev
    Homme Profil pro
    Inscrit en
    Janvier 2007
    Messages
    646
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Indre et Loire (Centre)

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

    Informations forums :
    Inscription : Janvier 2007
    Messages : 646
    Par défaut
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    $this->motsclefs = $this->motsclefs->toArray();

    ensuite dans la vue tu fait ça :
    Code php : Sélectionner tout - Visualiser dans une fenêtre à part
    $motsclefs->getRawValue();
    La tu retrouve ton tableau.

  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
    bonjour,

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

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    <? $motsclefs = $motsclefs->getRawValue();?>
    J'obtiens les éléments suivants :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    [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 : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    <?php foreach($motsclefs as $j => $motsclef): ?>
     
    <?php $Intitule=$motsclef['intitule'];
     
    <?php endforeach; ?>

    Merci.

  6. #6
    Membre émérite Avatar de kenny.kev
    Homme Profil pro
    Inscrit en
    Janvier 2007
    Messages
    646
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Indre et Loire (Centre)

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

    Informations forums :
    Inscription : Janvier 2007
    Messages : 646
    Par défaut
    tu fais un var_dump() ou un print_r() de $motsclef tu auras ta réponse

  7. #7
    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
    voila ce que me sort un print_r de motsclef :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    echo $motsclef['intitule'];
    il m'indique une erreur :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Notice: Undefined index: intitule in /home/
    Quelle serait la bonne syntaxe pour récupérer l'intitule ?

  8. #8
    Candidat au Club
    Homme Profil pro
    Inscrit en
    Octobre 2011
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Octobre 2011
    Messages : 4
    Par défaut
    Bonsoir,
    Vu le retour de print_r(), je serais tenté d'écrire ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    echo $motsclef['Translation']['fr']['intitule'];
    A+

  9. #9
    Membre émérite Avatar de kenny.kev
    Homme Profil pro
    Inscrit en
    Janvier 2007
    Messages
    646
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Indre et Loire (Centre)

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

    Informations forums :
    Inscription : Janvier 2007
    Messages : 646
    Par défaut
    il est 3 niveau en dessous.
    $motsclef['Translation']['fr']['intitule'];

  10. #10
    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
    Très bien merci,

    cela donne une optimisation :

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

    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.

  11. #11
    Membre émérite Avatar de kenny.kev
    Homme Profil pro
    Inscrit en
    Janvier 2007
    Messages
    646
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Indre et Loire (Centre)

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

    Informations forums :
    Inscription : Janvier 2007
    Messages : 646
    Par défaut
    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.

  12. #12
    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
    bonjour,

    vous vouliez plutot dire :

    car

    ne fonctionne pas chez moi.

    Exemple :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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();

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

Discussions similaires

  1. [Requête] Attribution auto de mots clés.
    Par Gunther dans le forum Requêtes et SQL.
    Réponses: 2
    Dernier message: 07/12/2006, 18h59
  2. Recherche par mots cles
    Par Seth77 dans le forum Langage SQL
    Réponses: 2
    Dernier message: 26/03/2006, 15h58
  3. [deb]Mot cle tyledef complement d'info
    Par Marc_3 dans le forum C++
    Réponses: 9
    Dernier message: 11/12/2005, 22h12
  4. [Mots cles]Signification de transient et volatile
    Par Pill_S dans le forum Langage
    Réponses: 2
    Dernier message: 14/07/2004, 11h58

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