Odpowiedzi:
Jest to symbol zastępczy HTML5, możesz po prostu dodać go jako atrybut do dowolnego elementu, a przeglądarki obsługujące HTML5 zareagują odpowiednio:
function MYMODULE_form_alter(&$form, &$form_state, $form_id) {
if ($form_id == 'some_form') {
$form['some_element']['#attributes']['placeholder'] = t('Placeholder text');
}
}
Taka krótka funkcja rekurencyjna może być przydatna, jeśli chcesz automatycznie dodawać symbole zastępcze dla każdego pola tekstowego w formularzu (na podstawie tytułu pola w tym przykładzie):
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]);
}
}
Następnie w formularzu zmień funkcję po prostu wywołaj
MYMODULE_auto_placeholders($form);
Ta metoda będzie działać dla prawie każdego pola tekstowego w formularzu, z wyjątkiem tych, które są dodawane w #process
funkcjach (na przykład pola tekstowe alt i tytuł pola obrazka).
Próbowałem odpowiedzi Clive'a:
function MYMODULE_form_alter(&$form, &$form_state, $form_id) {
if ($form_id == 'some_form') {
$form['some_element']['#attributes']['placeholder'] = t('Placeholder text');
}
}
Ale ku mojemu zdziwieniu umieściłem symbol zastępczy w polu tekstowym, a nie samo pole tekstowe. Potem wypróbowałem następującą odmianę, zadziałała!
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');
}
}
Wystarczy dodać symbol zastępczy w tablicy #attributes dla elementu pola formularza, na przykład w poniższym kodzie.
$form['my_textfield'] = array(
'#type' => 'textfield',
'#attributes' => array(
'placeholder' => t('My placeholder text'),
),
);
Natknąłem się na to i pomyślałem, że odpowiedź Clive'a wydawała się miła automatycznie dodawać symbole zastępcze.
Trzeba kilka drobnych zmian, aby zrobić to poprawnie w Drupal 8, więc oto prawie ta sama odpowiedź, ale odpowiednia dla Twojego motywu 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]);
}
}
Jeśli chcesz celować bezpośrednio do instancji formularza, użyj hook_form_FORM_FORM_ID_alter. Może być ładniejszy niż przy użyciu warunkowych. Moje rozwiązanie do kierowania tylko na instancję bloku formularza wyszukiwania.
function eyecare_form_search_block_form_alter(&$form, $form_state) {
$form['keys']['#attributes']['placeholder'] = t('Search');
}