var Phenix = function () {
Troll du Web depuis 1996

SPIP

Trouver la traduction d’un objet #SPIP

Une fonction bien pratique quand on travaille avec des squelettes multilingues. Avant j’utilisais un assemblage de boucles et de critères, un peu illisible.

Cette fonction simplifie grandement le travail en retrouvant automatiquement une traduction en fonction d’un couple id_objet/objet.
Cela devrait fonctionner avec n’importe quel objet utilisant le système de traduction de SPIP.

  1. <?php
  2. /**
  3.  * Récupère la traduction d'un objet via la langue et l'id_objet
  4.  *
  5.  * @param int $id_objet
  6.  * @param string $objet
  7.  * @param string $lang
  8.  * @access public
  9.  * @return int
  10.  */
  11. function objet_trouver_traduction($id_objet, $objet, $lang) {
  12.  
  13. // Pas de lang, on sort
  14. if (!isset($lang)) {
  15. return $id_objet;
  16. }
  17.  
  18. // Table
  19. $table = table_objet_sql($objet);
  20. $cle_primaire = id_table_objet($objet);
  21. // On récupère l'éventuelle traduction
  22. $id_traduction = sql_getfetsel(
  23. $cle_primaire,
  24. $table,
  25. 'id_trad='.intval($id_objet),
  26. 'lang='.sql_quote($lang),
  27. 'statut='.sql_quote('publie')
  28. )
  29. );
  30.  
  31. return $id_traduction;
  32. }
  33.  
  34. function article_trouver_traduction($id_article, $lang) {
  35. return objet_trouver_traduction($id_article, 'article', $lang);
  36. }
  37.  
  38. // Si le plugin Traduction entre rubriques est activé
  39. // http://contrib.spip.net/Traduction-des-rubriques
  40. function rubrique_trouver_traduction($id_article, $lang) {
  41. return objet_trouver_traduction($id_article, 'rubrique', $lang);
  42. }

Je l’utilise surtout pour les liens directs dans les squelettes :

  1. <a href="#URL_ARTICLE{[(#EVAL{_ID_ARTICLE_CONTACT}|article_trouver_traduction{#ENV{lang}})]}" class="button large">
  2. Nous contacter
  3. </a>

Des rédacteurs restreints dans #SPIP

Chacun sa rubrique !

Il est possible d’améliorer un peu la gestion des utilisateurs de SPIP. Dans cet exemple, on va :

- Pouvoir restreindre un rédacteur à une ou plusieurs rubriques. C’est similaire au administrateur restreint.
- Limiter la création d’article par les administrateurs/rédacteurs restreints à leur rubrique uniquement.
C’est assez pratique si vous n’avez pas envie que des articles soit poster n’importe ou sur le site.

On commence par permettre de lier aussi les rédacteurs à une rubrique, il faut placer ce code dans le fichier config/mes_options.php :

  1. <?php
  2. define('_STATUT_AUTEUR_RUBRIQUE', '0minirezo,1comite');

Ensuite on ajoute la vérification des accès restreints dans l’autorisation a créé des articles dans une rubrique.
Attention, c’est une surcharge de fonction, cela veut dire qu’elle va remplacer celle du core de SPIP.

Il faut mettre ce code dans un fichier de fonction (mes_fonctions.php par exemple).

  1. <?php
  2. /**
  3.  * Autorisation de créer un article dans une rubrique $id
  4.  *
  5.  * Il faut pouvoir voir la rubrique et pouvoir créer un article…
  6.  *
  7.  * @param string $faire Action demandée
  8.  * @param string $type Type d'objet sur lequel appliquer l'action
  9.  * @param int $id Identifiant de l'objet
  10.  * @param array $qui Description de l'auteur demandant l'autorisation
  11.  * @param array $opt Options de cette autorisation
  12.  * @return bool true s'il a le droit, false sinon
  13.  **/
  14. function autoriser_rubrique_creerarticledans($faire, $type, $id, $qui, $opt) {
  15. return
  16. $id
  17. and autoriser('voir', 'rubrique', $id)
  18. and autoriser('creer', 'article')
  19.  
  20. // Vérifier l'accès restreint avant d'autoriser la publication
  21. and (
  22. !$qui['restreint'] or !$id
  23. or in_array($id, $qui['restreint'])
  24. );
  25. }

Executer du code lorsqu’un utilisateur ce connecte sous SPIP

J’avais besoin d’exécuter un peu de code lorsqu’un utilisateur ce connecte à SPIP. Il y a un moyen assez simple de le faire : dans le traiter du formulaire login.

La connexion de l’utilisateur ce fait dans la partie vérifier du formulaire CVT. Cela veut dire que la session a été créé.

  1. function prefix_formulaire_traiter($flux) {
  2.  
  3. if ($flux['args']['form'] == 'login') {
  4. // Coder ici
  5. }
  6.  
  7. return $flux;
  8. }

Bien entendu je préfèrerai avoir un pipeline post_login, ce serai plus simple et plus lisible dans le code.
Cela viendra peut-être avec SPIP 3.2 !


Executer du code lorsqu’un inscription est validée sous SPIP

Ou comment avoir un pipeline post_inscription

Dans SPIP, il n’y a pas de pipeline post_inscription. Difficile donc d’exécuter facilement du code lorsque l’inscription est validé par l’utilisateur. Cela va peut être changé avec SPIP 3.2.

En attendant, voici un bricolage avec le pipeline post_edition :

  1. function prefix_post_edition($flux) {
  2.  
  3. // Confirmation d'une inscription
  4. if ($flux['args']['table'] == 'spip_auteurs'
  5. and $flux['args']['statut_ancien'] == 'nouveau'
  6. and $flux['args']['action'] == 'instituer'
  7. and $flux['data']['statut'] == '6forum' ) { // Limité aux visiteurs
  8. $id_auteur = $flux['args']['id_objet'];
  9. // Faire des trucs ici.
  10. }
  11.  
  12. return $flux;
  13. }

Utiliser les forums de #SPIP sur d’autres types d’objets

Parce que dans SPIP, il n’y a pas que des articles !

J’en ai marre de ne jamais me souvenir de cette procédure donc je vais la noter une bonne fois pour toutes :’-) .

Procédure :

Il faut déclarer quelques petites choses pour réussir à implémenter les forums de SPIP sur d’autres objets que les articles :

On commence par définir la fonction qui permet au formulaire de forum de trouver le titre de l’objet. Mettons que vous ayez un plugin qui définit un objet « annexe » sur lequel vous voulez utiliser les forums :

Dans le fichier de fonctions.php du plugin :

  1. /**
  2.  * Récupérer le titre des annexes pour les forums
  3.  *
  4.  * @param int $id_objet
  5.  * @access public
  6.  * @return string le titre de l'annexe
  7.  */
  8. function annexe_forum_extraire_titre($id_objet) {
  9. include_spip('inc/filtres');
  10. return generer_info_entite($id_objet, 'annexe', 'titre');
  11. }

Ensuite, il faut définir le pipeline qui va permettre à la balise #FORMULAIRE_FORUM de trouver automatiquement l’objet du forum :

Dans le fichier pipelines.php :

  1. function prefix_forum_objets_depuis_env($objets) {
  2. $objets['annexe'] = id_table_objet('annexe');
  3. return $objets;
  4. }

On n’oublie pas d’ajouter le pipeline dans le paquet.xml :

  1. <pipeline nom="forum_objets_depuis_env" inclure="prefix_pipelines.php" />

Dans le cas où les forums sont désactivés partout, on peut forcer le passage avec une fonction à déclarer dans le fichier inc/annexe_accepter_forums_publics.php :

  1. function inc_annexe_accepter_forums_publics_dist($arg = null) {
  2. return 'abo'; // chaine de 3 caractere parmi 'non','pos','pri','abo'
  3. }

Normalement à ce stade, la balise #FORMULAIRE_FORUM affiche le formulaire sur votre objet :).

Il ne faut pas oublier d’ajouter le critère {id_annexe ?} dans la boucle principale des forums et dans celle qui compte les messages. Sans quoi, SPIP va afficher tous les messages sans distinction.

Limitation :

Il y a cependant une configuration qui ne fonctionne pas correctement :

Si les forums sont désactivés sur les articles, il est impossible d’utiliser le mécanisme de réponse car #PARAMETRES_FORUM ne renvoie rien.
Le problème vient de cette partie du code, qui est spécifique à la configuration des articles.
Il est toujours possible de faire une surcharge brutale de la balise pour faire sauter cette limitation. Mais, du coup, le formulaire de configuration de l’admin n’a plus aucun sens.

Conclusion :

Les forums de SPIP ne sont pas encore complètement portables sur d’autres objets. Il y a visiblement eu du travail dans ce sens, mais ce n’est pas encore complet.
Cependant, il suffit souvent d’activer les forums d’articles pour que tout se passe pour le mieux.