Выпустил новый пакет modxSite-1.2.0-beta
Главная новинка — процессор на обработку форм (на замену formIt). Конечно, в нем гораздо меньше готовых функций, чем в формите, но он вполне годится ему на замену. Под катом покажу применение на примере обновленной сборки ShopModxBox-2.2.0
Итак, главное назначение этого процессора — обработка входящих данных, проверка обязательных полей, выполнение субпроцессора, если данные все заполнены верно (к примеру, процессор оформления заказа), а так же рассылка уведомления пользователям из указанных групп пользователей.
Рассмотрим реальную задачу, которую этот процессор выполнял в обработке формы обратной связи на странице контактов в сборке магазина:
1. Проверка обязательных полей (емейл, имя, сообщение, каптча).
2. Отправка уведомления пользователям спецгруппы.
Сам по себе базовый процессор обработки форм не имеет обязательных полей, но в нем предусмотрена функция, в которой эти поля указываются. Что мы делаем, для реализации нашей формы?
2. Создаем Smarty-шаблон, в котором прописываем вызов нашего процессора.
Особое внимание предлагаю обратить на блок вывода каптчи.
Немного инфы по юзабилити на заметку: (для всех, кто ненавидит каптчи (как и я)). В общем, если в форме используется каптча, то в случае отправки формы, даже если есть ошибки в форме, если каптча введена верно, то не создавать опять форму с каптчей (типа вводите картинку опять, раз руки такие кривые), а создавать хидден-поле со значением этой каптчи без вывода картинки, которая изменит значение в сессии. То есть если пользователь правильно ввел раз каптчу, то дальше она ему не нужна.
А теперь самое интересное: данный процессор имеет огромное преимущество над формитом и прочими решениями тем, что обработка всех полей происходит именно в процессоре, и он возвращает ассоциативный массив ошибок. Таким образом его можно использовать хоть в обычной форме, хоть с Ajax-ом, хоть в консоли отлаживать. К примеру, в новой сборке магазина выполните вот такой код:
<?php
print '<pre>';
ini_set('display_errors', 1);
$modx->switchContext('web');
$modx->setLogLevel(3);
$modx->setLogTarget('HTML');
$modx->invokeEvent('OnHandleRequest');
$namespace = 'modxsite';
if(!$response = $modx->runProcessor('web/forms/feedback',
array(
"email" => "test@test.loc",
"fullname" => "test",
"message" => "test",
"captcha" => "wlfnq",
), array(
'processors_path' => $modx->getObject('modNamespace', $namespace)->getCorePath().'processors/',
))){
print "Не удалось выполнить процессор";
return;
}
print_r($response->getResponse());