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