probleme d'affichage : plusieurs mêmes éléments sont affichés plusieurs fois

Mammouth du PHP | 536 Messages

01 août 2007, 10:39

Bonjour tout le monde.
Je dispose d'un fichier qui fait un lien entre des contributeurs et des critères (qui définissent des pratiques) et d'un fichier qui fait le lien entre des pratiques et ces mêmes critères.

Ils sont de cette forme là :

Code : Tout sélectionner

<root last_insert="3"> <link id="2"> <criteria idcat="1" idcrit="1"/> <criteria idcat="2" idcrit="1"/> <criteria idcat="3" idcrit="1"/> <criteria idcat="3" idcrit="2"/> <criteria idcat="3" idcrit="3"/> <contributor (ou pratique) id="2"/> </link> </root>
J'ai donc fait un script qui permet d'afficher, losrqu'un contributeur se connecte, uniquement les pratiques qui ont les mêmes critères que lui. Ainsi, le contributeur ne peut agir (supprimer, éditer) uniquement sur les pratiques qui ont les mêmes crièteres que lui.

Voici mon code pour afficher ces pratiquess :
<?
//on constuit le tableau qui contient les couples cat/crit pour lequel un contributeur a été enregistré.
//pour cela, on recherche dans la matrice l'id du contributeur actuellement 
//connecté et on récupère tous les noeuds criteria pour ce contributeur
//fichier de matrice entre practice et critères  
//on récupère déjà l'id du contributeur connecté

$criteriaCont = $xpCrit_cont->query('//link/contributor[@id="'.$_SESSION['contributorId'].'"]/../criteria');  
for ($v=0; $v < $criteriaCont->length ; $v++) { 
  $idcat = $criteriaCont->item($v)->getAttribute('idcat');
  $idcrit = $criteriaCont->item($v)->getAttribute('idcrit');
  $arrayContributor[] = $idcat."/".$idcrit; 
}

  
//on constuit le tableau qui contient les couples cat/crit de chaque practice
//pour cela, on recherche dans la matrice criteria-practice.xml 
$compteur = 0;
for($i=0; $i < sizeof($arrayContributor); $i++) // tant que $i est inferieur au nombre d'éléments du tableau...
{
  $var = $arrayContributor[$i];
  $explode = explode("/", $var);
  $idcat = $explode[0];
  $idcrit = $explode[1];
  $criteriaPract = $xpCrit_pract->query('//link/criteria[@idcat="'.$idcat.'" and @idcrit="'.$idcrit.'"]/../practice');
  for ($b=0; $b < $criteriaPract->length ; $b++) { 
    $idPracticeCommune = $criteriaPract->item($b)->getAttribute('id');

    $practice = $xpPractices->query('//practice[@id="'.$idPracticeCommune.'" and @subjected="1" and @validated="0"]');
    for ($j=0; $j < $practice->length ; $j++) { 
      $idPractice = $practice->item($j)->getAttribute('id');
      $name = $practice->item($j)->getAttribute('name');
      
      $practiceFile = '../'.$cfg['ressources_root'].'content/practice/'.$idPractice.'.xml';
      $domPractice = new DOMDocument('1.0','UTF-8');
      $domPractice->load($practiceFile);
      $xpPractice = new DOMXPath($domPractice);
      $practiceCreated = $xpPractice->query('//item[@id="'.$idPractice.'"]');
      $created = $practiceCreated->item(0)->getAttribute('date_created');
      $explode = explode('-', $created);
      $day = $explode[2];
      $month = $explode[1];
      $year = $explode[0];
      $date = $day."-".$month."-".$year;


      echo "<tr bgcolor='".( ($i++ % 2 == 0) ? '#FFFFFF' : '#EEEEEE' )."'>
      <td>".$name."</td>
      <td>".$date."</td>
      <td align='center'>"; ?><a href="practice-edit.php?id=<? echo $idPractice; ?>"><? echo "<img src='../css/images/edit.gif' border='0'></a></td>
      <td align='center'>"; ?><a href='?delete_commitee=<? echo $idPractice; ?>' onClick="return conf_suppr();"><? echo "<img src='../css/images/delete.gif' border='0'></a></td>  
      <td align='center'>"; ?><a href="?validated_commitee=<? echo $idPractice; ?>"><? echo COL_VALIDATE_PRACTICE."</td>
      </tr>";
      } //endfor
    $compteur++;
  }//endfor
}//endfor 
  
if ($compteur == '0') {
echo "<tr bgcolor='".( ($i++ % 2 == 0) ? '#FFFFFF' : '#EEEEEE' )."'>
  <td colspan='5' align='center'><strong>".TEXT_NO_PRACTICE_TO_EDIT."</strong></td>";
}
?>
Seulement voilà le problème, c'est que si on trouve des pratiques qui ont plusieurs fois un critère en commun, elle s'affiche plusieurs fois. Comment faire alors en sorte qu'lle ne s'affiche qu'une seule fois ?

Merci de m'aider car là e ne vois pas comment faire.
Un prof désespéré à son élève :
- Et maintenant, dessinez-moi un cercle au tableau... Voila... Alors qu'est-ce que c'est?
- Ben un cercle ?
- Non, c'est votre note, sortez !!

Invité
Invité n'ayant pas de compte PHPfrance

01 août 2007, 13:47

En fait, il faudrait faire en sorte que la practice affichée soit reconnaissable lorsqu'on repasse dans la boucle for pour ne pas l'afficher une autre fois.
La meilleure solution serait d'ajouter un attribut dans mon fichier xml ? Voyez-vous autre chose comme solution ?

Mammouth du PHP | 536 Messages

01 août 2007, 13:47

Désolé problème de session, j'avais pas vu que j'étais déconnecté quand j'ai posté le message précédent.

J'ai égalemnt pensé à mettre toutes mes informations dans un tableau, et ensuite avant d'afficher mon code html je fais une boucle dans ce tableau pendant laquelle j'utilise la fonction array_key_exists() pour sortir mes pratiques qu'une seule fois. Mais là je ne vois pas du tout comment faire.


EDIT

J'ai opté pour la deuxième solution, avec tout mettre dans un tableau et utiliser array_key_exists.
Maintenant mon tableau (qui est a plusieurs dimension au passage) ne contient bien que les pratiques que je souhaite afficher. Il n'y a pas de redondance.

Mais là, j'ai un nouveau problème, comment récupérer les éléments de mon tableau pour les afficher proprement ?

Voici mon code :
<?
//on constuit le tableau qui contient les couples cat/crit de chaque practice
//pour cela, on recherche dans la matrice criteria-practice.xml 
$compteur = 0;
$allPracticeFind = array();
for($i=0; $i < sizeof($arrayContributor); $i++) // tant que $i est inferieur au nombre d'éléments du tableau...
{
  //print_r($arrayContributor); exit;
  $var = $arrayContributor[$i];
  $explode = explode("/", $var);
  $idcat = $explode[0];
  $idcrit = $explode[1];
  $criteriaPract = $xpCrit_pract->query('//link/criteria[@idcat="'.$idcat.'" and @idcrit="'.$idcrit.'"]/../practice');
  
  for ($b=0; $b < $criteriaPract->length ; $b++) { 
    $idPracticeCommune = $criteriaPract->item($b)->getAttribute('id');
    $practice = $xpPractices->query('//practice[@id="'.$idPracticeCommune.'" and @subjected="1" and @validated="0"]');
    
    for ($j=0; $j < $practice->length ; $j++) { 
      $idPractice = $practice->item($j)->getAttribute('id');
      $name = $practice->item($j)->getAttribute('name');
      
      if ( array_key_exists($idPractice, $allPracticeFind) ) continue;
      
      $practiceFile = '../'.$cfg['ressources_root'].'content/practice/'.$idPractice.'.xml';
      $domPractice = new DOMDocument('1.0','UTF-8');
      $domPractice->load($practiceFile);
      $xpPractice = new DOMXPath($domPractice);
      $practiceCreated = $xpPractice->query('//item[@id="'.$idPractice.'"]');
      $created = $practiceCreated->item(0)->getAttribute('date_created');
      $explode = explode('-', $created);
      $day = $explode[2];
      $month = $explode[1];
      $year = $explode[0];
      $date = $day."-".$month."-".$year;
      
      $allPracticeFind[$idPractice]['id'] = $idPractice;
      $allPracticeFind[$idPractice]['namePractice'] = $name;
      $allPracticeFind[$idPractice]['date'] = $date;
    }//endfor
    $compteur++;
  }//endfor
}//endfor 

krsort($allPracticeFind);

echo "<pre>"; print_r($allPracticeFind); echo "</pre>";
for ($f=0 ; $f < sizeof($allPracticeFind) ; $f++)
{
echo $allPracticeFind[$f][$idPractice]['id'];
$name = $allPracticeFind[$f][$idPractice]['namePractice'];
$date = $allPracticeFind[$f][$idPractice]['date'];

echo "<tr bgcolor='".( ($v++ % 2 == 0) ? '#FFFFFF' : '#EEEEEE' )."'>
       <td>".$name."</td>
       <td>".$date."</td>
       <td align='center'>"; ?><a href="practice-edit.php?id=<? echo $idPractice; ?>"><? echo "<img src='../css/images/edit.gif' border='0'></a></td>
       <td align='center'>"; ?><a href='?delete_commitee=<? echo $idPractice; ?>' onClick="return conf_suppr();"><? echo "<img src='../css/images/delete.gif' border='0'></a></td>  
       <td align='center'>"; ?><a href="?validated_commitee=<? echo $idPractice; ?>"><? echo COL_VALIDATE_PRACTICE."</td>
       </tr>";
}
?>
Mais ça, ça ne marche pas ? pourquoi ?
Un prof désespéré à son élève :
- Et maintenant, dessinez-moi un cercle au tableau... Voila... Alors qu'est-ce que c'est?
- Ben un cercle ?
- Non, c'est votre note, sortez !!