Risposte:
Questo è un segnaposto HTML5, puoi semplicemente aggiungerlo come attributo a qualsiasi elemento e i browser abilitati per HTML5 reagiranno di conseguenza:
function MYMODULE_form_alter(&$form, &$form_state, $form_id) {
if ($form_id == 'some_form') {
$form['some_element']['#attributes']['placeholder'] = t('Placeholder text');
}
}
Una breve funzione ricorsiva come questa potrebbe essere utile se si desidera aggiungere automaticamente segnaposto per ogni campo di testo in un modulo (basato sul titolo del campo in questo esempio):
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]);
}
}
Quindi nella tua funzione di modifica del modulo basta chiamare
MYMODULE_auto_placeholders($form);
Tale metodo funzionerà praticamente per tutti i campi di testo di un modulo, ad eccezione di quelli aggiunti nelle #process
funzioni (come ad esempio i campi di testo alt e title di un campo immagine).
Ho provato la risposta di Clive:
function MYMODULE_form_alter(&$form, &$form_state, $form_id) {
if ($form_id == 'some_form') {
$form['some_element']['#attributes']['placeholder'] = t('Placeholder text');
}
}
Ma con mia sorpresa, ho ottenuto il segnaposto nel wrapper del campo di testo, non nel campo di testo stesso. Quindi ho provato una variante come segue, ha funzionato!
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');
}
}
Aggiungi il segnaposto nell'array #attributes per l'elemento del campo modulo, ad esempio nel codice seguente.
$form['my_textfield'] = array(
'#type' => 'textfield',
'#attributes' => array(
'placeholder' => t('My placeholder text'),
),
);
Ci siamo imbattuti in questo e ho pensato che la risposta di Clive sembrava piacevole aggiungere automaticamente segnaposto.
Tu, sono necessarie alcune piccole modifiche per farlo bene in drupal 8, quindi ecco praticamente la stessa risposta, ma adatta al tuo tema di 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 vuoi indirizzare un'istanza del modulo usa direttamente hook_form_FORM_ID_alter. Potrebbe essere più ordinato dell'uso dei condizionali. La mia soluzione per il targeting solo dell'istanza di blocco del modulo di ricerca.
function eyecare_form_search_block_form_alter(&$form, $form_state) {
$form['keys']['#attributes']['placeholder'] = t('Search');
}