Valider a836b256 rédigé par nicod@lerebooteux.fr's avatar nicod@lerebooteux.fr
Parcourir les fichiers

Ce plugin permet de créer une navigation par facettes qui recharge une liste d’objets en ajax.

Fonctionne avec n’importe quelle liste d’objets, il suffit d’ajouter le nom liste-objets au paramètre ajax dans prive/squelettes/contenu/pataes.html, et de créer un squelette prive/squelettes/navigation/patates.html dans lequel on peut utiliser des saisies.

Voir la page de démo (?exec=ajaxfiltre_articles) et ces trois squelettes documentés :
    /ajaxfiltre/prive/objets/liste/ajaxfiltre_articles.html
    /ajaxfiltre/prive/squelettes/contenu/ajaxfiltre_articles.html
    /ajaxfiltre/prive/squelettes/navigation/ajaxfiltre_articles.html
parent
Chargement en cours
Chargement en cours
Chargement en cours
Chargement en cours

.gitattributes

0 → 100644
+11 −0
Numéro de ligne d'origine Numéro de ligne de diff Ligne de diff
* text=auto !eol
lang/ajaxfiltre_fr.php -text
lang/paquet-ajaxfiltre_fr.php -text
/paquet.xml -text
prive/javascript/ajaxfiltre_prive.js -text
prive/objets/liste/ajaxfiltre_articles.html -text
prive/squelettes/contenu/ajaxfiltre_articles.html -text
prive/squelettes/navigation/ajaxfiltre_articles.html -text
prive/themes/spip/images/ajaxfiltre-128.png -text
prive/themes/spip/images/ajaxfiltre-32.png -text
prive/themes/spip/images/ajaxfiltre-64.png -text

lang/ajaxfiltre_fr.php

0 → 100644
+12 −0
Numéro de ligne d'origine Numéro de ligne de diff Ligne de diff
<?php
// This is a SPIP language file  --  Ceci est un fichier langue de SPIP

if (!defined('_ECRIRE_INC_VERSION')) {
	return;
}

$GLOBALS[$GLOBALS['idx_lang']] = array(

	// A
	'ajaxfiltre_titre' => 'Filtres rapides dans le privé',
);
+23 −0
Numéro de ligne d'origine Numéro de ligne de diff Ligne de diff
<?php
// This is a SPIP language file  --  Ceci est un fichier langue de SPIP

if (!defined('_ECRIRE_INC_VERSION')) {
	return;
}

$GLOBALS[$GLOBALS['idx_lang']] = array(

		// A
		'ajaxfiltre_description' => 'Ce plugin permet de créer une navigation par facettes qui recharge une liste d\'objets en ajax.

Fonctionne avec n\'importe quelle liste d\'objets.
Il suffit d\'ajouter le nom {liste-objets} au paramètre ajax dans {prive/squelettes/contenu/pataes.html}, 
et de créer un squelette {prive/squelettes/navigation/patates.html} dans lequel on peut utiliser des saisies.

Voir {{[la page de démo->?exec=ajaxfiltre_articles]}} et ces trois squelettes documentés :
-* /ajaxfiltre/prive/objets/liste/ajaxfiltre_articles.html
-* /ajaxfiltre/prive/squelettes/contenu/ajaxfiltre_articles.html
-* /ajaxfiltre/prive/squelettes/navigation/ajaxfiltre_articles.html',
		'ajaxfiltre_nom' => 'Filtres rapides dans le privé',
		'ajaxfiltre_slogan' => 'Des filtres de recherche sur les listes d\'objets',
	);

paquet.xml

0 → 100644
+18 −0
Numéro de ligne d'origine Numéro de ligne de diff Ligne de diff
<paquet
	prefix="ajaxfiltre"
	categorie="outil"
	version="1.0.0"
	etat="stable"
	compatibilite="[3.1.0;3.2.*]"
	logo="prive/themes/spip/images/ajaxfiltre-64.png"
	documentation=""
>
	<nom>Filtres rapides dans le privé</nom>
	<!-- Des filtres de recherche sur les listes d&#039;objets -->
	
	<auteur lien='https://contrib.spip.net/nicod_'>nicod_</auteur>
	<licence>GNU/GPL</licence>
	
	<script source="prive/javascript/ajaxfiltre_prive.js" type="prive" />

</paquet>
+72 −0
Numéro de ligne d'origine Numéro de ligne de diff Ligne de diff
(function($) {

	$.ajaxFiltre = function(el, options) {
		var base = this;

		base.init = function() {
			base.$el = $(el);
			base.el = el;
			base.options = $.extend({}, $.ajaxFiltre.defaultOptions, options);

			base.$el.find('select, input[type=checkbox], input[type=radio]').on('change', function() {
				base.$el.submit();
			});

			base.$el.on('submit', function(e) {
				e.preventDefault();
				
				var formData = base.$el.serializeArray().reduce(function(obj, item) {
					// si le name comporte des [] on construit un tableau
					if(item.name.indexOf('[]') !== -1) {
						var name = item.name.replace(/[\[\]]+/g, '');
						if(!obj.hasOwnProperty(name)) {
							obj[name] = [];
						}
						obj[name].push(item.value);
					} else {
						obj[item.name] = item.value;
					}
					return obj;
				}, {});

				// passer une valeur vide explicite pour les checkbox dont le name comporte des [] et dans lesquels rien n'est coché
				var $checkradio = base.$el.find('input[type=checkbox][name*="[]"]');
				$.each($checkradio,function(){
					var checkRadioName = $(this).attr('name');
					// si rien n'est coché
					if(!base.$el.find('input[name="'+checkRadioName+'"]:checked').length){
						// supprimer les données du nom avec []
						delete formData[checkRadioName];
						// ajouter un tableau vide sur le nom sans [] 
						formData[checkRadioName.replace(/[\[\]]+/g, '')] = [];
					}
				});
				
				console.log(formData);
				
				ajaxReload(base.options.ajaxTarget, {args: formData});
			});

		};

		base.init();
	};

	$.ajaxFiltre.defaultOptions = {
		ajaxTarget: "liste-objets"
	};

	$.fn.ajaxFiltre = function(options) {
		return this.each(function() {
			(new $.ajaxFiltre(this, options));
		});
	};

})(jQuery);

$(function() {

	$('.formulaire_navigation_filtre form').ajaxFiltre({ajaxTarget: 'liste-objets'});

});
 No newline at end of file