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.

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>

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.

Différences entre la version 1.0 et la versions 0.7

La nouvelle version 1.0 casse la compatibilité avec les squelettes conçus pour la version précédente et expérimantale (0.7).
Cette version inclut les nouveaux squelettes pour ranger les articles et les mots, mais si vous aviez des squelettes de liste d’objets personnels conçus pour la 0.7, ils doivent être adaptés.

  • les informations sur l’objet et l’id_objet (dans le <tr>) sont maintenant transmises dans des attributs data
  • Il n’est plus nécessaire de déclarer les objets dans le pipeline rang_declarer_contexte pour qu’ils soient pris en compte, c’est maintenant automatique, basé sur la configuration.
  • le filtre de test |rang_objet_dans_config générait une erreur dans les squelettes de listes d’objets si le plugin était désactivé/désinstallé, on utilise maintenant une balise (cf explications détaillées ci dessous).
  • la colonne avec le picto draggable est ajoutée automatiquement en javascript, inutile de l’ajouter dans les squelettes.

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 des 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.

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;
}

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/ Ce plugin se base sur la notion de “Définir la relation à l‘objet parent dans la déclaration de l‘objet”. Notion introduite dans le ticket https://core.spip.net/issues/3844, et gérée dans le plugin declarerparent

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

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

updated on 6 April 2020

Discussion

14 discussions

  • 3

    Bonjour,
    j’ai installé ce plugin bien pratique sur un spip 3.1.12.
    Je l’utilise pour ordonner les articles.
    Il fonctionne bien en général... sauf pour une rubrique dans laquelle il y a une quarantaine d’articles : l’article “déplacé” ne reste pas à sa nouvelle place. Pourtant, il est bien renuméroté. Il semble que le bug soit lié à la pagination.
    Ce problème existe avec Firefox. J’ai testé avec Chrome, et là, pas de problème, ça glisse !
    Cordialement,
    Sylvain

    • Bonjour Sylvain,

      je viens de tester avec SPIP 3.1.12 + Rang 1.0.15 + PHP 5.6.38 + FF 75
      -  sur un site de test chez un hébergeur avec une rubrique qui contient 290 articles : plusieurs tests dans différentes sections de la pagination;
      -  en local, avec une rubrique contenant une vingtaine d’articles : mêmes tests.

      Dans les deux cas, je n’arrive pas à reproduire l’anomalie que tu signales.

      Je reste à ta disposition si tu trouves de nouveaux éléments.

    • j’ai redémarré firefox, qui devait être un peu fatigué, voire en burn out, et c’est retombé en marche.
      Désolé pour le bruit...
      Merci !

    • Cool ! Merci pour ton retour.

    Reply to this message

  • 2

    bonjour,
    est-il possible de classer un objet editorial “bloc” par rubrique sachant que la rubrique n’est pas son parent . l’objet bloc peut appartenir à 0 ou n rubriques et une rubrique peut avoir 0 à n blocs ( comme les documents) ...
    Je suppose que cela se joue en ajoutant le rang dans la table des liens mais comment ?
    encore merci pour ce plugin

    • Si c’est bien comme des documents, c’est à dire que ton objet editorial “Bloc” est lié via une table de liaison genre spip_blocs_liens, il te faut alors utiliser le plugin “rang_auteurs” (qui devrait plutôt s’appeler “rang_liens” me semble t-il) et l’adapter à ton cas.
      Voir à ce propos https://core.spip.net/issues/4305

      ps : Je vois qu’on est nombreux à essayer de faire un plugin Bloc :)

    • mes blocs fonctionnent bien sur une page accueil ou je peux ordonnancer les blocs, choisir les styles couleurs, contenu mais je n’arrive pas à le généraliser.
      merci pour votre réponse

    Reply to this message

  • 5

    Bonjour,
    Sur un site SPIP 3.2.7 [24473]
    lorsque je veux faire la mise à jour de Rang 1.0.13 - test

    mon site plante (page blanche dès que je lance la moulinette).
    Mon site public est aussi bloqué (erreur 500) et dans l’admin je ne peux pas voir les pages ecrire/?exec=xx&id_xx

    Cela bloque (page blanche) après

                    <div id="conteneur" class="">
                                    <div id="navigation" class='lat' role='contentinfo'>

    J’ai desinstallé ce plugin et quand je veux le réactiver j’ai immédiatement une page blanche.

    Donc tout est bloqué !

    Merci

    • Bonjour,

      la dernière version est la 1.0.15, j’y ai justement corrigé un bug.

      Essaie de supprimer complètement le répertoire du plugin rang (/plugins/auto/rang, à priori), et de vider complètement ton cache (supprimer tout le contenu de /tmp, sauf /tmp/upload éventuellement), de retourner sur l’espace privé, et d’installer la toute dernière version.

    • Merci de ton aide.
      J’ai réussi à résoudre ce plantage général inédit en réinstallant le site et tous les plugins sauf plugin Métas + 2.3.4 - stable car dès que je l’active le site plante complètement.
      Alors qu’il fonctionnait jusqu’à hier et que je n’ai rien changé depuis. Bref..

      Je n’ai pas réinstallé “déclarer parent” qui ne parait plus utile.

    • Bizarre pour Métas+...
      Il faudrait investiguer un peu plus, j’ai plusieurs sites où tout ça cohabite très bien.

      Par contre pour declarer_parent, il est nécessité par Rang, donc tu dois forcément l’avoir activé.

    • Hello DD,

      mon site plante (page blanche dès que je lance la moulinette).

      Dans le cas d’une page blanche, tu as un moyen de connaître exactement la cause grâce aux indications données ici : https://www.spip.net/fr_article4453.html#Obtenir-encore-plus-d-informations-pour-le-debuggage.

      En résumé tu ajoutes les instructions suivantes dans ton fichier /config/mes_options.php :

      error_reporting(E_ALL^E_NOTICE);
      ini_set ("display_errors", "On");
      define('SPIP_ERREUR_REPORT',E_ALL);

      …et tu relances ta page. Elle devrait alors afficher un message d’erreur PHP indiquant la cause du problème. En général cela fait gagner beaucoup de temps.

    • Merci de ton aide.

      Voici l’erreur fatale :
      Fatal error: Uncaught ArgumentCountError: Too few arguments to function extraire_attribut(), 1 passed in /var/www/html/site/ecrire/public/composer.php(92) : eval()'d code on line 271 and at least 2 expected in /var/www/html/site/ecrire/inc/filtres.php:1906 Stack trace: #0 /var/www/html/site/ecrire/public/composer.php(92) : eval()'d code(271): extraire_attribut('Arr\xC3\xAAt\xC3\xA9 pr\xC3\xA9fe...') #1 /var/www/html/site/ecrire/public/composer.php(92) : eval()'d code(14): BOUCLE_principalehtml_7f8032ebe241add05fcb7a4deb98dfd1(Array, Array, Array, Array, 1) #2 /var/www/html/site/ecrire/public/parametrer.php(128): html_7f8032ebe241add05fcb7a4deb98dfd1(Array, Array) #3 /var/www/html/site/ecrire/public/assembler.php(314): public_parametrer_dist('article', Array, 'c50cfbd1bc647de...', NULL) #4 /var/www/html/site/ecrire/public/assembler.php(117): public_produire_page_dist('article', Array, 1, 'c50cfbd1bc647de...', NULL, Array, 1585333100, NULL) #5 /var/www/html/site/ecrire/public.php(117): assemb in /var/www/html/site/ecrire/inc/filtres.php on line 1906

      Ce n’est pas un problème de version de serveur car là je fais les tests en local avec le même site que celui en production et mon système est à jour.
      Bon c’est un site SPIP qui date de 2003 mais il est à jour des plugins et de version SPIP 3.2.7 [24473]

      Donc je clos ceci sur cette page du plugin “rang” qui n’est pas en cause.

    Reply to this message

  • 1
    Des Trois Maisons

    Est-ce que c’est possible de trier par drag & drop dans une rubrique de l’espace publique?

    • Ce serait possible mais ça demanderait forcément un développement spécifique (PHP + Javascript).

    Reply to this message

  • 4

    Bonjour,
    j’utilise le plugin rang.
    J’ai rajouté un objet avec la fabrique et cela fonctionne bien avec le code donné dans la doc.
    J’ai un pb par ailleurs : Je peux ordonner les articles dans une rubrique mais je voudrais aussi ou à la place pouvoir ordonner les articles associé à un mot clé ..
    J’ai activé le rang par mot clé mais cela sert a classe les mots clés dans un groupe de mot clé
    avez vous une idée du code ?
    merci

    • Bonjour Baloo,

      Je peux ordonner les articles dans une rubrique mais je voudrais aussi ou à la place pouvoir ordonner les articles associé à un mot clé ..

      Important : ce sera l’un ou l’autre.

      Il est possible de privilégier le classement des articles associés à un mot clé.
      Il me semble qu’avec les modifs suivantes ça devrait le faire :

      1. comme il est dit ici (https://contrib.spip.net/Rang-ordonner-une-liste-par-Drag-Drop#Notes-techniques) tu dois déclarer le nouveau contexte “exec=mot”
      2. il te faudra surcharger le fichier rang/prive/liste/articles

      Virer la ligne

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

      et la remplacer par

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

      et voilà…

    • bonjour,
      Pour aller plus loin
      n’est-il pas possible d’ajouter un rang dans la table spip_mots _liens et ainsi pouvoir classer les objets de chacun des mots clés id_mot id_objet objet ? ( quelque soit le type d’objet)

    • bonjour,
      Pour aller plus loin
      peux t-on classer classer les articles (les objets) pour chacun des mots clés auxquels il est associés .
      par exemple en ajoutant un rang dans la table spip_mots _liens ?

    • Bonne idée !
      Mais c’est sur https://core.spip.net/issues/4305 qu’il te faut faire cette proposition.

    Reply to this message

  • 4

    Bonjour,

    Je cherche un moyen de trier les auteurs des articles par rang. Est-ce possible de le faire avec votre plugin ou pensez-vous ajouter cette fonction prochainement?

    Merci d’avance

    Reply to this message

  • 1

    encore moi ..
    j’ai un objet bloc ( table spip_ blocs, id_bloc) avec un parent page ( table spip_pages, id_page) ..je voudrais ranger mes blocs dans ma page.
    si je met
    #SET{activer_rang, #ENV{id_page}|et{#VAL{blocs}|in_array{#RANG_LISTE_OBJETS}} }
    je n’ai pas la poignée et je ne peux déplacer les objets de ma page.

    Si je remplace , pour tester, #SET{activer_rang, #VAL{patates}|in_array{#RANG_LISTE_OBJETS} }
    je peux déplacer les blocs sur une liste de tous les blocs ( pas par page bien sur ... ) ce qui a l’air de montrer que le reste des modifs de /prive/objets/liste/blocs.html est ok.

    je n’ai pas fait de déclarer contexte ...
    avez vous une idée du pb ?
    merci

    • Bon maintenant ça fonctionne ... j’ai toujours le même code , aux espaces prés, je devais avoir un pb ailleurs

      #SET{activer_rang, #ENV{id_page}|et{#VAL{blocs}|in_array{#RANG_LISTE_OBJETS}}}
       [(#GET{activer_rang}|oui) [(#VAL{rang}|setenv{par})] #SET{tri,rang}] ...

    Reply to this message

  • 6

    Bonjour,

    j’ai activé le plugin, pour les articles, une poignée drag and drop apparaît bien, lorsque le suis dans une rubrique mais les articles ne se déplacent pas… J’ai loupé une étape?

    • Bonjour rjadot,

      J’utilise ce plugin sur de nombreux sites et je ne reproduis pas le problème que tu décrits. Peux-tu m’en dire plus ?

    • Il y a un plugin qui entre en conflit, j’essaie de trouver lequel et je te dis ça.

    • J’ai trouvé, il y a un conflit avec le plugin «traduction d’articles autrement»

    • Ça y est j’ai trouvé, il s’agit du plugin «traduction d’articles autrement»

    • Salut,
      quelqu’un a eu ce problème récemment avec taa (Traduction d’articles autrement) : ce plugin surcharge le squelette de liste d’articles du privé, pour ajouter une colonne sur les traductions, et du coup les données nécessaires au plugin rang ne sont plus là.

      Si c’est ton cas, il faut voir avec l’auteur du plugin s’il peut ajouter les attributs data-objet et data-id_objet.
      Ça ne casse rien du tout, ce sont juste des attributs sur les balises.

    • Bonjour,
      Signalement : le plugin Rang s’arrête de fonctionner après l’activation de “Interface de traduction pour objets”.

    Reply to this message

  • J’ai un problème sur SPIP 3.2.4 que je ne m’explique pas où le tri des articles ne fonctionnait pas (je n’ai pas essayé d’autres tri).

    J’ai dû rajouter $parent_champ = ’id_rubrique’; à la ligne 46 de action/trier_items.php car le champ $parent_champ était vide.

    Je suis dispo pour plus d’infos si besoin.

    Reply to this message

  • 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.

    Reply to this message

Ajouter un commentaire

Who are you?
[Log in]

To show your avatar with your message, register it first on gravatar.com (free et painless) and don’t forget to indicate your Email addresse here.

Enter your comment here

This form accepts SPIP shortcuts {{bold}} {italic} -*list [text->url] <quote> <code> and HTML code <q> <del> <ins>. To create paragraphs, just leave empty lines.

Add a document

Follow the comments: RSS 2.0 | Atom