web-dev-qa-db-fra.com

Comment définir l'attribut type = "email" sur un champ de texte de formulaire Drupal

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?

5
Richard Viney

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)

5
Chapabu

É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.

6
koyae

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.'));}}
1
Suresh

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

0
Matoeil