Перейти к содержимому
Русский язык для Invision Community 5

Окно входа без перезагрузки

Добрый вечер!

Подскажите, пожалуйста, возможно ли полностью отказаться от отдельной страницы входа на сайт, чтобы все происходило в стоковом всплывающем окне?

 

Например, когда пользователь вводит неправильный пароль в окне входа, его перебрасывает на новую страницу по адресу site.ru/index.php?app=core&module=global&section=login&do=process

 

Как убрать эту страницу, чтобы ошибку выдавало с ajax-обновлением в этом же popup-окне?

Рекомендованные сообщения

Теоретически можно отправить авторизационные данные через ajax запрос и в зависимость от полученного ответа вывести либо ошибку, либо, при успешной авторизации, обновить текущую страницу.

 

После формы авторизации () в globalTemplate > inlineLogin добавить скрипт

 

<script>
$$('#inline_login_form #login')[0].observe('submit', function(e){
   e.preventDefault();
   var form = this;
   new Ajax.Request(form.action, {
       method: 'post',
       parameters: this.serialize(true),
       onSuccess: function(r) {
           var div = document.createElement('div');
           div.innerHTML = r.responseText;
           var script = div.select('script:contains("member_id")')[0];
           if(script){
               var toEval = script.innerHTML.replace('Loader.boot();', '');
               eval(toEval);
               if(ipb.vars['member_id']){
                   var params = document.location.search.toQueryParams();
                   if(params['module'] == 'global' && ['register', 'login'].indexOf(params['section']) != -1){
                       window.location = ipb.vars['board_url']+'/';
                   }
                   else{
                       window.location.reload();
                   }
               }
               else{
                   var error = form.select('p.error.message')[0];
                   if(!error){
                       form.select('div.ipsForm fieldset')[0].insert({
                           before: '<p class="error message" style="margin-bottom:10px;"></p>'
                       });
                       error = form.select('p.error.message')[0];
                   }
                   var p = div.select('p.error.message')[0];
                   error.innerHTML = p ? p.innerHTML : 'Authentication error';
               }
           }
           else{
               window.location.href = form.action;
           }
       }
   });
   return false;
});
</script>

  • Автор

Добавил в шаблон inlineLogin этот скрипт, но теперь popup-окно входа вообще не всплывает после нажатия на кнопку входа, сразу перенаправляет на отдельную страницу...

Upd. - Извиняюсь, все правильно работает! Спасибо огромное!! Именно то, что нужно!

Изменено пользователем Strategius

  • 4 недели спустя...
  • Автор

Заметил, что с отдельного окна входа (site.ru/index.php?app=core&module=global&section=login&do=process) после добавления модификации перестала работать переадресация на прошлую страницу. Например, до модификации при авторизации с того окна раньше происходила переадресация на предыдущую страницу, с которой мы попали на страницу входа. Теперь мы остаемся на странице авторизации, даже после входа... В чем проблема?

Нужно сделать исключение для формы с отдельной страницы авторизации.

  • Автор

А как прописать страницу (ссылку) в исключение? Оно будет формироваться так примерно?

 

if(ipb.vars['member_id']){
                   window.location.reload();
				try {
                   if ($this->settings['base_url']."app=core&module=global&section=login");
                   window.location.assign();
                   }
                   catch () {
                   window.location.assign();
                   }
                   finally {
                   window.location.assign();
                   }
               }

Изменено пользователем Strategius

if(window.location.search.indexOf('app=core&module=global&section=login') == -1)
$('login').onsubmit = function(e){
...

  • Автор

Спасибо Вам большое, работает! :)

  • 5 месяцев спустя...
  • Автор

Вылез баг - авторизация не работает, если пытаемся логиниться под забаненной учетной записью :(

Вылез баг - авторизация не работает, если пытаемся логиниться под забаненной учетной записью

 

Перед

        onSuccess: function(r) {

добавить

	onFailure: function( t )
{
              // Тут пишите, что делать. Можете редиректить, можете посылать письмо почтой России.
},

  • Автор

// Тут пишите, что делать. Можете редиректить, можете посылать письмо почтой России.

А что нужно прописать, чтобы редиректило?

А что нужно прописать, чтобы редиректило?

 

Вот же у Вас в коде

                    if(params['module'] == 'global' && ['register', 'login'].indexOf(params['section']) != -1){
                       window.location = ipb.vars['board_url']+'/';
                   }
                   else{
                       window.location.reload();
                   }

В первом случае редиректит на индексную страница, во втором - перезагружает страницу.

  • Автор

Добавил, но все равно если логиниться забаненным, то ajax-авторизация не работает... Авторизовывается только после перезагрузки страницы.

Добавил, но все равно если логиниться забаненным, то ajax-авторизация не работает... Авторизовывается только после перезагрузки страницы.

Переменная params у Вас находится в другой части кода. Можете переместить

                    var params = document.location.search.toQueryParams();

выше. Например, под var form

  • Автор

Огромное спасибо, заработало!

Огромное спасибо, заработало!

Можете выложить полностью рабочий код? :)

Создайте аккаунт или войдите в него для комментирования

Аккаунт

Навигация

Поиск

Поиск

Настроить push-уведомления браузера

Chrome (Android)
  1. Нажмите на иконку замка рядом с адресной строкой.
  2. Нажмите Права доступа -> Уведомления.
  3. Измените свои настройки.
Chrome (компьютер)
  1. Нажмите на иконку замка в адресной строке.
  2. Выберите Настройки сайта.
  3. Найдите Уведомления и измените свои настройки.