Favoris pour les visiteurs

Attention, cette contribution est EN CHANTIER : elle n’est peut-être pas fonctionnelle.

dernière mise à jour du code source : 30/09/09 MISE A JOUR IMPORTANTE !

Ce plugin a pour vocation de permettre d’ajouter des éléments d’un site web dans une liste de favoris, afin d’y accéder plus rapidement par la suite. Au départ, ce plugin ajoutait simplement des articles dans une table, mais petit à petit le besoin s’est fait sentir de pouvoir ajouter autre chose que des articles. Le plugin s’est étendu à divers éléments SPIP (rubriques, auteurs, documents, mots), et finalement le système est devenu complètement flexible sur la nature des objets mis en favoris.

D’autre part, ce plugin essaie de couvrir divers besoins au niveau de la gestion des listes. Ainsi on peut l’utiliser dans un principe de listes de favoris géré exclusivement par l’utilisateur (classement libre), ou encore de manière plus orientée, pour plus de simplicité ou pour les besoin des administrateurs des sites. Ainsi dans ce cas les listes sont et le type de leur contenu est strictement dicté par l’administrateur du site.

Les explications qui suivent ont pour but de montrer toutes les possibilités offertes par ce plugin. Vous pourrez l’essayer sur le site http://www.02121.com où il est utilisé pour achever son développement (voir les pages de chaque jeu ainsi que les rubriques « categories » et « my favorites »).

Points forts du plugin :

-  type d’objets mis en favoris totalement libre et configurable.
-  deux types de gestion, soit l’utilisateur gère les listes, soit c’est l’administrateur.
-  nombreuses fonctionnalités AJAX, dont les interactions entre balises sur une même page
-  squelettes facilement configurables, et possibilité d’avoir un set de plusieurs squelettes actifs pour une même fonctionnalité.
-  les visiteurs non connectés peuvent mettre des objets en favoris, il faudra alors les motiver à s’enregistrer pour conserver leurs favoris sur le site de manière définitive.

Un favori est l’association d’un objet, d’un visiteur, et d’une liste de favoris. Ce système permet à un membre ou à un visiteur de sauvegarder des éléments du site et les retrouver dans ses favoris. Ce plugin contient des outils pour gérer les favoris d’un site, et principalement deux systèmes pour ajouter/supprimer des éléments favoris avec des modes de fonctionnement sensiblement différents. Ce plugin contient de plus des modèles de listes de favoris, dont un qui possède toute une palette de fonctions pour gérer ses favoris. Le plugin peut fonctionner en mode traditionnel avec des formulaires soumis en rechargeant les pages, ou bien en AJAX, où seuls les éléments affectés se rechargeront.

Nous utilisons deux systèmes distincts dans notre plugin (que j’appellerai ‘admin’ et ‘multi-listes’), tous deux utilisables à l’aide de balises distinctes. Le système multi-listes permet aux utilisateurs de gérer leurs propres listes, tandis que le système ‘admin’ est verrouillé sur une ou plusieurs listes prédéterminées. Le système ‘multi-liste’ n’est utilisable que par les utilisateurs identifiés, alors que le système de type ‘admin’ est aussi utilisable par des visiteurs non connectés, à l’aide des variables de session et des cookies. Seul le système ‘admin’ peut utiliser les listes définies par l’administrateur dans la configuration. En revanche, les deux systèmes peuvent utiliser des objets prédéfinis dans la configuration. Ce plugin est très complet et flexible, donc avec un peu de complexité lors de la configuration. De nombreux éléments du code et la plupart des librairies externes utilisées sont là pour permettre une utilisation en AJAX, qui est très rapide et sympathique pour le visiteur.

Objets et listes :

Une utilisation basique de ce plugin consisterait en l’ajout d’articles dans une simple liste de favoris. Nous avons néanmoins ajouté un peu de complexité à ce système afin de multiplier les possibilités de gestion des favoris.

1. Notion de liste.

Un membre peut avoir un certain nombre de favoris qu’il préfèrera classer, que ce soit par thème (« articles de voitures », « articles de jeux », etc.), par auteur, par pertinence, ou par n’importe quel type de catégorisation selon son gré. Un admin peut lui-même créer des listes semblables et ranger les favoris de ses membres/visiteurs dans ces listes, pour des besoins d’affichage, de statistiques, ou même l’élaboration d’outils plus avancés (par exemple un comparatif de produits). Il peut très bien utiliser cette catégorisation sans même la montrer au visiteur.
Exemple d’utilisation de liste ‘admin’ : Présenter des boutons d’ajout de favoris dans la section voitures et la section moto. Mais grâce à deux listes differentes, on va pouvoir par la suite ressortir une liste de voitures favorites distincte de la liste de motos favorites, sans que l’utilisateur ne voit aucune complication supplémentaire.

2. Notion d’objet .

Un objet est défini par son type et son identifiant. Par défaut, on va considérer que l’objet se trouve dans la table spip_objets (les noms des tables sont au pluriel) sous l’identifiant id_objet.

Exemple : si je veux permettre d’ajouter l’article 55 en favoris, mes paramètres seront objet=’article’ et id_objet=55. Ainsi le système ira chercher dans la table spip_articles la ligne avec id_article=55.

Un premier intérêt des objets est de créer des favoris basés sur n’importe quelle table du système et non pas seulement les articles. Par exemple, on peut permettre à un visiteur ou membre d’ajouter en favoris des membres du site (on se basera alors sur la table spip_auteurs), des rubriques, des mots clés, ou encore des tables additionnelles. Il est recommandé de préciser dans la configuration le nom de la table et le nom de la colonne identifiant. Cet identifiant n’est pas obligatoirement l’identifiant de la table SQL, mais il est fortement conseillé d’utiliser des colonnes dont la valeur est unique pour chaque ligne afin d’éviter des disfonctionnements dans le plugin. Par défaut, les fonctions qui retournent le titre et le lien d’un favoris fonctionnent pour les tables qui possèdent un champs titre et sont compatibles avec la fonction gznerer_url_entite(), comme spip_articles, spip_rubriques, spip_mots et spip_auteurs (seulement pour le lien, cette table n’a pas de champ ‘titre’). On pourra aussi définir la méthode de récupération du titre et de l’url pour chaque objet, méthode qui sera utilisée comme filtre dans les squelettes.

Un second intérêt des objets est de catégoriser les favoris, un peu comme pour les listes. On peut par exemple définir un objet de type « voiture » et un objet de type « moto », qui tous deux pointeront sur la table spip_articles de notre site d’automobile. Si on peut déjà faire cette catégorisation avec des listes, on peut se demander l’intérêt de le faire aussi avec des objets. Par exemple, si on laisse aux membres la gestion de leurs listes de favoris, on peut ainsi toujours y ajouter notre catégorisation, qui sera utilisée pour les besoins de l’admin. On peut aussi de la sorte catégoriser un favori selon deux critères simultanément en combinant listes et objets (par exemple par thème et par type : un article de moto, une rubrique de voiture, une rubrique de moto, un article de vélo, etc.).

Voici quelques exemples pour illustrer les possibilités :

-   Exemple 1 : Je souhaite mettre des articles en favoris, sans personnalisation.
On appelle la balise comme ceci

#FAVORIS_MULTI_BOUTON{article, #ID_ARTICLE}

C’est tout, le système ira par défaut chercher l’id_article dans la table spip_articles, et il génèrera les liens des favoris grâce à generer_url_entite().

La balise génère un bouton :

-   Exemple 2 : Je souhaite mettre des articles en favoris, mais utiliser un nom d’objet au choix (ici ‘game’).
On appelle la balise comme ceci

#FAVORIS_MULTI_BOUTON{game, #ID_ARTICLE}

Dans la configuration du plugin, on crée l’association entre notre nom d’objet et la table spip_articles, ainsi on ira chercher les informations de ce favoris de type ‘news’ dans la table spip_articles.

Voici une impression de la configuration :

-   Exemple 3 : Je souhaite utiliser le champ login sur spip_auteur (au lieu du champ id_auteur par défaut). Notez que login est unique et ne posera aucun conflit.
On appelle la balise comme ceci

#FAVORIS_MULTI_BOUTON{auteur, #LOGIN}

Dans la configuration, on crée un lien entre l’objet auteur et la table spip_auteurs, en précisant que le champ à tester est ‘login’.

-   Exemple 4 : On veut utiliser une autre table que les tables SPIP principales. Ici la table s’appelle ‘ma_table’, avec comme identifiant ‘id_ligne’, on souhaite y associer l’objet que l’on nommera ‘mon_objet’.

On appelle la balise comme ceci

#FAVORIS_MULTI_BOUTON{mon_objet, #ID_LIGNE}

Dans la configuration, on crée un lien entre l’objet ‘mon_objet’ et la table ‘ma_table’, en précisant qu’il faut utiliser le champ ‘id_ligne’.

Si, par exemple, on veut mettre des voitures en favoris à partir d’une table extérieure à SPIP :

Les Balises et les filtres disponibles :

1. Présentation rapide

#FAVORIS_ADMIN_BOUTON{objet, id_objet, id_liste, url_retour, nom_squelette}

-> crée un bouton qui ajoutera l’objet dans une liste de favoris définie par l’admin En mode AJAX, cette balise interagit avec la balise #FAVORIS_ADMIN_LISTE si les deux balises sont utilisées dans la même page.

#FAVORIS_ADMIN_LISTE{id_liste, nom_squelette}

-> génère une liste des favoris d’un membre pour la liste d’admin en paramètre, ou toutes les listes d’admin si pas de paramètre. Si le second paramètre est ‘edit’, on affiche la liste avec un certain nombre d’éléments de gestions, telle la gestion des positions des favoris ou la possibilité de supprimer un favoris de la liste. En mode AJAX, cette balise interagit avec #FAVORIS_ADMIN_BOUTON si les deux balises sont dans la même page. L’utilisation de cette balise est facultative, et il est possible de créer ses propres moyens d’afficher les favoris des visiteurs. Elle est néanmoins pratique car elle gère les membres et les visiteurs non connectés (variables de session). Si la balise est dans une boucle sur la table spip_auteurs, elle affichera les favoris de l’auteur de la boucle, sinon ceux de l’auteur de la session.

Exemple de fonctionnement et d’interactions entre ces deux balises :

http://www.02121.com/test_admin.html?var_skel=test1

Avec le paramètre ‘edit’ :

http://www.02121.com/test_admin_edit.html?var_skel=test1

#FAVORIS_MULTI_BOUTON{objet, id_objet, url_retour, nom_squelette}

-> crée un bouton qui ajoutera l’objet dans une ou plusieurs listes de favoris définies par l’utilisateur. url_retour est optionnel, et utile seulement si le mode AJAX est désactivé et si l’on souhaite aboutir à une page différente de la page actuelle suite à l’ajout d’un favori. Nom_squelette sert à créer des squelettes personnalisés, ce point est détaillé plus loin.

#FAVORIS_MULTI_LISTE{nom_squelette}

-> affichage des listes de favoris d’un membre. En mode AJAX, elle interagit avec la balise #FAVORIS_MULTI_BOUTON si les deux balises se trouvent dans la même page. Dans une boucle sur un auteur, la balise va par défaut afficher les favoris de l’auteur de la boucle, sinon elle affiche l’auteur de la session si le visiteur est connecté, sinon rien. Nom_squelette sert à créer des squelettes personalisés, nous avons créé le squelette plugins/favoris/formulaires/favoris_multi_liste_edit.html, qui sera alors le squelette utilisé si on apelle la balise comme ceci :

#FAVORIS_MULTI_LISTE{edit}

ce mode permet la gestion pour un membre de ses propres listes de favoris. Facultatif mais très complet, car il permet de déplacer, supprimer, créer et éditer des listes ou des favoris.

Exemple d’utilisation de ces deux balises et de leurs interactions :

http://www.02121.com/test_multi.html?var_skel=test1

Exemple du mode éditable :

http://www.02121.com/test_multi_edit.html?var_skel=test1

Notez que dans ces deux pages il faut être authentifié pour voir la partie propre au plugin et pouvoir l’utiliser. Il est nécessaire de créer un compte sur le site.

#FAVORIS_MULTI_ADD

-> formulaire d’ajout d’un favori dans une ou plusieurs listes d’un membre. On nous propose dans ce formulaire soit d’ajouter un favori à une nouvelle liste (dont on demande le nom), soit dans une ou plusieurs listes existantes en cochant la ou les listes concernées. Inutile si le mode AJAX est activé, il doit être utilisé dans une page dont l’url sera renseignée dans le squelette /formulaires/favoris_bouton_multiliste.html

#ID_FAVORI|favoris_get_titre

-> retourne le titre de l’objet favori passé en paramètre. Le titre de chaque type d’objet peut être défini dans la configuration (explquée plus bas).

#ID_ARTICLE|favoris_get_titre{‘article’}

-> retourne le titre de l’objet de type ‘article’ et d’identifiant id_article. Fonctionement identique qu’ avec un favori, sauf qu’on peut l’appliquer à des objets qui ne sont pas encore dans nos favoris, ou bien dont nous ne connaissons pas l’id_favori. Nous nous basons sur des articles à titre d’example, n’importe quel type d’objet est possible.

#ID_FAVORI|favoris_get_url

-> retourne l’url qui fait figure de lien vers l’objet favori passé en paramètre. L’url de chaque type d’objet peut être défini dans la configuration (explquée plus bas).

#ID_ARTICLE|favoris_get_url{‘article’}

-> même chose qu’appliqué sur un objet favori.

2. Balise #FAVORIS_ADMIN_BOUTON

Paramètres :
-   Objet (exemple ‘article’, ‘document’,…)
-   Id_objet (identifiant de cet objet dans la base de données)
-   Id_liste (liste de favoris, choisie impérativement par l’admin)
-   url_retour (facultatif, url de redirection une fois l’action effectuée, url actuel si non précisé)
-   extension_squelette (facultatif, nom d’une extension pour utiliser un squelette personalisé)

Action : crée un bouton qui ajoute ou supprime un objet d’une liste de favoris. Si l’objet ne figure pas déjà parmi les favoris de l’utilisateur, on permet de l’ajouter , sinon on propose de l’enlever.

Squelette : Le squelette de base de cette balise est /formulaires/favoris_admin_bouton.html. On peut personnaliser le squelette en manipulant les règles CSS, mais on peut aussi personnaliser ce bouton pour chaque liste en créant un fichier /formulaires/favoris_admin_bouton_xxxxx.html où ‘xxxxx’ est le nom particulier que l’on précisera dans la balise lors de l’appel.
Exemple : http://www.02121.com/games/desktop-tower-defense.html
On peut constater juste au dessus du jeu qu’on a modifié le template de base pour ajouter un texte dont le comportement suit celui du bouton. Pour cela nous avons créé le fichier /formulaires/favoris_admin_bouton_text.html, et nous appelons la balise comme ceci :

[(#FAVORIS_ADMIN_BOUTON{game, #ID_ARTICLE, 5, '', text})]

Ainsi nous permettons d’ajouter un objet de type ‘game’ dans la liste numero 5 gérée par l’admin. Cet objet pointe sur un article d’identifiant #ID_ARTICLE (traduit ensuite par SPIP), et pour permettre cet ajout nous utiliserons le squelette de suffixe ‘text’ s’il est présent dans les fichiers (sinon le squelette de base par défaut).

Remarques : Ce système est utilisable par des visiteurs non connectés, au choix pour toute la session ou alors sur une certaine durée (cookies), le tout étant configurable dans la configuration du plugin. Si un visiteur possède des variables de sessions actives ou des cookies, puis décide de se connecter ou s’inscrire et se connecter, ses favoris seront automatiquement copiés dans la base de données et seront utilisables comme s’il les avait ajoutés en tant que membre.

Screenshot :

Remarques sur le screenshot : seul le bouton(+) est affiché par la balise, le titre de l’article est affiché par la boucle de test qui contient la balise. L’aspect de la balise est au choix, il peut être un bouton différent, un texte, etc (à régler dans le CSS et/ou le squelette /formulaires/favoris_bouton.html).

3. Balise #FAVORIS_ADMIN_LISTE

Paramètres :
-   Id_liste (facultatif, liste de favoris à afficher) :

#FAVORIS_ADMIN_LISTE{12} ou bien #FAVORIS_ADMIN_LISTE{‘14,21,33’}


-   Mode édition ou non (« edit ») :

#FAVORIS_ADMIN_LISTE{‘’, edit}

Action : affiche les favoris du membre ou visiteur. Appelée dans une boucle sur un auteur, la balise affichera les favoris de cet auteur, sinon elle affichera les favoris du membre ou visiteur de la session. Si une liste ou un ensemble de listes est défini en paramètre

exemple : #FAVORIS_ADMIN_LISTE{‘5, 8’}

, on n’affiche les favoris que de cet ensemble. Si aucun numéro de liste n’est passé en paramètre, seules les listes publiques seront affichées, classés par liste. Les listes concernées ne sont que celles créées par les administrateurs du plugin. L’accès (publique ou privé) des listes est défini dans la configuration.

Squelette : On peut créer un squelette personnalisé pour une liste précise. Il suffit pour cela de créer le fichier /formulaires/favoris_admin_liste_X.html ou X est un suffixe au choix. Ainsi si on appelle la balise avec ce suffixe en paramètre, et si le fichier suivi du suffixe existe dans le dossier /formulaires/, il sera automatiquement utilisé pour afficher la liste. Cela permet de dissocier des listes de favoris au comportement atypique. Le mode ‘edit’ fonctionne sur ce principe.

Screenshots :

Listes publiques en mode normal :

#FAVORIS_ADMIN_LISTE

Listes publiques en mode edit :

#FAVORIS_ADMIN_LISTE{‘’, edit}

Listes appelées individuellement. La première n’a pas de squelette customisé, la seconde en a un (/formulaires/favoris_admin_liste_friends_edit.html)

4. Balise #FAVORIS_MULTI_BOUTON

Paramètres :
-   Objet (exemple ‘article’, ‘document’,…)
-   Id_objet (identifiant de cet objet dans la base de données)
-   url_retour (facultatif, url de redirection une fois l’action effectuée, url actuel si non précisé, inactif en mode AJAX) :

#FAVORIS_MULTI_BOUTON{article, 15, /home.html}

va ajouter l’article 15 dans les listes que nous sélectionnerons puis nous serons redirigés vers la page /home.html
-   extension_squelette (facultatif, nom d’une extension pour utiliser un squelette personalisé)

Action : genere un bouton d’ajout de favoris.

Réaction : Renvoie vers la page d’ajout d’un favori dans une liste personnelle avec les paramètres adéquats, ou bien ouvre le formulaire dans un popup si le mode AJAX est activé. Le formulaire en question est le résultat généré par la balise #FAVORIS_MULTI_ADD.

Squelette : personalisation possible sur le même principe que les listes admin.

Screenshot :

Remarque : Seul le bouton est affiché par la balise, le titre de l’article faisant partie de la boucle de test qui incluse la balise. On affiche toujours un bouton d’ajout car l’utilisateur peux ajouter un favoris dans une liste meme si il a déjà ete ajoute dans une autre . Exemple : tetris est un de mes jeux favoris, mais c’est aussi dans ma liste de jeux pour adulte.

5. Balise #FAVORIS_ MULTI_ADD

Paramètres :
-   url_retour (facultatif, url de redirection une fois l’action effectuée, url actuel si non précisé) , par exemple

#FAVORIS_MULTI_ADD{/home.html}

va ajouter un favoris à une ou plusieurs listes, puis rediriger vers la page /home.html (ce paramètre prend le dessus sur un éventuel url de redirection défini en paramètre de #FAVORIS_MULTI_BOUTON).

Action : Permet à un membre d’ajouter l’objet en favoris à une ou plusieurs de ses listes existantes OU de créer une liste et d’y ajouter l’objet en favoris. En créant une liste, on peut choisir entre les statuts ‘privé’ et ‘public’, ce qui sous entend qu’on peut montrer nos listes aux autres ou bien n’être que le seul à pouvoir les consulter. En mode AJAX, cette interface apparaît sous la forme d’un popup.

Screenshot :

6. Balise #FAVORIS_MULTI_LISTE

Paramètre :
-   extension_squelette (facultatif, nom d’une extension pour utiliser un squelette personalisé)

Action : Affiche une liste de favoris avec des fonction de gestion avancées. Elle permet à un membre d’afficher et de gérer ses propres listes de favoris. Les actions principales sont la suppression de favoris et la copie d’un favori d’une liste vers une autre. On peut aussi permettre de classer les favoris et les listes par ordre préférentiel, le tout avec JQUERY. Appelée dans une boucle sur un auteur, elle affichera les listes de cet auteur, sinon elle affichera les listes de l’auteur de la session. Le mode visiteurs non connectés ne s’applique pas à ce type de liste.

Screenshot :

Personalisation des squelettes :

Pour la personnalisation, toutes les classes CSS sont définies dans style_favoris.css et nous avons essayé de coder notre HTML de façon simple et modulable afin que les utilisateurs du plugin n’aient que le CSS à paramétrer. Si néanmoins des changements dans les squelettes du plugin sont souhaités, voici ou se trouve le code HTML de chaque fonctionnalité :

-  formulaires/favoris_multi_bouton.html -> Bouton d’ajout de favoris en mode multiliste
-  formulaires/favoris_admin_bouton.html -> Bouton d’ajout de favoris en mode simple/listes d’admin
-  formulaires/favoris_multi_liste.html -> affichage simple des listes de favoris d’un membre
-  formulaires/favoris_multi_liste_edit.html, build_favliste.html -> Listes des favoris d’un membre + leur gestion
-  formulaires/favoris_admin_liste.html, formulaires/favoris_admin_liste_edit.html -> listes des favoris en mode liste d’admin.
-  formulaires/favoris_multi_add.html -> formulaire pour ajouter un favoris dans des listes existantes ou dans une nouvelle liste
-  formulaires/favoris_login.html -> message qui renseigne sur la nécessité de se connecter si on tente d’ouvrir le formulaire ci-dessus sans être connecté
-  formulaires/delete_liste.html -> message qui demande confirmation pour supprimer une liste de favoris
-  formulaires/delete_favori.html -> message qui demande confirmation pour supprimer un favori d’une liste
-  formulaires/favoris_edit_liste.html -> formulaire pour éditer une liste de favoris (nom + accès)
-  formulaires/favoris_move.html -> formulaire pour copier ou déplacer un favori d’une liste à une autre
-  formulaires/favoris_new_liste.html -> formulaires pour créer une nouvelle liste de favoris pour un membre
-  formulaires/favoris_save_positions.html -> bouton pour sauvegarder les listes de favoris

Il est possible de créer un bouton ou un squelette d’affichage spécifique pour chaque liste ou bouton d’ajout/suppression. Il suffit, par exemple, en s’inspirant plus ou moins des squelettes existants, de créer le fichier plugins/favoris/formulaires/favoris_admin_bouton_suffixe.html où ‘suffixe’ est le nom que l’on utilisera pour le paramètre ’nom_squelette’. Cette personalisation peut s’appliquer à toutes les balises citées plus haut qui possèdent le paramètre ‘nom_squelette’.

Attention : Les id des éléments html du plugin peuvent avoir un rôle important dans son fonctionnement, tout particulièrement pour les effets et les fonctionnalités AJAX, ainsi leur manipulation doit se faire avec précaution. De plus, il y a certaines classes qui ont aussi un rôle à jouer et qu’il faut éviter de supprimer ou renommer :

-  ‘handle’
-  ‘add_fav_X-Y’ (X =un nombre, Y = un nombre)
-  ‘fav_del_X-Y’ (X =un nombre, Y = un nombre)
-  ‘fav_adminX’ ou ‘fav_admin_editX’ (X=un nombre)
-  ‘fav_member’

Configuration/Personnalisation.

1. Gestion des objets.

Une façon simple d’utiliser ce plugin est de l’appliquer aux principaux objets SPIP, tels les articles, les rubriques, les auteurs, les mots, etc. Il suffit d’utiliser comme objet ‘article’ avec en identifiant ‘id_article’ (dont les informations sont récupérées par défaut), ‘rubrique’ avec l’identifiant ‘id_rubrique’, etc. On peut néanmoins utiliser des objets, des tables et des champs différents. Paramétrer ces objets dans la configuration n’est pas obligatoire pour les objets prédéfinis.
Liste des objets prédéfinis : article, rubrique, mot, auteur.
Remarque : Laisser ces éléments comme prédéfinis par défaut est discutable, car il est aisément possible de les paramétrer dans la configuration.

Nous avons décidé de lier les objets de la configuration avec l’utilisation des balises, ainsi chaque objet utilisé dans une balise qui n’est pas un objet prédéfini ou déclaré rendra cette balise muette. Ceci permet de bien contrôler les objets du site, évite la création de favoris erronés à cause d’une erreur dans un squelette, et accessoirement de désactiver un objet présent dans plusieurs squelettes à partir de la configuration(en le supprimant de la liste, sans toucher aux squelettes).

Définir un objet consiste à enregistrer une association de plusieurs paramètres :

-  nom de l’objet (tel qu’on l’utilisera dans les balises)
-  table de la base de données qui contient cet objet
-  identifiant dans la base de données pour cet objet (il faut que ce soit un identifiant unique pour éviter d’éventuels bugs ou incohérences du système)
-  titre de l’objet dans la table (nom de colone, exemples : ‘titre’ pour spip_articles, ‘login’ pour spip_auteurs)
-  éventuellement un petit texte pour présenter l’objet (à débattre)

Exemple dans la configuration : un objet que je nomme ‘game’ pointe vers les articles SPIP :

Par défaut, pour les objets prédéfinis, le système affichera les favoris par leur titre (champ ‘titre’ dans la table SPIP), sauf les auteurs dont on affichera le login. Renseigner le champ ‘titre’ de l’objet (nommé ‘title’ dans cet exemple) permettra l’utilisation du filtre ‘favoris_get_titre’ dans les squelettes, qui retournera le titre d’un favori en fonction de son type d’objet, comme ceci :

#ID_FAVORI|favoris_get_titre

Ou bien :

#ID_ARTICLE|favoris_get_titre_objet{‘game’ }

De même, une balise permettant de récupérer l’url de la page associée au favori est disponible. Par défaut, elle retourne le résultat de la fonction SPIP ‘generer_url_entite’, elle est utilisable comme ceci :

#ID_FAVORI|favoris_get_url

Ou bien :

#ID_ARTICLE|favoris_get_url_objet{‘game’ }

Ces filtres nous permettent d’avoir une règle de récupération du titre et de l’url par objet. On peut changer ces règles dans la configuration des objets pour le titre (s’il ne sagit que d’afficher un champs de la table) ou bien le fichier favoris_options.php (pour des règles plus complexes, qui nécessitent éventuellement du code PHP.

Exemple du code de surcharge dans favoris_options.php :

//function that allows admin to set the title of custom objects
function favoris_define_titre_objet($objet, $id_objet){
	switch($objet){
		//example: I created an object "game"
		case "game" :
			$res = spip_query("select titre from spip_articles where id_article=$id_objet");
			$row = sql_fetch($res);
			return $row['titre'];
			break;
	}
	return '';
}


//function that allows admin to set the url of custom objects
function favoris_define_url_objet($objet, $id_objet){
	switch($objet){
		//example: I created an object "game", which actually doesn't exist in the table spip_urls, but let’s pretend…
		case "game" :
			$res = spip_query("select url from spip_urls where id_objet=$id_objet and type='$objet'");
			$row = sql_fetch($res);
			return $row['url'];
			break;
	}
	return '';
}

2. Enregistrement des favoris (en mode listes admin)

Dans le mode ou les listes sont imposées par l’admin, on peut autoriser l’utilisation des favoris soit par les membres identifiés, soit par les visiteurs, soit par les deux. Si on autorise l’utilisation aux visiteurs, on peut soit leur permettre l’utilisation le temps de la session (variables de session PHP), soit leur permettre l’utilisation sur plusieurs jours (cookies + variables de session PHP). Pour éviter tout conflit dans les noms des variables, l’admin peut choisir le nom de la variable utilisée pour les sessions PHP et les cookies, ainsi que la durée de vie des cookies.

3. Gestion des listes de favoris(en mode listes admin)

On permet à un admin de créer des listes de favoris. Ces listes sont tout simplement composées d’un nom, et éventuellement d’un descriptif. Il faut utiliser l’identifiant(numérique) de la liste dans les balises afin que le système fonctionne. Dans notre système, ces listes seront toujours dissociées des listes créées par les utilisateurs. Ces deux systèmes peuvent néanmoins cohabiter. Il est possible de renommer ou de supprimer une liste, mais la suppression doit être manipulée avec beaucoup de précautions car elle détruira tous les favoris des utilisateurs liés à cette liste. Ces listes seront utilisées dans les squelettes par l’admin comme bon lui semble, ce qui montre que ce système existe principalement pour des intentions propres à l’admin, contrairement à l’autre système qui est orienté « utilisateur ».
Remarque : Si on ne souhaite pas utiliser de système à plusieurs listes, il suffit de créer une seule liste dans la configuration, et n’utiliser que cette liste partout dans le site. L’utilisateur peut ne pas savoir que ses favoris sont liés à une liste gérée par l’admin.

Voici comment on peut gérer les listes dans la configuration :

Nous savons dans cet exemple que la liste 35 a déjà 10 favoris enregistrés. Si on souhaite changer le nom de cette liste, le champ ‘nom’ est éditable (les favoris liés seront conservés). Si on supprime cette liste, les favoris liés seront perdus. Nous affichons l’identifiant de cette liste, car c’est lui qui sera utilisé dans les balises pour lier des favoris à la liste.

Dans cet exemple, si on souhaite associer des ‘game’ favoris a la liste, on appellera la balise comme ceci dans nos squelettes :

#FAVORIS_ADMIN_BOUTON{game, #ID_ARTICLE, 5}

5 étant l’identifiant de ma liste, et ‘game’ le type d’objet que j’ai créé plus haut dans cette documentation, objet associé aux articles.
La position de la liste déterminera dans quel ordre seront affichées les listes publiques si on utilise la balise sans paramètre. Si on entre des numéros de listes en paramètres, c’est l’ordre dans lequel les paramètres sont entrés qui sera respecté.
Ainsi l’appel de

#FAVORIS_ADMIN_LISTE

affichera les listes 37 puis 5 (listes publiques, les listes privées ne sont pas affichées par défaut).
En revanche l’appel de

#FAVORIS_ADMIN_LISTE{‘5,37,35’}

affichera les listes 5 puis 37, puis 35 (liste privée dont on force l’affichage).

4. Affichage/gestion des favoris

On peut permettre à un membre d’organiser ses favoris en changeant l’ordre dans lequel ils aparaissent dans leurs listes. On aussi peut choisir deux modes pour enregistrer les modifications, soit à chaque drag’n’drop (une requête serveur par mouvement), soit en cliquant sur un bouton de sauvegarde après les manipulations (une seule requête serveur). Les listes sont déplaçables et interchangeables, de même pour les favoris qu’elles contiennent. En mode simple, le bouton ‘Save positions’ apparait et l’ordre des listes ne sera enregistré que si on presse ce bouton. En mode sauvegarde à chaque drag’n’drop, l’ordre des éléments sera sauvegardé à chaque déplacement de liste ou de favori au sein d’une liste.

Fonctionnalités Jquery

Nous avons ajouté un certain nombre d’éléments graphiques afin de rendre ce plugin plus sympathique à utiliser, le revers de la médaille étant un certain nombre de librairies Jquery à intégrer aux pages utilisant le plugin.

Par exemple, la plupart des pages intermédiaires dans l’ajout ou la gestion des favoris peuvent aparaitre sous forme de popup généré par Jquery et souvent en AJAX. Ce mode est facultatif, mais bien plus agréable et rapide qu’en mode ’page à page’ traditionel.

C’est le cas de ce formulaire, qui aparait au milieu de la page au lieu de figurer dans une nouvelle page :

La possibilité d’organiser l’ordre des favoris dans une liste ainsi que l’ordre d’affichage des listes de favoris est aussi un petit luxe qu’offrent Jquery et AJAX.

Enfin, nous avons eu recours au fil du temps à plusieurs méthodes pour notifier l’utilisateur que les modifications ont bien été prises en compte lors d’une action en AJAX. Les boutons changent d’aspect devant les yeux de l’utilisateur, et lorsqu’une liste est modifiée elle se recharge et les lignes ajoutées clignotent deux fois. Néanmoins nous avons voulu ajouter en plus un message traditionel de confirmation. Dans un premier temps, il s’agissait d’un div non loin du lieu de l’action, qui faisait aparaitre un texte du genre « update successful », mais la position de ce message n’était pas assez standard et régulière pour qu’il soit assimilé à coup sur. Nous avons finalement opté pour la librairie Jgrowl, qui affiche des messages dans le coin de l’écran. Ainsi lorsqu’on exécute une action qui se fait en AJAX, un message aparaitra dans la majorité des cas en haut à droite, comme ceci :

Quelques cas particuliers à éviter :

-   Si on décide d’utiliser un bloc qui affiche les listes de favoris d’un utilisateur, avec la gestion des positions des favoris dans les listes (drag & drop), avec la validation des positions par clic sur le bouton, il est à noter que si les listes sont vides au chargement de la page, le bouton n’aparaitra pas (inutile dans ce cas). Or si nous sommes en mode ajax, et que l’on ajoute des favoris, les listes vont aparaitre et se remplir. Mais le bouton pour sauvegarder les positions n’aparaitra pas tant qu’un changement de page ou un rafraichissement de la page n’ait été effectué. Ce cas particulier peut être traité, mais il aparaitra si rarement qu’ajouter de la complexité au code afin de gérer ce cas particulier n’en vaut probablement la peine.

-   Si on a plusieurs groupes de listes dans une même page, c’est-à-dire plusieurs appels à la balise #FAVORIS_ADMIN_LISTE, avec pour au moins deux de ces groupes la gestion des positions des favoris en drag & drop, alors la sauvegarde des positions risque de ne pas fonctionner correctement. Assurez-vous de n’avoir qu’une seule balise #FAVORIS_ADMIN_LISTE par page qui comporte cette fonctionalité.

-   Nous avons constaté que le positionnement des popups a un mauvais comportement dans nos pages sous IE7 si nous omettons les balises :

Attention, ce plugin nécessite les plugins/librairies javascript suivants :

-  plugin CFG (utilisé pour configurer le plugin)
-  plugin SPIP-BONUX (utilisé pour afficher les listes des visiteurs non connectés dans un squelette SPIP)
-  Jquery V1.3.2+
-  Jquery.UI V1.6+ (utilisé pour les drag’n’drop)
-  Jquery.form V2.21+ (utilisé pour les formulaires en AJAX)
-  Jquery.AjaxCallback
-  Jquery.jgrowl V1.2+ (utilisé pour les notifications en AJAX en haut à droite)
-  Jquery.livequery V1.0.3+ (utilisé pour la persistence des fonctionalités AJAX sur les objets rechargés)

Discussion

5 discussions

  • Oui, en effet la variable $_SERVER[« DOCUMENT_ROOT »] est sans doute trop puissante et inadaptée pour les multiples scénarios de configuration de serveur. Dans mon cas $_SERVER[’SERVER_NAME’].dirname($_SERVER[’PHP_SELF’]) fonctionne bien, mais encore une fois c’est un cas particulier à abandonner certainement.

    Effectivement, il faut sans doute se tourner vers une référence spip, quelquechose comme #CHEMIN...

    Mais tout cela ne me décourage pas et envisageant d’utiliser à l’avenir votre plugin, c’est avec plaisir que je ferai d’autres tests ;-)

    Répondre à ce message

  • 1

    Oui, effectivement cela vient de là.
    J’ai modifié balise/favoris_admin_liste (et non bouton) comme vous l’avez suggéré et le chemin indiqué « /home/e-smith/files/ibays/Primary/html/plugins/favoris/formulaires/favoris_admin_liste_edit.html » est erroné.

    $_SERVER[« DOCUMENT_ROOT »] va chercher le template bien loin et se trompe d’I-BAY :-(

    • ca prouve que je m’y prends mal, je devrais plutot me baser sur les variables de SPIP pour retrouver le chemin du repertoire /formulaires/ du plugin, si toutefois c’est possible. Je vais essayer de trouver un meilleur moyen et je vous tiendrai au courant si je fais une mise à jour. En attendant vous pouvez remplacer $_SERVER[« DOCUMENT_ROOT »] par un chemin qui fonctionne. Vous aurez peut-être à le faire dans plusieurs fichiers du répertoire /balise/ (faciles à repérer), mais en attendant que je fixe ce problème ca vous permettra de faire des tests un peu plus poussés. Il ne faut pas que ces petits détails vous découragent je compte m’investir dans ce plugin et faire en sorte qu’il soit complètement opérationnel le plus tôt possible.

      En tous cas merci pour votre participation.

    Répondre à ce message

  • 1

    J’en viens au point suivant.
    Je souhaite maintenant associer, à côté de mes images add ou remove qui s’affichent et fonctionnent bien, le texte correspondant <:favoris:add_to_favorites:>...
    Aussi, j’ajoute le suffixe ’text’ aux filtres de ma balises #FAVORIS_ADMIN_BOUTON{article, #ID_ARTICLE, 1, 'spip.php?page=favoris', text} pour appeler le squelette /formulaires/favoris_admin_bouton_text.html .
    Mais, ça ne fonctionne pas.

    J’ai donc utilisé un marqueur dans le source de favoris_admin_bouton_text.html et j’ai constaté qu’il ne s’affichait pas, c’est le squelette de base qui s’affiche.

    On rejoint le deuxième problème que j’avais évoqué, à savoir sur ma page présentant la liste des favoris construite sur une balise #FAVORIS_ADMIN_LISTE{1, edit} le squelette favoris_admin_liste_edit.html n’est pas appelé, simplement le squelette de base (là aussi j’ai fait le test du marqueur)

    Comment parvenir à appeler correctement ces pages en suffixe ?

    (Actuellement je teste sur IE7, Firefox 3.5.3 et Chrome 3.0.1 qui sur ce sujet ont le même comportement)

    Merci pour vos pistes :-)

    (Je précise enfin que si je renomme « favoris_admin_liste_edit.html » en « favoris_admin_liste.html » je me retrouve effectivement avec une page favoris me permettant de supprimer un à un les favoris !)

    • je vous propose une manip pour y voir plus clair sur le problème des tempaltes non trouvés :

      Dans /balise/favoris_admin_bouton.php, ligne 46 environ, c’est la que l’on teste si un formulaire avec l’extension passée en paramètre existe ou non, voici la ligne

      if(file_exists($_SERVER[« DOCUMENT_ROOT »].« /plugins/favoris/formulaires/favoris_admin_bouton_ ».$suffixe.« .html »)) $formulaire = « formulaires/favoris_admin_bouton_ ».$suffixe ;

      précédez cette ligne par

      die($_SERVER[« DOCUMENT_ROOT »].« /plugins/favoris/formulaires/favoris_admin_bouton_ ».$suffixe.« .html ») ;

      ce qui va casser votre page mais vous afficher le chemin exact vers lequel le plugin essaie d’aller chercher le plugin. Ainsi si ce chemin semble correct ca ne m’arrangerait pas dans le debuging, mais si vous voyez ou exactement le chemin est erroné alors on trouvera ce qui cloche.

      Il semble que ce soit encore une fois la façon d’indiquer des emplacements de fichiers qui diffère de votre site à ceux avec lesquels j’ai développé le plugin, espérons que la solution à tous vos soucis soit la même.

    Répondre à ce message

  • Merci Goony pour votre réponse rapide.

    Sur vos conseils, j’ai à nouveau regardé de près les CSS.
    Oui, sur ma page permettant l’ajout d’un article en favoris le lien vers la feuille de style style_favoris.css était bien renseigné (en fait dans le inc-head, après la surcharge des feuilles précédentes) : j’ai testé href=« plugins/favoris/style_favoris.css » ou encore href=« /plugins/favoris/style_favoris.css »...
    De même, dans la feuille elle même, j’ai tenté background-image : url(plugins/favoris/img_pack/add.gif) ; ou encore background-image : url(/plugins/favoris/img_pack/add.gif) ;... cela n’a rien donné !

    Je teste avec Firebug et en étudiant le css du span.add input, il ne parvient pas à m’afficher l’aperçu du background-image : url(plugins/favoris/img_pack/add.gif) ; alors que c’est bien là qu’il se trouve ?!

    Aussi, j’ai essayé toute autre chose. J’ai copié le dossier img_pack dans mon dossier squelette ainsi que le fichier style_favoris.css en adaptant ce dernier avec des liens images en url(img_pack/add.gif)... et j’ai donc également actualisé dans le inc-head le lien vers la feuille de style en href="#CHEMIN{style_favoris.css}"... et là, ça marche : les images add ou remove selon le cas s’affichent dans ma page proposant l’ajout aux favoris.

    Bon, voilà pour un premier point (je ne saurais dire si cela vient du plugin, de la gestion des liens relatifs dans spip ou de ma configuration de server web, sme-server avec I-bay...)

    Répondre à ce message

  • 3

    Merci pour ce plugin qui est très très prometteur :-)

    Je teste en local son utilisation. Je suis d’abord intéressé par la fonctionnalité offerte aux simples visiteurs non authentifiés.
    J’arrive à alimenter une page de favoris...

    Cependant, je rencontre un sérieux problème. Je ne parviens pas à faire afficher à l’aide de la balise #FAVORIS_ADMIN_BOUTON{article, #ID_ARTICLE, 1} l’image du bouton Add to favorites.... seule une zone invisible entre deux Span est cliquable et permet l’ajout.

    De même, dans ma page favoris, la balise #FAVORIS_ADMIN_LISTE{1,edit} ne fait pas apparaître de boutons pour retirer les favoris. (et cette fois il n’y a même pas de span dans le code source)

    Bref, j’y suis pas encore, mais le code semble si joli et la documentation détaillée que je vais continuer mes essais.

    Si quelqu’un parvient à afficher ces boutons, je suis preneur de pistes à expérimenter...

    • Alors ca doit être un problème de réglage niveau CSS, car on est loin d’être surs que la portativité est optimale dans ce domaine. Il semble ici que les balises fonctionnent mais ne trouvent pas les icones d’ajout et de suppression. Vérifiez d’abord la présence des fichiers

      /img_pack/remove.gif
      /img_pack/add.gif

      Ensuite voici le principe d’affichage de ces boutons (qu’on peut mettre à sa sauce, mais attention certaines classes et certains ids sont importants pour les actions en AJAX !) :

      Les templates correspondant à ces deux balises, respectiviement

      /formulaires/favoris_admin_bouton.html
      /formulaires/favoris_admin_liste_edit.html

      contiennent des spans, dont les classes css sont « add » et « remove ».

      Ce sont ces classes qui permettent l’affichage, comme indiqué dans le fichier style_favoris.css :

      span.add input
      background:none ;
      border:0 ;
      width:16px ;
      height:16px ;
      background-image : url(/plugins/favoris/img_pack/add.gif) ;
      cursor : pointer ;
      cursor : hand ;

      span.remove input
      background:none ;
      border:0 ;
      width:16px ;
      height:16px ;
      background-image : url(/plugins/favoris/img_pack/remove.gif) ;
      cursor : pointer ;
      cursor : hand ;

      vous voyez bien ici que le fichier CSS va lui-même lier les images aux classes correspondantes.

      Il faut donc tâtoner pour trouver ce qui cloche.

      Etes vous sur que le fichier CSS est bien inclu dans votre page ? N’y aurait-il aucune autre règle CSS dans votre page qui pourrait interférer avec celui-ci ? par exemple en redéfinissant une règle pour un élément de classe identique ?

      Peut-être faut-il modifier légèrement le chemin vers les gif dans les règles CSS, peut être en essayant des chemins relatifs ou absolus.

      n’hésitez pas à me tenir au courant de votre progression.

    • Pour le fait qu’il n’y ait même pas le code pour supprimer des favoris dans la liste avec le template edit :

      Vérifiez que le template appelé est bien celui qu’on attend, en mettant un marqueur de votre choix dans le template :

      /formulaires/favoris_admin_liste_edit.html

      Si vous voyez votre marqueur s’afficher, alors le template appelé est le bon. Dans ce cas je vous invite à me dire quelle partie du code n’apparait pas en comparant le code source et le template cité ci-dessus, et je pense que je trouverai rapidement ce qui cloche.

      Si vous ne voyez pas le marqueur, c’est que le template n’est pas trouvé, et il faut chercher ailleurs.

      Tenez moi informé du résultat de vos tests, j’essaierai de vous aider.

    • dernière chose : Je n’ai pas testé toues les versions des browsers, j’ai principalement bossé sur IE8 et FF3, il se peut que des éléments CSS ou même des fonctions javascript n’aient pas le comportement souhaité dans d’autres browsers/versions. merci de me les signaler dans ce cas.

    Répondre à ce message

Ajouter un commentaire

Avant de faire part d’un problème sur un plugin X, merci de lire ce qui suit :

  • Désactiver tous les plugins que vous ne voulez pas tester afin de vous assurer que le bug vient bien du plugin X. Cela vous évitera d’écrire sur le forum d’une contribution qui n’est finalement pas en cause.
  • Cherchez et notez les numéros de version de tout ce qui est en place au moment du test :
    • version de SPIP, en bas de la partie privée
    • version du plugin testé et des éventuels plugins nécessités
    • version de PHP (exec=info en partie privée)
    • version de MySQL / SQLite
  • Si votre problème concerne la partie publique de votre site, donnez une URL où le bug est visible, pour que les gens puissent voir par eux-mêmes.
  • En cas de page blanche, merci d’activer l’affichage des erreurs, et d’indiquer ensuite l’erreur qui apparaît.

Merci d’avance pour les personnes qui vous aideront !

Par ailleurs, n’oubliez pas que les contributeurs et contributrices ont une vie en dehors de SPIP.

Qui êtes-vous ?
[Se connecter]

Pour afficher votre trombine avec votre message, enregistrez-la d’abord sur gravatar.com (gratuit et indolore) et n’oubliez pas d’indiquer votre adresse e-mail ici.

Ajoutez votre commentaire ici

Ce champ accepte les raccourcis SPIP {{gras}} {italique} -*liste [texte->url] <quote> <code> et le code HTML <q> <del> <ins>. Pour créer des paragraphes, laissez simplement des lignes vides.

Ajouter un document

Suivre les commentaires : RSS 2.0 | Atom