Aggiunta di segnaposto di modulo ai campi di input di testo


22

Esiste un modo per convertire un modulo regolare e aggiungere segnaposto con un modulo, o dovrebbe essere fatto con un modello di modulo o con jQuery?

Risposte:


31

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 #processfunzioni (come ad esempio i campi di testo alt e title di un campo immagine).


Risultato: errore: chiamata alla funzione indefinita element_children () in bla_auto_placeholders () (riga 605 di temi / personalizzato / BLA / bla.theme).
Thomas,

15

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');
  }
}

Grazie! Stavo iniziando a diventare un po 'matto - non ci ho nemmeno pensato.
Mike Crittenden,

Che cos'è "some_element"? L'ID dell'elemento? Come posso trovarlo?
sokratis,

@sokratis puoi ottenere gli ID degli elementi per dpm ($ form), che appaiono nel primo livello dell'array $ form. Di seguito è riportato un esempio reale di modifica del modulo di commento: <code> funzione MYMODULE_form_alter (& $ form, & $ form_state, $ form_id) {if ($ form_id == 'comment_node_post_form') {$ form ['subject'] ['# attributi '] [' segnaposto '] = t (' Soggetto '); $ form ['comment_body'] ['und'] [0] ['value'] ['# stats'] ['placeholder'] = t ('Content'); }} </code>
Henry,

15

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'),
      ),
    );

2
grazie, questo ha funzionato per me in Drupal 8.
No Sssweat,

ha funzionato bene in D8.
dresh

5

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]);
  }
}

0

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');
}
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.