Jawaban:
Itu adalah placeholder HTML5, Anda bisa menambahkannya sebagai atribut ke elemen apa pun dan browser yang diaktifkan HTML5 akan bereaksi sesuai itu:
function MYMODULE_form_alter(&$form, &$form_state, $form_id) {
if ($form_id == 'some_form') {
$form['some_element']['#attributes']['placeholder'] = t('Placeholder text');
}
}
Fungsi rekursif singkat seperti ini mungkin berguna jika Anda ingin secara otomatis menambahkan placeholder untuk setiap bidang teks dalam formulir (berdasarkan judul bidang dalam contoh ini):
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]);
}
}
Kemudian dalam bentuk Anda ubah fungsi panggil saja
MYMODULE_auto_placeholders($form);
Metode itu akan bekerja untuk hampir semua bidang teks pada formulir, dengan pengecualian yang ditambahkan dalam #process
fungsi (misalnya alt dan judul bidang teks bidang gambar misalnya).
Saya mencoba jawaban Clive:
function MYMODULE_form_alter(&$form, &$form_state, $form_id) {
if ($form_id == 'some_form') {
$form['some_element']['#attributes']['placeholder'] = t('Placeholder text');
}
}
Tapi yang mengejutkan saya, saya mendapatkan placeholder di bungkus textfield, bukan textfield itu sendiri. Kemudian saya mencoba variasi sebagai berikut, itu berhasil!
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');
}
}
Tambahkan saja placeholder di larik #attributes untuk elemen bidang formulir, seperti dalam kode berikut.
$form['my_textfield'] = array(
'#type' => 'textfield',
'#attributes' => array(
'placeholder' => t('My placeholder text'),
),
);
Menemukan ini dan berpikir jawaban Clive tampak bagus untuk secara otomatis menambahkan placeholder.
Anda, beberapa perubahan kecil diperlukan untuk melakukannya dengan benar di drupal 8, jadi inilah jawaban yang hampir sama, tetapi cocok untuk tema drupal 8 Anda.
/**
* 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]);
}
}
Jika Anda ingin menargetkan contoh formulir secara langsung menggunakan hook_form_FORM_ID_alter. Mungkin lebih rapi daripada menggunakan kondisional. Solusi saya untuk menargetkan contoh blok formulir pencarian saja.
function eyecare_form_search_block_form_alter(&$form, $form_state) {
$form['keys']['#attributes']['placeholder'] = t('Search');
}