Webform. Сергей Шумской

Webform - модуль для создания форм и опросов в Drupal. После отправки письма электронной почты письмо может быть отправлено администратору и/или отправителю. Результаты могут быть экспортированы в Excel или в другие программы электронных таблиц. Webform также предоставляет некоторые базовые статистические review и имеет большой API для расширения своих возможностей.

В этом докладе раскрою:

  1. настройки elements webform при работе с file
  2. создание файла формата .pdf
  3. использование webform для отправки письма своих данных
  4. расширенные возможности element Select

 

1. Настройки elements webform при работе с file

Для работы с elements file в webform, у Вас должны быть установлены определенные настройки. При настройки сайта Drupal 8, выполните следующие настройки из файла drupal8/core/INSTALL.txt, см. пункт 5.

b. Open your settings.php in a plain-text editor, and uncomment (remove the #

     at the start of line) this line:

     # $settings['file_public_path'] = 'sites/default/files';

     Enter the desired path and save the file.

     If you want to use private file storage, you need to uncomment (remove

     the # at the start of line) the following line in settings.php:

     # $settings['file_private_path'] = '';

     Enter the path for private files and save the file.

Также обязательно обратите внимание на настройки в самой webform. Для этого перейдите на /admin/structure/webform, закладку Settings, найдите раздел File upload default settings и проверьте настройки как показано на рисунке.

1.jpg

После этого у Вас будет возможность добавлять к вашей форме elements webform File.

2. Создание файла формата *.pdf

В этом проекте для создания файла формата *.pdf, я конвертировал HTML в PDF с помощью Dompdf. Для работы нам необходимо установить dompdf library (https://github.com/dompdf/dompdf).

Как я конвертировал HTML в PDF с помощью Dompdf? - Очень просто, используем следующую функцию:

     function getResultFileResume(&$form, \Drupal\Core\Form\FormStateInterface &$form_state) {

     $values = $form_state->getValues();

     //  todo add date time

     $date = date('m-d-Y-h-i-s', time());

     $file_name = str_replace(' ', '-', $values['position_applied_for'])

     . '--' . str_replace(' ', '-', $values['last_name'])

     . '--' . str_replace(' ', '-', $values['first_name'])

     . '--' . $date . '.pdf';

     $form_params = [

     '#theme' => 'webform_job_aplication',

     '#elements' => $values,

     ];

     $html = \Drupal::service('renderer')->renderRoot($form_params);

     // Init the PDF generator. Here I am using the DOMPDF library

     $dompdf = new Dompdf();

     $dompdf->loadHtml($html);

     $dompdf->render();

     // Convert the HTML data to PDF

     $output = $dompdf->output();

     //   Save PDF file

     $file = file_save_data($output, 'public://' . $file_name ,FILE_EXISTS_REPLACE);

     //   PDF file to add our file in our list values $form_state

     $form_state->setValue('form_result', $file->id());

     }

Теперь шаг за шагом я расскажу, что такое и как про функцию getResultFileResume():

1. $values = $form_state->getValues();

$values - получаем все данные с заполненной формы на сайте в массив. Далее эти данные нам будут необходимы для создания файла формата *.pdf

2. $file_name - создаю уникальное имя для нашего будущего файла

3. $form_params = [

     '#theme' => 'webform_job_aplication',

     '#elements' => $values,

     ];

 

4. $form_params - создаю массив, куда перебрасываю данные '#elements' => $values, и название шаблона, который будет использоваться '#theme' => 'webform_job_aplication'.

Теперь необходима функция, которая будет эти данные обрабатывать

5. function fco_master_theme() {

     return [

         'webform_job_aplication' => [ 'variables' => [ 'elements' => [], ], ],

         ];

     }

6. $html = \Drupal::service('renderer')->renderRoot($form_params);

Использую сервис 'renderer', и получаю данные в формате HTML

Детальнее познакомиться с этим сервисом можно тут:

https://api.drupal.org/api/drupal/core%21lib%21Drupal%21Core%21Render%21Renderer.php/class/Renderer/8.2.x

7.   $dompdf = new Dompdf();

     $dompdf->loadHtml($html);

     $dompdf->render();

     $output = $dompdf->output();

     $file = file_save_data($output, 'public://' . $file_name ,FILE_EXISTS_REPLACE);

$output - получаю данные в формате *.pdf

$file - сохраняю получить файл в формате *.pdf

 

8. $form_state->setValue('form_result', $file->id());

В пункте 8 использую элемент формы. В данный элемент “помещаю” ссылку на созданный файл, который есть сохранен на сервере.

С помощью $form_state->setValue('form_result', $file->id()); использую настройки моей webform и моя форма сама добавляет линк на файл к письму.

 

Таким образом подведем итоги:

  • получили массив со всеми данными формы
  • создали уникальное имя
  • создали шаблон и передали в шаблон данные
  • получили данные html
  • использовали Dompdf и получили файл формата *.pdf
  • сохранили файл формата *.pdf
  • передали в форму линк на этот файл

3. Использование webform для отправки письма своих данных

Что я имею ввиду ?

Идея простая - я использовал саму webform, а именно - поскольку уже есть настройки Emails / Handlers моей webform то я просто создаю еще одно поле формата file, далее “прячу” это поле от пользователя и после того как создается необходимый файл формата *.pdf (описано выше), я добавляю этот файл в “спрятанное” поле.

То есть будет выполняться при Submit формы:

  1. выполняется валидация всех полей формы
  2. создается необходимый файл формата *.pdf
  3. файл будет добавлен к письму
  4. письмо отправится с указанными настройками

Каким образом это реализуемо, используем form_alter

function fco_master_form_alter(&$form, \Drupal\Core\Form\FormStateInterface &$form_state, $form_id) {

 if ($form_id == 'webform_submission_job_application_form') {

   if (empty($form['actions']['submit']['#submit'])) {

     $form['actions']['submit']['#submit'] = [];

   }

   array_unshift($form['actions']['submit']['#submit'], 'getResultFileResume');

 }

}

Эта функция просто добавляет к списку функций, которые используются при Submit первой нашу, которая создает файл формата *.pdf

4. Расширенные возможности element Select

В этом пункте расскажу, каким образом используя только возможности одной

webform возможно создать что-то похожее на Add One More секции формы.

Конечно, наилучшим вариантом будет написание своего собственного поля, в котором будут указаны все необходимые поля, например, как из нашего проекта:

2.jpg

 

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

Для этого необходимо выполнить следующие настройки:

 

3.jpg

  1. Это будет наша кнопка, которая добавит возможность “еще” заполнить информацию. То есть если мы нажмем на эту кнопку - то появится еще один блок.

Для настройки нам необходимо перейти на редактирование поля, нажмите Edit, далее:

    

  • перейдите на вкладку Conditional logic
  • добавьте необходимые настройки, в нашем примере это:

 

4.jpg

 

  1. Это блок, который необходимо заполнить пользователю.

 

Social activity
28.03.2017