Drupal 8: Программный вывод формы Contact

Узнайте, как легко вывести форму Contact программно в Drupal 8.

21.11.2015
5 комментариев
3 мин.

На данный момент webform и eform (entityform) для Durpal 8 ещё не готовы или же сырые, поэтому приходится использовать стандартный модуль Contact для создания форм обратной связи на сайте.

Вызов данной формы, несколько "экзотический", поэтому я решил записать это на память, а может ещё и пригодиться кому.

Получаем идентификатор формы

В модуле Contact, есть галочка 'Make this the default form' - которая позволяет пометить контактную форму по умолчанию для сайта.

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

$default_form_name = \Drupal::config('contact.settings')->get('default_form');

Далее мы получаем форму.

# Получаем форму по её машинному имени напрямую, или можете задействовать
# $default_form_name.
$entity = \Drupal::entityManager()->getStorage('contact_form')->load('feedback');

$message = \Drupal::entityManager()
  ->getStorage('contact_message')
  ->create(array(
    'contact_form' => $entity->id(),
  ));

# Тут будет наша форма.
$form = \Drupal::service('entity.form_builder')->getForm($message)

Выводим форму в Twig

В моём случае надо было вывести форму в темплейте page.html.twig. Для этого в файле THEMENAME.theme пишем:

THEMENAME.theme
/**
 * Implements hook_preprocess_page().
 */
function THEMENAME_preprocess_page(&$variables) {
  $default_form = \Drupal::config('contact.settings')->get('default_form');
  $entity = \Drupal::entityManager()
    ->getStorage('contact_form')
    ->load($default_form);

  $message = \Drupal::entityManager()
    ->getStorage('contact_message')
    ->create(array(
      'contact_form' => $entity->id(),
    ));

  $variables['contact_form'] = \Drupal::service('entity.form_builder')->getForm($message);
}
page.html.twig
{{ contact_form }}
Contact
Drupal
Drupal 8

Комментарии

VVS   чт, 26/11/2015 - 22:58

А чем не устроил стандартный ядрёный вывод контактной формы в блоке? Зачем сразу в шаблоне выводить?

Baz   ср, 25/05/2016 - 15:01

Сделал по Вашему алгоритму; форма выводится, поля заполняются, но не отправляется. На странице /contact форма работает, как положено.
Может ли повлиять то, что сервер на nginx?

Георгий   вт, 09/08/2016 - 19:20

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

Макц   вт, 22/11/2016 - 16:55

Доброго времени. Спасибо за полезные материалы. Подскажите, будьте добры, если Вам известно в какую сторону глядеть, у меня стоит задача использования двух тимплейтов для вывода одной и той же формы. Пока доковырялся до сюда: function xxx_theme($existing, $type, $theme, $path) { return array( 'contact_message_xxx_callback_form' => array( 'template' => 'xxx-callback-contact-form-custom-template', 'render element' => 'form', ), 'contact_message_xxx_callback_form_modal' => array( 'template' => 'xxx-callback-contact-form-custom-template-modal', 'render element' => 'form', ), ); } но не работает...

Meles   пт, 27/10/2023 - 21:18

Так же ещё через модуль "Twig Tweak"
FORM_MACHINE_NAME - заменить на машинное имя формы

{{ drupal_entity_form('contact_message', values={contact_form: 'FORM_MACHINE_NAME'}) }}