Итак, сегодня займемся совершенно не тривиальной задачей, а именно той, которая все чаще попадается мне на проектах, а именно сохранение значений формы в PDF документ. Данная технология, в основном используется в интернет магазинах, да и в других сервисах, где требуется выставление счетов или снять какие-то показатели сайта.
Как всегда, все делаем на примере. У меня есть базовая форма, которая состоит из 3х полей:
- Ваше имя
- Ваш пол
- Текст сообщения
Я опускаю, как создавать простейшие формы, ибо все это уже проходили.
Ну или код модуля, файл custom_form.module:
<?php /** * Implements hook_menu() */ function custom_form_menu(){ 'title' => 'My custom form', 'page callback' => 'drupal_get_form', 'access callback' => TRUE, ); return $items; } /** * Implements hook_form() */ function custom_form_form($form, &$form_state){ // Text field '#title' => 'Your name', '#type' => 'textfield', '#required' => TRUE, ); // Select '#title' => 'Your sex', '#type' => 'select', '#empty_option' => 'Select your sex', '#required' => TRUE, ); // Textarea '#title' => 'Your message', '#type' => 'textarea', '#required' => TRUE, ); // Submit '#value' => 'Save value to PDF', '#type' => 'submit', ); return $form; } /** * Implements hook_form_submit */ function custom_form_form_submit($form, &$form_state){ $result = $form_state['values']; }
По сабмиту, у нас естественно ничего не происходит. Теперь к самому интересному, как создать PDF документ. PHP из коробки не умеет работать с PDF документами, только с подключением дополнительных библиотек. Библиотек очень большое количество, а действительно адекватно работающих не так уж и много. Я перепробовал их огромное количество и для себя выбрал 2:
В нашем случае, я буду использовать первый вариант TCPDF. Первое, что нужно сделать – это скачать саму библиотеку и распаковать ее в корень своего модуля.
Теперь в сабмите подключим данную библиотеку
<?php module_load_include('php', 'custom_form', 'tcpdf/tcpdf');
Ну а дальше, нам остается лишь задать параметры PDF документа и определить, что делать с данным файлом после создания. Я, данный документ буду сохранять в БД и отправлять его пользователю на скачивание. Список примеров и параметров данной библиотеки можно посмотреть здесь
Ну а дальше по коду и комментариям должно быть все понятно
Хочу заметить, что данный файл в БД, будет сохраняться в течении нескольких часов, ибо статус у него 0, если же вам нужно сохранить его навсегда, то меняем на 1.
Файл модуля custom_form.module
<?php /** * Implements hook_menu() */ function custom_form_menu(){ 'title' => 'My custom form', 'page callback' => 'drupal_get_form', 'access callback' => TRUE, ); return $items; } /** * Implements hook_form() */ function custom_form_form($form, &$form_state){ // Text field '#title' => 'Ваше имя', '#type' => 'textfield', '#required' => TRUE, ); // Select '#title' => 'Ваш пол', '#type' => 'select', '#empty_option' => 'Select your sex', '#required' => TRUE, ); // Textarea '#title' => 'Сообщение', '#type' => 'textarea', '#required' => TRUE, ); // Submit '#value' => 'Save value to PDF', '#type' => 'submit', ); return $form; } /** * Implements hook_form_submit */ function custom_form_form_submit($form, &$form_state){ module_load_include('php', 'custom_form', 'tcpdf/tcpdf'); // Подключаем библиотеку TCPDF $result = $form_state['values']; // Массив срезультатами формы $html ='<h1>Результаты заполнения формы</h1> <ul> <li>Ваше имя: ' .$result['name'] .'</li> <li>Ваше пол: ' .$result['sex'] .'</li> <li>Сообщение: ' .$result['message'] .'</li> </ul>'; $pdf = new TCPDF('P', 'mm', 'A4', true, 'UTF-8', false); // создаем объект TCPDF $pdf->SetMargins(20, 25, 25); // отступы страницы $pdf->SetFont('dejavusans', '', 16); // используемый шрифт и его размер $pdf->AddPage(); // создали страницу $pdf->Writehtml($html, true, false, true, false, ''); $url_to_path = 'public://' .$name_file; $pdf->Output($url_to_path, 'F'); // сохраняем файл на сервере // Сохраняем файл в БД if(user_is_anonymous()){ $uid = ''; }else{ global $user; $uid = $user->uid; } $uri = $url_to_path; // Создаем объект файла $file = new stdClass; $file->uid = $uid; $file->filename = $name_file; $file->uri = $uri; $file->filemime = 'application/pdf'; $file->status = 0; file_save($file); // Отдаем файл на скачивание конечному пользователю 'Content-Type' => 'application/octet-stream', 'Content-Disposition' => 'attachment; filename="' .$url_to_path . '"', ) ); }
Сам готовый модуль, используемый в примере можно скачать здесь. По всем остальным вопросам - как всегда в комментариях.
Хочу заметить, что вместе с модулем идет и библиотека TCPDF, отсюда и вес в 17mb.
Комментарии (4)
Где это применять? Зачем такое нужно может быть?
например для выставления счета оплаты в банке.
Штука крутая, а как такое реализовать для разных шаблонов. Чтоб можно было их выбрать. Я имею в виду конечный пдф, чтоб имер разный вид в нутри к примеру для одной компании с одной шапкой и тремя столбиками, а дя другой с двумя столбиками и своей шапкой. И в нагрузгу не только пдф но и эксэль )
добавляете дополнительный радиобаттон в форму и при сабмите проверяете занчение радиобаттона и на основе этого генерируете PDF. Для exel попробуйте использовать библиотеку php exel