Respuestas:
Es un marcador de posición HTML5, solo puede agregarlo como un atributo a cualquier elemento y los navegadores habilitados para HTML5 reaccionarán en consecuencia:
function MYMODULE_form_alter(&$form, &$form_state, $form_id) {
if ($form_id == 'some_form') {
$form['some_element']['#attributes']['placeholder'] = t('Placeholder text');
}
}
Una función recursiva breve como esta podría ser útil si desea agregar automáticamente marcadores de posición para cada campo de texto en un formulario (basado en el título del campo en este ejemplo):
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]);
}
}
Luego, en su formulario, alter function solo llame
MYMODULE_auto_placeholders($form);
Ese método funcionará para casi todos los campos de texto en un formulario, con la excepción de los que se agregan en #process
funciones (como los campos de texto alt y title de un campo de imagen, por ejemplo).
Intenté la respuesta de Clive:
function MYMODULE_form_alter(&$form, &$form_state, $form_id) {
if ($form_id == 'some_form') {
$form['some_element']['#attributes']['placeholder'] = t('Placeholder text');
}
}
Pero para mi sorpresa, obtuve el marcador de posición en el contenedor del campo de texto, no en el campo de texto en sí. Luego probé una variación de la siguiente manera, ¡funcionó!
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');
}
}
Simplemente agregue el marcador de posición en la matriz de # atributos para el elemento del campo de formulario, como en el siguiente código.
$form['my_textfield'] = array(
'#type' => 'textfield',
'#attributes' => array(
'placeholder' => t('My placeholder text'),
),
);
Tropecé con esto y pensé que la respuesta de Clive parecía agradable para agregar automáticamente marcadores de posición.
De todos modos, se necesitan algunos cambios menores para hacerlo bien en drupal 8, por lo que esta es la misma respuesta, pero adecuada para su tema de 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]);
}
}
Si desea apuntar a una instancia de formulario directamente, use hook_form_FORM_ID_alter. Podría ser más ordenado que usar condicionales. Mi solución para orientar solo la instancia de bloque de formulario de búsqueda.
function eyecare_form_search_block_form_alter(&$form, $form_state) {
$form['keys']['#attributes']['placeholder'] = t('Search');
}