Drupal → Темизация форм

29.11.2015

Drupal 8+

Пример темизации формы с идентификатором example_form:

1. Реализуем хук hook_theme(), в котором в качестве имени шаблона указываем идентификатор формы:

// THEMENAME.theme

/**
 * Implements hook_theme().
 */
function THEMENAME_theme(): array {
  return [
    'example_form' => [
      'render element' => 'form',
    ],
  ];
}

2. Создаём файл templates/example-form.html.twig, в котором выводим элементы в нужной разметке:

<div class="container">
  <div class="row">
    <div class="col-sm">{{ form.element1 }}</div>
    <div class="col-sm">{{ form.element2 }}</div>
  </div>
</div>
{{ form|without('element1', 'element2') }}

3. Сбрасываем кэш.

Как это работает? Если у формы не задано свойство #theme, а оно по умолчанию не задано, то в \Drupal\Core\Form\FormBuilder::prepareForm() вызывается:

$form['#theme'] = [$form_id];
if (isset($build_info['base_form_id'])) {
  $form['#theme'][] = $build_info['base_form_id'];
}

Остаётся только объявить соответствующий шаблон и создать twig файл.

Подробнее.

Drupal 7

Пример темизации формы commerce_checkout_form_checkout:

1. Реализуем хук hook_theme():

function THEMENAME_theme() {
  return array(
    'commerce_checkout_form_checkout' => array(
      'render element' => 'form',
      'template' => 'commerce-checkout-form-checkout',
    ),
  );
}

2. В корне модуля/темы создаём файл commerce-checkout-form-checkout.tpl.php:

<div class="row">
  <div class="col">
    <?php echo render($form['field_name1']); ?>
    <?php echo render($form['field_name2']); ?>
  </div>
  <div class="col">
    <?php echo render($form['field_name3']); ?>
  </div>
</div>
<?php echo drupal_render_children($form); ?>

3. Очищаем кэш.

Написанное актуально для
Drupal 7+
Похожие записи

Комментарии

Виктория
28.01.2016, 00:18

Может, мой вопрос покажется глупым, но где при этом должен находится файл commerce-checkout-form-checkout.tpl.php?

там же где файл с реализацией hook_theme

Гость
04.02.2021, 19:33

Не знаю что за ребус, но кнопку Юберкарта "Добавить в корзину" я так и не смог переоределить ни этим способом, ни

так

function annette_form_alter(&$form, &$form_state, $form_id)
{
  switch ($form_id) {
    case 'uc_product_add_to_cart_form':
      $form['actions']['submit']['#value'] = 'asdasd';
      return $form;
      break;
  }
}
function annette_form_add_to_cart_form_alter(&$form, &$form_state, $form_id)
{
  $form['actions']['submit'] = array(
    '#type' => 'submit',
    '#value' => t('Add ++'),
    '#id' => 'edit-submit-' . $node->nid,
    '#attributes' => array(
      'class' => array('node-add-to-cart'),
    ),
  );
  return $form;
}

ни даже скопировав из юберкарта код функции в собственный модуль.

Единственное что дает эффект - это править код в самом модуле.

Добавить комментарий