Filtrer les articles

danielsandanielsan Member
juin 2012 modifié dans Discussions générales
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:
<?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 ... :p ),
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&eacute;lectionner le d&eacute;partement souhait&eacute; sur la carte.</h3>


<form action="<?php echo $url_global; ?>" method="post">
<label for="dep"><h3>ou entrer un code d&eacute;partement <span>( ex: 34 pour l'H&eacute;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&eacute;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&egrave;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&eacute;l&eacute;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&eacute;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

Réponses

  • StéphaneStéphane Member, Former PluXml Project Manager
    Salut

    Regarde si les fonctions php array_filter et array_search t'inspire.

    Consultant PluXml

    Ancien responsable et développeur de PluXml (2010 à 2018)

  • Sinon, plutôt que de générer le tableau des revendeurs à chaque fois, pourquoi ne pas le générer à chaque insertion d'un nouveau revendeur ? Tu fais ton insertion et tu écris ta variable dans un fichier que tu inclues en entête de page template.


    Tu peux ensuite faire ta boucle de recherche (une au lieu de deux).
  • danielsandanielsan Member
    juin 2012 modifié
    @Stéphane: merci, c'est vrai que je suis (un peu) bourrin sur les bords ... :p
    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 :p spice di gik va ! )

    Merci de votre aide.
  • danielsandanielsan Member
    juin 2012 modifié
    bah mirde alors, la génération du xml fonctionne ...
    fichier liste.php à insérer à la racine du site
    <?php
    # ------------------ BEGIN LICENSE BLOCK ------------------
    #
    # This file is part of PluXml : http://www.pluxml.org
    #
    # Copyright (c) 2010-2011 Stephane Ferrari and contributors
    # Copyright (c) 2008-2009 Florent MONTHEL and contributors
    # Copyright (c) 2006-2008 Anthony GUERIN
    # Licensed under the GPL license.
    # See http://www.gnu.org/licenses/gpl.html
    #
    # ------------------- END LICENSE BLOCK -------------------
    
    include('config.php');
    
    # Définition des constantes
    define('PLX_ROOT', './');
    define('PLX_CORE', PLX_ROOT.'core/');
    define('PLX_PLUGINS', PLX_ROOT.'plugins/');
    define('PLX_CONF', PLX_ROOT.'data/configuration/parametres.xml');
    
    # On verifie que PluXml est installé
    if(!file_exists(PLX_CONF)) {
    	header('Location: '.PLX_ROOT.'install.php');
    	exit;
    }
    
    # On inclut les librairies nécessaires
    include(PLX_CORE.'lib/class.plx.date.php');
    include(PLX_CORE.'lib/class.plx.glob.php');
    include(PLX_CORE.'lib/class.plx.utils.php');
    include(PLX_CORE.'lib/class.plx.capcha.php');
    include(PLX_CORE.'lib/class.plx.erreur.php');
    include(PLX_CORE.'lib/class.plx.record.php');
    include(PLX_CORE.'lib/class.plx.motor.php');
    include(PLX_CORE.'lib/class.plx.plugins.php');
    
    # On impose le charset
    header('Content-Type: text/xml; charset='.PLX_CHARSET);
    
    # Creation de l'objet principal et lancement du traitement
    $plxMotor = plxMotor::getInstance();
    
    # Chargement du fichier de langue
    loadLang(PLX_CORE.'lang/'.$plxMotor->aConf['default_lang'].'/core.php');
    
    $plxMotor->prechauffage();
    $plxMotor->demarrage();
    
    # Entête XML
    echo '<?xml version="1.0" encoding="'.strtolower(PLX_CHARSET).'" ?>'."\n";
    ?>
    <urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9">
    <?php
    if (isset($_GET["categorie"]) AND !empty($_GET["categorie"]) AND isset($_GET["champ"]) AND !empty($_GET["champ"]) AND isset($_GET["filtre"]) AND !empty($_GET["filtre"])){
    	$get_cat = sprintf("%03d", $_GET["categorie"]);
    	$get_champ = $_GET["champ"];
    	$get_filtre = $_GET["filtre"];
    # Les articles
    if($aFiles = $plxMotor->plxGlob_arts->query('/^[0-9]{4}.['.$get_cat.']*.[0-9]{3}.[0-9]{12}.[a-z0-9-]+.xml$/','art','rsort', 0, false, 'before')) {
    	$plxRecord_arts = false;
    	$array=array();
    	foreach($aFiles as $k=>$v) { # On parcourt tous les fichiers
    		$array[ $k ] = $plxMotor->parseArticle(PLX_ROOT.$plxMotor->aConf['racine_articles'].$v);
    	}
    	# On stocke les enregistrements dans un objet plxRecord
    	$plxRecord_arts = new plxRecord($array);
    	if($plxRecord_arts) {
    		# On boucle sur nos articles
    		while($plxRecord_arts->loop()) {
    			$num = intval($plxRecord_arts->f('numero'));
    			$le_champ = $plxRecord_arts->f($get_champ);
    			if(isset($le_champ) && $le_champ=$get_filtre){
    				echo "\n";
    				echo "\t<url>\n";
    				echo "\t\t<loc>".$plxMotor->urlRewrite("?article".$num."/".plxUtils::strCheck($plxRecord_arts->f('url')))."</loc>\n";
    				echo "\t</url>\n";
    			}else{}
    		}
    	}
    }
    eval($plxMotor->plxPlugins->callHook('SitemapArticles'));
    }else{}
    ?>
    </urlset>
    

    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 ...
  • danielsandanielsan Member
    juin 2012 modifié
    re...


    dans mon tempate categorie-revendeurs.php,
    je souhaite transformer ce fichier dynamique en tableau php.
    J'utilise
    <?php
    //$url_xml = $plxMotor->urlRewrite()."liste.php?categorie=2&champ=champArt_cp&filtre=06000";
    $url_xml = dirname(__FILE__).'/carte/liste.xml';
    echo $url_xml;
    
    if (file_exists($url_xml)) {
        $xml = simplexml_load_file($url_xml);
        print_r($xml);
    } else {
        exit('Echec lors de l\'ouverture du fichier');
    }
    ?>
    
    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.
  • danielsandanielsan Member
    juin 2012 modifié
    je teste aussi avec ob_get_contents mais en vain ... :(
    <?php
    $url_xml = $plxMotor->urlRewrite()."liste.php?categorie=2&champ=champArt_cp&filtre=06000";
    // $url_xml = dirname(__FILE__).'/carte/liste.xml';
    echo "<a href=\"".$url_xml."\">".$url_xml."</a>\n";
    
    ob_start(); 
    include($url_xml); 
    $xml_genere = ob_get_contents($url_xml); 
    ob_end_clean(); 
    $xml = simplexml_load_string($xml_genere);
    var_dump($xml);
    print_r($xml);
    ?>
    
  • danielsan a écrit:
    re...


    dans mon tempate categorie-revendeurs.php,
    je souhaite transformer ce fichier dynamique en tableau php.
    J'utilise
    <?php
    //$url_xml = $plxMotor->urlRewrite()."liste.php?categorie=2&champ=champArt_cp&filtre=06000";
    $url_xml = dirname(__FILE__).'/carte/liste.xml';
    echo $url_xml;
    
    if (file_exists($url_xml)) {
        $xml = simplexml_load_file($url_xml);
        print_r($xml);
    } else {
        exit('Echec lors de l\'ouverture du fichier');
    }
    ?>
    
    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 :
    $plxMotor->urlRewrite()."/liste.php?categorie=2&champ=champArt_cp&filtre=06000";
    

    ???
  • Hello,


    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
    		$motif = '/^[0-9]{4}.[002]*.[0-9]{3}.[0-9]{12}.[a-z0-9-]+.xml$/';
    		
    			if($aFiles = $plxMotor->plxGlob_arts->query($motif,'art','rsort', 0, false, 'before')) {
    				
    				$plxRecord_arts = false;
    				$array=array();
    				foreach($aFiles as $k=>$v) { # On parcourt tous les fichiers
    					$array[ $k ] = $plxMotor->parseArticle(PLX_ROOT.$plxMotor->aConf['racine_articles'].$v);
    				}
    				# On stocke les enregistrements dans un objet plxRecord
    				$plxRecord_arts = new plxRecord($array);
    			}
    


    Je récupère la variable envoyée par le formulaire ou l'url:
    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_4\">\n";
    			echo "<p>Code d&eacute;partement non valide</p>\n";
    			echo "</div>\n";
    } else{}
    


    Et j'affiche en filtrant seulement les bonnes fiches:
    	foreach($plxRecord_arts->result as $k => $v){
    	$dep_rev = substr($v['champArt_cp'], 0, 2);
    		if($dep_rev==$get_dep){
    			$jeton="1";
    
    			echo "<div class=\"carte_visite grid_4\">\n";
    			echo "<div>\n";
    			echo "<ul>\n";
    				if(!empty($v['title'])){echo "<li class=\"nom\"><h5>".$v['title']."</h5></li>";}else{}
    			echo "</ul>\n";
    			echo "<ul>\n";
    				if(!empty($v['champArt_cp'])){echo "<li class=\"cp\">".$v['champArt_cp']." ";}else{} if(!empty($v['champArt_ville_rev'])){echo strtoupper($v['champArt_ville_rev'])."</li>";}else{}
    			echo "</ul>\n";
    			echo "<ul>\n";
    				if(!empty($v['champArt_telephone'])){ echo "<li class=\"telephone\"><span>T&eacute;l&eacute;phone</span>".$v['champArt_telephone']."</li>"; }else{}
    				if(!empty($v['champArt_portable'])){ echo "<li class=\"portable\"><span>Portable</span>".$v['champArt_portable']."</li>"; }else{}
    			echo "</ul>\n";
    
    			echo "<a href=\"".$v['champArt_site_web']."\" class=\"btn abs_b\">Voir la fiche revendeur</a>\n";
    			echo "</div>\n";
    			echo "</div>\n";
    
    		}else{}
    
    	}
    


    Je me suis inspiré de ton menu qui classe les articles... :p merci!
    Cependant, je me demande comment $plxMotor peux tourner comme ça tout seul, habituellement faut rajouter $plxShow->plxMotor ...


    Merci.
  • $plxShow utilise dans son constructeur, une instance de $plxMotor et $plxMotor c'est la classe qui fait tourner le bouzin si je ne m'abuse...
Connectez-vous ou Inscrivez-vous pour répondre.