Сохранение данных форм в системе MODx

Для организации работы web-форм на сайтах под управлением MODx используется сниппет eForm. Сниппет включен в базовую комплектацию системы управления контентом и достаточно хорошо документирован.

Однако, достаточно часто требуется не только отправка на почту данных, введенных в форму на сайте, но и сохранение информации в базу данных или лог. Сохранение данных целесообразно использовать в событии eFormOnBeforeMailSent после проверки валидности введенных значений перед отправкой почты. Введенные значения можно сохранять в структуре документов, а потом обрабатывать и выводить их с помощью Ditto.

Для работы со структурой документов потребуется специально разработанная для этой задачи библиотека. Эту библиотеку разработал ur001, я ее нашел очень давно и источник, к сожалению, указать не могу. Класс позволяет достаточно просто оперировать с документами и их TV-параметрами.

Собственно теперь об использовании:

1) Если сохранение данных будет осуществляться в структуру документов, необходимо выбрать (или создать) корневой элемент. У этого документа необходимо поставить галочку «содержит вложенные элементы»

2) Переместить этот файл в assets/libs/docmanager/document.class.inc.php.

3) Если сохранение данных формы будет осуществляться в соответствующие TV-параметры, то их предварительно необходимо создать. Имеет смысл создать для данных отдельный шаблон.

4) Необходимо создать функцию, в которой будет происходить обработка значений формы. Эту функцию надо поместить в отдельный сниппет.

Пример функции:

<!--?php 
function createnewticket(&$fields){
// Массив $fields будет содержать данные всех полей формы
// Создания документа с описанием.
require_once('assets/libs/docmanager/document.class.inc.php');
//путь к нашей библиотеке

$doc = new Document(); // создаем документ
$doc--->Set('parent',2); // определяем в какую папку положить
$doc->Set('template','ticket'); // задаем шаблон
$doc->Set('pagetitle',strip_tags($fields['title'])); // название
$doc->Set('introtext',strip_tags($fields['qwestion'])); // аннотацию
$doc->Set('content', ''); //можно помещать что-то и в контент
$doc->Set('published','0'); // не публикуем

// Далее пойдут TV-параметры
$doc->Set('tvname',strip_tags($fields['name'])); // автор
$doc->Set('tvemail', strip_tags($fields['email'])); // e-mail
$doc->Save(); // сохраняем

return true; // Говорим eForm, что все в порядке.
};
?>

Эту функцию надо поместить в сниппет createticket. В принципе в этой функции можно производить любые действия с данными формы, такие как запись в текстовый лог, сохранение в специальной таблице БД, отправка письма пользователю и т.п.

5) В вызове eForm на странице необходимо добавить событие eFormOnBeforeMailSent и до вызова eForm некешируемо вызвать сниппет с функцией-обработчиком.
Например так:

[!createticket!] [!eForm? &formid=`newticket` &to=`example@example.ru` 
&subject=`Новый вопрос с сайта` &tpl=`form_ask` 
&eFormOnBeforeMailSent=`createnewticket` &thankyou=`thankyou`!]