Rang : ordonner une liste par Drag&Drop

Dans l’espace privé, pouvoir ordonner une liste d’objets par glisser-déposer. Par exemple la liste des articles d’une rubrique.

Il devient possible d’utiliser le critère par rang dans vos squelettes.

Installation

Il s’installe comme tous les plugins.

Avec SPIP < v4 il nécessite le plugin Déclarer parent (installé en dépendance).

Il est fourni avec une surcharge des squelettes du core et du plugin mots, permettant de ranger les articles et les mots clés dans l’espace privé.

Configuration

Choisir les objets
…pour lesquels vous voulez activer le drag&drop.

Ici vous pouvez activer :

  • les Articles,
  • les Site référencés,
  • les Mots-clés,
  • les objets éditoriaux gérés par d’autres plugins.

Ranger les objets
Si cette case est cochée, les nouveaux objets créés seront rangés automatiquement à la fin de la liste, avec le rang le plus élevé +1.

Dans vos squelettes

Il est possible d’utiliser le critère par rang pour les objets activés dans la configuration.

<BOUCLE_articles(ARTICLES){id_rubrique}{par rang}>
	<h2>#TITRE</h2>
	<div>#TEXTE</div>
</BOUCLE_articles>

Cas particulier de classement

Si vous avez un cas particulier, vous pouvez utiliser le pipeline rang_declarer_contexte pour ajouter d’autres contextes à cette liste.

Exemple
Pouvoir classer les définitions qui apparaissent dans la page exec=dictionnaire.

1- déclarer le pipeline dans le fichier paquet.xml (du plugin « prefixplugin » ici)

<pipeline nom="rang_declarer_contexte" inclure="prefixplugin_pipelines.php" />

2- puis dans le fichier prefixplugin_pipelines.php ajouter la fonction suivante :

function prefixplugin_rang_declarer_contexte($flux) {
	$flux[] = 'dictionnaire';
	return $flux;
}

Comment utiliser ce plugin pour faire du drag&drop sur mon objet éditorial

La première chose à faire est bien sûr de cocher l’objet (exemple : Patates) dans la configuration du plugin.

Ensuite, il faut modifier le squelette /prive/objets/liste/patates.html pour y ajouter quelques informations.
Sur la base d’un squelette généré par la Fabrique, voici les modifications à y apporter.

1- Pouvoir trier la liste par rang
Dans le tableau ci-dessous, ajouter l’entrée rang,1

[(#SET{defaut_tri,#ARRAY{
	rang,1,	
	titre,1,
	date,-1,
	id_patate,1,
	points,-1
}})]

2- Vérifier que l’objet a bien été sélectionné dans la configuration
Juste après ce tout premier bloc qui détermine le sens de tri, ajouter le test qui détermine si l’objet est effectivement coché dans la configuration de Rang ou pas, et stocker le résultat pour ne pas le recalculer ensuite.

#SET{activer_rang, #VAL{patates}|in_array{#RANG_LISTE_OBJETS} }

Si l’objet éditorial a un objet parent (par exemple, le parent d’un article est une rubrique, le parent d’un mot est un groupe_mot), il faut aussi tester si l’identifiant du parent est bien reçu dans l’environnement.
On trie alors les objets en fonction de leurs parents.

Dans le cas d’un article par exemple, le test serait :

#SET{activer_rang, #ENV{id_rubrique}|et{#VAL{articles}|in_array{#RANG_LISTE_OBJETS}} }

3- toujours pour le tri
si le rang est activé sur cet objet, on applique un tri par rang par défaut.

[(#GET{activer_rang}|oui) [(#VAL{rang}|setenv{par})] #SET{tri,rang} ]

4- Pour pouvoir insérer et configurer le code javascript qui va gérer le drag&drop
…Il faut préciser sur quel objet il va s’appliquer.
On ajoute donc un attribut data-objets à la table :

<table class="spip liste" data-objet="patates">

5- Afficher le Rang

Par défaut, la Fabrique génère des squelettes qui affichent la balise #RANG à côté du #TITRE. Mais nous voulons pouvoir trier aussi bien par rang que par titre, nous allons donc séparer ces deux colonnes.

Dans le <thead>, on ajoute juste avant celle du titre une colonne pour trier par Rang :

[(#GET{activer_rang}|oui)<th class="rang" scope="col">[(#TRI{rang,<span title="<:rang:lien_trier_rang|attribut_html:>"><:rang:info_rang_abbr:></span>,ajax})]</th>]

Et dans le <tbody>, on ajoute la colonne correspondante :

[(#GET{activer_rang}|oui)<td class="rang">[(#RANG).]</td>]

Dans le <td class="titre principale"> qui contient le titre, on peut donc supprimer la balise [(#RANG).]

6- Ajout de l’attribut data-id_objet
Ajouter un attribut data-id_objet sur le <tr> de chaque objet :

<tr [(#GET{activer_rang}|oui)data-id_objet="#ID_PATATE"] class="[(#COMPTEUR_BOUCLE|alterner{row_odd,row_even})]">

Le code javascript qui gère le drag&drop ajoutera automatiquement une colonne supplémentaire avec un petit picto symbolisant une poignée, qui indique que les objets peuvent être déplacés dans la liste.

Déclarer le parent d’un objet éditorial

Pour les objets qui ont une liaison directe avec un autre objet (i.e. sont enfants de cet objet par un id_, par exemple spip_articles qui contient un id_rubrique), le plugin rang a besoin de savoir quel est le parent des objets qu’on veut classer.

Il utilise pour ça la fonction du core objet_lister_parents() (dans ecrire/base/objets.php).

Cette déclaration peut être faite soit par la déclaration d’un [’parent’] dans la description de la table de l’objet :

	'parent' => 
		[
			'type' => 'type_du_parent', 
			'champ' => 'id_type_du_parent'
		],

soit par l’utilisation du pipeline objet_lister_parents.

Notes techniques

a/ La balise #RANG_LISTE_OBJETS calcule automatiquement la liste des contextes (i.e. pages /?exec=patates) sur lesquels il insère le code javascript qui gère le drag&drop.

Cette liste est calculée à partir des objets cochés dans la configuration, et y ajoute les noms des objets parents au singulier. Si vous avez coché Articles dans la configuration, la liste des contextes contiendra articles et rubrique.

Le calcul s’appuie sur la convention que les noms des squelettes correspondent aux noms des objets, par exemple, les objets patates sont listés dans le squelette /prive/objets/liste/patates.html et affichés dans /prive/objets/contenu/patate.html.

Enfin la balise #RANG_LISTE_OBJETS offre l’avantage de ne plus être interprétée si le plugin est désactivé ou désinstallé. Les surcharges de squelettes sont donc compatible « avec et sans » le plugin Rang, et ne génèreront pas d’erreurs.

b/ Ce plugin surcharge la balise #RANG du core de SPIP.

c/ Lorsque vous activez un objet dans la config, le plugin va créer un champ ’rang’ dans la table de l’objet sélectionné.

Discussion

25 discussions

  • 1

    Bonjour,
    Est-il possible d’installer ce plugin sans qu’il change l’ordre des articles ?
    Et donc le rang n’est pas donné par défaut pour les objets déjà publiés.
    Merci

    • Bonjour,
      à l’installation le plugin ne change rien.
      Les articles se voient attribuer un rang dans leur rubrique uniquement quand on commence à les déplacer.

    Répondre à ce message

  • 1

    Excellent plugin, une fois qu’il ne sera plsu en test, j’éspère le voir intégre dans la prochaine version de SPIP.
    C’est le classement par num titre qui devrait être en option.

    • En fait il faudrait même fusionner les deux dans une prochaine version de spip. Donner l’option rang au rubrique donc aussi. Et attribuer un numéros en fonction du rang et vice versa.. ce serait top

    Répondre à ce message

  • 2

    est-ce que l’on peut envisager à terme d’utiliser ce plugin pour composer une page ?

    • Bonjour,
      pour composer une page ? non, pas du tout, ce plugin sert juste à ranger des objets dans une liste pour les classer.
      Si je comprends bien, il faudrait plutôt voir du côté du noizettier.

    • j’avais pensé à créer des objets éléments d’une page sommaire /rubrique
      navigation, derniers articles etc ? avec un squelette adéquat affichant en fonction du rang .... mais bon je délire surement et le noizetier est déjà bien. Dans tous les cas ce plugins mériterait d’être intégrer dans spip. Merci pour ton travail.

    Répondre à ce message

  • 2

    Attention, actuellement le plugin supprime tout champ « rang » des objets sélectionnés lors de sa désinstallation. Or il y a des objets (notamment dans des plugins, sur la zone) qui ajoutent déjà eux-mêmes le champ rang parce qu’ils l’ont déjà prévu en interne et l’utilisent. Et donc quand on enlève Rang, ça vire le champ alors qu’il venait du plugin, et c’est irréparable, on perd tout.

    (Le plugin est « en test » au niveau XML mais du coup ça mériterait un encart sur cet article de documentation pour préciser cela et dire qu’il n’est pas encore finalisé et qu’il peut rester des bugs importants de ce genre.)

    • Le plugin est passé de expérimental à en test parce que le code a été revu et stabilisé.
      Le fait que les champs rang soient supprimés, je comptais m’en occuper mais tu as fait ton fork avant. Mes journées ne font que 24h.

      Qu’est ce qui te fait dire qu’il n’est pas finalisé ? Tu veux qu’on ajoute un encart sur tous les plugins qui à sont l’état « test » ? Tu veux que j’en sorte la liste ?
      Et tu crois qu’il ne reste des « bugs importants » que sur les plugins « en test » ?

      Si tu pouvais arrêter de calomnier...

    • Il faut arrêter de calomnier en traitant les autres de calomniateur, comme le fait de couper court à des discussions en traitant les interlocuteurs de trolls dès qu’on veut arrêter.

      Il me semble que c’est quand même assez objectif de dire qu’un bug qui supprime des champs avec toutes leurs données alors qu’ils étaient là avant, et que c’est irrécupérable, constitue un bug non négligeable qui fait que ce n’est pas à mettre entre toutes les mains publiquement. Et que donc soit ça doit être testé entre devs dans un premier temps, soit s’il y a publication, l’indiquer.

      Personne ne reproche à quiconque d’avoir des journées très remplies, je suis le premier à ne pas avoir le temps d’avancer sur tout ce que j’aimerais, mais du coup pas d’empressement à avoir, justement. :)
      Généralement, de nombreux plugins ont été d’abord présentés sur la liste etc en demandant aux copains-copines contributeurices de tester, avant d’avoir une documentation publique pour le reste du monde. Là il me semble que ça a été un peu vite par rapport à l’état de stabilité : immédiatement dès que la nouvelle manière a été commitée, paf article publique, etc.

      Par ailleurs, pour l’allusion, je ne fais pas un fork, mais une branche de dev-feature expérimentale, pour voir si des choses sont possibles à automatiser : je ne garantis pas du tout que ce soit possible, moi même je n’en sais rien, c’est pour tester ! Et je le versionne parce je veux pas perdre si mon ordi plante, normal.

      Si jamais la chose est possible, et qu’on peut permettre d’avoir cette fonctionnalité de tri sans demander aux devs d’objets, core ou plugins, de modifier leurs squelettes, alors dans ce cas d’après moi c’est la voie à suivre en priorité avant toute autre amélioration, afin que ce soit vraiment générique. C’est aussi ce qui me fait dire que ce n’est pas finalisé, d’autant plus si l’idée à moyen terme c’est que ça puisse intégrer la dist ou le noyau, pour arrêter d’utiliser les numéros dans les titres. Si les tests fonctionnent mais que je suis le seul à penser que c’est le but prioritaire, là oui ça deviendra peut-être un fork. Mais bon on n’en est pas là, pour l’instant c’est vraiment du proof of concept juste pour tester et pouvoir montrer, ya aucune promesse.

      En espérant avoir assez argumenté…

    Répondre à ce message

  • liberte

    Il est bien indique tout en bas des notes techniques.

    « e/ La désinstallation supprime les champs ’rang’ de tous les objets activés et les choix fait dans la configuration. »

    Plus generalement, pour tous les plugins dans Spip-Cpntrib, il n’y aurait pas le moyen d’indiquer sous les votes l’etat du plugin et le nombre d’utilisateurs comme cela se fait dans https://plugins.spip.net ?

    Ca serait bien pratique.

    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