J'avais besoin d'avoir des boutons pour insérer des balises dans un champ html de type raw.

L'idée était de de publier automatiquement un article lors d'un traitement par tâche automatique (CRON).

Le texte de l'article devant être defini dans la configuration du composant, avec des balises de contenu, qui à l’exécution doivent être substituées par des informations liées au traitement en cours.

Pour les contenu de l'article, pas de problème, j'utilise donc un champ de type "editor", en y supprimant tous les boutons (plugin editors-xtd) sauf ceux de mon plugin d'insertion des balises.

Mais pour le titre de l'article, je cherchais un champ de type text avec possibilité d'avoir les boutons de mon plugin actif.

J'ai donc été amené à étudier le fonctionnement du champ editor.

En fait le champ editor est un extension du champ textarea.

Je me suis vitre rendu compte, qu'il ne me serai pas nécessaire développer un champ spécifique basé sur la champ text.

D'abord une routine dans mon plugin system (ou content) qui lors de la préparation des champs editor en question supprimerait tous les autres plugins.

On intercepte donc l'évènement onContentPrepareForm, on vérifie que le composant en cours est bien 'com_config' et que celuin en cours de configuration est bien le bon (variable d'URL 'component') :

On crée un tableau de tous les plugins de type editors-xtd actif (recherche de tous les champs 'element' de la table  #__extensions ayant  le champ folder = 'editor-xtd' et enabled = 1)

Un truc de ce genre :

$editor_buttons = GskiGeneralHelper::getEditorButtons();

Avec la fonction qui va bien

public static function getEditorButtons(){
 $app = JFactory::getApplication();
 if($buttons = $app->getUserState('gski.editor-xtd.buttons',false)){
  return $buttons;
 }
  $db = JFactory::getDbo();
  // Build the query.
 $query = $db->getQuery(true)
  ->select('element')
   ->from('#__extensions')
   ->where('folder = ' . $db->quote('editors-xtd'))
  ->where('enabled = 1');
  $db->setQuery($query);
 $buttons = $db->loadColumn();
 $app->setUserState('gski.editor-xtd.buttons',$buttons);
 return $buttons;
}

  Ensuite on retire notre plugin

if($i1 = array_search('gskikeyword',$editor_buttons)){
 unset($editor_buttons[$i1]);
}

Et on modifie les 3 champ du formulaire de configuration (définis dans config.xml) pour n'afficher que les boutons de notre plugin editors-xtd

$fields_name = array('listes_pts_info_msg_titre','listes_pts_info_msg_contenu','listes_pts_info_msg_contenu_clt');
$buttons = implode($editor_buttons,',');
foreach ($fields_name as $name) {
 $form->setFieldAttribute($name,'buttons','true');
 $form->setFieldAttribute($name,'hide',$buttons);
}

Le formulaire etant la première variable recue par la methode onContentPreprareForm du plugin system (dans mon cas)

public function onContentPrepareForm(JForm $form, $data)

Pour le titre, afin d'avoir un champ "raw", il suffira de dire dans le paramètre du champ editor que l'on ne veut pas d’éditeur.

Auquel cas notre éditeur sera en fait comme un champ textarea.

Donc dans la configuration du formulaire (dans mon cas dans le config.xml du composant), on ajoutera la balise editor="none" :

<field name="listesptsinfomsgtitre" type="editor" height="30px"
 label="COMGSKITITRESCONFIGLISTESPTSINFOMSGTITRELABEL"
 description="COMGSKITITRESCONFIGLISTESPTSINFOMSGTITREDESC"
 class="control-group gski-editor"
 buttons="false"
 filter="JComponentHelper::filterText"
 editor="none"
 default=""
 showon="listesptsinfo:1">
</field>

Références (fichiers) des principales classes utilisées par le champ editor :

  • /libraries/src/Form/Field/EditorField.php
  • /libraries/joomla/orm/fields/textarea.php (classe mère de la précedente)
  • /librairies/src/Form/Form.php
  • /libraries/src/Editor/Editor.php