Ajout d'espaces réservés de formulaire aux champs de saisie de texte

22

Existe-t-il un moyen de convertir un formulaire standard et d'ajouter des espaces réservés avec un module, ou cela devrait-il être fait avec un modèle de formulaire ou avec jQuery?

chrisjlee
la source

Réponses:

31

C'est un espace réservé HTML5, vous pouvez simplement l'ajouter comme attribut à n'importe quel élément et les navigateurs compatibles HTML5 réagiront en conséquence:

function MYMODULE_form_alter(&$form, &$form_state, $form_id) {
  if ($form_id == 'some_form') {
    $form['some_element']['#attributes']['placeholder'] = t('Placeholder text');
  }
}

Une fonction récursive courte comme celle-ci peut être utile si vous souhaitez ajouter automatiquement des espaces réservés pour chaque champ de texte dans un formulaire (basé sur le titre du champ dans cet exemple):

function MYMODULE_auto_placeholders(&$element) {
  if ( isset($element['#type']) && $element['#type'] == 'textfield') {
    // set placeholder
    $element['#attributes']['placeholder'] = $element['#title'];
    // hide label
    $element['#title_display'] = 'invisible';
  }
  foreach (element_children($element) as $key) {
    MYMODULE_auto_placeholders($element[$key]);
  }
}

Ensuite, dans votre formulaire alter fonction, appelez simplement

MYMODULE_auto_placeholders($form);

Cette méthode fonctionnera pour à peu près tous les champs de texte d'un formulaire, à l'exception de ceux qui sont ajoutés dans les #processfonctions (comme les champs de texte alt et title d'un champ d'image par exemple).

Clive
la source
Résultat: Erreur: appel à la fonction undefined element_children () dans bla_auto_placeholders () (ligne 605 de themes / custom / BLA / bla.theme).
Thomas
15

J'ai essayé la réponse de Clive:

function MYMODULE_form_alter(&$form, &$form_state, $form_id) {
  if ($form_id == 'some_form') {
    $form['some_element']['#attributes']['placeholder'] = t('Placeholder text');
  }
}

Mais à ma grande surprise, j'ai obtenu l'espace réservé dans le wrapper de textfield, pas textfield lui-même. J'ai ensuite essayé une variante comme suit, ça a marché!

function MYMODULE_form_alter(&$form, &$form_state, $form_id) {
  if ($form_id == 'some_form') {
    $form['some_element']['und'][0]['value']['#attributes']['placeholder'] = t('Placeholder text');
  }
}
Henri
la source
Merci! Je commençais à devenir un peu fou - je n'y ai même pas pensé.
Mike Crittenden
Qu'est-ce que "some_element"? L'ID de l'élément? Comment puis-je le trouver?
sokratis
@sokratis vous pouvez obtenir les ID des éléments par dpm ($ form), ils apparaissent dans le premier niveau du tableau $ form. Voici un exemple réel de modification du formulaire de commentaire: <code> function MYMODULE_form_alter (& $ form, & $ form_state, $ form_id) {if ($ form_id == 'comment_node_post_form') {$ form ['subject'] ['# attributs '] [' placeholder '] = t (' Subject '); $ form ['comment_body'] ['und'] [0] ['value'] ['# attributes'] ['placeholder'] = t ('Content'); }} </code>
Henry
15

Ajoutez simplement l'espace réservé dans le tableau #attributes pour l'élément de champ de formulaire, comme dans le code suivant.

   $form['my_textfield'] = array(
      '#type' => 'textfield',
      '#attributes' => array(
        'placeholder' => t('My placeholder text'),
      ),
    );
neelmeg
la source
2
thx, cela a fonctionné pour moi dans Drupal 8.
No Sssweat
a bien fonctionné en D8.
dresh
5

Je suis tombé sur cela et j'ai pensé que la réponse de Clive semblait agréable d'ajouter automatiquement des espaces réservés.

Toi, quelques changements mineurs sont nécessaires pour bien faire les choses dans Drupal 8, alors voici à peu près la même réponse, mais adaptée à votre thème Drupal 8.

/**
 * Implements hook_form_alter
 */
function THEME_form_alter(&$form, \Drupal\Core\Form\FormStateInterface $form_state, $form_id) {
  add_placeholders($form);
}


/**
 * Add placeholders to suitable form elements -> textfield, password, email, textarea
 */
function add_placeholders(&$element) {
  if(isset($element['#type']) && in_array($element['#type'], ['textfield', 'password', 'email', 'textarea'])) {
    $element['#attributes']['placeholder'] = $element['#title'];
  }
  foreach(\Drupal\Core\Render\Element::children($element) as $key) {
    add_placeholders($element[$key]);
  }
}
frysch
la source
0

Si vous souhaitez cibler une instance de formulaire directement, utilisez hook_form_FORM_ID_alter. Pourrait être plus ordonné que l'utilisation de conditionnels. Ma solution pour cibler l'instance de bloc de formulaire de recherche uniquement.

function eyecare_form_search_block_form_alter(&$form, $form_state) {
  $form['keys']['#attributes']['placeholder'] = t('Search');
}
Dr.ifle
la source