$enableCsrfValidation = false

Общие вопросы по использованию второй версии фреймворка. Если не знаете как что-то сделать и это про Yii 2, вам сюда.
cruim
Сообщения: 106
Зарегистрирован: 2016.12.23, 10:16

$enableCsrfValidation = false

Сообщение cruim »

После того, как добавил это в контроллер, перестал корректно работать экспорт(kartik\export\ExportMenu), выгружаются только названия колонок без данных.

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

public function beforeAction($action)
{
    $this->enableCsrfValidation = false;
    return parent::beforeAction($action);
}

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

public function actionIndex()
{
    $data = null;
    if(isset($_POST['last_month'])) {
        $data = order::getTest();
    }

    if(isset($_POST['pre_last_month'])) {
        $data = order::getCheckPreLastMonth();
    }

    $dataProvider = new ArrayDataProvider([
        'allModels' => $data,
        'sort' => [],
        'pagination' => [
            'pageSize' => 50,
        ],
    ]);

    return $this->render('index',['dataProvider' =>$dataProvider]);
}
Подозреваю, что проблема в

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

$this->enableCsrfValidation = false;
. Но без этого некорректно отрабатывают кнопки.
Аватара пользователя
Faenir
Сообщения: 292
Зарегистрирован: 2010.01.06, 01:46
Откуда: Симферополь

Re: $enableCsrfValidation = false

Сообщение Faenir »

Для начала объясните для чего вы вообще отключаете csrf валидацию?

И "order" -> "Order".
cruim
Сообщения: 106
Зарегистрирован: 2016.12.23, 10:16

Re: $enableCsrfValidation = false

Сообщение cruim »

Faenir писал(а): 2017.02.08, 11:22 Для начала объясните для чего вы вообще отключаете csrf валидацию?

И "order" -> "Order".
Если этого не сделать, то при клике по кнопке выдает ошибку "Bad Request (#400)Unable to verify your data submission."
rak
Сообщения: 2181
Зарегистрирован: 2010.11.02, 23:40
Контактная информация:

Re: $enableCsrfValidation = false

Сообщение rak »

ну так нужно с ошибкой разбираться, а не csrf отключать :)
cruim
Сообщения: 106
Зарегистрирован: 2016.12.23, 10:16

Re: $enableCsrfValidation = false

Сообщение cruim »

rak писал(а): 2017.02.08, 17:57 ну так нужно с ошибкой разбираться, а не csrf отключать :)
гугление этой ошибки, вывело на stackoverflow, где эта ошибка фиксилась таким способом.http://stackoverflow.com/questions/2645 ... 5#28690225
Loveorigami
Сообщения: 977
Зарегистрирован: 2014.08.27, 21:54

Re: $enableCsrfValidation = false

Сообщение Loveorigami »

Смешно ). Вы все пробовали делать из этого ответа?
cruim
Сообщения: 106
Зарегистрирован: 2016.12.23, 10:16

Re: $enableCsrfValidation = false

Сообщение cruim »

Loveorigami писал(а): 2017.02.08, 18:15 Смешно ). Вы все пробовали делать из этого ответа?
Да
Loveorigami
Сообщения: 977
Зарегистрирован: 2014.08.27, 21:54

Re: $enableCsrfValidation = false

Сообщение Loveorigami »

что именно? интересует для кнопок...
cruim
Сообщения: 106
Зарегистрирован: 2016.12.23, 10:16

Re: $enableCsrfValidation = false

Сообщение cruim »

Loveorigami писал(а): 2017.02.08, 18:36 что именно? интересует для кнопок...

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

<form method="POST">
        <input id="form-token" type="hidden" name="<?=Yii::$app->request->csrfParam?>"
               value="<?=Yii::$app->request->csrfToken?>"/>
        <input type="hidden" name="_csrf" value="<?=Yii::$app->request->getCsrfToken()?>" />
        <br><button type="submit" name="last_month" class='btn btn-primary' style="width:120px;height:50px;display:inline-block;" > Прошлый<br> месяц </button>

    </form>
Loveorigami
Сообщения: 977
Зарегистрирован: 2014.08.27, 21:54

Re: $enableCsrfValidation = false

Сообщение Loveorigami »

Дальше...
Куда уходят эти данные? Action?
Вы отправляете кнопку или посылаете ajax запрос?
cruim
Сообщения: 106
Зарегистрирован: 2016.12.23, 10:16

Re: $enableCsrfValidation = false

Сообщение cruim »

Loveorigami писал(а): 2017.02.08, 21:27 Дальше...
Куда уходят эти данные? Action?
Вы отправляете кнопку или посылаете ajax запрос?
в вопросе указан action. дублирую:

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

public function actionIndex()
{
    $data = null;
    if(isset($_POST['last_month'])) {
        $data = order::getTest();
    }

    if(isset($_POST['pre_last_month'])) {
        $data = order::getCheckPreLastMonth();
    }

    $dataProvider = new ArrayDataProvider([
        'allModels' => $data,
        'sort' => [],
        'pagination' => [
            'pageSize' => 50,
        ],
    ]);

    return $this->render('index',['dataProvider' =>$dataProvider]);
}
Loveorigami
Сообщения: 977
Зарегистрирован: 2014.08.27, 21:54

Re: $enableCsrfValidation = false

Сообщение Loveorigami »

ну и ...
print_r($_POST) что выдает? Присутсвует scrf?
Loveorigami
Сообщения: 977
Зарегистрирован: 2014.08.27, 21:54

Re: $enableCsrfValidation = false

Сообщение Loveorigami »

Заодно еще проверьте и print_r($data), тогда, когда оно выгружалось.
А то может там и данных нет. Был у нас недавно такой случай.
----

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

<form method="POST">
        <input id="form-token" type="hidden" name="<?=Yii::$app->request->csrfParam?>"
               value="<?=Yii::$app->request->csrfToken?>"/>
        <input type="hidden" name="_csrf" value="<?=Yii::$app->request->getCsrfToken()?>" />
        <br><button type="submit" name="last_month" class='btn btn-primary' style="width:120px;height:50px;display:inline-block;" > Прошлый<br> месяц </button>
    </form>
Это у вас так в коде, или это как вы пробовали?
cruim
Сообщения: 106
Зарегистрирован: 2016.12.23, 10:16

Re: $enableCsrfValidation = false

Сообщение cruim »

Loveorigami писал(а): 2017.02.08, 21:39 ну и ...
print_r($_POST) что выдает? Присутсвует scrf?
Данные там есть. Если сделать так

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

  public function actionIndex()
    {
        $data = null;

        $data = order::getTest();
        if(isset($_POST['last_month'])) {
            $data = order::getTest();
            
        }

        if(isset($_POST['pre_last_month'])) {
            $data = order::getCheckPreLastMonth();
        }

        $dataProvider = new ArrayDataProvider([
            'allModels' => $data,
            'sort' => [
            ],
            'pagination' => [
                'pageSize' => 50,
            ],
        ]);

        return $this->render('index',['dataProvider' =>$dataProvider]);
    }
Чтобы сразу же шло присвоение

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

$data = order::getTest();
То скачивание происходит корректно, правда с любой кнопки выгружаются данные с `getTest`
Изначально кнопки были такими

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

<form method="POST">
        <br><button type="submit" name="last_month" class='btn btn-primary' style="width:120px;height:50px;display:inline-block;" > Прошлый<br> месяц </button>
        <button type="submit" name="pre_last_month" class='btn btn-primary' style="width:120px;height:50px;display:inline-block;margin-top:0;" > Позапрошлый<br> месяц </button>


    </form>
Loveorigami
Сообщения: 977
Зарегистрирован: 2014.08.27, 21:54

Re: $enableCsrfValidation = false

Сообщение Loveorigami »

1. Вы ответили на пол вопроса. Как правильно передать csrf, выше давали ссылку
2. Подумайте, почему
с любой кнопки выгружаются данные с `getTest`
Ну и посмотрев в консоль или дебаг панель, вы найдете ответ на 1 и 2, а потом и найдете решение своего вопроса...
cruim
Сообщения: 106
Зарегистрирован: 2016.12.23, 10:16

Re: $enableCsrfValidation = false

Сообщение cruim »

Loveorigami писал(а): 2017.02.08, 23:12 1. Вы ответили на пол вопроса. Как правильно передать csrf, выше давали ссылку
2. Подумайте, почему
с любой кнопки выгружаются данные с `getTest`
Ну и посмотрев в консоль или дебаг панель, вы найдете ответ на 1 и 2, а потом и найдете решение своего вопроса...
Сделал так, во вью

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

<?php $form = ActiveForm::begin(['id' => 'pre_last_month', 'method' => 'GET']) ?>
    <input type="hidden" value="1" name="pre_last_month" >

    <div class="form-group">
        <?= Html::submitButton('Позапрошлый', ['class' => 'btn btn-primary', 'name' => 'nn']) ?>
    </div>

    <?php ActiveForm::end(); ?>
    <?php $form1 = ActiveForm::begin(['id' => 'last_month', 'method' => 'GET']); ?>
    <input type="hidden" value="2" name="last_month" >

    <div class="form-group">
        <?= Html::submitButton('Прошлый', ['class' => 'btn btn-primary', 'name' => 'n1']) ?>
    </div>

    <?php ActiveForm::end(); ?>
В контроллере

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

public function actionIndex()
    {
        $data = null;
        if(isset($_GET['last_month'])) {

            $data = order::getTest();
        }

        if(isset($_GET['pre_last_month'])) {
            $data = order::getCheckPreLastMonth();

        }

        $dataProvider = new ArrayDataProvider([
            'allModels' => $data,
            'sort' => [
            ],
            'pagination' => [
                'pageSize' => 50,
            ],
        ]);

        return $this->render('index',['dataProvider' =>$dataProvider]);

    }
Выгрузка стала работать, но после каждого нажатия на кнопки, строка браузера постоянно "увеличивается" http://joxi.ru/xAeOlVvSEgN8my И если нажать на первую кнопку, то при нажатии на вторую, переход не происходит.
Loveorigami
Сообщения: 977
Зарегистрирован: 2014.08.27, 21:54

Re: $enableCsrfValidation = false

Сообщение Loveorigami »

Потому что это у вас обернуто все в pjax. Для кнопки надо поставить data-pjax = 0
cruim
Сообщения: 106
Зарегистрирован: 2016.12.23, 10:16

Re: $enableCsrfValidation = false

Сообщение cruim »

Loveorigami писал(а): 2017.02.10, 19:49 Потому что это у вас обернуто все в pjax. Для кнопки надо поставить data-pjax = 0
Можно пример, перепробовал разные варианты, не помогает.
Loveorigami
Сообщения: 977
Зарегистрирован: 2014.08.27, 21:54

Re: $enableCsrfValidation = false

Сообщение Loveorigami »

у вас button... это ставится для ссылок... Должно было бы быть так

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

<?= Html::submitButton('Позапрошлый', [

'class' => 'btn btn-primary', 
'name' => 'nn', 
'data' => [
    'pjax' => 0
]

]) ?>
https://habrahabr.ru/post/225823/

можно еще
1. в Pjax виджете поставить enablePushState = false, - тогда вообще не будет меняться url
2. в ActiveForm указать явно action
http://www.yiiframework.com/doc-2.0/yii ... ion-detail
Ответить