sanchezzzhak
@sanchezzzhak
Ля ля ля...

Yii2 pajax и redirect, как сделать так чтоб редирект работал не перезагружая страницу пользователя?

Yii2 pajax и redirect, как сделать так чтоб редирект работал не перезагружая страницу пользователя?

Все оказалось гораздо легче. УРА РЕШЕНИЕ!Ё!
Yii::$app->response->getHeaders()->set('X-PJAX-Url',Url::to(['wall/show','id' => 2]));

И отдаем сразу данные этой страницы этого контроллера wall/show PS в Laravel приблизительно также решается эта беда.

Что я побывал до этого
Я пробовал переопределить в наглую код библиотеки
метод
options.error =  function (xhr, textStatus, errorThrown) {
            var container = extractContainer("", xhr, options)
            // Check redirect status code
            var redirect = (xhr.status >= 301 && xhr.status <= 303)
            // Do not fire pjax::error in case of redirect
            if(redirect) {
                   var conteiner1 =   xhr.getResponseHeader('X-PJAX-Container') || false; // этот заголовк я сам отправил
                    if(conteiner1){
                              pjaxReload($(conteinercontainer.url);
                              return false;
                    }
            }


            var allowed = redirect || fire('pjax:error', [xhr, textStatus, errorThrown, options])
            if (redirect || options.type == 'GET' && textStatus !== 'abort' && allowed) {
                locationReplace(container.url)
            }

Это все работает но лезть в чужую либо мне не хочется....
Еще один способов глобальный
$.ajaxPrefilter(function( options, originalOptions, jqXHR ) {
        var originalPromise = jqXHR.promise(),
        newDefer = $.Deferred(function( defer ) {
            defer.promise( jqXHR );
            jqXHR.success = originalPromise.done;
            jqXHR.error = defer.fail;
        });
        originalPromise.fail(function(xhr, textStatus, errorThrown) {
            var isPajax = xhr.getResponseHeader('X-PJAX') || false;
            var redirect = (xhr.status >= 301 && xhr.status <= 303);
            if(redirect) {
                var conteiner =   xhr.getResponseHeader('X-PJAX-Container') || false;
                var isPajax = xhr.getResponseHeader('X-PJAX') || false;
                if(isPajax){
                    $.pajax.reload(conteiner , url);
                    return false;
                 }
                
            }
        });
    });
  • Вопрос задан
  • 7180 просмотров
Решения вопроса 2
SPAHI4
@SPAHI4
реактовцы - это не девы, а прокидыватели пропсов
если редирект через js, то просто $.pjax(url, ...)
если через Yii, то нельзя
Ответ написан
Комментировать
@umneeq
Мне помогло добавление 200-го кода ответа:
return $this->redirect(['/user'], 200);
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 4
FanatPHP
@FanatPHP
Чебуратор тега РНР
— Так вот, — говорит Морковьева. — Нам нужно нарисовать семь красных линий. Все они должны быть строго перпендикулярны, и кроме того, некоторые нужно нарисовать зеленым цветом, а еще некоторые — прозрачным. Как вы считаете, это реально?
— Нет, — говорит Петров.
Ответ написан
@xom9lk
Поясните, что за редирект, где вызывается редирект, по какому событию.
Сам редирект как таковой не может произойти без перезагрузки страницы, природа у него такая.
Ответ написан
Комментировать
sanchezzzhak
@sanchezzzhak Автор вопроса
Ля ля ля...
jquery pajax если получает ответ 301 по 301
options.error = function(xhr, textStatus, errorThrown) {
    var container = extractContainer("", xhr, options)
    // Check redirect status code
	var redirect = (xhr.status >= 301 && xhr.status <= 303)
	// Do not fire pjax::error in case of redirect
    var allowed = redirect || fire('pjax:error', [xhr, textStatus, errorThrown, options])
    if (redirect || options.type == 'GET' && textStatus !== 'abort' && allowed) {
      locationReplace(container.url)
    }
  }

то вызывается функция locationReplace
// Internal: Hard replace current state with url.
//
// Work for around WebKit
//   https://bugs.webkit.org/show_bug.cgi?id=93506
//
// Returns nothing.
function locationReplace(url) {
  if(!pjax.options.history) return;
  window.history.replaceState(null, "", pjax.state.url)
  window.location.replace(url)
}

В результате чего приходится отказываться от redirect а там где не не работает pajax ajax использовать redirect
на старых телефонах использую redirect (им не повезло)
if(!Yii::$app->request->isPjax || !Yii::$app->request->isAjax)
              return $this->redirect(['group/show','id' => $id  ]);
Ответ написан
nurbek_nurjanov
@nurbek_nurjanov
Yii developer
Не совсем понятно.
У меня с редиректом не работает.
Есть контроллер PostController/actionView(id)
В странице этого контроллера коменты, с возможностью удалить коммент
Все коменты обернуты в pjax

Есть контроллер CommentController/actionDelete(id)
Здесть происходит обрантый редирект на страницу поста. то есть обратно сюда PostController/actionView(id)

Что где нужно ставить. Я пробовал поиграть с x-pjax-url никак :(((
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы