SPIP Bonux

Le plugin qui lave plus SPIP que SPIP, avec des chouettes cadeaux dedans ! Interface douce, boucles POUR et CONDITION, tableaux, compteur, etc.

Parce que nous n’avons pas pu tout mettre dans SPIP 2.0 (la boîte était trop petite), voici un plugin qui intègre des trucs en plus ! C’est cadeau !

Rq : certaines fonctionnalités de SPIP Bonux ne sont pas documentées ici, mais dans la doc sur Bonux pour SPIP 3.

C’est doux, c’est neuf ?

De l’avis des amateurs de SPIP-Bonux, cette distribution améliore le confort d’usage des formulaires de saisie de l’espace privé, dont les couleurs tiennent mieux dans la durée. Il s’agit a priori d’une simple variante de style : celle-ci propose une nouvelle palette de couleurs, plus douces pour les yeux et propices à la concentration sur votre travail éditorial. Mais surtout, — là est le vrai cadeau Bonux —, ces formulaires restent accessibles, même lorsque l’affichage des images est désactivé dans le navigateur ou lorsque le trop faible débit de votre connexion ne permet pas de les afficher, situation bien plus courante qu’on ne croit. SPIP-Bonux vous permet donc d’accueillir des collaborateurs autrement laissés pour compte.

Une boucle (POUR)

Une boucle (POUR) qui permet de boucler sur tous les tableaux PHP, qu’ils soient en #ENV, en #GET, ou autres...

<BOUCLE_test(POUR){tableau #ENV{tableau}}>
#CLE=>#VALEUR<br />
</BOUCLE_test>

cle et valeur peuvent être utilisés dans les critères, ainsi que de nombreux critères des boucles traditionnelles de spip (pagination par exemple)

Ces tableaux peuvent être déjà présent dans #ENV car fournis en argument d’un inclure, ou en contexte d’un formulaire CVT, ou issus de tout filtre retournant un array() PHP : (#ENV{qqc}|mon_filtre), ou toute balise retournant un array() comme #ARRAY ...

De nombreux exemples sont disponibles dans le répertoire demo/ du plugin.

Il est possible dans cette boucle de trier les résultats {par cle} ou {par valeur}, mais aussi, si les résultats sont eux-mêmes des tableaux (ou des objets), de trier sur une de leurs clés. Par exemple si #ARRAY est un tableau d’objets ayant un champ date, le tri {par date} fonctionne « naturellement ».

Une boucle (CONDITION)

<BOUCLE_test(CONDITION){si #ENV{test}|>{5}}>
vrai
</BOUCLE_test>
faux
<//B_test>

Des balises pour manipuler les tableaux

SPIP permet deja d’initialiser un tableau avec

#SET{tableau,#ARRAY{1,premier,2,deuxieme,3,troisieme}}

ou avec

#SET{tableau,#LISTE{janvier,février,mars}}

Spip-Bonux ajoute la balise #SET_MERGE qui permet de fusionner et affecter une variable en meme temps :

#SET_MERGE{nom_tableau,#GET{tableau},#ARRAY{cle,valeur}}

et la balise #SET_PUSH, pour y ajouter un element :

#SET_PUSH{tableau,valeur}

Un critère compteur

Le critère compteur permet de compter les éléments d’une table associés à ceux d’une autre.

Exemple, pour afficher les auteurs avec leur nombre d’articles :

<BOUCLE1(AUTEURS){compteur articles}{par compteur_articles}>
#ID_AUTEUR : #COMPTEUR{articles}
</BOUCLE1>

La balise #COMPTEUR est associée au critere et permet d’afficher la valeur du compteur pour chaque auteur.

Un article entier est consacré à la documentation de ce critère : Le critère compteur de Bonux.

Discussion

111 discussions

  • 1
    François

    Bonjour,
    En SPIP 2.09 et Bonux 1.83, dès que j’active SPIP Bonux, le site privé disparaît. Quelqu’un a t’il déjà vu ce problème, et comment faire pour y remédier ?
    Merci par avance

    • Bonjour,
      Pour ceux à qui ça pourrait servir, voici la chose à faire : augmenter la memoryLimit et memory max size du serveur, car apparemment, spip bonux est un peu gourmand.

    Répondre à ce message

  • Bon,

    le problème (comme souvent) ne venait pas de SPIP, mais de ma configuration locale.

    Ça ne fonctionnait pas parce que ma config de PHP n’acceptait pas les scripts de plus de 16M. En réglant memory_limit sur 32M dans php.ini, tout fonctionne.

    Cool :)

    Répondre à ce message

  • 1

    Ben, ça marche toujours pas malheureusement.

    Quand j’enlève le plugin et que j’actualise firefox, le message suivant apparaît dans l’espace privé :

    Erreur dans les plugins : plugins/spip-bonux/public/spip_bonux_criteres.php, plugins/spip-bonux/public/spip_bonux_balises.php, plugins/spip-bonux/spip_bonux_fonctions.php

    Une idée ?

    • Je ne comprends pas.

      Quand tu enlève le plugin Bonux, il est normal que tu reçoive un message d’erreur. Rien d’anormal. Il suffit de repasser par la page d’admin des plugins pour que ça soit pris en compte.

      Cédric

    Répondre à ce message

  • Merci. Je vais essayer ça demain matin, puis je posterais le résultat ici même.

    Répondre à ce message

  • 1

    J’obtiens ça quand j’essaye d’activer le plugin :

    Fatal error : Allowed memory size of 16777216 bytes exhausted (tried to allocate 7054 bytes) in /var/www/hdr/ecrire/public/phraser_html.php on line 222

    J’ai téléchargé spip_bonux aujourd’hui (2/11/09), je suis en local. J’ai mis à jour vers 2.0.10 en me disant que ça devait venir de là, mais le problème reste le même.

    Autres plugins installés : CFG, spip-listes, contact

    Une idée ? Pas de chance pour moi, je voulais installer le site chez mon hébergeur aujourd’hui. M’enfin ! C’est pas bien grave :)

    PS : suis pas très doué sorti de xhtml, css et les boucles SPIP...

    • Essai de désactiver spip liste ; j’ai aussi fait la mise à jour perso sans aucun problème.

    Répondre à ce message

  • 5

    Bonjour,

    Merci pour ce plugin. Je tente (avec SPIP 2.0.5) de trier des articles en fonction du nombre de messages de forums qu’ils ont suscité. Par mimétisme avec le code donné ci-dessus pour les auteurs, j’écris (schématiquement) ceci :

    <BOUCLE_les_plus_commentes(ARTICLES){compteur forums}{!par compteur_forums}>
    #TITRE - #COMPTEUR{forums} <br/>
    </BOUCLE_les_plus_commentes>

    Mais ça donne des résultats assez bizarres. Sur le site sur lequel je teste j’ai cinq articles avec des messages de forums (pour un total de neuf messages). La boucle n’en renvoie que deux, et leur attribue neuf messages à chacun...

    J’ai dû louper quelque chose. Mais quoi ?

    • Je suis en train de me battre avec le même problème de résultats surprenants pour le calcul du nombre de commentaires d’un article, le soucis vient de ce que SPIP fait la jointure sur id_auteur au lieu de le faire sur id_article.

      Si on déclare dans la fonction critere_compteur if ($arrivee[0] == 'forums') $arrivee[1]['key']['KEY id_article'] = 'id_article'; la jointure est immédiate, mais elle se fait avec un INNER JOIN, ce qui fait qu’on perd tous les articles qui n’ont pas de message dans le forum...

    • Bon, je réussi à obtenir un LEFT JOIN à l’aide du code suivant :

      Avant le if ($compt = calculer_jointure($boucle,$depart,$arrivee)){ :

      	if ($arrivee[0] == 'forums') {
      		$isArriveeForum = true;
      		$arrivee[1]['key']['KEY id_article'] = 'id_article';
      	}

      Et après la fermeture du if ($compt = calculer_jointure($boucle,$depart,$arrivee)) :

      if($isArriveeForum) {
      		$boucle->from['articles'] = 'spip_articles LEFT JOIN spip_forum AS L1 ON(L1.id_article = articles.id_article)';
      		unset($boucle->from['L1']);
      		unset($boucle->join['L1']);
      	}

      Je subodore que ça ne soit pas propre du tout du tout...

    • J’ai rien suivi, mais tu as ->from_type pour déclarer un type de jointure particulière… Utilisé ici : http://zone.spip.org/trac/spip-zone...

    • Effectivement, merci beaucoup Mathieu, j’ai finalement fait un critère spécifique :

      function critere_corrigerJointuresForum($idb, &$boucles, $crit) {
      
      	$boucle = &$boucles[$idb];
      
      	$boucle->from_type['L2'] = 'LEFT';
      	$boucle->join["L2"]= array("'articles'", "'id_article'", "'id_article AND L2.statut = \'publie\''");
      	unset($boucle->from['L1']);
      	unset($boucle->join['L1']);
      
      }
    • Une autre utilisation, pour trier par nombre de commentaires une liste d’articles dont on veut s’assurer qu’ils ont tous au moins une vidéo FLV :

      <BOUCLE_tri_par_commentaires
      	(ARTICLES spip_documents_liens spip_documents)
      	 {id_rubrique}
      	 {compteur forums}
      	 {!par compteur_forums}
      	 {spip_documents_liens.objet=article} 
      	{spip_documents.extension=flv} 
      	{corrigerJointuresForumTri}
      	>
       CODE HTLM 
      </BOUCLE_tri_par_commentaires>

      et le code PHP :

      function critere_corrigerJointuresForumTri ($idb, &$boucles, $crit) {
      
      	$boucle = &$boucles[$idb];
      
      	$boucle->from['forum'] = 'spip_forum';
      	$boucle->from_type['forum'] = 'LEFT';
      	$boucle->join["forum"]= array("'articles'", "'id_article'", "'id_article AND forum.statut = \'publie\''");
      	$boucle->select[]= "COUNT(forum.id_forum) AS compteur_forums";
      
      }

      Je vais me fendre d’un article dédié quand j’aurais le temps tiens...

    Répondre à ce message

  • Bonjour,

    C’est pas un truc super grave mais y a un pti souci d’affichage avec IE (6 et 7 je crois) déjà repéré si j’en crois les précédents posts.
    Bon ça disparaît avec la version 8, alors....

    Merci pour le boulot,

    DG

    Répondre à ce message

  • 1

    Bonjour à tou(te)s,

    Je poste ici un exemple de problème résolu par la balise #ARRAY et la balise #SET_PUSH de spip-bonux :

    Problème à résoudre

    1. on cherche a obtenir, dans un site, une sélection des 3 derniers articles d’actualités

    2. mais, les articles d’actualités sont éparpillés ; ce sont :
    -  tous les articles de la rubrique « actus »
    -  seulement certains articles de la rubrique « sommaire » qui portent le mot clé « actus »

    3. il faut donc qu’on « réunisse » en une seule liste, ces deux séries d’articles, puis qu’on les trie par date inverse pour prendre seulement les 3 plus récents.

    Solution

    1. initialiser un tableau SPIP avec la commande
    #SET{actus, #ARRAY{}}

    2. créer une première boucle pour récupérer les articles de la rubrique « actus », et à chaque itération, ajouter une ligne au tableau « actus » avec #SET_PUSH :

    	<h1>La boucle des articles de la rubrique "actus" :</h1>
    	<ul>
    	<BOUCLE_actu1(ARTICLES){id_rubrique=2}{lang}>
    	#SET_PUSH{actus, #ID_ARTICLE}
    	<li>#TITRE</li>
    	</BOUCLE_actu1>
    	</ul>

    3. créer une seconde boucle pour récupérer les articles avec le mot clé « actus » (et continuer le cahrgement du tableau) :

    	<h1>La boucle des articles portant le mot clé "actus" :</h1>
    	<ul>
    	<BOUCLE_actu2(ARTICLES){id_mot=2}{lang}>
    	#SET_PUSH{actus, #ID_ARTICLE}
    	<li>#TITRE</li>
    	</BOUCLE_actu2>
    	</ul>

    4. enfin, récupérer, trier et sélectionner tous les articles d’actualité, c’est à dire tous les articles du site dont l’id_article fait partie du tableau « actus » :

    	<h1>La boucle de tous les articles d'actus :</h1>
    	<ul>
    	<BOUCLE_actus(ARTICLES){id_article IN #GET{actus}}{!par date}>
    	<li>#TITRE [- (#DATE|affdate_court)]</li>
    	</BOUCLE_actus>
    	</ul>

    En espérant que cet exemple simple puisse inspirer de nombreux sites !

    A+
    Cyril

    • Et que penser de ?

      <BOUCLE_actu1(ARTICLES){id_rubrique=2}{lang}{doublons actus}>
      <BOUCLE_actu2(ARTICLES){id_mot=2}{lang}{doublons actus}>
      <BOUCLE_actus(ARTICLES){!doublons actus}{!par date}>

    Répondre à ce message

  • le critère de tri par hasard fonctionne-t-il sur le boucle (POUR) ?
    (objectif sortir une valeur parmi d’autre dans un tableau aléatoirement )

    Répondre à ce message

  • C’est bon, c’est la bonne version maintenant ! :-)

    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