Yanıtlar:
Bu bir HTML5 yer tutucusu, sadece herhangi bir öğeye bir özellik olarak ekleyebilirsiniz ve HTML5 özellikli tarayıcılar buna göre tepki verecektir:
function MYMODULE_form_alter(&$form, &$form_state, $form_id) {
if ($form_id == 'some_form') {
$form['some_element']['#attributes']['placeholder'] = t('Placeholder text');
}
}
Bunun gibi kısa bir özyinelemeli işlev, bir formdaki her bir metin alanı için otomatik olarak yer tutucu eklemek istiyorsanız (bu örnekteki alanın başlığına göre) kullanışlı olabilir:
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]);
}
}
O zaman formunu değiştir fonksiyonunu çağır.
MYMODULE_auto_placeholders($form);
Bu yöntem, #process
fonksiyonlara eklenenler dışında ( örneğin bir resim alanının alt ve başlık metin alanları gibi) , bir formdaki hemen hemen her metin alanı için işe yarar .
Clive'nin cevabını denedim:
function MYMODULE_form_alter(&$form, &$form_state, $form_id) {
if ($form_id == 'some_form') {
$form['some_element']['#attributes']['placeholder'] = t('Placeholder text');
}
}
Ama benim için sürpriz, yer tutucu metin alanı değil, metin alanı paketleyicisine getirildi. Sonra aşağıdaki gibi bir varyasyon denedim, işe yaradı!
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');
}
}
Yer tutucuyı, aşağıdaki kodda olduğu gibi, form alanı öğesinin #attributes dizisine ekleyin.
$form['my_textfield'] = array(
'#type' => 'textfield',
'#attributes' => array(
'placeholder' => t('My placeholder text'),
),
);
Bunun üzerine tökezledi ve Clive'nin cevabını otomatik olarak yer tutucu eklemek için iyi göründüğünü düşündüm.
Drupal 8'de doğru şekilde elde etmek için birkaç küçük değişiklik yapmanız gerekiyor, bu yüzden hemen hemen aynı cevap, ama drupal 8 temanız için uygun.
/**
* 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]);
}
}
Bir form örneğini hedeflemek istiyorsanız, doğrudan hook_form_FORM_ID_alter kullanın. Koşullu kullanmaktan daha düzenli olabilir. Yalnızca arama formu blok örneğini hedeflemeye yönelik çözümüm.
function eyecare_form_search_block_form_alter(&$form, $form_state) {
$form['keys']['#attributes']['placeholder'] = t('Search');
}