Antworten:
Das ist ein HTML5-Platzhalter. Sie können ihn einfach als Attribut zu jedem Element hinzufügen. HTML5-fähige Browser reagieren entsprechend:
function MYMODULE_form_alter(&$form, &$form_state, $form_id) {
if ($form_id == 'some_form') {
$form['some_element']['#attributes']['placeholder'] = t('Placeholder text');
}
}
Eine kurze rekursive Funktion wie diese kann nützlich sein, wenn Sie automatisch Platzhalter für jedes Textfeld in einem Formular hinzufügen möchten (basierend auf dem Feldtitel in diesem Beispiel):
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]);
}
}
Dann rufen Sie in Ihrem Formular einfach die Änderungsfunktion auf
MYMODULE_auto_placeholders($form);
Diese Methode funktioniert für fast alle Textfelder in einem Formular, mit Ausnahme derjenigen, die in #process
Funktionen hinzugefügt werden (wie z. B. die Textfelder "alt" und "title" eines Bildfelds).
Ich habe Clives Antwort ausprobiert:
function MYMODULE_form_alter(&$form, &$form_state, $form_id) {
if ($form_id == 'some_form') {
$form['some_element']['#attributes']['placeholder'] = t('Placeholder text');
}
}
Aber zu meiner Überraschung habe ich den Platzhalter im Wrapper von textfield erhalten, nicht im Textfield selbst. Dann habe ich eine Variante wie folgt ausprobiert, es hat funktioniert!
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');
}
}
Fügen Sie einfach den Platzhalter im Array #attributes für das Formularfeldelement hinzu, wie im folgenden Code.
$form['my_textfield'] = array(
'#type' => 'textfield',
'#attributes' => array(
'placeholder' => t('My placeholder text'),
),
);
Stolperte über dieses und dachte, dass Clives Antwort nett schien, Platzhalter automatisch hinzuzufügen.
Du brauchst ein paar kleine Änderungen, um es in Drupal 8 richtig zu machen, also hier ist so ziemlich die gleiche Antwort, aber passend für dein Drupal 8-Thema.
/**
* 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]);
}
}
Wenn Sie eine Formularinstanz direkt als Ziel festlegen möchten, verwenden Sie hook_form_FORM_ID_alter. Könnte ordentlicher sein als die Verwendung von Bedingungen. Meine Lösung für das Targeting nur der Instanz des Suchformularblocks.
function eyecare_form_search_block_form_alter(&$form, $form_state) {
$form['keys']['#attributes']['placeholder'] = t('Search');
}