Tutoriel : afficher / cacher tyniMCE selon le champs

Information importante

En raison d'un grand nombre d'inscriptions de spammers sur notre site, polluant sans relache notre forum, nous suspendons la création de compte via le formulaire de "sign up".

Il est néanmoins toujours possible de devenir adhérent•e en faisant la demande sur cette page, rubrique "Inscription" : https://www.drupal.fr/contact


De plus, le forum est désormais "interdit en écriture". Il n'est plus autorisé d'y écrire un sujet/billet/commentaire.

Pour contacter la communauté, merci de rejoindre le slack "drupalfrance".

Si vous voulez contacter le bureau de l'association, utilisez le formulaire disponible ici, ou envoyez-nous un DM sur twitter.

Bonjour,

Voici une petite explication pour cacher ou afficher tyniMCE au champ prêt et non se contenter d'un affichage sur TOUS les champs d'une page.

Je m'en inspire d'un tutoriel sur le site anglais :
http://drupal.org/node/179462

et de l'aide de Bes' et Webastien sur l'IRC.

La première des choses à faire est d'installer TyniMCE et de le configurer (autoriser un rôle / définir la visibilité ...). Je vous passe les étapes... voici un screencast (en anglais) : https://drupal.org/node/228270

Imaginons maintenant que vous avez un formulaire d'au moins deux champs texte créé avec CCK et TinyMCE s'affiche sur toutes les deux champs (c'est ce qui doit se passer par défaut).

Notre but est d'en enlever tinyMCE sur un des champs... et de le laisser sur autre. Pour le moment, il n'est pas possible de le faire via la configuration de TinyMCE.

Ainsi, je vous propose une solution qui consiste à retoucher la fonction thème :

  • ouvrir dans le fichier du module TinyMCE avec nodepad++ (par exemple) "tinymce.module"

  • Rechercher dans le fichier la fonction :
    "function theme_tinymce_theme($init, $textarea_name, $theme_name, $is_running)" (sans les guillemets !)

  • Copier la fonction en entier. Attention à bien s'arrêter au bon endroit. La fin ressemble à sa :

      // Always return $init
      return $init;
    }
  • Coller cette fonction à la fin de votre fichier template.php qui se trouve dans votre thème. N'oublier pas de la commenter pour la séparer des autres et ne pas vous perdre dans le code.

  • La partie à modifier se situe dans la première partie :

    function phptemplate_tinymce_theme($init, $textarea_name, $theme_name, $is_running) {
      switch ($textarea_name) {
        // Disable tinymce for these textareas
        case 'log': // book and page log
        case 'img_assist_pages':
        case 'caption': // signature
        case 'pages':
        case 'access_pages': //TinyMCE profile settings.
        case 'user_mail_welcome_body': // user config settings
        case 'user_mail_approval_body': // user config settings
        case 'user_mail_pass_body': // user config settings
        case 'synonyms': // taxonomy terms
        case 'description': // taxonomy terms
          unset($init);
          break;

Vous avez du remarquer le commentaire "//Disable tinymce for these textareas" qui signifit "arrêter tinymce pour ces champs textes. Il va falloir donc ajouter nos exceptions sous "case 'description': // taxonomy terms"

Cependant pour trouver la mention qu'il y a entre les guillemets, il faut trouver l'ID du champs. Pour celà je vous invite à utiliser Firebug, un plugin de firefox quasi indispensable pour personnaliser Drupal (selon moi)...

  • avec Firebug, utiliser le mode "inspect" et survoler le formulaire choisit. Relever son ID ... et vous aurez un nom du type : "edit-field-article-0-value" qu'il faut copier.

  • collet cette mention et supprimer la partie "edit-" de l'ID comme suit à la suite des "case 'blabla' :" comme suit :
    case 'field-article-0-value': // formulaire article blog

Ainsi le code final sera :

function phptemplate_tinymce_theme($init, $textarea_name, $theme_name, $is_running) {
  switch ($textarea_name) {
    // Disable tinymce for these textareas
    case 'log': // book and page log
    case 'img_assist_pages':
    case 'caption': // signature
    case 'pages':
    case 'access_pages': //TinyMCE profile settings.
    case 'user_mail_welcome_body': // user config settings
    case 'user_mail_approval_body': // user config settings
    case 'user_mail_pass_body': // user config settings
    case 'synonyms': // taxonomy terms
    case 'description': // taxonomy terms
    case 'field-article-0-value': // formulaire article blog
      unset($init);
      break;

Notez que cette partie de code n'est qu'une partie de la fonction à mettre dans le template.php de votre thème. En effet, c'est la seule à modifier.

Cordialement,

Martin

Version de Drupal : 

Sympa de partager :)
Je complète juste un peu pour une approche plus technique...

La valeur de $textarea à mettre dans un "case" est déduite par tinyMCE comme suit :

<?php
// Fichier tinymce/tinymce.module

function tinymce_process_textarea($element) {

  (...)

 
$textarea_name = substr($element['#id'], strpos($element['#id'], '-') + 1);

  (...)
}
?>

Donc pour le dire en français, tinyMCE prend l'attribut #id de l'élément du fAPI ( http://api.drupal.org/?q=api/file/developer/topics/forms_api_reference.h... ) à partir du premier tiret.

Vous pouvez par exemple déduire cette clef en faisant un print_r($form) dans un form_alter.

Une méthode propre et pratique est d'utiliser l'excellent module devel (http://drupal.org/project/devel) en activant l'option "Display form element keys and weights".

Vous verrez alors 2 informations à côté de vos champs de formulaire : la clef (key) et le poids (weight).

Concernant le fonctionnement de cette fonction de thème, bien que le module même utilise unset($init), il est plus propre de retourner un tableau vide car le test est fait comme suit :

<?php
   
if (count($init) < 1) {
      return
$element;
    }
?>

Donc pour ne pas afficher tinyMCE sur le textarea en question, faites donc "return array();".

Remarque :
On peut se servir de cette fonction pour une autre raison : changer la configuration du RTE sur cette textarea.
Pour celà, on modifie l'élément $init qui est un tableau PHP (construit par la function "tinymce_config").

On peut enlever une option en utilisant unset($init['optionkey']).
"optionkey" étant le nom de celle-ci.

Au contraire, pour en ajouter :
$init['optionkey'] = array('param1', 'param2', ...);

Reportez vous au fichier "plugin_reg.php" pour connaitre les paramètres.

Edit :
Suite à relecture par martin87, le terme "RTE" n'est pas forcément évident pour tous.

RTE = Rich Text Editor, c'est à dire un éditeur de texte amélioré, ici tinyMCE

Si besoin d'autre complément d'infos...