Étendre le formulaire de paramétrage d'un type de contenu Drupal

Il peut arriver, pour milles et une raisons, d'avoir à étendre le formulaire de configuration d'un type de contenu de sorte à ajouter des réglages qui lui sont spécifiques. Les cas d'usages sont nombreux et dépendent des projets, mais on peut par exemple imaginer un champ "responsable" qui permet de sélectionner un utilisateur Drupal en charge des contenus d'un type donné. Je n'ai pas dit que l'exemple serait intelligent ;-)

Comme toute modification de formulaire, l'histoire commence par l'implémentation du hook_form_alter en le ciblant spécifiquement le formulaire de paramétrage d'un type de contenu.

function artefact_form_alter(&$form, &$form_state, $form_id) {
  if ($form_id == 'node_type_form') {
    // Ajouts ici
  }
}
Implémentation du hook_form_alter en ciblant les formulaires de type de contenu
Le champ $form['#node_type']->type contenant le nom machine du type de contenu, il serait possible d'être encore plus spécifique en ciblant un ou plusieurs types de contenu.

La seconde étape consiste à ajouter un fieldset supplémentaire (responsable) au formulaire contenant les réglages à ajouter au type de contenu.

$form['responsable'] = array(
    '#type' => 'fieldset',
    '#title' => t('Person in charge of this content type'),
    '#collapsible' => TRUE,
    '#collapsed' => TRUE
);      
$form['responsable']['responsable_user'] = array(
'#type' => 'textfield',
'#title' => t('Drupal user'),
'#maxlength' => 60,
'#autocomplete_path' => 'user/autocomplete',
'#description' => t('Leave blank for %anonymous.', array('%anonymous' => variable_get('anonymous', t('Anonymous'))))
);
Ajout du fieldset et du champ 'responsable'

Cela nous permet de voir au passage comme mettre en place un champ de type 'utilisateur' avec autocomplétion sans avoir rien à coder.

Tout ceci est très bien car dés que le module où vous aurez implémenté ce hook_form_alter est activé, tous les formulaires d'édition de type de contenu dispose maintenant du fieldset. Ceci dit se pose un petit problème. En effet, nous n'avons pas défini de #submit et nous n'avons donc pas stocké ce qui aura été choisi dans ce formulaire.

En réalité c'est faux. Drupal a une manière bien à lui de gérer les champs supplémentaires ainsi ajoutés, en stockant leur contenu dans la table variables (comme l'aurait fait un variable_set). Ainsi le nom de l'utilisateur choisi est disponible dans une variable nommé [NOM_DU_CHAMP]_[TYPE_DU_CONTENU]. Si nous avons modifié le type de contenu 'article_papier' pour lui assigner un responsable, il sera accessible simplement par variable_get('responsable_article_papier').

Sachant cela, nous pouvons rajouter à notre champ une valeur par défaut :

$form['responsable']['responsable_user'] = array(
'#type' => 'textfield',
'#title' => t('Drupal user'),
'#default_value'=>variable_get("responsable_".$form['#node_type']->type, '),
'
#maxlength' => 60,
'#autocomplete_path' => 'user/autocomplete',
'#description' => t('Leave blank for %anonymous.', array('%anonymous' => variable_get('anonymous', t('Anonymous'))))
);
Ajout d'une valeur par défaut au champ 'responsable'

Et voilà, c'est terminé.

Vus : 715
Publié par arNuméral : 54