Code : Tout sélectionner
<root last_insert="4">
<link id="1">
<criteria idcat="1" idcrit="3"/>
<criteria idcat="2" idcrit="1"/>
<practice id="2"/>
</link>
<link id="2">
<criteria idcat="5" idcrit="7"/>
<practice id="1"/>
</link>
<link id="4">
<criteria idcat="1" idcrit="1"/>
<criteria idcat="1" idcrit="2"/>
<criteria idcat="1" idcrit="3"/>
<practice id="3"/>
</link>
</root><?
if (!$cfg['ressources_root']) $cfg['ressources_root'] = ".";
$link_file = $cfg['ressources_root'].'/matrix/criteria-practice.xml';
$xml = simplexml_load_file($link_file);//on ouvre le fichier xml
//on vérifie l'existence des varaibles passées par le formulaire si elles n'existent pas, on meur affecte une valeur vide
if (!isset($_POST['cat'])) { $_POST['cat'] = ''; }
if (!isset($_POST['crit'])) { $_POST['crit'] = ''; }
//si les variables ne sont pas vides
if ( ($_POST['cat'] != '') and ($_POST['crit'] != '') )
{
$msg = '';
foreach ($_POST["crit"] as $index=>$idcrit){
$idcat = $_POST["cat"][$index]; //trouve la cat du crit
$cat["$idcat"][] = $idcrit; //stocke le crit dans son groupe cat
}
$practice = null;
//Recherche des practices
foreach($xml->link as $value)
{
foreach($value->criteria as $criteria)
{
//practice en cours
$id = $value->practice['id'];
//echo "<pre>"; print_r($criteria); echo "</pre>";
//Chercher selon les critères de recherche imposés
foreach($cat as $idcat=>$crit)
foreach($crit as $idcrit) //critères groupés par cat
{
//si la cat est touvée
if( trim($criteria['idcat']) == trim($idcat) )
//vérifier le crit de cette cat
if ( trim($criteria['idcrit']) == trim($idcrit) ) //si crit existe
{
$practice["$id"] = true; //sélectioner le practice en cours
}
else //au mois un crit de cette cat n'est pas trouvé
{
$practice["$id"] = false; //élinminer le practice en cours
//break; //Arrêter si éliminé
}
}
}
}
//echo "<pre>"; print_r($practice); echo "</pre>";
//Lecture des practices trouvés
if ( (isset($practice) and count($practice) >0 )) // tableau des practices
{
foreach ($practice as $id=>$trouve){
if (!$trouve) continue; //sauter les practices marqués non trouvés
//fichier qui contient une practice
$practiceFile = $cfg['ressources_root'].'/content/practice/'.$id.'.xml';
$domPractice = new DOMDocument('1.0','UTF-8');
$domPractice->load($practiceFile);
$xpPractice = new DOMXPath($domPractice);
$item_practice = $domPractice->getElementsByTagName('item');
//fichier qui contient toutes les practices
$practicesFile = $cfg['ressources_root'].'practice.xml';
$domPractices = new DOMDocument('1.0','UTF-8');
$domPractices->load($practicesFile);
$xpPractices = new DOMXPath($domPractices);
$practice_practices = $domPractices->getElementsByTagName('practice');
//recherche xml
foreach ($item_practice as $item)
{
foreach ($item->childNodes as $child)
{
if($child->nodeType != XML_ELEMENT_NODE) continue;
if ($child->tagName == 'short_description')
{
$short_description = utf8_decode($child->firstChild->nodeValue);
}
}
} //fin de foreach $item_practice
foreach ($practice_practices as $practices)
{
$name = $xpPractices->query('//practice[@id="'.$id.'"]')->item(0)->getAttribute('name');
$viewed = $xpPractices->query('//practice[@id="'.$id.'"]')->item(0)->getAttribute('viewed');
$used = $xpPractices->query('//practice[@id="'.$id.'"]')->item(0)->getAttribute('used');
}//fin de foreach $practice_practices
$msg = "<table width='100%'><tr><th>".TITLE_OF_THE_GOOD_PRACTICE." </th><th>".SHORT_DESCRIPTION_GOOD_PRACTICE."</th><th>".VIEWED."</th><th>".USED."</th><th>See this practice</th></tr>";
$msg .= "<tr width='100%'><td>";
$msg .= "<a href='show-practice.php?idPractice=".$id."'>".$name."</a></td><td>".$short_description."</td><td>".$viewed." time</td><td>".$used." time</td></tr>";
$msg .= "</table>";
}//fin foreach $id_practice
} //fin de si $id_practice trouvé
else
{
//$msg = "<table width='100%'>";
$msg = "There is no practice which corresponds to your request. Please refine your search";
//$msg .= "</table>";
}
}
else
{
$msg = "<p>Choose your crireria before starting your search</p>";
}
echo $msg;
?>
honnêtemetn, je croyais que ça allait etre plus simple que ça ce petit moteur de recherche...
le premier $msg = "<table .... doit être une concat $msg .= "<table ... pour ne pas écraser le $msg précédent de la boucle.$msg = "<table width='100%'><tr><th>".TITLE_OF_THE_GOOD_PRACTICE." </th><th>".SHORT_DESCRIPTION_GOOD_PRACTICE."</th><th>".VIEWED."</th><th>".USED."</th><th>See this practice</th></tr>";
$msg .= "<tr width='100%'><td>";
$msg .= "<a href='show-practice.php?idPractice=".$id."'>".$name."</a></td><td>".$short_description."</td><td>".$viewed." time</td><td>".$used." time</td></tr>";
$msg .= "</table>";
Code : Tout sélectionner
Laoding...
Je te corrige, il devrait afficher la practice 2 et 1 mais pas la 3 car cette dernière ne dépond pas du crit 4 de la cat 1
Mais autre petit problème, lorsque je séléctionne les crit 3 et 4 de la cat 1, il devrait m'afficher la pratique 2 et la pratique 3, mais là il m'affiche rien.
<?php
/*-----------------------------------------------------*/
//on affiche le résultat en fonction d'un seul critère //
/*-----------------------------------------------------*/
if (!$cfg['ressources_root']) $cfg['ressources_root'] = ".";
$link_file = $cfg['ressources_root'].'/matrix/criteria-practice.xml';
$xml = simplexml_load_file($link_file);//on ouvre le fichier xml
//si les variables ne sont pas vides
//echo "<pre>"; print_r($_POST['cat']); print_r($_POST['crit']); echo "</pre>";
if ( ($_POST['cat'] ) and ($_POST['crit'] ) )
{
foreach ($_POST["crit"] as $index=>$idcrit){
$idcat = $_POST["cat"][$index]; //trouve la cat du crit
$cat["$idcat"][] = $idcrit; //stocke le crit dans son groupe cat
}
//echo "<pre>"; print_r($cat); echo "</pre>";
$practice = null;
//Recherche des practices
foreach($xml->link as $value)
{
foreach($value->criteria as $criteria)
{
//practice en cours
$id = $value->practice['id'];
//echo "<pre>"; print_r($criteria); echo "</pre>";
//Chercher selon les critères de recherche imposés
foreach($cat as $idcat=>$crit)
foreach($crit as $idcrit) //critères groupés par cat
{
//echo "<p>Practice=$id<br />criteria['idcat']=$criteria[idcat] vs idcat=$idcat AND criteria['idcrit']=$criteria[idcrit] vs idcrit=$idcrit</p>";
//si la cat est touvée
if( trim($criteria['idcat']) == trim($idcat) )
//vérifier le crit de cette cat
if ( trim($criteria['idcrit']) == trim($idcrit) ) //si crit existe
{
$practice["$id"] = true; //sélectioner le practice en cours
}
else //au mois un crit de cette cat n'est pas trouvé
{
$practice["$id"] = false; //élinminer le practice en cours
break;
}
}
}
}
//echo "<pre>"; print_r($practice); echo "</pre>";
//Lecture des practices trouvés
if ( (isset($practice) and count($practice) >0 )) // si $id_practice est trouvé
{
foreach ($practice as $id=>$trouvé){
if (!$trouvé) continue; //sauter les practices marqués non trouvés
//fichier qui contient toutes les practices
$practicesFile = $cfg['ressources_root'].'/content/practice/'.$id.'.xml';
$domPractices = new DOMDocument('1.0','UTF-8');
$domPractices->load($practicesFile);
$xpPractices = new DOMXPath($domPractices);
$item_practice = $domPractices->getElementsByTagName('item');
//recherche xml
foreach ($item_practice as $item)
{
foreach ($item->childNodes as $child)
{
if($child->nodeType != XML_ELEMENT_NODE) continue;
if ($child->tagName == 'name')
{
$name = utf8_decode($child->firstChild->nodeValue);
echo "<p>Name=$name</p>" ;
}
if ($child->tagName == 'short_description')
{
$short_description = utf8_decode($child->firstChild->nodeValue);
echo "<p>Description=$short_description</p>" ;
}
}
}
}//fin foreach $practice
} //fin de si $practice trouvé
else
{
echo "<p>There is no practice which corresponds to your request. Please refine your search</p>";
}
}
else
{
echo "<p>Choose your crireria before starting your search</p>";
}
?>
$t [link1] = array (
array("idcat" => 1, "idcrit" => 1),
array("idcat" => 1, "idcrit" => 2),
array("idcat" => 1, "idcrit" => 3),
array("idcat" => 2, "idcrit" => 1),
"id" => 3 );
$t [link2] = array (
array("idcat" => 5, "idcrit" => 7),
"id" => 1 );
sachant qu'on reçoit d'un formulaire le tableau $cat contenant les critères de recherche regroupés par catégorie de cette forme:
$cat[1] = array(1, 2, 3);
$cat[5] = array(7);
ici, le formulaire à sélectionné les critères 1,2 et 3 de la catégorie 1 et le critère 7 de la catégorie 5C'est peut être là qu'il y a un problème sadeq non ?Les règles:
Un id "practice" est trouvé si au moins un critère d'une catégorie est trouvé.
Un id "practice" n'est pas trouvé si au moins un critère d'une catégorie n'est pas trouvé
cette règle est équivalente à celle que j'ai citée:Sinon autre règle, une practique n'est pas trouvée si tous ses critères + 1 sont sélectionnés.
Ceci veut dire:Un id "practice" n'est pas trouvé si au moins un critère d'une catégorie n'est pas trouvé
<?php
/*-----------------------------------------------------*/
//on affiche le résultat en fonction d'un seul critère //
/*-----------------------------------------------------*/
if (!$cfg['ressources_root']) $cfg['ressources_root'] = ".";
$link_file = $cfg['ressources_root'].'/matrix/criteria-practice.xml';
$xml = simplexml_load_file($link_file);//on ouvre le fichier xml
//si les variables ne sont pas vides
//echo "<pre>"; print_r($_POST['cat']); print_r($_POST['crit']); echo "</pre>";
if ( ($_POST['cat'] ) and ($_POST['crit'] ) )
{
foreach ($_POST["crit"] as $index=>$idcrit){
$idcat = $_POST["cat"][$index]; //trouve la cat du crit
$cat["$idcat"][] = $idcrit; //stocke le crit dans son groupe cat
}
//echo "<pre>"; print_r($cat); echo "</pre>";
$practice = null;
//Recherche des practices
foreach($xml->link as $value)
{
//practice en cours
$id_practice = $value->practice['id'];
//ses critères de recherche
$temp = null; //tableau pour ordonner les critères par cat
foreach($value->criteria as $criteria){
$idcat = trim($criteria['idcat']);
$idcrit = trim($criteria['idcrit']);
//construire le tableau de critères
$temp[$idcat][] = $idcrit;
}
//print_r($temp);
//Rapporochement du tableau temp et du tableau du postage
foreach ($cat as $idcat=>$crit_post){
//liste des critères de recherche
$crit_rech = $temp[$idcat];
if (is_array($crit_rech) && is_array($crit_post)) {
//calculer la différence entre les critères
$diff = array_diff($crit_post, $crit_rech);
//print_r($diff);
//Si les critères sont les mêmes alors practice trouvé
if (count($diff) <=0) $practice["$id_practice"] = true;
}
}
}
//echo "<pre>"; print_r($practice); echo "</pre>";
//Lecture des practices trouvés
if ( (isset($practice) and count($practice) >0 )) // si $id_practice est trouvé
{
foreach ($practice as $id=>$trouvé){
if (!$trouvé) continue;
//fichier qui contient toutes les practices
$practicesFile = $cfg['ressources_root'].'/content/practice/'.$id.'.xml';
$domPractices = new DOMDocument('1.0','UTF-8');
$domPractices->load($practicesFile);
$xpPractices = new DOMXPath($domPractices);
$item_practice = $domPractices->getElementsByTagName('item');
//recherche xml
foreach ($item_practice as $item)
{
foreach ($item->childNodes as $child)
{
if($child->nodeType != XML_ELEMENT_NODE) continue;
if ($child->tagName == 'name')
{
$name = utf8_decode($child->firstChild->nodeValue);
echo "<p>Name=$name</p>" ;
}
if ($child->tagName == 'short_description')
{
$short_description = utf8_decode($child->firstChild->nodeValue);
echo "<p>Description=$short_description</p>" ;
}
}
}
}//fin foreach $practice
} //fin de si $practice trouvé
else
{
echo "<p>There is no practice which corresponds to your request. Please refine your search</p>";
}
}
else
{
echo "<p>Choose your crireria before starting your search</p>";
}
?>
Et ça marche @$crit_rech = $temp[$idcat];
au lieu de
$crit_rech = $temp[$idcat]; Code : Tout sélectionner
Notice: Undefined offset: 5 in F:\www\...\result-request.php on line 43Code : Tout sélectionner
<link id="1">
<criteria idcat="3" idcrit="3"/>
<criteria idcat="2" idcrit="1"/>
<practice id="2"/>
</link>
<link id="2">
<criteria idcat="5" idcrit="7"/>
<practice id="1"/>
</link>non ?Sinon autre règle, une practique n'est pas trouvée si tous ses critères + 1 sont sélectionnés.
foreach ($cat as $idcat=>$crit_post){
//liste des critères de recherche
@$crit_rech = $temp[$idcat];
if (is_array($crit_rech) && is_array($crit_post)) {
//calculer la différence entre les critères
$diff = array_diff($crit_post, $crit_rech);
//print_r($diff);
//Si les critères sont les mêmes alors practice trouvé
if (count($diff) <=0) $practice["$id_practice"] = true;
}
}