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

тегизаметки, modx, обратная связь, решение задач




Отправляя сообщение я подтверждаю, что ознакомлен и согласен с политикой конфиденциальности данного сайта.



Перебор всех дней в году на PHP
С. Визгорев - AI Factory's Chess, уровень 10, 10 мая 2016
Роман "Работа во сне": Глава №1