Ajouter un onglet en bas de la page d'édition d'un node

En bas des pages d'édition des nodes sur Drupal, on a un certain nombre de paramètres que l'on peut régler. Voici comment faire pour en ajouter un pour les besoins de vos modules customs grace à l'aide de hook_form_alter() et de hook_node_update(). Et  bien sur la FORM api.

exemple de vertical-tab

Ajouter l'onglet

Il faut pour cela utiliser hook_form_alter(). Ce hook permet de modifier nimporte quelle formulaire. Grace à une condition (if), nous allons séléctionner le formulaire d'édition des noeuds :

function nommodule_form_alter(&$form, $form_state, $form_id) {
  if (isset($form['#node']) && $form['#node']->type . '_node_form' == $form_id) {

    //code de modification du formulaire

 }
}

Les onglets verticaux de bas de page sont dans la variables $form dans un groupe intitulé 'additional_settings'.
Pour en ajouter un, il vous faut ajouter un élément de type fieldset attribué à ce groupe. Notre code devient :

function nommodule_custom_mail_form_alter(&$form, $form_state, $form_id) {
  if (isset($form['#node']) && $form['#node']->type . '_node_form' == $form_id) {
    // Define field set in additional settings group
    $form['mailing'] = array(
      '#type' => 'fieldset',
      '#title' => t('Mailing'),
      '#collapsible' => TRUE,
      '#collapsed' => TRUE,
      '#weight' => 10,
      '#group' => 'additional_settings',
      );
  }
}

L'ajout d'élément dans cette zone se fait ensuite tout simplement avec la Form API, en reprenant bien la clé indiqué dans la création du fieldset ( mailing dans notre exemple). Avec une zone de texte riche et un textfield, notre code devient :

function nommodule_custom_mail_form_alter(&$form, $form_state, $form_id) {
  if (isset($form['#node']) && $form['#node']->type . '_node_form' == $form_id) {
    // Define field set in additional settings group
    $form['mailing'] = array(
      '#type' => 'fieldset',
      '#title' => t('Mailing'),
      '#collapsible' => TRUE,
      '#collapsed' => TRUE,
      '#weight' => 10,
      '#group' => 'additional_settings',
      );
    // Add checkbox option
    $form['mailing']['mailing_subject'] = array(
      '#type' => 'textfield',
      '#title' => t('Mail subject ?'),
      '#size' => 60,
      '#maxlength' => 128,
      '#weight' => 5,
      '#default_value' => variable_get('mailing_subject_'. $form['#node']->nid, ''),
      );

    $form['mailing']['mailing_text'] = array(
      '#type' => 'text_format',
      '#title' => t('Mail text'),
      '#default_value' => variable_get('mailing_text_'. $form['#node']->nid, ''),
      '#format' => 'full_html',
      '#weight' => 10,
      );
  }
}

Le résultat obtenu est le suivant :

résultat de notre code

Sauvegarder ou traiter les informations

Le traitement ou la sauvegarde des informations est évidemment particulier à chaque cas d'utilisation. Je vous en présente toutefois un tout simple ici visant à stocker les informations grace aux variables persistantes. Les données rentrées dans le formulaire peuvent être obtenu dans le hook hook_node_update().
Lors de l'utilisation de ce dernier, les données rentrés dans notre formulaire se trouve dans la variable $node. On le sauve grace à variable_set.

function apclermont_custom_mail_node_update($node) {
  if(empty($node->mailing_text['value'])){
    variable_del('mailing_text_'.$node->nid);
  }
  else{
    variable_set('mailing_text_'.$node->nid, $node->mailing_text['value']);
  }

  if(empty($node->mailing_subject)){
    variable_del('mailing_subject_'.$node->nid);
  }
  else{
    variable_set('mailing_subject_'.$node->nid, $node->mailing_subject);
  }
}

Vous pouvez évidemment utiliser d'autres moyen de stocker ces informations comme les entités par exemple.