Respostas:
Esse é um espaço reservado para HTML5, você pode adicioná-lo como um atributo a qualquer elemento, e os navegadores habilitados para HTML5 reagirão de acordo:
function MYMODULE_form_alter(&$form, &$form_state, $form_id) {
if ($form_id == 'some_form') {
$form['some_element']['#attributes']['placeholder'] = t('Placeholder text');
}
}
Uma função recursiva curta como essa pode ser útil se você desejar adicionar espaços reservados automaticamente para cada campo de texto em um formulário (com base no título do campo neste exemplo):
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]);
}
}
Então, no seu formulário alter function basta chamar
MYMODULE_auto_placeholders($form);
Esse método funcionará para praticamente todos os campos de texto de um formulário, com exceção daqueles adicionados em #process
funções (como os campos de texto alt e title de um campo de imagem, por exemplo).
Tentei a resposta de Clive:
function MYMODULE_form_alter(&$form, &$form_state, $form_id) {
if ($form_id == 'some_form') {
$form['some_element']['#attributes']['placeholder'] = t('Placeholder text');
}
}
Mas, para minha surpresa, coloquei o espaço reservado no invólucro do campo de texto, não no próprio campo de texto. Então eu tentei uma variação da seguinte forma, funcionou!
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');
}
}
Basta adicionar o espaço reservado na matriz #attributes para o elemento do campo de formulário, como no código a seguir.
$form['my_textfield'] = array(
'#type' => 'textfield',
'#attributes' => array(
'placeholder' => t('My placeholder text'),
),
);
Deparei com isso e achei que a resposta de Clive parecia agradável ao adicionar automaticamente espaços reservados.
Você precisa de algumas pequenas alterações para acertar no drupal 8, então aqui está a mesma resposta, mas adequada para o seu tema 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]);
}
}
Se você deseja direcionar uma instância de formulário diretamente, use hook_form_FORM_ID_alter. Pode ser mais organizado do que usar condicionais. Minha solução para segmentar apenas a instância do bloco de formulário de pesquisa.
function eyecare_form_search_block_form_alter(&$form, $form_state) {
$form['keys']['#attributes']['placeholder'] = t('Search');
}