Как понять, почему не работает форма обратной связи на MODx
Наверно процентов 80 заказчиков, пишущих мне, желают решения проблемы с сайтом. На первом месте это доработки, а на втором – решение внезапно (или не очень) возникших проблем. Спектр проблем огромен, но все же можно найти общие моменты. Для примера давайте найдем вместе решение одной проблемы. Как я обычно думаю, при решении подобных задач. Итак, есть проблема: не работает форма обратной связи. Не приходят письма. Необходимо починить.
Первым делом всегда надо уточнять задачу: на какой ящик не приходят, после чего перестали приходить. В данном случае заказчик затруднился ответить на второй вопрос, на первый, впрочем, тоже. Ладно, смотрим сам сайт.
Сначала попробуем отправить. Желательно с разных браузеров, с расширениям и без. В данном случае это у нас не получилось. Капча не проходится. Нажимаем на я не робот, крутится анимация исчезает и все. Без капчи не получается отправить письмо.
Сразу смотрим в инструменты разработчика. Это, пожалуй, первый важный этап – ищем ошибки. Если это фронтенд – в консоли браузера, или в запросах. Если бэкенд – смотрим логи. Апача, сайта, базы данных – с чем взаимодействуем, того уровня и нужны логи.
В данном случае у нас мы сразу видим ошибку в запросе: проверка капчи отправляет POST-запрос по адресу norobot.json, а получает в ответ ошибку 404. То есть навскидку вариант: нет ресурс в modX, который бы отдавал ответ на запрос. Окей, давайте перейдем в админку и посмотрим вообще на чанк, в котором формируется форма (простите за тавтологию). Это у нас чанк под названием call-order. Его код:
<div style="display:none;"> <div id="call-order" class="popup-wrap call-order-popup-wrap"> [[!AjaxForm? &snippet=`FormIt` &form=`callmeFormTpl` &hooks=`spam,email,FormItSaveForm` &emailSubject=`Заявка с сайта shans-plus.ru` &emailTpl=`sentCallMeMessageTpl` &customValidators=`customValidator,noLink,phoneValidator,validatorNorobot` &emailFromName=`[[++site_name]]` &emailTo=`[[++emailTo]]` &validate=`callmename:required:customValidator:noLink:minLength=^2^:stripTags, callmephone:required:phoneValidator:stripTags, message:required:maxLength=^999^:stripTags:customValidator:noLink, ipuser:required, workemail:blank, norobot:required:stripTags, hiddennorobot:required:validatorNorobot` &validationErrorMessage=`В форме содержатся ошибки!` ]] [[!+fi.successMessage:notempty=`<h3 class="error">[[!+fi.successMessage]]</h3>`]] </div> </div>Тут, кто хотя бы хоть раз сталкивался с MODX Revolution легко разберется в данном чанке. Главное, что нас интересует – это валидация капчи. А что у нас отвечает за валидацию капчи? Правильно, сниппет validatorNorobot. Находим этот сниппет. Код:
<?php if ($value=='') { $validator->addError($key,'Проверка капчи не пройдена'); return false; } elseif($value!=$_SESSION['norobot']){ $validator->addError($key,'Проверка капчи не пройдена'); return false; }elseif($value==$_SESSION['norobot']){ return true; }else{ $validator->addError($key,'Проверка капчи не пройдена'); return false; }Так, здесь ничего интересного. Этот сниппет получает данные и потом их обрабатывает, а нам надо найти то место, откуда они сюда приходят. Попробуем провести поиск по базе данных по слову «iamnotrobot» - это именно то, что отправляет наш POST запрос к адресу norobot.json. И находим вот такой сниппет norobotReturnSession (код я немного поменял, чтобы не светить соль хэширования, это тут вообще не играет никакой роли)
<?php $json = array(); if(isset($_POST['norobotclick']) and $_POST['norobotclick']=='iamnotrobot'){ if(!isset($_SESSION['norobot'])){ $_SESSION['norobot'] = md5('x0FFvvds'.time().'adsfffk'); } $json['success']=$_SESSION['norobot']; return json_encode($json); }else{ $json['error']='Проверка капчи не пройдена'; return json_encode($json); }Да, это как раз то, что нам надо. Проверка, что в пост-запросе именно необходимое слово и затем ответ json. Что ж, теперь мы знаем, что нам надо сделать, чтобы решить проблему. Создаем ресурс с псевдонимом norobot.json, в него ставим вызов снипета norobotReturnSession.
Не забудьте в настройках сделать простой текст, без html-форматирования.
Проверяем. Да, все в порядке, теперь ответ приходит и вы проходите верификацию, что не робот.
Итог
В данном конкретном случае кто-то специально или нечаянно удалил ресурс norobot.json – это самая вероятная причина того, что раньше работало, а потом перестало. Либо же кто-то восстановил сайт из бэкапа но не совсем. Интересовать это нас будет только в том случае, если подобное повторится.
Вот примерно по такой схеме я и работаю при починке неисправностей любого сайта: ищем то место, где что-то не работает. Либо в админке, либо поиск по базе данных, либо по файлам. Дальше понимаю алгоритм работы и локализую проблему, вставляю недостающую, поливаю маслом или заклеиваю изолентой поломанную шестеренку в механизме. За плату я починю и ваш сайт. Пишите.
Автор этого материала - я - Пахолков Юрий. Я оказываю услуги по написанию программ на языках Java, C++, C# (а также консультирую по ним) и созданию сайтов. Работаю с сайтами на CMS OpenCart, WordPress, ModX и самописными. Кроме этого, работаю напрямую с JavaScript, PHP, CSS, HTML - то есть могу доработать ваш сайт или помочь с веб-программированием. Пишите сюда.
Читайте также:
Отправляя сообщение я подтверждаю, что ознакомлен и согласен с политикой конфиденциальности данного сайта.