_csrf перестает быть действительным после ajax запроса

Общие вопросы по использованию второй версии фреймворка. Если не знаете как что-то сделать и это про Yii 2, вам сюда.
Ответить
Аватара пользователя
bemulima
Сообщения: 207
Зарегистрирован: 2012.12.20, 09:41
Откуда: Курган

_csrf перестает быть действительным после ajax запроса

Сообщение bemulima »

Доброго времени всем суток!
Есть форма, в ней есть кнопка файл менеджер, которая запрашивает через аякс данные из сервера. Вопрос: если в форме делать изменения без использования файл менеджера то всё нормально данные формы обновляются, как только использовали файл менеджера для изменения данные формы, то при сохранении выдает "Bad Request (#400) Не удалось проверить переданные данные ", пробовал заменить значение _csrf из формы на новый (получал вместе данными файл менеджера) но не прокатило.

Код: Выделить всё

Yii::$app->controller->enableCsrfValidation = FALSE;
Не вариант. Как решить эту задачу? Спасибо за внимание!
urichalex
Сообщения: 994
Зарегистрирован: 2015.08.07, 11:03

Re: _csrf перестает быть действительным после ajax запроса

Сообщение urichalex »

Как-то так. Может есть и красивее решения

Код: Выделить всё

// Controller
public function myAction()
{
	$model = new MyModel();
	$model->setNoCheckCaptcha(Yii::$app->getRequest()->getIsAjax());
}

// Model
class MyModel extends ActiveRecord
{
	private $noCheckCaptcha = false;
	public function setNoCheckCaptcha($value)
	{
		$this->noCheckCaptcha = $value;
	}
	
	public function needCheckCaptcha()
	{
		return !$this->noCheckCaptcha;
	}
	
	public function rules()
	{
		return [
			['myField1', 'required'],
			...
			['captcha', 'captcha', 'when' => function($model) {
				return $model->needCheckCaptcha();
			}],
		];
	}
}
Аватара пользователя
bemulima
Сообщения: 207
Зарегистрирован: 2012.12.20, 09:41
Откуда: Курган

Re: _csrf перестает быть действительным после ajax запроса

Сообщение bemulima »

urichalex писал(а): 2018.09.25, 17:23 Как-то так. Может есть и красивее решения
БлагоДарю за ответ. При аякс запросе никакая валидация не происходит соответственно rules тоже не срабатывает а просто возвращает данные

Код: Выделить всё

public function actionFilemanager()
    {
        $model = new MediafileSearch();
        $dataProvider = $model->search(Yii::$app->request->queryParams);
        
        return $this->renderAjax('filemanager', [
            'model' => $model,
            'dataProvider' => $dataProvider,
        ]);
    }
И основная форма не имеет капчу
urichalex
Сообщения: 994
Зарегистрирован: 2015.08.07, 11:03

Re: _csrf перестает быть действительным после ajax запроса

Сообщение urichalex »

bemulima писал(а): 2018.09.26, 11:00
urichalex писал(а): 2018.09.25, 17:23 Как-то так. Может есть и красивее решения
БлагоДарю за ответ. При аякс запросе никакая валидация не происходит соответственно rules тоже не срабатывает а просто возвращает данные

Код: Выделить всё

public function actionFilemanager()
    {
        $model = new MediafileSearch();
        $dataProvider = $model->search(Yii::$app->request->queryParams);
        
        return $this->renderAjax('filemanager', [
            'model' => $model,
            'dataProvider' => $dataProvider,
        ]);
    }
И основная форма не имеет капчу
Моя внимательность..
Покажите как именно вы отправляете запрос
Аватара пользователя
bemulima
Сообщения: 207
Зарегистрирован: 2012.12.20, 09:41
Откуда: Курган

Re: _csrf перестает быть действительным после ajax запроса

Сообщение bemulima »

urichalex писал(а): 2018.09.26, 12:03 Моя внимательность..
Покажите как именно вы отправляете запрос
Всё очень просто, есть событие на кнопку, при нажатии запрашиваем данные

Код: Выделить всё

var containers = [];
function loadFileManagerContainer(url,modal){
    if(!containers[url]){
        $.ajax({
            url:url,
            type: 'post',
            success: function(html){
                containers[url] = html;
                showModal(html,modal);
            }
        });
    }else{
        showModal(containers[url],modal);
    }
}
function showModal(html,modal){
    modal.find(".modal-body").html($('<div id="' + modal.attr("data-id") + '" role="filemanager-container" class="filemanager-container">'+html+'</div>'));
    modal.modal("show");
    pagination();
    $(uploadManager);
    $(fileManager);
}
$(document).ready(function() {

    $('.filemanager-launch').on("click", function(e) {
        e.preventDefault();
        var modal = $('.modal-container');
        loadFileManagerContainer(modal.attr("data-src"),modal);
        
    });

});
urichalex
Сообщения: 994
Зарегистрирован: 2015.08.07, 11:03

Re: _csrf перестает быть действительным после ajax запроса

Сообщение urichalex »

Что в запросе? В заголовках есть csrf?
Аватара пользователя
bemulima
Сообщения: 207
Зарегистрирован: 2012.12.20, 09:41
Откуда: Курган

Re: _csrf перестает быть действительным после ajax запроса

Сообщение bemulima »

urichalex писал(а): 2018.09.26, 14:20 Что в запросе? В заголовках есть csrf?
Не было, добавил) Заработал. Спасибо!
Ответить