recherche multicritères

Salut,

je souhaite faire un moteur de recherche multicritères à l’aide des mots clés mais qui puisse prendre en compte le critère ou et en plus mettre une pagination sur le résultat.

Je m’explique, dans une rubrique j’ai des sous-rubriques qui correspondent à un premier critères et dans chaque rubrique j’ai une suite d’articles associés à des mots clés qui corresponde aux autres critères.

J’ai donc un formulaire avec 2 listes de sélection, la première est construite en récupérant un groupe de mot et en listant ses mots, la seconde liste les sous rubriques, en dessous j’ai mes 2 boutons validation et ré-initialisation du formulaire et un troisième bouton pour afficher tous les articles. Ce qui me donne le code suivant :

<form id="formoffres" name="formoffres" method="post" action="#SELF">
	[(#REM) Liste de selection construite a partir de la liste des mots du groupe 11 ]
	<BOUCLE_groupe_type(GROUPES_MOTS){id_groupe=11}>
	<select id="typeOffre" name="typeOffre">
		<option value="0">Indifférent</option>
		<BOUCLE_mot_type(MOTS){id_groupe}>
		<option value="[(#ID_MOT)]"[ (#ENV{typeOffre}|=={#ID_MOT}|?{'selected="selected"',''})]>#TITRE</option>
		</BOUCLE_mot_type>
	</select>
	</BOUCLE_groupe_type>

	[(#REM) Liste de selection construite a partir de la liste des sous-rubriques de la rubrique offres]
	<B_sous_rub>
	<label>Je suis int&eacute;ress&eacute;(e) par : </label>
	<select id="poles" name="poles">
		<option value="0">Indifférent</option>
		<BOUCLE_sous_rub(RUBRIQUES){id_parent}{par num titre, titre}>
		<option value="[(#ID_RUBRIQUE)]"[ (#ENV{poles}|=={#ID_RUBRIQUE}|?{'selected="selected"',''})]>#TITRE</option>
		</BOUCLE_sous_rub>
	</select>
	</B_sous_rub>

	<input type="submit" value="Valider" id="validFormOffres" name="validFormOffres" class="bout-form" />
	<input type="button" value="Réinitialiser votre recherche" id="resetFormOffres" name="resetFormOffres" class="bout-form" onclick="document.location='#SELF'" />

	[(#REM) Bouton qui permet d'afficher tous les articles ]
	<input type="submit" value="Affichez toutes les offres" id="toutesOffres" name="toutesOffres" class="bout-form" />
</form>

Ensuite j'affiche les résultats en dessous dans un tableau et la j'ai utilisé du php car je n'ai pas réussi à l'écrire en SPIP, c'est à partir d'ici que j'ai besoins d'aide.

Voici le code pour les résultats :

`[(#REM) resultat de la recherche]`
`<?php // Si le formulaire est valide et que type_offre et pole existent`
`if(isset($_POST["validFormOffres"]) && isset($_POST["typeOffre"]) && isset($_POST["poles"])){  ?>`
`<div class="formulaire-resultat">`
`	``<h3>R&eacute;sultat de votre recherche</h3>`
`	``<?php`` ``if(("0"!=$_POST["typeOffre"])&&("0"==$_POST["poles"])) {`` //Si le pole est selectionne et pas le type d'offre ``?>`
`	``<B_critere_type>`
`	``<table cellpadding="0" cellspacing="0" class="comm">`
`		``<tr>`
`			``<th>Offres</th>`
`			``<th>Pôle</th>`
`			``<th>Lieu</th>`
`		``</tr>`
`		``<BOUCLE_critere_type(ARTICLES){id_mot=#ENV{typeOffre}}{doublons}>`
`		``<tr>`
`			``<td><a href="#URL_ARTICLE">[(#TITRE|supprimer_numero)]</a></td>`
`			``<td>`
`				``<BOUCLE_rubrique_offre_critere_type(RUBRIQUES){id_rubrique=#ID_RUBRIQUE}>`
`					``[(#TITRE|supprimer_numero)]`
`				``</BOUCLE_rubrique_offre_critere_type>`
`			``</td>`
`			``<td>`
`				``<BOUCLE_mots_offrestype(MOTS){id_article}{id_groupe=7}{par titre}{", "}>`
`					``[(#TITRE|supprimer_numero)]`
`				``</BOUCLE_mots_offrestype> `
`				``</B_mots_offrestype>&nbsp;<//B_mots_offrestype>`
`			``</td>`
`		``</tr>`
`		``</BOUCLE_critere_type>`
`	``</table>`
`	``</B_critere_type>`
`	``<p class="message-erreur">Aucun enregistrement ne correspond aux critères selectionnés pour votre recherche</p>`
`	``<//B_critere_type>`
`	``<?php`` ``}`
`	``//Si le type d'offre est selectionne et pas le pole`
`	``if(("0"==$_POST["typeOffre"])&&("0"!=$_POST["poles"])) {`
`	``?> `
`	``<B_critere_pole>`
`	``<table cellpadding="0" cellspacing="0" class="comm">`
`		``<tr>`
`			``<th>Offres</th>`
`			``<th>Type</th>`
`			``<th>Lieu</th>`
`		``</tr>`
`		``<BOUCLE_critere_pole(ARTICLES){id_rubrique=#ENV{poles}}{doublons}>`
`		``<tr>`
`			``<td><a href="#URL_ARTICLE">[(#TITRE|supprimer_numero)]</a></td>`
`			``<td>`
`				``<BOUCLE_type_offres_critere_pole(MOTS){id_article}{id_groupe=11}>`
`					``[(#TITRE)]`
`				``</BOUCLE_type_offres_critere_pole>`
`			``</td>`
`			``<td>`
`				``<BOUCLE_mots_offrespole(MOTS){id_article}{id_groupe=7}{par titre}{", "}>`
`					``[(#TITRE|supprimer_numero)]`
`				``</BOUCLE_mots_offrespole>`
`				``</B_mots_offrespole>&nbsp;<//B_mots_offrespole>`
`			``</td>`
`		``</tr>`
`		``</BOUCLE_critere_pole>`
`	``</table>`
`	``</B_critere_pole>`
`	``<p class="message-erreur">Aucun enregistrement ne correspond aux critères selectionnés pour votre recherche</p>`
`	``<//B_critere_pole>`
`	``<?php`
`	``}`
`	``//Si le type d'offre et le pole sont selectionnes `
`	``if(("0"!=$_POST["typeOffre"]) && ("0"!=$_POST["poles"])) {`
`	``?>`
`	``<B_critere_deux>`
`	``<table cellpadding="0" cellspacing="0" class="comm">`
`		``<tr>`
`			``<th>Offres</th>`
`			``<th>Lieu</th>`
`		``</tr>`
`		``<BOUCLE_critere_deux(ARTICLES){id_rubrique=#ENV{poles}}{id_mot=#ENV{typeOffre}}>`
`		``<tr>`
`			``<td><a href="#URL_ARTICLE">[(#TITRE|supprimer_numero)]</a></td>`
`			``<td>`
`				``<BOUCLE_mots_offresdeux(MOTS){id_article}{id_groupe=7}{par titre}{", "}>`
`					``[(#TITRE|supprimer_numero)]`
`				``</BOUCLE_mots_offresdeux>`
`				``</B_mots_offresdeux>&nbsp;<//B_mots_offresdeux>`
`			``</td>`
`		``</tr>`
`		``</BOUCLE_critere_deux>`
`	``</table>`
`	``</B_critere_deux>`
`	``<p class="message-erreur">Aucun enregistrement ne correspond aux critères selectionnés pour votre recherche</p>`
`	``<//B_critere_deux>`
`	``<?php`
`	``}`
`	``// Si aucun critère n'a ete selectionne`
`	``if(("0"==$_POST["typeOffre"]) && ("0"==$_POST["poles"])) {`
`	``?>`
`	``<p class="message-erreur">Aucun critère n'a été selectionné</p>`
`	``<?php`` ``}`` ``?>`
`</div>`
`<?php`
`} else {`
`	``// Si le formulaire n'a pas ete validé mais que l'on clique sur le bouton toutes les offres`
`	``if ( !empty($toutesOffres) ) {`
`?>`
`<div class="formulaire-resultat">`
`	``<B_articles_offres>`
`	``<h3>Toutes nos offres</h3>`
`	``#ANCRE_PAGINATION`
`	``<table cellpadding="0" cellspacing="0" class="comm">`
`		``<tr>`
`			``<th>Offres</th>`
`			``<th>P&ocirc;le</th>`
`			``<th>Lieu</th>`
`		``</tr>`
`		``<BOUCLE_articles_offres(ARTICLES){branche}{par titre}{pagination}>`
`		``<tr>`
`			``<td>`
`				``<a href="#URL_ARTICLE">[(#TITRE|supprimer_numero)]</a>`
`				``<BOUCLE_type_offres(MOTS){id_article}{id_groupe=11}>`
`					``[ <span class="detail">((#TITRE))</span>]`
`				``</BOUCLE_type_offres>`
`			``</td>`
`			``<td>[(#_rubrique_offres:TITRE|supprimer_numero)]</td>`
`			``<td>`
`				``<BOUCLE_mots_lieu(MOTS){id_article}{id_groupe=7}{par titre}{", "}>`
`					``[(#TITRE|supprimer_numero)]`
`				``</BOUCLE_mots_lieu> `
`				``</B_mots_lieu>&nbsp;<//B_mots_lieu>`
`			``</td>`
`		``</tr>`
`		``</BOUCLE_articles_offres>`
`	``</table>`
`	``[(#PAGINATION)]`
`	``<br />Il y a au total #GRAND_TOTAL articles, cette page en affiche #TOTAL_BOUCLE`
`	``</B_articles_offres>`
`</div>`
`<?php`
`}`
`}`
`?>`

Même si le code est lourd ça marche sauf pour la pagination sur le dernier teste, quand on affiche tous les articles.
Quand je clique sur un lien de pagination je n’affiche rien par contre si rafraichie la page la ça marche.
Est ce que qq1 aurait une idée ?

Vous pouvez voir le résultat à l’adresse http://www.neolame.com/dev/solucom/spip.php?rubrique19

Arnaud



<br>-- <br>CARIOU Arnaud<br>Web-Designer<br>Tél : 06 22 43 83 06<br>E-mail : [arnaud@neolame.com](mailto:arnaud@neolame.com)<br><br>

Bon je me répond ça peut servir à qql1.

Pour les tests de variable du formulaire voici le code :

[(#ENV*{validFormOffres}|?{
[(#ENV*{poles}|!={‹ 0 ›}|?{
[(#ENV*{typeOffre}|!={‹ 0 ›}|?{
[(#INCLURE{fond=res-offres}{poles=#ENV*{poles}}{typeOffre=#ENV*{typeOffre}})]
,
[(#INCLURE{fond=res-offres-pole}{poles=#ENV*{poles}})]
})]
,
[(#INCLURE{fond=res-offres-type}{typeOffre=#ENV*{typeOffre}})]
})]
,
[(#ENV*{toutesOffres}|?{
[(#INCLURE{fond=res-toutes-offres}{id_rubrique=#ID_RUBRIQUE}{self=#SELF})]
,
[(#INCLURE{fond=res-offres-defaut}{id_rubrique=#ID_RUBRIQUE})]
})]
})]

Pour résoudre le problème de rafraîchissement j’ai copié le modèle de pagination dans le répertoire modeles de mon squelette et j’ai rajouté le filtre |parametre_url{‹ toutesOffres ›,‹ oui ›} à la variable url

@+

Le jeudi 16 octobre 2008 à 21:04 +0200, CARIOU Arnaud a écrit :

Salut,

je souhaite faire un moteur de recherche multicritères à l’aide des mots clés mais qui puisse prendre en compte le critère ou et en plus mettre une pagination sur le résultat.

Je m’explique, dans une rubrique j’ai des sous-rubriques qui correspondent à un premier critères et dans chaque rubrique j’ai une suite d’articles associés à des mots clés qui corresponde aux autres critères.

J’ai donc un formulaire avec 2 listes de sélection, la première est construite en récupérant un groupe de mot et en listant ses mots, la seconde liste les sous rubriques, en dessous j’ai mes 2 boutons validation et ré-initialisation du formulaire et un troisième bouton pour afficher tous les articles. Ce qui me donne le code suivant :

<form id="formoffres" name="formoffres" method="post" action="#SELF">
	[(#REM) Liste de selection construite a partir de la liste des mots du groupe 11 ]
	<BOUCLE_groupe_type(GROUPES_MOTS){id_groupe=11}>
	<select id="typeOffre" name="typeOffre">
		<option value="0">Indifférent</option>
		<BOUCLE_mot_type(MOTS){id_groupe}>
		<option value="[(#ID_MOT)]"[ (#ENV{typeOffre}|=={#ID_MOT}|?{'selected="selected"',''})]>#TITRE</option>
		</BOUCLE_mot_type>
	</select>
	</BOUCLE_groupe_type>

	[(#REM) Liste de selection construite a partir de la liste des sous-rubriques de la rubrique offres]
	<B_sous_rub>
	<label>Je suis int&eacute;ress&eacute;(e) par : </label>
	<select id="poles" name="poles">
		<option value="0">Indifférent</option>
		<BOUCLE_sous_rub(RUBRIQUES){id_parent}{par num titre, titre}>
		<option value="[(#ID_RUBRIQUE)]"[ (#ENV{poles}|=={#ID_RUBRIQUE}|?{'selected="selected"',''})]>#TITRE</option>
		</BOUCLE_sous_rub>
	</select>
	</B_sous_rub>

	<input type="submit" value="Valider" id="validFormOffres" name="validFormOffres" class="bout-form" />
	<input type="button" value="Réinitialiser votre recherche" id="resetFormOffres" name="resetFormOffres" class="bout-form" onclick="document.location='#SELF'" />

	[(#REM) Bouton qui permet d'afficher tous les articles ]
	<input type="submit" value="Affichez toutes les offres" id="toutesOffres" name="toutesOffres" class="bout-form" />
</form>

Ensuite j'affiche les résultats en dessous dans un tableau et la j'ai utilisé du php car je n'ai pas réussi à l'écrire en SPIP, c'est à partir d'ici que j'ai besoins d'aide.

Voici le code pour les résultats :

`[(#REM) resultat de la recherche]`
`<?php // Si le formulaire est valide et que type_offre et pole existent`
`if(isset($_POST["validFormOffres"]) && isset($_POST["typeOffre"]) && isset($_POST["poles"])){  ?>`
`<div class="formulaire-resultat">`
`	<h3>R&eacute;sultat de votre recherche</h3>`
`	<?php if(("0"!=$_POST["typeOffre"])&&("0"==$_POST["poles"])) { //Si le pole est selectionne et pas le type d'offre ?>`
`	<B_critere_type>`
`	<table cellpadding="0" cellspacing="0" class="comm">`
`		<tr>`
`			<th>Offres</th>`
`			<th>Pôle</th>`
`			<th>Lieu</th>`
`		</tr>`
`		<BOUCLE_critere_type(ARTICLES){id_mot=#ENV{typeOffre}}{doublons}>`
`		<tr>`
`			<td><a href="#URL_ARTICLE">[(#TITRE|supprimer_numero)]</a></td>`
`			<td>`
`				<BOUCLE_rubrique_offre_critere_type(RUBRIQUES){id_rubrique=#ID_RUBRIQUE}>`
`					[(#TITRE|supprimer_numero)]`
`				</BOUCLE_rubrique_offre_critere_type>`
`			</td>`
`			<td>`
`				<BOUCLE_mots_offrestype(MOTS){id_article}{id_groupe=7}{par titre}{", "}>`
`					[(#TITRE|supprimer_numero)]`
`				</BOUCLE_mots_offrestype> `
`				</B_mots_offrestype>&nbsp;<//B_mots_offrestype>`
`			</td>`
`		</tr>`
`		</BOUCLE_critere_type>`
`	</table>`
`	</B_critere_type>`
`	<p class="message-erreur">Aucun enregistrement ne correspond aux critères selectionnés pour votre recherche</p>`
`	<//B_critere_type>`
`	<?php }`
`	//Si le type d'offre est selectionne et pas le pole`
`	if(("0"==$_POST["typeOffre"])&&("0"!=$_POST["poles"])) {`
`	?> `
`	<B_critere_pole>`
`	<table cellpadding="0" cellspacing="0" class="comm">`
`		<tr>`
`			<th>Offres</th>`
`			<th>Type</th>`
`			<th>Lieu</th>`
`		</tr>`
`		<BOUCLE_critere_pole(ARTICLES){id_rubrique=#ENV{poles}}{doublons}>`
`		<tr>`
`			<td><a href="#URL_ARTICLE">[(#TITRE|supprimer_numero)]</a></td>`
`			<td>`
`				<BOUCLE_type_offres_critere_pole(MOTS){id_article}{id_groupe=11}>`
`					[(#TITRE)]`
`				</BOUCLE_type_offres_critere_pole>`
`			</td>`
`			<td>`
`				<BOUCLE_mots_offrespole(MOTS){id_article}{id_groupe=7}{par titre}{", "}>`
`					[(#TITRE|supprimer_numero)]`
`				</BOUCLE_mots_offrespole>`
`				</B_mots_offrespole>&nbsp;<//B_mots_offrespole>`
`			</td>`
`		</tr>`
`		</BOUCLE_critere_pole>`
`	</table>`
`	</B_critere_pole>`
`	<p class="message-erreur">Aucun enregistrement ne correspond aux critères selectionnés pour votre recherche</p>`
`	<//B_critere_pole>`
`	<?php`
`	}`
`	//Si le type d'offre et le pole sont selectionnes `
`	if(("0"!=$_POST["typeOffre"]) && ("0"!=$_POST["poles"])) {`
`	?>`
`	<B_critere_deux>`
`	<table cellpadding="0" cellspacing="0" class="comm">`
`		<tr>`
`			<th>Offres</th>`
`			<th>Lieu</th>`
`		</tr>`
`		<BOUCLE_critere_deux(ARTICLES){id_rubrique=#ENV{poles}}{id_mot=#ENV{typeOffre}}>`
`		<tr>`
`			<td><a href="#URL_ARTICLE">[(#TITRE|supprimer_numero)]</a></td>`
`			<td>`
`				<BOUCLE_mots_offresdeux(MOTS){id_article}{id_groupe=7}{par titre}{", "}>`
`					[(#TITRE|supprimer_numero)]`
`				</BOUCLE_mots_offresdeux>`
`				</B_mots_offresdeux>&nbsp;<//B_mots_offresdeux>`
`			</td>`
`		</tr>`
`		</BOUCLE_critere_deux>`
`	</table>`
`	</B_critere_deux>`
`	<p class="message-erreur">Aucun enregistrement ne correspond aux critères selectionnés pour votre recherche</p>`
`	<//B_critere_deux>`
`	<?php`
`	}`
`	// Si aucun critère n'a ete selectionne`
`	if(("0"==$_POST["typeOffre"]) && ("0"==$_POST["poles"])) {`
`	?>`
`	<p class="message-erreur">Aucun critère n'a été selectionné</p>`
`	<?php } ?>`
`</div>`
`<?php`
`} else {`
`	// Si le formulaire n'a pas ete validé mais que l'on clique sur le bouton toutes les offres`
`	if ( !empty($toutesOffres) ) {`
`?>`
`<div class="formulaire-resultat">`
`	<B_articles_offres>`
`	<h3>Toutes nos offres</h3>`
`	#ANCRE_PAGINATION`
`	<table cellpadding="0" cellspacing="0" class="comm">`
`		<tr>`
`			<th>Offres</th>`
`			<th>P&ocirc;le</th>`
`			<th>Lieu</th>`
`		</tr>`
`		<BOUCLE_articles_offres(ARTICLES){branche}{par titre}{pagination}>`
`		<tr>`
`			<td>`
`				<a href="#URL_ARTICLE">[(#TITRE|supprimer_numero)]</a>`
`				<BOUCLE_type_offres(MOTS){id_article}{id_groupe=11}>`
`					[ <span class="detail">((#TITRE))</span>]`
`				</BOUCLE_type_offres>`
`			</td>`
`			<td>[(#_rubrique_offres:TITRE|supprimer_numero)]</td>`
`			<td>`
`				<BOUCLE_mots_lieu(MOTS){id_article}{id_groupe=7}{par titre}{", "}>`
`					[(#TITRE|supprimer_numero)]`
`				</BOUCLE_mots_lieu> `
`				</B_mots_lieu>&nbsp;<//B_mots_lieu>`
`			</td>`
`		</tr>`
`		</BOUCLE_articles_offres>`
`	</table>`
`	[(#PAGINATION)]`
`	<br />Il y a au total #GRAND_TOTAL articles, cette page en affiche #TOTAL_BOUCLE`
`	</B_articles_offres>`
`</div>`
`<?php`
`}`
`}`
`?>`

Même si le code est lourd ça marche sauf pour la pagination sur le dernier teste, quand on affiche tous les articles.
Quand je clique sur un lien de pagination je n’affiche rien par contre si rafraichie la page la ça marche.
Est ce que qq1 aurait une idée ?

Vous pouvez voir le résultat à l’adresse http://www.neolame.com/dev/solucom/spip.php?rubrique19

Arnaud



<br>-- <br>CARIOU Arnaud<br>Web-Designer<br>Tél : 06 22 43 83 06<br>E-mail : [arnaud@neolame.com](mailto:arnaud@neolame.com)<br><br>

_______________________________________________
liste spip
[spip@rezo.net](mailto:spip@rezo.net) - désabonnement : [spip-off@rezo.net](mailto:spip-off@rezo.net)

Infos et archives : [http://listes.rezo.net/mailman/listinfo/spip](http://listes.rezo.net/mailman/listinfo/spip)

Documentation de SPIP : [http://www.spip.net/](http://www.spip.net/)

irc://irc.freenode.net/spip ou [http://embed.mibbit.com/?server=irc.freenode.net&channel=%23spip](http://embed.mibbit.com/?server=irc.freenode.net&channel=%23spip)



<br>-- <br>CARIOU Arnaud<br>Web-Designer<br>Tél : 06 22 43 83 06<br>E-mail : [arnaud@neolame.com](mailto:arnaud@neolame.com)<br><br>