Додавання заповнювачів форми до полів введення тексту


22

Чи є спосіб перетворити звичайну форму та додати заповнювачі за допомогою модуля, або це потрібно зробити за допомогою шаблону форми або за допомогою jQuery?

Відповіді:


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_placeholders () (рядок 605 тем / звичай / 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'] ['# attributes '] [' placeholder '] = t (' Subject '); $ form ['comment_body'] ['und'] [0] ['value'] ['# attributes'] ['placeholder'] = t ('Content'); }} </code>
Генрі

15

Просто додайте заповнювач у масив #attributes для елемента поля форми, наприклад, у наведеному нижче коді.

   $form['my_textfield'] = array(
      '#type' => 'textfield',
      '#attributes' => array(
        'placeholder' => t('My placeholder text'),
      ),
    );

2
thx, це спрацювало для мене в Drupal 8.
No 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]);
  }
}

0

Якщо ви хочете націлити на екземпляр форми, скористайтеся безпосередньо гачком_форма_FORM_ID_alter. Може бути акуратніше, ніж використання умовних умов. Моє рішення для націлювання лише на екземпляр блоку форми пошуку.

function eyecare_form_search_block_form_alter(&$form, $form_state) {
  $form['keys']['#attributes']['placeholder'] = t('Search');
}
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.