Добавление заполнителей формы в поля ввода текста

22

Есть ли способ преобразовать обычную форму и добавить заполнители с помощью модуля, или это должно быть сделано с помощью шаблона формы или с помощью jQuery?

chrisjlee
источник

Ответы:

31

Это заполнитель HTML5, вы можете просто добавить его в качестве атрибута к любому элементу, и браузеры с поддержкой HTML5 будут реагировать соответствующим образом:

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

Короткая рекурсивная функция, подобная этой, может быть полезна, если вы хотите автоматически добавлять заполнители для каждого текстового поля в форме (на основе заголовка поля в этом примере):

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

Тогда в вашей форме изменить функцию просто вызов

MYMODULE_auto_placeholders($form);

Этот метод будет работать практически для каждого текстового поля в форме, за исключением тех, которые добавляются в #processфункции (например, текстовые поля alt и title поля изображения).

Клайв
источник
Результат: Ошибка: вызов неопределенной функции element_children () в bla_auto_placeholder () (строка 605 тем / custom / BLA / bla.theme).
Томас,
15

Я попробовал ответ Клайва:

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

Но, к моему удивлению, я получил заполнитель в текстовом поле, а не в самом текстовом поле. Тогда я попробовал вариант следующим образом, это сработало!

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');
  }
}
Генри
источник
Благодарность! Я начинал немного сходить с ума - даже не думал об этом.
Майк Криттенден
Что такое "some_element"? Идентификатор элемента? Как я могу найти это?
Сократись
@sokratis вы можете получить идентификаторы элементов по dpm ($ form), они появляются на первом уровне массива $ form. Ниже приведен фактический пример изменения формы комментария: функция <code> MYMODULE_form_alter (& $ form, & $ form_state, $ form_id) {if ($ form_id == 'comment_node_post_form') {$ form ['subject'] ['# атрибуты '] [' placeholder '] = t (' Subject '); $ form ['comment_body'] ['und'] [0] ['value'] ['# attribute'] ['placeholder'] = t ('Content'); }} </ code>
Генри
15

Просто добавьте заполнитель в массив #attributes для элемента поля формы, например, в следующем коде.

   $form['my_textfield'] = array(
      '#type' => 'textfield',
      '#attributes' => array(
        'placeholder' => t('My placeholder text'),
      ),
    );
neelmeg
источник
2
THX, это сработало для меня в Drupal 8.
Нет Sssweat
хорошо работал в D8.
августа
5

Наткнулся на это и подумал, что ответ Клайва, похоже, хорош для автоматического добавления заполнителей.

Итак, для исправления ситуации в drupal 8 необходимо внести несколько небольших изменений, так что здесь почти такой же ответ, но подходящий для вашей темы в 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]);
  }
}
frysch
источник
0

Если вы хотите нацелить экземпляр формы напрямую, используйте hook_form_FORM_ID_alter. Может быть аккуратнее, чем использование условных выражений. Мое решение для ориентации только на экземпляр блока формы поиска.

function eyecare_form_search_block_form_alter(&$form, $form_state) {
  $form['keys']['#attributes']['placeholder'] = t('Search');
}
Dr.ifle
источник