Je fais des formulaires mobiles avec Drupal et j'ai un champ de texte d'adresse e-mail qui a actuellement type = "text" dans le code HTML résultant. J'aimerais que ce soit type = "email" à la place afin que iOS affiche un clavier plus utile lors de la saisie de l'adresse e-mail.
J'ai essayé d'ajouter:
"#attributes" => array("type" => "email")
à mon domaine, mais il semble juste être ignoré par Drupal. Existe-t-il un moyen correct et/ou pris en charge pour y parvenir?
En l'état, Drupal core ne prend pas en charge tous les éléments du formulaire HTML5. Le module Elements ajoutera cependant une certaine prise en charge, alors vérifiez cela.
Éléments HTML5 (URL, e-mail, recherche, tél, numéro, plage)
Éléments qui sont input[type=email]
sont une fonction intégrée à partir de Drupal 8 . Ils peuvent être ajoutés (avec d'autres éléments HTML5 et du balisage) à Drupal 6 ou 7 via le module Elements .
Au moment d'écrire cette réponse, j'ai trouvé les documents du module Élément assez rares; ils n'expliquent pas que la méthode pour obtenir un élément d'entrée de courrier électronique est légèrement différente de celle utilisée dans D8. Pour Drupal 7:
/**
* Implements hook_form().
* "For long-lasting relief you can count on!"
*
* hook_form() functions are passed a form-node,
* plus extra state-info if present.
*
* At the end of the function, the form-node should
* be returned to the caller.
*
*/
function mymodule_form($node,&$form_state) {
$node['primary_email'] = array(
'#type' => 'emailfield',
'#title' => t('Submitter'),
); // in Drupal 8, it's '#type' => 'email'
return $node;
}
Assurez-vous d'avoir activé le module Elements avant de vous attendre à ce que cela fonctionne. De plus, si vous ne l'avez pas déjà fait, vous voudrez également rendre le formulaire accessible en faisant quelque chose comme:
/**
* Implements hook_menu().
* "Money back guarantee!"
*/
function mymodule_menu() {
// create primary menu-entry for module:
$items['mymodule'] = array(
'title' => 'My Very Own Module',
'page callback' => 'mymodule_description',
'access callback' => TRUE,
'expanded' => TRUE,
);
// create menu-entry for form:
$items['mymodule/myform'] = array(
'title' => 'My Very Own Form',
'page callback' => 'drupal_get_form',
'page arguments' => array('mymodule_form'),
'access arguments' => array('Behold, the form.'),
'file' => 'mymodule.module',
);
// ...[maybe add more stuff here]...
return $items;
Les autres éléments mis à disposition par Element sont répertoriés sur cgit.drupalcode.org/elements/tree/elements.module#n7.
Au lieu d'ajouter un gestionnaire de validation de formulaire au formulaire, vous pouvez ajouter un gestionnaire de validation à l'élément de formulaire qui doit être validé:
$form['email'] = array('#type' => 'textfield','#title' => 'Email','#required' => TRUE,'#element_validate' => array('myelement_email_validate')
);
Le gestionnaire de validation reçoit trois arguments: l'élément de formulaire en cours de validation, le $ form_state et le tableau $ form du formulaire contenant l'élément de formulaire.
function myelement_email_validate($element, &$form_state, $form) {$value = $element['#value'];if (!valid_email_address($value)) {form_error($element, t('Please enter a valid email address.'));}}
voici comment je l'ai fait:
$form ['group_coordonnees'] ['field_candid_email'] = array (
'#type' => 'textfield',
'#title' => t ( 'E-mail' ),
'#default_value' => '',
'#required' => TRUE
);
$node->field_candid_email ['und'] [0] ['email'] = $form_state ['values'] ['field_candid_email'];
Le type de champ field_candid_email étant sélectionné dans le back office comme e-mail