Узнайте, как легко вывести форму Contact программно в Drupal 8.
На данный момент 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
пишем:
/**
* 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);
}
{{ contact_form }}
Комментарии
Сделал по Вашему алгоритму; форма выводится, поля заполняются, но не отправляется. На странице /contact форма работает, как положено.
Может ли повлиять то, что сервер на nginx?
Подскажите пожалуйста как сделать отправку этой формы аяксом?(без перезагрузки страницы, с выводом сообщения что письмо отправленно)
Доброго времени. Спасибо за полезные материалы. Подскажите, будьте добры, если Вам известно в какую сторону глядеть, у меня стоит задача использования двух тимплейтов для вывода одной и той же формы. Пока доковырялся до сюда: 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', ), ); } но не работает...
Так же ещё через модуль "Twig Tweak"
FORM_MACHINE_NAME - заменить на машинное имя формы
{{ drupal_entity_form('contact_message', values={contact_form: 'FORM_MACHINE_NAME'}) }}
А чем не устроил стандартный ядрёный вывод контактной формы в блоке? Зачем сразу в шаблоне выводить?