Hinzufügen von Formularplatzhaltern zu Texteingabefeldern

22

Gibt es eine Möglichkeit, ein reguläres Formular zu konvertieren und Platzhalter mit einem Modul hinzuzufügen, oder sollte dies mit einer Formularvorlage oder mit jQuery erfolgen?

chrisjlee
quelle

Antworten:

31

Das ist ein HTML5-Platzhalter. Sie können ihn einfach als Attribut zu jedem Element hinzufügen. HTML5-fähige Browser reagieren entsprechend:

function MYMODULE_form_alter(&$form, &$form_state, $form_id) {
  if ($form_id == 'some_form') {
    $form['some_element']['#attributes']['placeholder'] = t('Placeholder text');
  }
}

Eine kurze rekursive Funktion wie diese kann nützlich sein, wenn Sie automatisch Platzhalter für jedes Textfeld in einem Formular hinzufügen möchten (basierend auf dem Feldtitel in diesem Beispiel):

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

Dann rufen Sie in Ihrem Formular einfach die Änderungsfunktion auf

MYMODULE_auto_placeholders($form);

Diese Methode funktioniert für fast alle Textfelder in einem Formular, mit Ausnahme derjenigen, die in #processFunktionen hinzugefügt werden (wie z. B. die Textfelder "alt" und "title" eines Bildfelds).

Clive
quelle
Ergebnis: Fehler: Aufruf der undefinierten Funktion element_children () in bla_auto_placeholders () (Zeile 605 von themes / custom / BLA / bla.theme).
Thomas
15

Ich habe Clives Antwort ausprobiert:

function MYMODULE_form_alter(&$form, &$form_state, $form_id) {
  if ($form_id == 'some_form') {
    $form['some_element']['#attributes']['placeholder'] = t('Placeholder text');
  }
}

Aber zu meiner Überraschung habe ich den Platzhalter im Wrapper von textfield erhalten, nicht im Textfield selbst. Dann habe ich eine Variante wie folgt ausprobiert, es hat funktioniert!

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');
  }
}
Henry
quelle
Vielen Dank! Ich fing an, ein bisschen verrückt zu werden - dachte nicht einmal darüber nach.
Mike Crittenden
Was ist das "some_element"? Ist die ID des Elements? Wie finde ich das?
Sokratis
@sokratis Sie können die IDs von Elementen von dpm ($ form) erhalten, sie erscheinen in der ersten Ebene des $ form-Arrays. Das Folgende ist ein aktuelles Beispiel für das Ändern des Kommentarformulars: <code> function MYMODULE_form_alter (& $ form, & $ form_state, $ form_id) {if ($ form_id == 'comment_node_post_form') {$ form ['subject'] ['# Attribute '] [' Platzhalter '] = t (' Betreff '); $ form ['comment_body'] ['und'] [0] ['value'] ['# attributes'] ['placeholder'] = t ('Content'); }} </ code>
Henry
15

Fügen Sie einfach den Platzhalter im Array #attributes für das Formularfeldelement hinzu, wie im folgenden Code.

   $form['my_textfield'] = array(
      '#type' => 'textfield',
      '#attributes' => array(
        'placeholder' => t('My placeholder text'),
      ),
    );
neelmeg
quelle
2
Danke, das hat bei mir in Drupal 8
funktioniert
funktionierte gut in D8.
Dresh
5

Stolperte über dieses und dachte, dass Clives Antwort nett schien, Platzhalter automatisch hinzuzufügen.

Du brauchst ein paar kleine Änderungen, um es in Drupal 8 richtig zu machen, also hier ist so ziemlich die gleiche Antwort, aber passend für dein Drupal 8-Thema.

/**
 * 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]);
  }
}
frysch
quelle
0

Wenn Sie eine Formularinstanz direkt als Ziel festlegen möchten, verwenden Sie hook_form_FORM_ID_alter. Könnte ordentlicher sein als die Verwendung von Bedingungen. Meine Lösung für das Targeting nur der Instanz des Suchformularblocks.

function eyecare_form_search_block_form_alter(&$form, $form_state) {
  $form['keys']['#attributes']['placeholder'] = t('Search');
}
Dr.ifle
quelle