Для чего все это нужно и почему не компонент Login?
Не знаю, почему, но за всю свою многолетнюю практику работы с MODX Revolution, я использовал компонент Login только один раз. Отличие Login от FormIt состоит в том, что Login решает ряд задач, посвященных конкретно авторизации/регистрации и редактированию профиля пользователя на Frontend, а FormIt — это более универсальный компонент, с помощью которого можно построить практически любую логику обработки формы, но придется немного покодить. Если перед вами не стоит задача построить сайт с регистрацией и авторизацией на Frontend за час, то я бы предпочел исползовать FormIt, написав для него несколько хуков, вместо того, чтобы разбираться в Login и кастомизировать его формы, доступные по-умолчанию.
Я буду использовать ниже синтаксис Fenom вместо стандартного синтаксиса MODX.
В предыдущей статье я разбирал принцип работы FormIt. При работе с FormIt в чистом виде необходимо в самой форме добавлять дополнительные плейсхолдеры для вывода значений ошибок, значений полей и так далее. Для того, чтобы упростить себе жизнь, можно использовать данный компонент в связке с AjaxForm, что позволит сделать формы асинхронными и избавит вас от необходимости вставлять упомянутые выше плейсхолдеры.
Создаем html-код формы авторизации
На данном шаге нам необходимо создать болванку (html-код) нашей формы, которую мы в дальнейшем будем наполнять логикой.
Возьмем для примера такой код (взят из вполне конкретного проекта):
Создаем чанк с именем b.signinForm и помещаем в него код формы в том виде, в котором он показан выше. Далее мы будем вызывать данный чанк в параметрах сниппета AjaxForm.
Делаем вызов сниппета AjaxForm в связке с FormIt
Для того, чтобы наша форма хотя бы просто отобразилась на странице, необходимо в том месте, где она должна размещаться, поставить вызов сниппета AjaxForm.
Не важно, запускаете вы сниппет AjaxForm или FormIt, его необходимо вызывать без кэширования (с восклицательным знаком спереди), так как при любой загрузке страницы нам нужен свежий вызов, а не "слепок" из кэша.
Валидация полей
FormIt имеет встроенный механизм валидации полей. Правила валидации мы можем задать в параметре validate. Прежде, чем будет запущен какой-либо хук из параметра hooks, все поля будут прогнаны через указанные правила валидации. В нашем случае, это простое правило required, которое проверит, есть ли хотя бы один символ во введенных полях. Если поля успешно прошли валидацию, будет запущен первый хук из цепочки хуков, указанных в параметре hooks через запятую. В нашем случае мы создадим один хук под названием loginHook.
Для простоты понимания, хук — это сниппет, который запускается изнутри механизмов FormIt. Данный сниппет создается точно так же, как и все остальные сниппеты, а на входе такой сниппет принимает параметр $hook.
Стоит отметить, что если ваша форма подразумевает более сложную логику валидации полей, то вы можете создать собственный валидатор, который также является сниппетом, внутри которого вы можете проверить поле на соответствие значению в базе данных или любым иным способом.
Более подробно об этом написано здесь.
Но! И это еще не все! Вы можете проводить валидацию полей внутри хуков, что бывает также удобно.
Наполняем наш хук кодом
Сперва добавьте в параметр hooks в вызове сниппета AjaxForm или FormIt значение loginHook:
После чего необходимо создать сниппет loginHook, код которого нас сейчас будет интересовать больше всего.
В данном примере авторизация пользователя осуществляется через встроенный в modx процессор login. Если ваша логика авторизации отличается от встроенной логики авторизации modx, вы можете создать собственный процессор, наследующий класс процессора login, или написать код авторизации непосредственно в хуке.
Таким образом, вызов AjaxForm ниже в связке с хуом loginHook и формой b.signinForm позволит вам реализовать форму авторизации пользователя на сайте:
MODX FormIt. Создание форм с произвольной логикой
Как быстро понять суть работы FormIt и использовать данный компонент для обработки любых форм.
Спасибо за интересную статью Но почему то не работает?? использовал стандартный вывод [[!AjaxForm? &form=
signinForm
&hooks=loginHook
&validate=username:required,password:required
&validationErrorMessage=В форме содержатся ошибки!
&successMessage=Вход успешно выполнен!
&submitVar=sendSignin
]]А что-нибудь в консоли браузера есть? Запрос на сервер улетает?
Если улетает, тогда нужно посмотреть, проходят ли валидацию все поля. Если не проходят, то нужно искать проблему в валидации.
Если проходят, то нужно посмотреть, запускается ли сниппет loginHook. Если не запускается, то нужно проверить, нет ли опечаток в названии сниппета и выяснить, почему он не запускается.
Если запускается, то нужно смотреть в логику сниппета. Где-то в ней проблема.
при отправки выдает сообщение: Форма успешно отправлена, хотя должно быть Авторизация успешно завершена. Как можно проверить валидацию, и запуск хука loginHook? уже 2 час ковыряюсь проверил вроде все как описано
Такое сообщение отправляется, если не отправлена переменная submitVar. Нужно, чтобы в форме присутствовала либо <button type="submit" name="sendSignin" value="1">, либо <input type="hidden" name="sendSignin" value="1">
Спасибо, подставил, теперь наоборот пишет что: Форма содержит ошибки.
А вот это уже проблема валидации. Смотри, что выдает сервер, какие там ошибки.
прошу прощения, теперь выдает ошибки в консоли: Failed to load resource: the server responded with a status of 500 ()
.../public_html/core/model/modx/modx.class.php 1772 Processor .../public_html/core/model/modx/processors/security/user/login.php does not exist; Array ( [processors_path] => .../public_html/core/model/modx/processors/security/ )
MODX 3-й что ли? Если этого стандартного процессора нет, то что-то не так с путями, либо не та версия MODX.
Modx 2.8.4-pl (.../) скрыл просто полный путь папки проекта, nda
public_html/core/model/modx/processors/security/user/login.php по этому пути и правда нет этого вайла login.php
public_html/core/model/modx/processors/security/login.class.php по этому пути есть такой только файл, Интересно как так может быть, файл точно не перемешал и не удалял, прам точно
Значит нужно сделать runProcessor('login'..., а не runProcessor('security/login'...
Да кажется заработало, Огромное спасибо что помогли найти решение ошибок!
А не подскажете что может быть..? У меня на сайте при оформлении заказа, получаю ошибку вида /core/components/formit/src/FormIt/Hook/Email.php : 322) С не возможностью отправки письма на почту.
Если при вызове FormIt все параметры указаны верно и на локальной машине все отправляется, то проверьте последовательно:
? Почтовые настройки modx на рабочем сайте (способ отправки, настройки smtp, логин/пароль, порт, протокол, если отправка идет через smtp). Если там все в порядке, идем далее. Если не в порядке — читайте детальное описание к вашему smtp серверу, как правильно указывать настройки. Иногда проблема может быть в адресе сервера, порте и протоколе tls
? Проверьте почтовые логи сервера (/var/log/mail и т. п. в зависимости от операционной системы) — там как правило содержится подробная информация, почему письмо не хочет отправляться.
? Проверьте, уходят ли в принципе письма с вашего сервера. Для этого просто попробуйте сделать простой php скрипт с функцией mail() или через команду sendmail в командной строке сервера.
? Если у вас виртуальный хостинг (не VDS/VPS), то там как правило, самый быстрый способ найти проблему — это написать в техподдержку, так как у них много клиентов и если проблема частая, то ответ приходит очень быстро.
Удачи в поисках!