Video: Utilisation du hook_form_alter pour modifier (theming) un formulaire sous Drupal 6.x

Dans cette vidéo nous allons voir comment modifier le formulaire des filtres exposés dans une vue avec Drupal 6.x

Pour cela nous allons utiliser la fonction hook _form_alter() de l'API de Drupal qui nous permettra de modifier apparence de certains champs du formulaire. Je vous montrerai aussi brièvement comment le faire avec une fonction preprocess dans le fichier template.php

Voici le code de la fonction hook_form_alter() à insérer dans votre module

<?php
/**
   * Implementation of hook_form_alter().
   *
   * The function is named modulename_form_alter.
   */
  
function modulename_form_alter(&$form, &$form_state, $form_id){
 
  switch (
$form['#id']){
    case
'views-exposed-form-test-nodos-page-1' :
     
$form['postal_code']['#size'] = 10;
     
$form['submit']['#value'] = t('Search');
    break;
 
  }
 
}
?>

Voici le code de la fonction preprocess à insérer dans votre template.php

<?php
function mytheme_preprocess_views_exposed_form(&$vars, $hook) {
 
  if (
$vars['form']['#id'] == 'views-exposed-form-test-nodos-page-1') {
   
$vars['form']['postal_code']['#size'] = 10;

   
// Reconstuire the rendered version (postal_code, le reste ne change pas)
   
unset($vars['form']['postal_code']['#printed']);
   
$vars['widgets']['filter-postal_code']->widget = drupal_render($vars['form']['postal_code']);
   
dsm($vars);
  }
}
?>

N’hésitez pas [a poster un commentaire si vous avez une question.

Commentaires

Très intéressant

Très intéressant

valeur du select

J'ai enfin compris comment modifier mes formulaires.
Mais il me reste encore du chemin pour faire ce que je veux.
Par exemple, récupérer la valeur sélectionnée dans un select ?

Autre question, le hook_form_alter est appelé lors du chargement du formulaire. Y'a t'il un API qui est appelé lors du changement de choix dans un select ? C'est-à-dire un onchange type javascript.

merci

filtre personnalisé sur DATE

Boujour,

Tout d'abord je tenais à vous remercier pour toutes ses informations très utiles.

J’ai créée une fonction test pour explorer le principe des filtres. J’ai mis en place un filtre affichant 1993 et 1994. J’utilise le module date.
Mon filtre s’affiche bien dans ma vue et remplace 1993 et 1994 par 18ans et 19ans.
Par contre quand je clique sur le bouton submit "rechercher", j’ai un message d’erreur.

Fatal error : Cannot create references to/from string offsets nor overloaded objects in C:\wamp\www\drupal-7.12_sandbox\includes\common.inc on line 6392

dans l'URL avant l'insertion de la fonction form_alter j'ai : ?
q=membres&field_naissance[value][date]=1993 (->marche bien)
et après form_alter j'ai :
?q=membres&field_naissance=1993 (->marche pas)

Avez-vous une solution pour contourner le problème ?

function page_example_form_alter(&$form, &$form_state, $form_id) {
if ($form_id == «views_exposed_form» && $form[‘#id’] == «views-exposed-form-membres-test-page») {

$form['field_naissance']['#options']= t("");
$form['field_naissance']['#options'] = array(
'All' => t(''),
'1993' => t('19ans'),
'1994' => t('18ans')
);
$form['field_naissance']['#default_value'] = $form['field_naissance']['#options']['All'];
$form['field_naissance']['#date_format'] = 'Y';
$form['field_naissance']['#access'] = TRUE;
$form['field_naissance']['#type'] = "select";
$form['field_naissance']['#title'] = 'De';

}

}

Merci d’avance.

Bonjour, Je suis en train

Bonjour,
Je suis en train d'écrire un module dans drupal 7 qui utilise un formulaire pour sauvegarder les infos dans la base de données. J'ai réussi à créer ce formulaire et je peux insérer les infos dans la base de données. Je voudrai maintenant récupérer les infos de la base de données pour les modifier à partir de ce formulaire et aussi pouvoir les effacer. Comment faire cela?
Merci

Excellent tutoriel

Bonjour,

Merci pour cette façon d'expliquer simplement des choses qui paraissent si complexes au premier abord. J'ai compris tellement de choses en 15 minutes qu'il me tarde d'aller les tester sur les prochains projets.

Merci pour tout !!!

Merci

Merci Anthony pour ce commentaire, fais-nous part de tes découvertes et bon vent !

Bonjour, j'ai trouvé votre

Bonjour,
j'ai trouvé votre vidéo, fantastique.
Je commence à mieux comprendre tout çà, et je vous en remercie. car il n'y a pas grand chose d'aussi clair (et en french) sur le web, ou dans les livres.
Mais je ne parviens pas tout-à-fait à faire ce que je veux. Je m'explique.

Je suis en drupal 6.22
Je travaille sur le formulaire d'abonnement du module simplenews.
Je l'ai relooké avec les css, et un peu de traductions sur la console d'admin de drupal (module traduire l'interface et rechercher etc…), mais ne parvenant pas à traduire le terme "courriel", j'en arrive logiquement (et de toutes façon, je dois y passer) sur les looks.

Je cherche donc à remplacer le label "courriel" par "Email" (demande du client - désolé…)

A la finale, sur le formulaire, (c'est d'origine, et simplifié par mes manips css)

je n'ai qu'un champ input

avec son label situé au-dessus

courriel :
*

et deux boutons : "s'abonner" et "se désabonner".
Je cherche d'ailleurs (mais je vous ennuierais plus tard, avec çà), à rajouter un troisième bouton (demande du client) "modifier".

Revenons au sujet principal.

J'ai donc tout fait comme sur la vidéo.
Je parviens bien à faire quelques petites choses (modifier les noms des boutons par ex).

Donc, le principe fonctionne - L'ID du formulaire est bien "simplenews-subscriptions-page-form".

Le nom de mon module est : courrielToEmail.module.

Voici mon code. Je vous ai mis des commentaires pour les précisions.

function courrielToEmail_form_alter(&$form, &$form_state, $form_id) {
//dsm($form);
switch ($form['#id']) {
case 'simplenews-subscriptions-page-form' :

// 1- J'espère toucher le contenu du label du champ input
$form['edit-mail']['#title'] = 'Email';

// 2- J'espère toucher la taille du champ input
$form['edit-mail']['#size'] = 70;

// 3- J'espère afficher (j'ai vu çà quelque part) une légende ou description (je ne sais plus) sous le champ input
$form['edit-mail']['#suffix'] = 'Suffixe toto';

//Cela fonctionne bien
// $form['subscribe']['#value'] = t('Subscribe').'toto';

//Ou (cela fonctionne également)
// $form['subscribe']['#value'] = 'NouveauBouton';
break;
}
}

1- et 2- (et 3- d'ailleurs) ne fonctionnent pas.

Il se trouve qu'avec "Devel" (et c'est là, je crois, le fond de mon problème), j'observe des choses différentes.
Je m'explique.

Je consulte la console d'admin (donc, logué en admin) de mon site sur un navigateur, et je visite le site (pas logé du tout) sur un autre navigateur.
Je gère, à priori convenablement les droits.

Avec la fonction : dsm($form);
je visualise (sur la console) le Krumo version 0.2a avec le (Array, 20 éléments………), mais évidemment, pas sur la page du formulaire.
Dès que je vais sur cette page (donc toujours logué en admin) : plus rien (de devel, krumo, etc)

J'y vais donc, sur l'autre navigateur (normal - pas logué), et là, je ne vois rien, je dois utiliser "devel themer" puis passer par la boite à cocher "themer info" pour ensuite, après avoir sollicité le form ou le textfield en question, visualiser les variables du array du form.

Et donc, selon que je sollicite (sur le formulaire, en mode themer info) le form ou le champ, je vois (dans la boite devel) des choses différentes concernant les infos du champ (title, size…).

Par ex, sur les infos du form (toujours dans la boite devel), je vois bien mes nouveaux paramètres (title et size), mais sur le formulaire, les modifs ne sont pas prises en compte.

Et, si je sollicite le champ (sur le formulaire, en mode themer info), eh bien, effectivement, les nouveaux paramètres n'apparaissent pas (toujours dans la boite devel).

En gros :

à partir du form
title : Email
size : 70
suffix : Suffixe toto

à partir du champ
title : courriel
size : 20 (d'origine)

Mais sur le formulaire - Rien ne se passe.

Auriez-vous une idée, sur une erreur de manip ou de compréhension de ma part ?

Je vous remercie d'avance d'avoir pris le temps de me lire. Pardonnez la taille du post, mais c'est pour être très précis.

Cordialement.

Abonnement simplenews : courriel vs email

Désolé, j'ai loupé l'objet (connais pas l'espagnol) d:-)

Encore désolé : le code html du formulaire a disparu

<label for="edit-mail">
courriel&nbsp;:
<span class="form-required" title="Ce champ est obligatoire.">*</span>
</label>
<input id="edit-mail" class="form-text required" type="text" value="" size="20" name="mail" maxlength="128">

Merci

Merci pour l'article de sorte intersting

Bonjour, Merci beaucoup pour

Bonjour,

Merci beaucoup pour cette vidéo qui d'une part est de très bonne facture et d'autre part correspond exactement a ce que je cherche à faire sur mon site.. mais je ne parviens pas à exécuter les choses correctement.(je développe depuis très peu de temps seulement).
Je pense que cela provient du fait que mes id sont possiblement faux, mais je parviens à voir la $form en tant qu'administrateur, donc je les regarde via code source et non devel.

voici mon code:
function affi_form_alter(&$form, &$form_state, $form_id){
switch($form_id){
case 'user_register':
$form['profile_optin']['#type']='hidden';
$form['edit-name']['#size']= 5;
}
}

Pour être plus précis, cette fonction est intégrée dans un module "affiliation"
et a pour but de cacher un champs optin lorsque l'url n'est pas monsite.fr/affi

Même sans la condition, cela ne fonctionne pas. est ce juste un problème de synthaxe, dois-je l'appeler dans mon fichier inc.?

Sinon je vais anticiper le problème à venir : ce formulaire sera aussi visible via un Iframe dans facebook, est ce que la condition if($url=='adresse-la-page-genere-par-module-affiliation')est judicieuse?

Merci beaucoup par avance de votre aide et pour tous les autres tutoriaux que je vais étudier,

Bien à vous,

Raphaël Saclé

Break

Bonjour Raphael,

J'ai comme l'impression qu'il vous manque un break à la fin de votre instruction case.

A bientôt.

Tu me donnes pleins

Tu me donnes pleins d'idées pour mon nouveau site!!!!
_________
cafetiere nespresso Expert

Merci , cela était

Merci ,

cela était effectivement un problème de synthaxe, la bonne étant
//function affi_form_alter(&$form, &$form_state, $form_id){
//drupal_set_message("Form ID is : " . $form_id);
//drupal_set_message(print_R($form, TRUE));
//switch($form_id){
//case 'user_register':
//$form['CGU-CGV']['profile_optin']['#access']= FALSE;
//$form['account']['name']['#size']= 5;
//}
//}
Cependant ces changements sont par ailleurs ignorés parce que j'utilise facebook register,module en dev très intéressant, mais qui pour une raison que j'ignore outrepasse la logique de weight du system et ne prend pas en compte les form_alter d'autres modules.

Bien à vous,

Raphaël

Table System

Il faudrait voir dans la table système quel est le weight de ton module.

A+

Merci beacoup

Je te remercie pour ce tutoriel.

Merci

Merci pour ce gentil commentaire. Ça fait toujours plaisir.

Merci

C'est une vidéo de bonne qualité, très agréable à regardé!

Ah oui et au fait, pourquoi

Ah oui et au fait, pourquoi n'a t'on pas de flux RSS pour web en stock?!! :p

Merci

Merci Linternautilus pour ce commentaire.

Le flux RSS est accessible depuis la home page: http://www.webenstock.com/fr/rss.xml

A+

C'est une vidéo de b

C'est une vidéo de bonne qualité, très agréable à regardé!
_________
Website:cafetière

idées

Tu me donnes pleins d'idées pour mon nouveau site!!!!

Super

C'est super ça Vincent.

Poster un nouveau commentaire

Le contenu de ce champ sera maintenu privé et ne sera pas affiché publiquement.
  • Les adresses de pages web et de messagerie électronique sont transformées en liens automatiquement.
  • Tags HTML autorisés : <a> <em> <strong> <cite> <code> <ul> <ol> <li> <dl> <dt> <dd><img>
  • Vous pouvez publier du code en utilisant les balises <code>...</code> (generic) ou bien <?php ... ?> (PHP colorié).
  • Les lignes et les paragraphes vont à la ligne automatiquement.

Plus d'informations sur les options de formatage

By submitting this form, you accept the Mollom privacy policy.

Toutes les langues

A propos

En savoir plus... Karim Boudjema. Un développeur belge dans les Andes boliviennes.

Voir mon profil sur LinkedInVoir mon profil sur Twitter

>> En savoir plus...

Commentaires récents