Filtrer les articles
danielsan
Member
Bonjour à vous,
je dois créer un site de gestion de fiches avec une possibilité de filtre et de recherche selon des critères.
J'ai donc créé une catégorie "Revendeurs" avec un article par revendeur.
Dans cet article j'ai rajouté un groupe de champs destinés à remplir la fiche ( nom, tel, etc ... ).
La catégorie "revendeurs" doit afficher la liste des articles selon un critère ( le département ), puis on clique sur le nom du revendeur pour voir sa fiche.
Dans le template categorie-revendeurs.php,
je construis d'abord un tableau regroupant les fiches revendeurs, afin de retrouver les critères qui vont servir au filtre:
Puis à l'aide d'un formulaire ( bon, en vrai j'ai fait une carte de france en SVG dynamique ... ),
j'affiche les revendeurs du département sélectionné:
( la méthode GET est pour la carte SVG et le partage d'URL, le POST pour un champ recherche )
Le problème de cette manipulation est
1/ je boucle une première fois avec la boucle de PluXml ( je crois qu'elle est limitée non ?)
2/ je boucle une deuxième fois sur mon tableau généré dans lequel je filtre les fiches à afficher.
C'est un peu lourd ...
Quitte à boucler une fois, je pourrais créer toutes la liste des revendeurs en les cachant avec la feuille de style, et avec un script JS afficher seulement ceux filtrés.
Mais c'est aussi lourd ( je ne sais pas encore combien de fiches il y a, mais entre 100 et 200 ... ).
On pourrait aussi parser l'ensemble des articles d'une catégorie et n'afficher que ceux qui possède le critère souhaité, mais là je galère.
Une autre solution serait de s'inspirer de la fonction tag:
un plugin qui lors de la création d'un article,
implémente un fichier departement.xml et lors de ma recherche je vais taper dedans ... mais là je galère aussi ...
Qu'en pensez-vous ?
Merci de votre aide
_____
D.San
je dois créer un site de gestion de fiches avec une possibilité de filtre et de recherche selon des critères.
J'ai donc créé une catégorie "Revendeurs" avec un article par revendeur.
Dans cet article j'ai rajouté un groupe de champs destinés à remplir la fiche ( nom, tel, etc ... ).
La catégorie "revendeurs" doit afficher la liste des articles selon un critère ( le département ), puis on clique sur le nom du revendeur pour voir sa fiche.
Dans le template categorie-revendeurs.php,
je construis d'abord un tableau regroupant les fiches revendeurs, afin de retrouver les critères qui vont servir au filtre:
<?php
include(dirname(__FILE__).'/departements.php'); // insertion du tableau des départements
$bdd_rev = array(); // tableau général des revendeurs
?>
<?php while($plxShow->plxMotor->plxRecord_arts->loop()): ?>
<?php
$champs = array("contact_rev", "adresse_rev", "cp", "ville_rev", "telephone", "fax", "portable", "email", "site_web", "logo");
$champs = array_flip($champs);
foreach($champs as $k => $v){
$champs[$k] = "";
$le_champ = $plxShow->callHook('champArt', $k.'_R');
if($le_champ!="") {
$champs[$k] = $plxShow->callHook('champArt', $k.'_R');
}else{}
}
$champs["title"] = plxUtils::strCheck($plxShow->plxMotor->plxRecord_arts->f('title'));
$champs["url"] = $plxShow->plxMotor->urlRewrite('?article'.intval($plxShow->plxMotor->plxRecord_arts->f('numero')).'/'.$plxShow->plxMotor->plxRecord_arts->f('url'));
array_push($bdd_rev, $champs);
?>
<?php endwhile; ?>
Puis à l'aide d'un formulaire ( bon, en vrai j'ai fait une carte de france en SVG dynamique ... ),
j'affiche les revendeurs du département sélectionné:
( la méthode GET est pour la carte SVG et le partage d'URL, le POST pour un champ recherche )
<h3>Veuillez sélectionner le département souhaité sur la carte.</h3>
<form action="<?php echo $url_global; ?>" method="post">
<label for="dep"><h3>ou entrer un code département <span>( ex: 34 pour l'Hérault )</span></h3>
<INPUT type="text" name="dep" class="search_dep" size="2" maxlength="2">
<input type="submit" value="Chercher">
</form>
<?php
if (isset($_GET["dep"]) AND !empty($_GET["dep"]) AND array_key_exists($_GET["dep"], $list_dep)){
$get_dep = $_GET["dep"];
} elseif (isset($_POST["dep"]) AND !empty($_POST["dep"]) AND array_key_exists($_POST["dep"], $list_dep)){
$get_dep = $_POST["dep"];
} elseif ((isset($_GET["dep"]) AND !empty($_GET["dep"]) AND !array_key_exists($_GET["dep"], $list_dep)) OR (isset($_POST["dep"]) AND !empty($_POST["dep"]) AND !array_key_exists($_POST["dep"], $list_dep))){
echo "<div class=\"grid_6 space_3 center\">\n";
echo "<p>Code département non valide</p>\n";
echo "</div>\n";
} else{}
if(isset($get_dep)){
$test = "0";
echo "<div id=\"liste_cartes\">\n";
echo "<div class=\"grid_12 margin_b1\">\n";
echo "<h3>Nos revendeurs de Garde-corps et Barrièrres de protection pour piscines dans le <b>".$get_dep." - ".$list_dep[$get_dep]."</b></h3>\n";
echo "</div>\n";
foreach($bdd_rev as $k => $fiche_rev) {
$dep_rev = substr($fiche_rev["cp"], 0, 2);
if($dep_rev==$get_dep){
echo "<div class=\"carte_visite grid_4\">\n";
echo "<div>\n";
echo "<ul>\n";
if(!empty($fiche_rev["cp"])){echo "<li class=\"nom\"><h5>".$fiche_rev["title"]."</h5></li>";}else{}
echo "</ul>\n";
echo "<ul>\n";
if(!empty($fiche_rev["cp"])){echo "<li class=\"cp\">".$fiche_rev["cp"]." ";}else{} if(!empty($fiche_rev["ville_rev"])){echo strtoupper($fiche_rev["ville_rev"])."</li>";}else{}
echo "</ul>\n";
echo "<ul>\n";
if(!empty($fiche_rev["telephone"])){ echo "<li class=\"telephone\"><span>Téléphone</span>".$fiche_rev["telephone"]."</li>"; }else{}
if(!empty($fiche_rev["portable"])){ echo "<li class=\"portable\"><span>Portable</span>".$fiche_rev["portable"]."</li>"; }else{}
echo "</ul>\n";
echo "<p class=\"more\"><a href=\"".$fiche_rev["url"]."\" class=\"btn\">Voir la fiche revendeur</a></p>\n";
echo "</div>\n";
echo "</div>\n";
$test = "1";
}else{
}
}
echo "</div>\n";
if($test=="0"){
echo "<div class=\"grid_6 space_3 center\">\n";
echo "<p>Nous n'avons pas encore de revendeur dans ce département.</p>\n";
echo "<p class=\"more\"><a href=\"#\" class=\"btn\">Trouvons une solution ensemble</a></p>\n";
echo "</div>\n";
}else{}
}else{}
?>
Le problème de cette manipulation est
1/ je boucle une première fois avec la boucle de PluXml ( je crois qu'elle est limitée non ?)
2/ je boucle une deuxième fois sur mon tableau généré dans lequel je filtre les fiches à afficher.
C'est un peu lourd ...
Quitte à boucler une fois, je pourrais créer toutes la liste des revendeurs en les cachant avec la feuille de style, et avec un script JS afficher seulement ceux filtrés.
Mais c'est aussi lourd ( je ne sais pas encore combien de fiches il y a, mais entre 100 et 200 ... ).
On pourrait aussi parser l'ensemble des articles d'une catégorie et n'afficher que ceux qui possède le critère souhaité, mais là je galère.
Une autre solution serait de s'inspirer de la fonction tag:
un plugin qui lors de la création d'un article,
implémente un fichier departement.xml et lors de ma recherche je vais taper dedans ... mais là je galère aussi ...
Qu'en pensez-vous ?
Merci de votre aide
_____
D.San
Connectez-vous ou Inscrivez-vous pour répondre.
Réponses
Regarde si les fonctions php array_filter et array_search t'inspire.
Consultant PluXml
Ancien responsable et développeur de PluXml (2010 à 2018)
Tu peux ensuite faire ta boucle de recherche (une au lieu de deux).
il n'empêche qu'il me faille d'abord créer le tableau pour ensuite le filtrer ..?
@Jerry: ça reviendrait un peu à la fonction de la gestion de mots clefs ...
j'écris dans un csv ou du xml (encore mieux) le numéro de l'article associé au département.
Puis dans le template de la catégorie, je n'utilise pas la boucle de pluxml mais fait un import de la base avec un filtre que si le formulaire est envoyé ... qui me dira dans quels articles aller piocher les info nécessaires...
Sauf que si demain mon client change de chemise, euh, d'avis, et souhaite que l'on filtre selon un autre critère ( genre le pays, la langue parlée ... ), il faudra aller enregistrer chaque article pour générer une autre base, sik !
Et si nous avions une page dynamique comme le sitemap dont l'url serait du type
liste.php?categorie=003&champ=dep
Cette page analyse son nom, puis génère la liste des articles de la catégorie revendeurs ayant le département filtré.
J'insère ce fichier dans mon template categorie-revendeurs.php et grâce à lui je vais piocher dans les bons articles ... je tiens un truc là ? c'est faisable ? ça prendrai bcp de ressource ? ( y'a le cache aussi ... )
( en tout cas c'est marrant spice di gik va ! )
Merci de votre aide.
fichier liste.php à insérer à la racine du site
on accède à la page avec une url de ce type:
http://localhost/monsite/liste.php?categorie=2&champ=champArt_cp&filtre=06000
ya des trucs que je peux enlever ? parmi les include et define ?
Après faut sécuriser tout ça ...
dans mon tempate categorie-revendeurs.php,
je souhaite transformer ce fichier dynamique en tableau php.
J'utilise si j'utilise l'url dynamique, ça ne fonctionne pas.
Cependant, si j'enregistre et que je lis le fichier liste.xml, là ça marche.
Je n'arrive pas à trouver d'où vient le problème ...
Quelqu'un a une idée ?
Merci à tous.
C'est pas plutôt :
???
peut-être bien ... mais je suis passé par une autre approche ...
Quand ça ne passe pas d'un côté, je tente ailleurs ...
Je boucle sur les articles de la catégorie 2
Je récupère la variable envoyée par le formulaire ou l'url:
Et j'affiche en filtrant seulement les bonnes fiches:
Je me suis inspiré de ton menu qui classe les articles... merci!
Cependant, je me demande comment $plxMotor peux tourner comme ça tout seul, habituellement faut rajouter $plxShow->plxMotor ...
Merci.