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

21.11.2015 4 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 }}

Комментарии

V
VVS # 26.11.2015 - 22:58

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

B
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', ), ); } но не работает...

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

В комментариях присутствует поддержка Markdown синтаксиса. Показать подсказку.
Ссылка
[Заголовок](http://google.ru)
Код в строку
`print "Hello World";`
Многострочный код
```php print "Hello World"; ```
Жирный текст
*Текст*
Курсивный текст
_Текст_