2014-07-02 3 views
1

У меня есть сайт, который содержит, среди прочего, две страницы: страницу бронирования событий и страницу входа в систему.Объединение двух функций ajax?

Моя цель: Я хочу объявить две функции Ajax, loginUser() и bookEvent(), которые я могу использовать на любой странице, также в сочетании. Когда пользователь нажимает «login» на странице входа в систему, должна выполняться только функция loginUser(), когда пользователь нажимает «книжное событие» на странице бронирования событий, сначала следует проверить, зарегистрирован ли пользователь, затем если он не вошел в систему, у него будет возможность войти в систему (вызывая функцию loginUser), и как только он войдет в систему, он автоматически забронирует событие (вызывая функцию bookEvent).

Мой вопрос: Как объединить обе функции в последнем случае? И как достичь этого, если пользователь уже зарегистрировался, на странице бронирования событий активируется функция bookingEvent(), когда пользователь нажимает на «книжное событие»? Я не прошу php-код, я уже знаю, как использовать обе функции отдельно друг от друга и как подключиться к базе данных!

Вот что я придумал до сих пор:

Мои две общие настраиваемые функции:

// LOGIN USER FUNCTION 
function loginUser(login_query, param_response_dberror, 
param_response_failed, param_response_success) { 

     $.ajax({ 
       type : "POST", 
       url : "system/process-login.php", 
       data : login_query, 
       cache : false, 
       success : function(ajaxresponse) { 
           if (ajaxresponse === 'db_error') { 
            param_response_dberror(); 
           } 
           if (ajaxresponse === 'failed') { 
            param_response_failed(); 
           } 
           if (ajaxresponse === 'success') { 
            param_response_success(); 
           } 
          } 
         }); 

} // /function loginUser(); 

// BOOK EVENT FUNCTION 
function bookEvent (booking_query, param_response_dberror, 
param_response_failed, param_response_success) { 

     $.ajax({ 
       type : "POST", 
       url : "system/process-booking.php", 
       data : booking_query, 
       cache : false, 
       success : function(ajaxresponse) { 
           if (ajaxresponse === 'db_error') { 
            param_response_dberror(); 
           } 
           if (ajaxresponse === 'failed') { 
            param_response_failed(); 
           } 
           if (ajaxresponse === 'success') { 
            param_response_success(); 
           } 
          } 
         }); 

} // /function bookEvent(); 

Моя страница фронтенд:

<h1>Some event</h1> 
<p>Some event description</p> 

<a href="#">book event</a> 

<div id="loginbox" style="display:none"> 
<input type="text" id="username" placeholder="username"> 
<input type="password" id="password" placeholder="password"> 
<a href="#" id="login_and_book">login and book</a> 
</div> 

Во-первых, он должен быть проверен, если пользователь вошел в систему.

  • Если он не вошедшего в: Сделать окно Логин видимым и когда пользователь нажимает «логин и книга» он получает войти в систему и книги события. Как я могу объединить оба, когда пользователь нажимает кнопку?
  • Если он уже зарегистрирован: Зарезервируйте событие.
+0

Как узнать, если они вошли в систему со стороны браузера? – jfriend00

+0

На данный момент у меня есть следующий фрагмент php в шаблоне моей страницы: if (isset ($ _ SESSION ['username'])) {$ username = $ _SESSION ['username']; } –

+0

Это что-то делает на самой странице браузера? Или это просто PHP работает на вашем сервере? Это не имеет большого значения для последовательности двух вызовов ajax, но ваша первая проблема заключается в том, как javascript на стороне клиента знает, что вы вошли в систему или нет, поэтому он может решить, нужно ли ему запускать процесс входа в систему? – jfriend00

ответ

1

Это звучит как плакат-ребенок для jQuery "Promises", хотя это осложняется тем, что даже ваши условия «ошибки» выглядят как «успехи» на уровне AJAX.

Вам нужно будет поддерживать некоторый браузер на стороне государства, чтобы указать, является ли пользователь успешно вошел в систему или нет, изначально false, и установить его в true в филиале «успех» функции loginUser. Разумеется, вы также должны поддерживать это состояние на сервере, чтобы избежать возможности пользователя в обход требования входа в систему путем взлома кода на стороне клиента.

Я предлагаю также отделяя ваш успех и условия отказа, а также использование обещает достичь «разделение интересов»:

var loggedIn = false; 

// returns promise that will be resolved by logging in via AJAX, 
// or automatically resolved if the user was already logged in 
function loginUser(login_query) { 
    var def = $.Deferred(); 
    if (loggedIn) { 
     def.resolve(); 
    } else { 
     $.ajax({ 
      type : "POST", 
      url : "system/process-login.php", 
      data : login_query, 
      cache : false 
     }).then(function(ajaxresponse) { 
      if (ajaxresponse === 'success') { 
       loggedIn = true; 
       def.resolve(); 
      } else { 
       def.reject(ajaxresponse); 
      } 
     }); 
    } 
    return def.promise(); 
}; 

Измените функцию bookEvent аналогичным образом, а затем, когда «книги событие» кнопка нажата, использовать что-то вроде этого:

function autoBook() { 
    return loginUser(login_query).then(bookEvent); 
} 

Пожалуйста, обратите внимание - этот пример очень неполной. Вам нужно будет организовать отправку соответствующих параметров запроса и вызывать обратные вызовы на основе (окончательных) результатов, полученных от обещаний.

+0

Я собирался прокомментировать ваш комментарий «вам нужно будет сохранить комментарий на стороне браузера». ;) Никогда, никогда, никогда не полагайтесь исключительно на безопасность на стороне браузера - ха-ха. Кроме того, обещания jQuery по сути имеют «порядок выполнения» (т. Е. Порядок, в котором они выполняются)? –

+0

@CaseyFalk обратные вызовы по обещанию всегда вызывается в том порядке, в котором они были зарегистрированы, или вы имели в виду что-то еще? – Alnitak

+0

Но означает ли это, что второй звонок не будет уволен, пока первый не вернет успех/неудачу? Если он уволен по порядку, но не остановлен до достижения успеха, то по-прежнему существует вероятность того, что пользователь не войдет в систему для «бронирования». Правильно? –

0

AJAX по определению является асинхронным, поэтому даже если вы могли бы объединить их в одну функцию, нет гарантии, что любой из них всегда будет получен первым (например: логин может обрабатывать ПОСЛЕ бронирования и т. Д.). Лучше всего поставить один внутри другого - в частности, в обратном вызове успеха.

Это вызывает вопрос о том, как вы регистрируете своих пользователей; если вы используете переадресацию какого-то рода, то попытка их объединения бессмысленна, поскольку после перенаправления пользователя предыдущий вызов AJAX будет лишен. Если вы просто загружаете данные входа пользователя в форму бронирования, почему бы не иметь серверный сервер, который проверяет, является ли пользователь «комком» в данных, которые вы ему отправили?

Вот немного на "parallel" AJAX requests, но я думаю, что вы действительно ищете, это «последовательная» очередь AJAX (которая показана в той же ссылке).

Смежные вопросы