Exemple de hook_form_alter et de theming

Onglets principaux

La documentation Drupal 6 n'est plus maintenue et en cours de dépublication.

Le code ci-dessous est simplement un exemple concret de module pour altérer un formulaire et le themer de façon plus poussé que dans les exemples précédents.
Ici le module s'appelle "formulaire_tableau" : le but est simplement d'améliorer la présentation d'un formulaire produit (node/add/tableaux dans ce cas) pour la boutique en ligne ubercart : le formulaire de node étant étant déjà altéré par ubercart, taxonomie, CCK, le résultat final niveau présentation est catastrophique : ici je fais une restructuration complète du formulaire afin d'en controler totalement la présentation et de réordonner les champs de façon logique pour l'utilisateur final; et également pour remplir de façon automatique le champ référence.

<?php
function formulaire_tableau_form_alter(&$form, $form_state, $form_id){
  global
$user;
 
// dans le cas ou on ajoute un produit de type tableau
 
if($form_id == 'tableaux_node_form'){
   
// dire d'utiliser la fonction "theme_formulaire_tableau" quand le formulaire sera transformé en html
   
$form['#theme'] = 'formulaire_tableau';  
   
// créer automatiquement une nouvelle référence ubercart à la création d'un produit
   
arg(1) == 'add' ? $form['base']['model']['#value'] = nouvelle_reference_tableau() : '';
   
// Masquer ce champ sauf pour le super admin
   
$user->uid != 1 ? form['base']['model']['#type'] = 'hidden' : '';    
   
// j'enleve des descriptions qui genent ma présentation
   
$form['title']['#description'] = '';
   
$form['taxonomy']['tags'][2]['#description'] = '';
   
$form['taxonomy']['tags'][3]['#description'] = '';
   
$form['taxonomy']['tags'][4]['#description'] = '';
   
$form['taxonomy']['tags'][5]['#description'] = '';
   
$form['taxonomy']['tags'][6]['#description'] = '';
   
$form['base']['prices']['sell_price']['#description'] = '';
   
$form['buttons']['#weight'] = 100; // s'assurer que les boutons de soumission restent bien en bas
 
}
}

// cette fonction créer une référence automatique pour un nouveau tableau
function nouvelle_reference_tableau(){
 
// trouver la dernière référence existante, puis ajouter 1
 
return db_result(db_query_range("SELECT model FROM {uc_products} ORDER BY nid DESC", 0, 1)) + 1;
}

// redonner un visgage humain au formulaire node/add/tableaux et ordonner les champs à notre sauce
// (taxonomie, ubercart, cck)
function theme_formulaire_tableau($form){
 
drupal_set_title("Ajouter un tableau"); 
 
$html .= '<p>Ajouter un nouveau tableau dans votre boutique.</p>';
 
$html .= drupal_render($form['title']);
 
$html .= drupal_render($form['taxonomy']['tags'][5]);
 
$html .= drupal_render($form['base']['dimensions']['width']); 
 
$html .= drupal_render($form['base']['dimensions']['height']); 
 
$html .= drupal_render($form['field_heightc']); 
 
$html .= drupal_render($form['field_widthc']);
 
$html .= drupal_render($form['field_localisation']);
 
$html .= drupal_render($form['taxonomy']['tags'][4]);
 
$html .= drupal_render($form['taxonomy']['tags'][3]);
 
$html .= drupal_render($form['taxonomy']['tags'][6]);
 
$html .= drupal_render($form['base']['prices']['sell_price']);
 
$html .= drupal_render($form['field_source']);
 
$html .= drupal_render($form['taxonomy']['tags'][2]);  
 
$html .= drupal_render($form['field_disponibilite']); 
 
$html .= drupal_render($form['field_provenance']);  
 
$html .= drupal_render($form['field_image_cache']);
 
$html .= drupal_render($form['base']['model']);
 
$html .= drupal_render($form['base']['dimensions']['lenght']);
 
$html .= '<div style = "display :none">';
 
$html .= drupal_render($form['base']);
 
$html .= '</div>';
 
// J'Ajoute tous les champs qui n'ont pas été énoncé ci dessus !
 
$html .= drupal_render($form);
  return
$html;
}

// TRES IMPORTANT : on déclare à drupal notre theme. Sans ce hook,
// le theming ne fonctionnera pas.
function formulaire_tableau_theme(){
 
$themes = array();
 
$themes['formulaire_tableau'] = array(
   
'arguments' => array(), //notre fonction n'a besoin d'aucun argument, on laisse vide.
 
);
  return
$themes;
}
?>
Version de Drupal : 

Commentaires