Как понять, почему не работает форма обратной связи на 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 - то есть могу доработать ваш сайт или помочь с веб-программированием. Пишите сюда.
Программы на заказ
Отзывы
Контакты