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

Notes

[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)

Discussion

35 discussions

  • 1
    joachim109

    Peut -on utiliser cette contrib pour afficher ou non les champs extra ?
    voir meme choisir quels champs extra afficher ?

    j’ai essayer tout betement

    $GLOBALS['meta']["articles_extra"] = "non";

    mais bien sur ca ne marche pas...

    • Je suis intéressé par ce principe, mais pour l’utiliser en SPIP 3.2 et SPIP 4.1.

      Cela a t’il un équivalent pour les SPIP récents ?

    Répondre à ce message

  • Je n’ai pas réussi à la faire marcher avec SPIP3 :/

    Répondre à ce message

  • 1

    salute, dans le cas de l’édition dans l’espace public, est il possible restreindre l’affichage des champs ? La surcharge de l’intitulé des champs fonctionne mais pas la restriction ?

    Répondre à ce message

  • 4
    robomatix

    Avec un spip 1.9.2d sous php5 j’obtenais deux fois le message d’erreur :
    Warning : array_merge() [function.array-merge] : Argument #1 is not an array in /homez.193/multisce/www/ecrire/inc/traduire.php on line 69...
    En fait, la fonction array_merge ne fonctionne plus de la même façon sous php4 que php5...

    Pour y remédier, j’ai modifier les lignes 67 et 68 du fichier ecrire/inc/traduire :

    			(array)$GLOBALS[$idx_lang_normal],
    			(array)$GLOBALS[$idx_lang_surcharge]

    Est ce que quelqu’un a une idée pour ne pas modifier le noyau et faire une modif qui marche sur les fichiers contenu dans squelettes/lang ?

    • j’ai le même problème sous 2.1 ... et si je modifis comme tu le fais les ligne 66 67 j’ai carrément un plantage de l’admin :/

      Quelqun aurait une solution ?

    • Ah c’était les ligne 74 75 en fait je suis bête :)

    • En revanche si je n’ai plus d’erreur en remplaçant ces lignes... je me retrouve sans gestion des langues :/
      En dessou de l’icone edition j’ai par exemple ’lintitulé : « icone édition » au lieue de la traduction « édition ».
      Si quelqun comprenant le PHP passe par là ...

    • Je relance la question pour la version 2.1 le choix des champ à afficher marche bien, mais pour spécifier l’intitulé de chacun, cela ne marche pas.

    Répondre à ce message

  • 1

    Je suis confronté à une problématique proche, moins complexe, mais je n’arrive néanmoins pas à trouver de solution...
    Je travaille sur un Spip 2-1-2. J’utilise le plug-in champs extras pour ma rubrique 16.

    Je souhaiterais, pour cette même rubrique 16, masquer les champs standards qui ne me sont pas utiles (mais qui me servent dans les autres rubriques). Par exemple, masquer le surtitre et le sous-titre. Quelque chose qui s’apparenterait à :

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

    Mais je ne sais pas où placer ce code et faire en sorte que ça marche. Peut-être qu’il manque autre chose ?
    Quelqu’un peut m’aider ?

    • Alors, je me réponds à moi-même...
      Ça pourra peut-être servir à d’autres.

      J’ai trouvé la réponse dans le commentaire de Joachim109 du 6 mars 2009 à 17:55.

      J’ai donc :
      -  créé un fichier local_fr.php qui contient ce code :

      <?php
      // This is a SPIP language file  --  Ceci est un fichier langue de SPIP
      
      // ESPACE PUBLIC
      
      if ($f = chercher_module_lang('local_prive_fr'))
      surcharger_langue($f);
      
      ?>

      Puis, j’ai créé un fichier local_prive_fr.php (comme indiqué dans cette contrib, donc) qui contient le code :

      <?php
      
      $id_art = $_GET['id_article'];
      $id_rub = $_GET['id_rubrique'];
      
      if (($id_rub == '') and ($id_art != '')) {
      $row = spip_fetch_array(spip_query("SELECT id_rubrique FROM spip_articles WHERE id_article=$id_art"));
      $id_rub  = $row['id_rubrique'];
      }
      
      // On peut maintenant personnaliser l'affichage 
      // de l'article à modifier
      // en fonction du secteur auquel il appartient:
      
      
      // Espace privé: Annuaire
      
      if ($id_rub=='16') {
      // On choisit quels champs afficher:
      $GLOBALS['meta']["articles_surtitre"] = "non";
      $GLOBALS['meta']["articles_titre"] = "oui";
      $GLOBALS['meta']["articles_soustitre"] = "non";
      $GLOBALS['meta']["articles_descriptif"] = "non";
      $GLOBALS['meta']["articles_chapeau"] = "non";
      $GLOBALS['meta']["articles_ps"] = "non";
      $GLOBALS['meta']["articles_redac"] = "non";
      $GLOBALS['meta']["articles_urlref"] = "non";
      }
      ?>

      Cela fonctionne comme je voulais, et j’en suis ravi !

    Répondre à ce message

  • Et ça marche toujours sur un spip 2.1.2 ... qu’on se le dise (et éventuellement, qu’on modifie les compatibilités mentionnés sur cet article)

    Répondre à ce message

  • 3

    Je crois qu’il ne manque que cette fonction intégré a spip ou en plugin pour le rendre vraiment parfait. Je suis persuadé qu’un plug de la sorte serait une véritable avancée pour spip. Hélas je n’ai aucun talent de développeur.

    • Champs Extras 2 répondre à ton besoin surement.

    • Champs Extras 2, je pensais qu’il permettait uniquement de rajouter des champs personnalisés mais pas de modifier (par rubriques ou non) les intitulés des champs de saisies « titres » « surtitres » « soustitres » « chapeau » ’descriptif" etc...
      Je vais vérifier quand même ...

      Merci pour ta réponse

    • Il ne me semble pas que champ extra 2 permette de modifier le descriptif des champs de base.
      C’est clair ce serait un gros plus. Mais bon on peux déjà faire pas mal avec tout ce qu’on à :)...
      Merci à tous ceux qui contribuent !.

    Répondre à ce message

  • Arnaud

    Merci pour ces infos fort utiles.
    En suivant cette méthode :
    ’icone_ecrire_article’ => ’Créer une nouvelle publi’,
    j’essaye de personnaliser le bouton « créer une sous-rubrique »
    ’icone_ecrire_sous_rubriques’ => ’Ajouter un nouveau label’,
    mais sans succès…merci d’avance pour un éclaircissement à ce sujet.
    De la même manière comment puis-je afficher (ou plutôt restreindre l’affichage) des boutons « écrire une nouvelle brève » ou « référencer un site » dans une rubrique où je sais que ça ne sera pas utile.
    Sous Spip 2…

    merci d’avance et merci beaucoup pour cette contrib.

    Répondre à ce message

  • Cécile

    Bonjour

    Après avoir suivi les explications, tout marche très bien si je suis connectée en tant qu’administrateur. Par contre, si je suis connectée en tant que rédacteur, certains champs n’apparaissent pas (surtitre, PS ...), est ce normal et il y a t-il un moyen de remédier à cela ? (j’ai essayé le plugin autorité mais je n’y arrives pas non plus)
    Merci pour votre aide

    Répondre à ce message

  • joachim109

    Sous SPIP 2 Cela marche très bien pour la création de nouveaux articles. Merci.

    Par contre, lorsqu’on clique sur « modifier cet article », la configuration et les noms de champs reviennent comme avant...
    Une idée de comment changer ca ?

    Merci

    EDIT : J’ai trouvé la réponse :
    -  j’utilisais une personalisation par rubrique
    et non par secteur comme dans l’exemple.
    -  il fallait donc changer un peu le code pour obtenir l’id_rubrique correspondant à l’article :

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

    Répondre à ce message

  • vanessa

    Je me réponds à moi même, j’ai trouvé :
    ’info_post_scriptum’

    Répondre à ce message

  • vanessa

    Bonjour et merci pour cette contrib !!
    Je suis sur spip 205 et je n’arrive pas à personnaliser le champs ’PS’.

    Dans local_prive_fr.php j’ai bien fait choisir le champs ps a faire apparaitre :

    $GLOBALS[’meta’][« articles_ps »] = « oui » ;

    donc là pas de souci, il apparait bien mais, n’étant pas une experte du php, je n’arrive pas à le renommer... J’ai essayé plusieurs écriture sans succès du style :

    ’texte_post-scriptum’ => ’tarifs, contact’,

    Quelle est la bonne écriture ? Merci pour votre aide !!

    Répondre à ce message

  • Bon, le mieux que j’ai pu faire pour spip 2.0, c’est la modif suivante

    $id_art = _request('id_article');
    $id_rub = _request('id_rubrique');
    
    // On détermine ensuite à quel secteur appartient la rubrique ou l'article:
    
    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'];
    }

    ça élimine tout les problèmes de logs intempestif évoqués par ailleurs, et ça fonctionne à merveille.

    Seul truc que je n’ai pas réussi à adapter à partir de la tentative de matthieu marcillaud, c’est la mise au norme des spip_fetch_array/spip_query à la sauce 2.0. Page blanche quoi qu’il arrive. En attendant un connaisseur, c’est tout de même parfaitement fonctionnel en l’état.

    Luc.

    Répondre à ce message

  • 2

    Juste une note pour la V2 (je n’ai absolument pas testé) : en voyant le code proposé, je vois que les requetes SQL ne sont pas adaptées à SPIP 2 et n’utilisent pas les fonctions sql_*(). Voici (sans vérifier) les modifications à apporter :

    Original

    <?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'];
    }

    Pour SPIP 2.0 :

    <?php
    $id_article = _request('id_article');
    $id_rubrique = _request('id_rubrique');
    
    if ($id_rubrique = intval($id_rubrique)) {
        $id_sect = sql_getfetsel('id_secteur','spip_rubriques','id_rubrique='.$id_rubrique);
    } 
    elseif ($id_article = intval($id_article)) {
        $id_sect = sql_getfetsel('id_secteur','spip_articles','id_article='.$id_article);
    }
    • Hello,

      Les lignes 2 et 3 marchent. En activant les autres lignes, on arrive sur une page blanche.

      Désolé, je n’ai pas pu mener le debuggage plus loin.

      Cordialement
      P

    • en spip 2.03 la modif de mathieu donne une page blanche, non ?

    Répondre à ce message

  • 1

    Je l’ai déjà dit, mais contrib’ ultra pratique. D’autant plus qu’elle marche impeccablement en version 2.0

    • Elle marche impeccablement oui, mais regardez vos fichier /tmp/spip.log, en l’état ça génère de nombreuses requêtes erronées, comme par exemple pour la compilation des squelettes mots ou plutôt des squelettes sans contexte de rubriques et/ou d’articles. C’est sans conséquence visible, mais que de log et de requête générée pour rien.

      ça ne demande qu’à s’arranger, si quelqu’un a une piste propre, il faudra mettre à jour cette contrib’.

    Répondre à ce message

  • N’ayant pas d’ id_rubrique, la reconnaissance du secteur ne fonctionne pas,
    j’ai ajouté après la ligne 3

     if ($new = 'oui' AND $id_rub==''){ 
    $id_rub =  _request('id_parent');
    }

    et ça roule

    Répondre à ce message

  • 1
    Tropicaloo

    Bonjour,
    Quelqu’un a-t-il trouvé un moyen de personnaliser la version SPIP 2.0 ?
    J’ai essayé d’adapter le code à la v2 mais sans succès... :-(

    • Tropicaloo

      Merci Sébastien pour les précisions sur la V2. Vraiment super ta contrib !

    Répondre à ce message

  • Bonjour, aprés avoir lu les posts, et n’ayant pas trouvé mon info, j’aurai voulu savoir s’il existe une maniére pour interdire aux admins restreint l’accés aux plugins ?

    Du genre qu’il ne puisse modifier des tables ou formulaires, des abonnés aux lettres etc ....

    Qu’ils ne puissent se contenter que d’écrire des articles dans des rubriques bien à eux.

    Merci

    Cordialement

    Répondre à ce message

  • 1

    j’ai trouvé une parade qui marche avec la version SPIP 1.9.2d, pour le choix des champs à afficher.

    il suffit de mettre les deux lignes :

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

    dans ecrire/ecrire_fr.php, plutôt que dans local_fr.php.

    pas très propre, mais ça marche.

    • Après coup, la modif pour Spip 1.9.2d est bien plus simple.

      les fichiers de langue personnalisées sont à mettre dans un sous répertoire /lang du dossier squelettes.

      là c’est propre.

    Répondre à ce message

  • Bonjour
    merci pour ces infos.
    Est-il possible de créer une liste de choix pour le titre par exemple, avec trois valeurs possible ( maths, physique, chimie par exemple) ?
    merci d’avance

    Répondre à ce message

  • Bonsoir
    j’ai spip 1.9.2.d et je ne trouve pas le fichier lang_privé. Est-il nommé autrement ?
    d’avance merci

    Répondre à ce message

  • Ce serait vraiment bien qu’il y est un plugin. Ne connaissant pas le php j’ai un peu peur de faire des erreurs.
    Merci pour ta contrib en tous cas. Elle est très utile et complète.

    Répondre à ce message

  • 1
    Dominique W

    Merci pour cette contrib, elle fonctionne toujours en 192b.

    je l’ai adapté pour la personnalisation par mots clefs attachés aux rubriques.

    <?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'];
    
    
    if (($id_art != '') and ($id_rub == '')) {
    	$row = spip_fetch_array(spip_query("SELECT id_rubrique FROM spip_articles WHERE id_article=$id_art"));
    	$id_rub  = $row['id_rubrique'];
    }
    // id du groupe de mots clefs dans lequel on veut les sélectionner
    $id_groupe_mot_cles = 2;
    
    if ($id_rub != '') {
    	$row = spip_fetch_array(spip_query("SELECT titre FROM spip_mots join spip_mots_rubriques on spip_mots.id_mot=spip_mots_rubriques.id_mot WHERE id_rubrique=$id_rub and id_groupe=$id_groupe_mot_cles"));
    	$titre  = $row['titre'];
    }
    
    // On peut maintenant personnaliser l'affichage de l'article à modifier
    // en fonction des mots clefs de la rubrique à laquelle il appartient
    
    if ($titre == 'actualites') {
    	// On choisit quels champs afficher:
    	$GLOBALS['meta']["articles_chapeau"] = 'oui';
    }
    ?>

    Il suffit de modifier la valeur de l’id du groupe de mots clés et ensuite de gérer comme dans les autres exemples ci-dessus la personnalisation.

    Remarque : il suffit en fait pour la personnalisation de ne redéfinir que ce qui doit être en plus ou en moins pas rapport aux réglages définis dans la configuration du site. Il n’est pas nécessaire de tout redéfinir. dans mon exemple, je veux juste le chapeau pour les articles des rubriques qui ont le mot clé « actualites ».

    • Renyon Paris

      Bonjour,

      Merci beaucoup pour ta contrib ! C’est exactement ce dont j’ai besoin. Mais j’ai testé chez moi et ça ne marche pas. Mes mot-clés sont composés et un comporte un accent.
      Peux-tu me dire si les accents, les majuscules, et mots composés d’un mot clés sont à écrire d’une façon spécifique dans le fichier local_prive_fr.php stp ?

      Merci d’avance pour ta réponse !

    Répondre à ce message

  • 3

    Je vins de passer à une SVN 1.9.3 et cette contrib ne semble plus marcher complètement. La personnalisation des textes est ok par contre, le choix des champs à afficher ou pas n’est plus active ?

    C’est donc dans ce bout de code que ça coince

    // Espace privé: Annuaire
    if ($id_sect=='21') {
    // On choisit quels champs afficher:
    $GLOBALS['meta']["articles_surtitre"] = "oui";

    Quelqu’un aurait une idée, pour rétablir la situation ?

    • En regardant les fichiers spip.log et mysql.log, je constate une foison de

      SELECT id_secteur FROM <span class="base64" title="PGNvZGUgY2xhc3M9InNwaXBfY29kZSBzcGlwX2NvZGVfaW5saW5lIiBkaXI9Imx0ciI+YmFzZV9zcGlwPC9jb2RlPg=="></span>.spip_rubriques WHERE id_rubrique=
      
      1064 Erreur de syntaxe près de '' à la ligne 1
      
      SELECT id_secteur FROM <span class="base64" title="PGNvZGUgY2xhc3M9InNwaXBfY29kZSBzcGlwX2NvZGVfaW5saW5lIiBkaXI9Imx0ciI+YmFzZV9zcGlwPC9jb2RlPg=="></span>.spip_articles WHERE id_article=
      
      1064 Erreur de syntaxe près de '' à la ligne 1

      Voilà, derrière cette erreur se cache à coup sûr mon problème. Si quelqu’un trouve avant moi, qu’il n’hésite pas à laisser un message ici.

    • Fausse piste, mais correction nécéssaire de cette contrib’ comme indiqué un peu plus bas dans le forum : http://www.spip-contrib.net/Personnaliser-les-champs-de-l#forum391158

      si on ne fait pas cette modif’, pour chaque page de l’espace privé ou public qui ne possède ni id_article, ni id_rubrique, spip fait une (ou plusieurs) requêtes inutiles et erronées (voir votre spip.log ou mysql.log pour vous en rendre compte).

      Bref, je ne sais toujours pas comment reconditionner l’affichage des champs :-(

    • Le conditionnement d’affichage des champs me manquait trop. Et comme je ne trouvais pas de solution au problème, j’ai bricolé une solution de dépannage, en attendant de savoir faire/prendre le temps d’un plugin pour gérer ça.

      Pour info, j’ai modifier le ecrire/inc/editer_article (et placer en surcharge dans le dossier squelettes) en passant $id_secteur à toutes les fonctions du genre editer_articles_surtitre (....) et dans ces fonctions je conditionne l’affichage dans le test :

      if (($config[’articles_surtitre_.$id_secteur] == ’non’) AND !$surtitre)

      il m’a ensuite fallu ajouter à la table spip_metas des enregistrements articles_surtitre_5 par exemple pour le secteur 5 avec une valeur à non.

      ça me dépanne en partie en attendant. Peut-être un jour je reviendrai sur quelque chose de plus propre.

    Répondre à ce message

  • petit ajout de code pour dire que l’on peut aussi avoir la modification des champs de spip a l’intérieur d’une rubrique et de ses sous-rubriques.

    il suffit d’avoir un truc comme ca :
    par exemple pour une rubrique de type annuaire, on aurait

    $rubriques_annuaire=array(95);
    
    
    
    if (!defined("_ECRIRE_INC_VERSION")) return;
    include_spip('base/db_mysql');
    
    function get_ss_rubriques($rubriques_parent){
    	if(is_array($rubriques_parent))
    	foreach ($rubriques_parent as $r) {
    		$tab_ss_rubriques[]=$r;
    
    		$temp=spip_mysql_array(spip_query("select id_rubrique from spip_rubriques where id_parent=".$r));
    		if($temp)
    			foreach ($temp as $t)
    			{
    				$tab_ss_rubriques[]=$t['id_rubrique'];
    				$tab_ss_rubriques=array_merge($tab_ss_rubriques,get_ss_rubriques(array($t['id_rubrique'])));
    			}
    	}
    
    return array_merge($rubriques_parent,$tab_ss_rubriques);
    }
    
    
    $rubriques_marches=array_unique(get_ss_rubriques($rubriques_marches));
    $rubriques_agenda=array_unique(get_ss_rubriques($rubriques_agenda));
    
    
    //récupération de l'id_rubrique sur l'édition de l'article
    if(!$id_rubrique)
    {	if($id_parent) $id_rubrique=$id_parent;
    	elseif($id_article){
    	$temp=spip_mysql_array(spip_query("select id_rubrique from spip_articles where id_article=".$id_article));
    	if($temp[0]['id_rubrique']) $id_rubrique=$temp[0]['id_rubrique'];}
    }
    
    
    
    //et ici on fait vraiment le test de l'id_rubrique:
    if(in_array($id_rubrique,$rubriques_annuaire){
    
    
    //la modif des textes et noms de champs 
    
    }

    Répondre à ce message

  • Bonjour,
    J’ai quelques soucis , il faut dans mon CMS que pour une rubrique(ici recette) que les articles contenu dans cette rubrique possede des champs pré-rempli du genre : Entrée / Plat / Dessert : permettant au rédacteur de tapé simplement le menu sans besoin de retapé Entrée / Plat / Dessert à chaque rédaction de nouvel article. Je pense que cette contrib est la solution mais je comprend pas tout vus que je débute en spip.
    Les deux fichiers doivent se mettre dans le répertoire squelettes ou /ecrire/lang ou /squelettes/lang ??
    Et comment moditons ces deux fichiers ? ma rubrique recette est 34 et l’article 103, je dois mettre les champs :
    ->Entrée :
    ->Plat :
    ->Dessert :
    ->Intitulée :
    ->Ingrédients :
    ->Explication :
    ->Commentaires :

    ça fé plusieurs semaines que je galere à trouver la solution si vous pouviez m’aider , merci d’avance.

    Répondre à ce message

  • Tropicaloo

    Bonjour,

    Voici un retour sur le fonctionnement que j’ai sur 1.9.2a [8878] avec des secteurs ET des rubriques :

    Secteurs (rubriques racines) :
    -  page 1 édition de l’article (surtitre-titre-soustitre-descriptif-etc...) > OK
    -  page 2 édition de l’article (dates-auteurs-mots-clé) > OK
    -  page édition du secteur (rubrique racine) > OK

    Rubriques (sous-rubriques) :
    -  page 1 édition de l’article (surtitre-titre-soustitre-descriptif-etc...) > OK
    -  page 2 édition de l’article (dates-auteurs-mots-clé) > KO
    -  page édition de la rubrique (sous-rubrique) > OK

    Pour la page d’édition 2 d’un article appartenant à une rubrique (sous-rubrique), c’est le contexte du secteur qui s’affiche en lieu et place de celui de la rubrique. La variable « secteur » est récupérée mais pas celle de la « rubrique ».

    Si quelqu’un a une proposition sur ce point, je suis preneur !

    Répondre à ce message

  • 3
    Tropicaloo

    Bonjour,

    Sur 1.9.2a [8878]
    En faisant un simple copier-coller du local_prive_fr.php (en modifiant bien sur les numéros des id des rubriques), j’ai un message d’erreur :

    Parse error : parse error in c :\program files\easyphp1-8\www\monsite\squelettes\local_prive_fr.php on line 5

    Quelqu’un a-t-il une idée ?

    • idem
      idem (le deuxieme idem c pour le nombre limite de 10 caractères.... ;)
      mais sinon pareil !

    • Mea culpa !

      Il n’y a pas d’espace entre <? et php à la première ligne de local_prive_fr.php... C’est maintenant corrigé.

    • Tropicaloo

      Merci Sébastien

      Effectivement cela marche beaucoup mieux maintenant. Comme toi, je suis passé X fois devant cet espace sans le voir...
      Merci encore

    Répondre à ce message

  • 5

    Bonjour
    Bravo pour ces lignes de codes qui me sont bien ytiles.
    Cependant je bloque un peu car dans certains cas, avec les sous rubriques, je me retrouve bloqué car le fonctionnement des sous rubriques n’est pas forcément identique pour tout un secteur.
    Sauriez vous comment je pourrais faire la même chose mais en renseignant les URL des rubriques plutôt que les secteurs.
    Je souhaiterais en fait faire comme le système de squelette cad que si on a un fichier de langue renseigné pour la rubrique mère et pas pour les sous rub = même fichier langue pour tout. Sinon le fichier de chaque rubrique et sous rub passe en premier / celui de la rubrique mère.

    Je serais très reconnaissant si quelques bonnes âmes pouvaient m’aider ...
    Merci

    • Bonjour,

      Il suffit en fait après la definition du secteur de faire un test sur $id_rubrique :

      if ($id_sect=='21'){
      //definition des champs pour le secteur 21
      }
      
      if ($id_rub=='210'){
      //definition des champs pour la rubrique 210 appartenant au secteur 21
      }

      et de redéfinir les champs pour cette rubrique.

      En principe ça devrait marcher.

    • Merci de ta réponse, mais j’ai beau essayer, Je n’y arrive pas de la sorte !!
      J’ai essayé de faire quelque chose en fonction des id-parent mais je ne m’en sort pas non plus.
      La seule chose que j’ai réussi mais ça ne m’arrange pas du tout c’est de personnaliser en fonction de l’article en faisant :

      if ($id_sect==’21’ AND $id_art==’210’)
      // les variables

      Mais pas moyen pour les rubriques !!!! Je m’y recolle et vous tiens au courant ! mais quelle galère et j’ai si peu de temps devant moi ...

    • Bon je pense avoir trouvé une solution du moindre mal. Pas la solution idéal qui permettrait comme je le disais au début de faire ça en fonction des rubriques mères ou sous rub. Enfin !! quoi qu’à force d’essayer plein de trucs , ça se trouve ça fonctionnerais mais je crois pas. Donc ma solution pour le faire en fonction des rubriques et ne pas avoir à le faire pour CHAQUE rub :

      // 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_parent FROM spip_rubriques WHERE id_rubrique=$id_rub"));
      $id_sect  = $row['id_parent'];
      }
      if ($id_rub == ''){
      $row = spip_fetch_array(spip_query("SELECT id_rubrique FROM spip_articles WHERE id_article=$id_art"));
      $id_sect  = $row['id_rubrique'];
      }
      
      // On peut maintenant personnaliser l'affichage 
      //de l'article à modifier
      // en fonction de la rubrique à laquelle il appartient:
      
      // Plusieurs rubriques avec champs similaires 
      
      if ($id_sect=='61' || $id_sect=='62' || $id_sect=='64' || $id_sect=='65') {
      // On choisit quels champs afficher:
      $GLOBALS['meta']["articles_surtitre"] = "oui";
      $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";
      
      // ... et le texte de ces champs
      $GLOBALS[$GLOBALS['idx_lang']] = array(
      'texte_sur_titre' => '<B>66666666 Titre de la page</B> (dans la barre bleue du navigateur - facultatif)',
      'info_nouvel_article' => 'Titre',
      'texte_titre_obligatoire' => '<B>Titre de l\'article</B> (obligatoire)',
      'texte_descriptif_rapide' => 'Email et/ou Site Web du prestataire',
      'texte_sous_titre' => '<B>Pr&eacute;nom</B>',
      'entree_liens_sites' => '<B>Nom du site</B> (facultatif)',
      'info_titre' => ' ',
      'info_url' => '<B>Lien vers le site du Parc (adresse)</B>',
      'texte_introductif_article' => 'Description de l\'article',
      
      ); }
    • Sébastien Zamith

      Bonjour,

      Je ne comprends pas trop le pb.

      J’ai fait chez moi le test suivant :

      -  Rubrique à la racine : Test (id_rubrique = 280)

      Sous-rubrique : Test1 (id_rubrique=281)

      Sous-rubrique : Test2 (id_rubrique=282)

      Sous-rubrique de Test1 : Test11 (id_rubrique=283)

      Ensuite j’ai mis les conditions suivantes :

      // Espace privé test
      
      if ($id_sect=='280') {
      $GLOBALS['meta']["articles_surtitre"] = "non";
      
      $GLOBALS[$GLOBALS['idx_lang']] = array(
      
      'info_nouvel_article' => 'Test sur secteur',
      'icone_modifier_article' => 'Modifier ce test sur secteur',
      'icone_ecrire_article' => 'Cr&eacute;er un nouveau test sur secteur'
      
      );
      }
      
      if ($id_rub=='281') {
      $GLOBALS['meta']["articles_surtitre"] = "non";
      
      $GLOBALS[$GLOBALS['idx_lang']] = array(
      
      'info_nouvel_article' => 'Test sur rub',
      'icone_modifier_article' => 'Modifier ce test sur rub',
      'icone_ecrire_article' => 'Cr&eacute;er un nouveau test sur rub'
      );
      }

      Avec ça, lorsque je vais dans la rubrique Test1, j’ai bien le texte « test sur rub » qui apparait pour les articles, tandis que sous n’importe quelle autre sous rubrique de Test (y compris dans Test11), j’ai bien le texte « test sur secteur » qui apparait pour les articles.

      Bien sûr il faut tester l’id_rubrique après l’id_secteur si on désire personnaliser seulement une rubrique d’un secteur donné.

      Sébastien

    • J’ai retenté de la sorte et ça ne fonctionne pas chez moi !!! Je ne sais pas du tout comment ça se fait !! c’est très étrange ...
      En tous cas merci de t’être penché sur mon cas ;)

      Je vais faire comme je l’ai écris plus haut et je retesterais plus tard sur un autre site.

    Répondre à ce message

  • bonjour !

    J’ai une suggestion, mais je ne sais pas ou le poster !! excusez moi donc si je ne suis pas à la bonne page ! Je viens du monde Drupal et j’aimerais faire profiter mon experience en tant que developpeur web confirmé.

    Ma proposition concerne l’espace privé de SPIP. Est ce qu’il ne serait pas préférable de deplacer une partie du repertoire « ecrire » pour en faire un plugin ?

    Avantages :
    - plus de lisibilité du fonctionnement de SPIP
    - plus de modularité (le systeme de plugin est une très bonne chose. merci !)
    - le developpement de chaque partie devient independant : la partie edition
    peut evoluer de maniere different que la partie statistiques par exemple

    Vos points de vue la dessus seraient la bienvenue !

    Tous pour que SPIP devienne toujours plus fort !!!!

    Répondre à ce message

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

    Répondre à ce 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.

    Répondre à ce message

  • 1

    remplacer

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

    par

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

    Répondre à ce 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 ..

    Répondre à ce message

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

    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