Для организации работы 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`!]