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?
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 function, 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 #process
fonctions (comme les champs de texte alt et title d'un champ image par exemple).
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'),
),
);
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. Ensuite, j'ai essayé une variante comme suit, cela a fonctionné!
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');
}
}
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 modifications mineures sont nécessaires pour bien faire les choses dans drupal 8, donc voici à peu près la même réponse, mais adaptée à votre drupal 8 thème.
/**
* 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]);
}
}
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');
}