UMIhelp

Разработка сайта на UMI.CMS => JS и AJAX => Тема начата: Cubes от 22 Октября 2014, 18:05:10

Название: Регистрация новых пользователей AJAX
Отправлено: Cubes от 22 Октября 2014, 18:05:10
Здравствуйте. Собственно проблема в следующем: человек заполняет данные формы, которые AJAX запросом отправляются на сервер, а ему показывается сообщение об успешной регистрации, но как получить ответ от сервера, если при регистрации были допущены ошибки (допустим логин уже занят)?

Данные отправляются с помощью плагина jquery.form. Реализовано, примерно как тут:
http://wiki.umisoft.ru/Вебформы_на_ajax_tpl (http://wiki.umisoft.ru/Вебформы_на_ajax_tpl)

Нужно переделать файл _register.php (/classes/modules/users), чтобы он передавал данные об ошибке на текущую страницу. Можно ли это сделать? Если, да дайте наводку как? В Ajax не силен, один не справлюсь, выручайте! :)
Название: Re:Регистрация новых пользователей AJAX
Отправлено: admin от 24 Октября 2014, 12:18:06
раньше переписывал макрос registrate_do (делали копию со соими исправлениями) в котором все ошибки возвращал через exit (чтобы не срабатывал redirect), а потом стал писать пред. функцию, которая вначале проверяла все данные и возвращала в случае ошибки ответ через exit или через result (если вызов функции был с .json), а затем вызывала registrate_do.

Возможно, сейчас можно и через json вызвать registrate_do и обойти ситуацию редиректа, но это не проверял.
Название: Re:Регистрация новых пользователей AJAX
Отправлено: Cubes от 24 Октября 2014, 12:31:48
Спасибо за наводку! Можете показать код переделанного макроса registrate_do или функции проверки? На конкретном примере быстрее разберусь.)
Название: Re:Регистрация новых пользователей AJAX
Отправлено: Cubes от 30 Октября 2014, 15:33:18
Оказалось, как всегда все просто. Реализовал (наверняка коряво, но работает) следующим образом(привожу упрощенный пример, где проверяется только уникальность email):

Функция logincheck() в modules/users/__custom.php

public function logincheck(){




$object_id = $this->user_id;


$email = trim((string) getRequest('email'));


if (!$this->checkIsUniqueEmail($email, $object_id)) {
echo ("<span style='color:red'>ОШИБКА: пользователь с данным email уже существует</span>");

}
else {

// ниже, переделанная функция register_do (можно взять ее в исходном виде):

    if (!($template = getRequest('template'))) {
// ..........................................
$this->setEventPoint($oEventPoint);
}


exit();
}       

Не забываем дать права новой функции:
Создаем файл в classes/modules/users: permissions.custom.php

<?php
$permissions = Array(
      'login' => Array('logincheck')
  );
?>


Дальше создаем страницу с формой и скриптом, который будет обращаться к макросу и выдавать ответ (либо ошибку, либо запуск регистрации):

$(document).ready(function() {   
   
$("#IDФОРМЫ").submit(function(){                                               
var form = $(this);                                                           
                                                               
var data = form.serialize();                                           
$.ajax({
   type: "POST",
   url: "/udata/users/logincheck",
   dataType: "text",
   data: data,
   success: function(data){
     document.getElementById('ID_DIV_куда_выводим_сообщение').innerHTML = data;
   
       if (document.getElementById('ID_DIV_куда_выводим_сообщение').innerHTML == "") {       
         document.getElementById('ID_DIV_куда_выводим_сообщение').innerHTML = 'Пользователь успешно зарегистрирован!';
    }

    }
   });

return false;
});
});