Personnaliser les champs de l’espace privé

Comment choisir le type de champ et le texte des champs dans l’espace privé en fonction des rubriques.

Le besoin

J’ai récemment mis en ligne un site sous SPIP 1.9.1 avec les contraintes suivantes:
-  nombreux rédacteurs à priori
-  plusieurs types d’articles traités différemment dans les squelettes par des choix de mots clés.

Il est apparu très vite que les champs par défaut de l’espace privé (Sur-titre, Titre, Chapeau, etc.) ne seraient pas assez explicites, surtout lorsque l’on commence à detourner les champs Surtitre et Titre pour entrer Prénom et Nom par exemple.

D’autre part, suivant les rubriques les types et le nombre des données à entrer sont différents: pour une rubrique annuaire, on désirera par exemple créer des articles avec des champs Nom, Prénom, Tel, email, etc. Par contre pour une autre rubrique on ne désirera peut être pour les articles que deux champs seulement, et pour d’autres les champs classiques de SPIP.

Dans mon exemple particulier je désirais en particulier avoir une rubrique Annuaire, dans laquelle chaque personne est entrée sous la forme d’un article, une rubrique Publications, une rubrique Séminaires, etc. Lorsque un utilisateur lambda arrive sur l’interface privée du site, s’il désire entrer une nouvelle Publication par exemple, il faut qu’il puisse entrer sans avoir à se poser de questions les différents champs clairement identifiés.

La seule chose que j’ai pu trouver sur le sujet est présenté dans cet article Personnaliser son espace privé en fonction de la rubrique [1]. Elle présente cependant quelques désavantages, notamment sur l’utilisation d’un seul et même fichier de langue pour espace privé et public (on ne peut pas avoir la double fonctionnalité)

Une solution

La solution que j’ai utilisé pour répondre à ces différents impératifs est largement basée sur l’article suscité:
-  Détournement des fichiers langues
-  Un peu de bidouille...

Avec deux améliorations majeures:
-  On garde la possibilité d’utiliser local_fr.php pour la définition des balises multilingues de l’espace public
-  On peut de plus choisir quels champs afficher

Dans le dossier squelettes je crée un premier fichier local_fr.php avec mes définitions habituelles des balises cf multilinguisme et un deuxième, local_prive_fr.php dans lequel je vais définir mes champs.

La première chose à faire est de surcharger le fichier de langue en faisant trouver à spip le fichier local_prive_fr.php.
Pour cela il faut ajouter à la fin de local_fr.php les lignes suivantes:

<?php
// This is a SPIP language file  --  Ceci est un fichier langue de SPIP


// ESPACE PUBLIC

$GLOBALS[$GLOBALS['idx_lang']] = array(
'balise1' => 'Ma premi&egrave;re balise',
'balise2' => 'Ma deuxi&egrave;me balise'
);

if ($f = chercher_module_lang('local_prive_fr'))
surcharger_langue($f);

?>

Ensuite dans le fichier local_prive_fr.php il faut redéfinir les titres des champs en fonction des rubriques (ou des articles, des brèves, etc.).
Ce sera par exemple:

<?php

// On commence par récupérer l'id article ou rubrique ou autre:

include_spip('base/db_mysql');

$id_art = $GLOBALS['id_article'];
$id_rub = $GLOBALS['id_rubrique'];

// On détermine ensuite à quel secteur appartient le rubrique ou l'article:

if ($id_art == ''){
$row = spip_fetch_array(spip_query("SELECT id_secteur FROM spip_rubriques WHERE id_rubrique=$id_rub"));
$id_sect  = $row['id_secteur'];
}
if ($id_rub == ''){
$row = spip_fetch_array(spip_query("SELECT id_secteur FROM spip_articles WHERE id_article=$id_art"));
$id_sect  = $row['id_secteur'];
}

// On peut maintenant personnaliser l'affichage 
//de l'article à modifier
// en fonction du secteur auquel il appartient:


// Espace privé: Annuaire

if ($id_sect=='21') {
// On choisit quels champs afficher:
$GLOBALS['meta']["articles_surtitre"] = "oui";
$GLOBALS['meta']["articles_titre"] = "oui";
$GLOBALS['meta']["articles_soustitre"] = "oui";
$GLOBALS['meta']["articles_descriptif"] = "non";
$GLOBALS['meta']["articles_chapeau"] = "non";
$GLOBALS['meta']["articles_ps"] = "non";
$GLOBALS['meta']["articles_redac"] = "oui";
$GLOBALS['meta']["articles_urlref"] = "oui";

// ... et le texte de ces champs
$GLOBALS[$GLOBALS['idx_lang']] = array(
'texte_sur_titre' => '<B>Num&eacute;ro de t&eacute;l&eacute;phone</B>',
'info_nouvel_article' => 'Nouveau membre',
'texte_titre_obligatoire' => '<B>Nom (pas tout en majuscule!)</B>',
'texte_sous_titre' => '<B>Pr&eacute;nom</B>',
'entree_liens_sites' => '<B>Adresse email</B>',
'info_titre' => ' ',
'info_url' => '<B>URL site personnel</B>',
'texte_introductif_article' => ' ',
'icone_ecrire_article' => 'Cr&eacute;er un nouveau membre',
'icone_modifier_article' => 'Modifier ce membre'
);
}

// Espace privé : Publications du labo

if ($id_sect=='13') {
$GLOBALS['meta']["articles_surtitre"] = "non";
$GLOBALS['meta']["articles_titre"] = "oui";
$GLOBALS['meta']["articles_soustitre"] = "non";
$GLOBALS['meta']["articles_descriptif"] = "oui";
$GLOBALS['meta']["articles_chapeau"] = "non";
$GLOBALS['meta']["articles_ps"] = "non";
$GLOBALS['meta']["articles_redac"] = "oui";
$GLOBALS['meta']["articles_urlref"] = "oui";


$GLOBALS[$GLOBALS['idx_lang']] = array(
'info_nouvel_article' => 'Nouvelle Publication',
'texte_titre_obligatoire' => '<B>Titre de la publi</B>',
'texte_descriptif_rapide' => 'Liste d\'auteurs:',
'texte_contenu_article' => ' ',
'entree_liens_sites' => '<B>R&eacute;f&eacute;rence bibliographique</B> (Par ex: Phys. Rev. A, 68, 012712/1-8, (2003))',
'info_titre' => ' ',
'info_url' => '<B>Lien vers l\'article en ligne:</B>',
'info_texte' => 'Abstract de l\'article',
'icone_ecrire_article' => 'Cr&eacute;er une nouvelle publi',
'icone_modifier_article' => 'Modifier cette publi',

'titre_mots_cles' => 'Mots-cl&eacute;s<p><b>Attention! Pensez &agrave; rajouter les mots cl&eacute; Equipe, Ann&eacute;e de publication et revue &agrave; comit&eacute de lecture!</b></p>'
);
}
?>

Evolutions possibles

Tout cela est bien sur personnalisable pour une rubrique donnée plutôt qu’un secteur, pour les brèves, etc.

Je suis sûr que tout ça devrait pouvoir se mettre sous forme de plugin, mais je sèche un peu. J’ai déjà eu du mal à aller récupérer les différentes infos dans les fichiers de spip ... Pour le texte des champs, il faut fouiller dans /ecrire/lang/ecrire_fr.php et /ecrire/lang/prive_fr.php. J’ai découvert quels champs afficher dans /ecrire/inc_articles_edit.php

À faire:
-  Récupérer l’ensemble des variables qui permettent l’affichage dans l’espace privé.
-  Faire un plugin?

Pour Spip 2.0

La philosophie de la contrib reste essentiellement la même.
Il y a juste quelques petites modifications à prendre en compte:

-  Tout d’abord, il faut mettre les fichiers local_fr.php et local_prive_fr.php dans le dossier squelettes/lang (à créer s’il n’existe pas). En effet la fonction chercher_module_lang ne recherche que dans les dossiers nommés lang/.

-  Ensuite pour récupérer les variables $id_rubrique et $id_article, il faut passer par un $_GET. Le début du fichier local_prive_fr.php devient:

<?php

$id_art = $_GET['id_article'];
$id_rub = $_GET['id_rubrique'];

if ($id_art == '')
{ $row = spip_fetch_array(spip_query("SELECT id_secteur FROM spip_rubriques WHERE id_rubrique=$id_rub"));
$id_sect  = $row['id_secteur'];
}

if ($id_rub == ''){
$row = spip_fetch_array(spip_query("SELECT id_secteur FROM spip_articles WHERE id_article=$id_art")); $id_sect  = $row['id_secteur'];
}

Noter qu’il n’y plus le include_spip(’base/db_mysql’);.

On peut ensuite faire les tests sur $id_rub et $id_art pour afficher les champs souhaités et/ou changer leur intitulé.

Footnotes

[1Nota SPIP-Contrib : pour la documentation officielle concernant la définition de fichiers de langue personnels (pour redéfinir les noms des champs), voir les articles concernant le multilinguisme et particulièrement Internationaliser les squelettes > Méthode des fichiers de langue

Cette contrib marche toujours aussi bien en SPIP 1.9.2g.
Ca marche aussi pour SPIP 2.0! (Voir ci-dessus)

updated on 2 October 2019

Discussion

35 discussions

  • Très bo contrib!!! Je vais me baser sur ca pour faire autre chose. Un grd merci!

    Une autre proposition: je crois qu’il serait préférable dans les versions futures de spip d’ajouter la colonne “type” dans la table “spip_rubriques”.

    Je trouve que cela aura un avantage considerable, vu que bon nombre de personnes utilisent d’autres types de contenus autre que article et brève (c’est mon cas!).

    Cela va te permettre de ne pas utiliser les id des rubriques directement dans le code php, donc plus propre et plus portable (meme si les id change ca va toujours fonctionner!).

    Reply to this message

  • 3

    Très bien cette contrib’, bravo.

    Quelques coquilles à rectifier si possible

    1. dans le local_prive_fr, ne pas oublier de débuter par un <?php

    2. il manque l’accolade fermante dans ce passage là

    if ($id_rub == ''){
    $row = spip_fetch_array(spip_query("SELECT id_secteur FROM spip_articles WHERE id_article=$id_art"));
    $id_sect  = $row['id_secteur'];
    {{} }}

    J’y retourne, merci sebastien.

    • Voilà, c’est corrigé!

      Merci de me l’avoir signalé.

    • Le seul truc que je n’arrive pas à faire puisque spip ne semble pas proposer de meta pour ça, c’est de ne pas afficher le formulaire texte. En effet, j’ai quelques rubriques ou l’on ne renseigne que les champs titre, descriptif, ... et quelques mots-clés mais jamais de texte.

      Un $GLOBALS[’meta’][“articles_texte”] aurait été le bienvenu. Hélas pas prévu dans spip.

      Si jamais quelqu’un trouvait une astuce à intégrer dans cette contrib’, je suis preneur.

    • Finalement, j’ai trouvé la solution, mais j’ai tout de même déposer un ticket sur le trac spip, pour une éventuelle intégration dans le core.

      Donc pour ceux que ça intéresse :
      Dans le local_prive_fr.php,
      $GLOBALS['meta']["articles_texte"] = "non";

      Et le plus “gênant” dans un dossier /squelettes/inc , il faut copier le fichier /ecrire/inc/editer_article_texte et ajouter à la fonction editer_article_texte la condition comme suit :

      function editer_article_texte($texte, $config, $aider)
      {
      	if (($config['articles_texte'] == 'non') AND !$texte)
      		return '';

      Je n’ai pas encore trouvé comment surcharger uniquement la fonction.

    Reply to this message

  • 1

    remplacer

    if ($f = chercher_module_lang(’local_prive_fr.php’))

    par

    if ($f = chercher_module_lang(’local_prive_fr’))

    Reply to this message

  • 5

    J’ai créé 1 fichier local_fr et 1 fichier local_prive_fr puis personnalisé une rubrique. Mais dans l’espace privé rien n’a changé pour cette rubrique. Une idée ?

    Merci d’avance.

    • Bonjour,

      Tout d’abord, bien vérifier que les lignes suivantes figurent à la fin du fichier local_fr.php:

      if ($f = chercher_module_lang('local_prive_fr.php'))
      surcharger_langue($f);

      Cela permet de surcharger le fichier de langue par le fichier local_prive_fr.php.

      Ensuite dans le fichier local_prive_fr.php, il faut sélectionner le secteur pour lequel on désire personnaliser les champs. cela se fait à la ligne:
      if ($id_sect=='21') {. (Remplacer 21 par le secteur concerné dans votre cas).

      Pour finir, les champs indiqués dans la contrib ne concernent que les articles. Pour les rubriques ou brèves il faut lesrechercher dans les fichiers /ecrire/lang/ecrire_fr.php et /ecrire/lang/prive_fr.php.

      Enfin, les fichiers local_fr.php et local_prive_fr.php doivent être placés dans le dossier squelettes.

      J’espère que cela vous aidera. Sinon, il faudrait que je puisse voir vos fichiers local_fr et local_prive_fr

    • strictement le même problème et j’ai bien mis toutes les lignes.

      J’ai tout essayé : mettre les 2 fichiers dans squelettes/lang dans squelettes, à la racine etc etc ... le fichier local_prive_fr.php n’est pas trouvé.

      PS :
      si je met le contenu de local_prive_fr.php à la place du contenu local_fr.php cela marche, j’ai donc pas un pb de numéro de rubrique mal géré etc mais bon j’ai plus mes alias de local_fr...

    • Bonjour,

      Tout d’abord quelle version de SPIP utilisez-vous?
      Moi je suis sous SPIP 1.9.1

      Un premier test à faire:
      Dans local_fr.php, remplacer les lignes:

      if ($f = chercher_module_lang('local_prive_fr'))
      surcharger_langue($f);

      par

      if ($f = chercher_module_lang('local_prive_fr'))
      var_dump($f);
      surcharger_langue($f);

      Aller ensuite sur votre site avec votre navigateur. En haut de la page devrait s’afficher quelque chose comme:
      string(32) “../squelettes/local_prive_fr.php”

      Est-ce le cas?

    • Je suis en spip 1.9.1

      avec le dump j’ai trouvé le pb

      // On détermine ensuite à quel secteur appartient le rubrique ou l'article:
      
      if ($id_art == ''){
      $row = spip_fetch_array(spip_query("SELECT id_secteur FROM spip_rubriques WHERE id_rubrique=$id_rub"));
      $id_sect  = $row['id_secteur'];
      }
      if ($id_rub == ''){
      $row = spip_fetch_array(spip_query("SELECT id_secteur FROM spip_articles WHERE id_article=$id_art"));
      $id_sect  = $row['id_secteur'];

      Si on rentre dans l’espace prive par une rubrique ou un article
      ... cela marche si on rentre par la page d’accueil sans être dans une rubrique ou un article... on plante sur les requêtes. Comme ça cela marche

      if (($id_art == '') AND ($id_rub!="")){
       $row = spip_fetch_array(spip_query("SELECT id_secteur FROM spip_rubriques WHERE id_rubrique=$id_rub"));
       $id_sect  = $row['id_secteur'];
      }
      
      if (($id_rub == '') AND ($id_art != '')){
        $row = spip_fetch_array(spip_query("SELECT id_secteur FROM spip_articles WHERE id_article=$id_art"));
        $id_sect  = $row['id_secteur'];
      }

      merci beaucoup pour cette superbe idée.

    • J’aurai aimé travailler avec des mots clés mais j’ai trés peur des admin restreint qui pourraient bricoler ..

    Reply to this message

  • Très utile. Bravo, et merci d’avoir pris le temps de partager ça.

    Reply to this message

Comment on this article

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