Submitted by nyl auster on
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;
}
?>
Commentaires
Dommage que le code ne
Permalien Soumis par kikispas le 13 Janvier, 2010 - 15:47
Dommage que le code ne fonctionne pas pour moi (en dehors d'une erreur de frappe, il manque un '$', le script n'affiche que le bouton enregistrer :D)