Перейти до вмісту
Пошук в
  • Детальніше...
Шукати результати, які ...
Шукати результати в ...

Паттерн обработки форм отправленных Ajax и обычным способом


Recommended Posts

Есть, кто реализовывал подобное или может материалы видел, поделитесь. Лучшее, что приходит на ум - в контроллере собирать 2 url для action и тот, который для ajax вставлять в атрибут data-action. Ну и соответственно создать метод, который обработает запрос.

Змінено користувачем Muvka
Надіслати
Поділитися на інших сайтах


1 час назад, Muvka сказал:

Есть, кто реализовывал подобное или может материалы видел, поделитесь. Лучшее, что приходит на ум - в контроллере собирать 2 url для action и тот, который для ajax вставлять в атрибут data-action. Ну и соответственно создать метод, который обработает запрос.

а зачем? в аяксную отправку просто добавить данные, типа, ajax:true

А в обработчике отслеживать этот параметр, и дальше создать условие для вывода результата.

Надіслати
Поділитися на інших сайтах

2 минуты назад, esculapra сказал:

а зачем? в аяксную отправку просто добавить данные, типа, ajax:true

А в обработчике отслеживать этот параметр, и дальше создать условие для вывода результата.

Ajax и по-другому можно определить. Например так:

if(isset($this->request->server['HTTP_X_REQUESTED_WITH']) && !empty($this->request->server['HTTP_X_REQUESTED_WITH']) && strtolower($this->request->server['HTTP_X_REQUESTED_WITH']) == 'xmlhttprequest'))

Проблема в другом. Код слишком захламленным получается. Много вложенных if. Например вот регистрация:

if (($this->request->server['REQUEST_METHOD'] == 'POST') && $this->validate()) {
    $customer_id = $this->model_account_customer->addCustomer($this->request->post);

    // Clear any previous login attempts for unregistered accounts.
    $this->model_account_customer->deleteLoginAttempts($this->request->post['email']);

    $this->customer->login($this->request->post['email'], $this->request->post['password']);

    unset($this->session->data['guest']);

    $this->response->redirect($this->url->link('account/success'));
}

нужно валидацию внутри условия уже проводить, потом условие на результат валидации и только потом на ajax. Мне это не очень нравится....

Надіслати
Поділитися на інших сайтах


Вот на скорую руку накидал. Получается что-то типа этого. Не проверял как работает, но мне такой код не очень нравится

if (($this->request->server['REQUEST_METHOD'] == 'POST')) {
  $validate = $this->validate();
  $ajax_request = isset($this->request->server['HTTP_X_REQUESTED_WITH']) && !empty($this->request->server['HTTP_X_REQUESTED_WITH']) && strtolower($this->request->server['HTTP_X_REQUESTED_WITH']) == 'xmlhttprequest';

  if ($validate) {
    $this->request->post['email'] = 'default' . round(microtime(true) * 1000) . '@localhost.ru';

    $customer_id = $this->model_account_customer->addCustomer($this->request->post);

    $this->model_account_customer->deleteLoginAttempts($this->request->post['telephone']);

    $this->customer->login($this->request->post['telephone'], $this->request->post['password']);

    unset($this->session->data['guest']);

    if ($ajax_request) {
      $json = array();

      $json['redirect'] = $this->url->link('account/success');

      $this->response->addHeader('Content-Type: application/json');
            $this->response->setOutput(json_encode($json));
    } else {
      $this->response->redirect($this->url->link('account/success'));
    }
  } elseif ($ajax_request) {
    $this->response->addHeader('Content-Type: application/json');
    $this->response->setOutput(json_encode(array(
      'error' => $this->error;
    )));
  }
}

 

Змінено користувачем Muvka
Надіслати
Поділитися на інших сайтах


2 минуты назад, esculapra сказал:

а не проще ? и в приведенном коде я не нашел много if


if(isset($this->request->post['ajax'])){
//
}

А я ажно 3ю вложенность условий вижу...

Надіслати
Поділитися на інших сайтах


1 минуту назад, esculapra сказал:

if ($ajax_request) {
echo 'Its okay!';
exit();
}

$this->response->redirect($this->url->link('account/success'));

Да, спасибо, в 2х местах еще exit() поставил. Вам нравится такой код?

Надіслати
Поділитися на інших сайтах


Я в своих разработках результат вывожу своеобразной функцией

 private function ajaxResponseError($message,$warning=false)
     {
     if($warning)$return['status']='Warning';
           else
          $return['status']='Error';
       $return['result']=$message;
        echo json_encode($return);
          exit  ;
     }

Вот если сервер возвратит ошибку, то выводится сообщение, а если сработает функция

 private function ajaxResponseDone($message,$params=null)
     {
     if(isset($params))
         foreach($params as $key=>$value)
       {
         $return[$key]=$value;
       }
       $return['status']='Done';
       $return['result']=$message;
       $return['success']=true;
        echo json_encode($return);
          exit  ;
     }

То (применительно к коду регистрации) можно выести сообщение о успешной реге и после некоторой задержки сделать перенаправление на страницу входа

Надіслати
Поділитися на інших сайтах

7 минут назад, Muvka сказал:

в 2х местах еще exit() поставил. Вам нравится такой код?

Это нужно для прерывания работы скрипта и отправки результата. Иначе скрипт пойдет дальше и страница перезагрузится.

Надіслати
Поділитися на інших сайтах

4 минуты назад, esculapra сказал:

Это нужно для прерывания работы скрипта и отправки результата. Иначе скрипт пойдет дальше и страница перезагрузится.

Тут вы меня неправильно поняли. Последнее предложение не про exit().

Надіслати
Поділитися на інших сайтах


21 минуту назад, Muvka сказал:

$this->response->addHeader('Content-Type: application/json'); $this->response->setOutput(json_encode($json));

Это вообще лишний код. Почуему? Потому что клиетнт ожидает определенный тип данных (это задано в установках). А редирект можно переместить в шаблон - и он произойдет при успешном статусе.

    function checkRegexp(fun) {
    url=$('#url_no_mod').val()+'&'+$('#token_indent').val()+'='+$('#token').val();    
    form = $("#regexpForm").serializeArray();
     jQuery.ajax({
      url: url,    
      type:"post",
      dataType: "json", // ожидаем получение json
      data:{
          controller:"antivirus",
         task:"checkRegexp",
         fun:fun,
          form:form
        },
  success: function(data){
        if(data.success){

window.location=data.redirec; //это как пример

}

else alert(data.message);
  }
}
);
}

Надіслати
Поділитися на інших сайтах

Створіть аккаунт або увійдіть для коментування

Ви повинні бути користувачем, щоб залишити коментар

Створити обліковий запис

Зареєструйтеся для отримання облікового запису. Це просто!

Зареєструвати аккаунт

Вхід

Уже зареєстровані? Увійдіть тут.

Вхід зараз
  • Зараз на сторінці   0 користувачів

    • Ні користувачів, які переглядиють цю сторінку
×
×
  • Створити...

Important Information

На нашому сайті використовуються файли cookie і відбувається обробка деяких персональних даних користувачів, щоб поліпшити користувальницький інтерфейс. Щоб дізнатися для чого і які персональні дані ми обробляємо перейдіть за посиланням . Якщо Ви натиснете «Я даю згоду», це означає, що Ви розумієте і приймаєте всі умови, зазначені в цьому Повідомленні про конфіденційність.