Відповіді:
Це заповнювач HTML5, ви можете просто додати його як атрибут до будь-якого елемента, і браузери з підтримкою HTML5 реагуватимуть відповідно:
function MYMODULE_form_alter(&$form, &$form_state, $form_id) {
if ($form_id == 'some_form') {
$form['some_element']['#attributes']['placeholder'] = t('Placeholder text');
}
}
Коротка рекурсивна функція на зразок цієї може бути корисною, якщо ви хочете автоматично додавати заповнювачі для кожного текстового поля у форму (виходячи з назви поля в цьому прикладі):
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]);
}
}
Тоді у вашій формі зміни функції просто зателефонуйте
MYMODULE_auto_placeholders($form);
Цей метод буде працювати майже для кожного текстового поля у формі, за винятком тих, які додаються у #process
функції (наприклад, текстові поля alt та title поля зображення, наприклад).
Я спробував відповідь Клайва:
function MYMODULE_form_alter(&$form, &$form_state, $form_id) {
if ($form_id == 'some_form') {
$form['some_element']['#attributes']['placeholder'] = t('Placeholder text');
}
}
Але на моє здивування, я отримав заповнювач у обгортці текстового поля, а не самому текстовому полі. Потім я спробував варіацію наступним чином, вона спрацювала!
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');
}
}
Просто додайте заповнювач у масив #attributes для елемента поля форми, наприклад, у наведеному нижче коді.
$form['my_textfield'] = array(
'#type' => 'textfield',
'#attributes' => array(
'placeholder' => t('My placeholder text'),
),
);
Натрапивши на це і подумав, що відповідь Клайва здається приємною, що автоматично додає заповнювачі.
Тим не менше, потрібно декілька незначних змін, щоб зрозуміти це правильно в drupal 8, тому ось приблизно та сама відповідь, але підходить для вашої 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]);
}
}
Якщо ви хочете націлити на екземпляр форми, скористайтеся безпосередньо гачком_форма_FORM_ID_alter. Може бути акуратніше, ніж використання умовних умов. Моє рішення для націлювання лише на екземпляр блоку форми пошуку.
function eyecare_form_search_block_form_alter(&$form, $form_state) {
$form['keys']['#attributes']['placeholder'] = t('Search');
}