GridView и PJAX

Общие вопросы по использованию второй версии фреймворка. Если не знаете как что-то сделать и это про Yii 2, вам сюда.
Ответить
Гимнаст
Сообщения: 67
Зарегистрирован: 2013.02.17, 23:27

GridView и PJAX

Сообщение Гимнаст »

Привет!
Есть gridView, выводится инфа, есть кнопки редактировать, удалить. Надо, чтобы удаление проходило через ajax. В блогах писали про использование pjax. Пробовал его использовать - никакого ajax и в помине нет. Что делать?
Выкладываю полностью текст вьюхи.

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

<h1>Тематики</h1>
<?php 

use yii\grid\GridView;
use yii\data\ActiveDataProvider;
use yii\grid\ActionColumn;
use yii\helpers\Html;

$dataProvider = new ActiveDataProvider([
    'query' => $model,
    'pagination' => [
        'pageSize' => 20,
    ],
]);

echo newerton\fancybox\FancyBox::widget([
    'target' => 'a[class=fancyboxWindow]',
    'config' => [
        'maxWidth' => '90%',
        'maxHeight' => '90%',
        'playSpeed' => 7000,
        'padding' => 0,
        'fitToView' => false,
        'width' => '70%',
        'height' => '70%',
        'autoSize' => false,
        'closeClick' => false,
        'openEffect' => 'elastic',
        'closeEffect' => 'elastic',
        'prevEffect' => 'elastic',
        'nextEffect' => 'elastic',
        'closeBtn' => false,
        'openOpacity' => true,
    ]
]);

\yii\widgets\Pjax::begin();
echo GridView::widget([
    'dataProvider' => $dataProvider,
    'columns'=>[
        'id',
        'name',
        [
            'class' => 'yii\grid\DataColumn', // can be omitted, default
            'header'=>'Тип',
            'value' => function ($data) {
                    return $data->editionType->name;
                },
        ],
        [
            'format' => 'html',
            'value' => function($data) {
                    $name='/uploads/'.$data->img;
                    return Html::a(Html::img($name, ['width'=>'100px']), $name, ['class' => 'fancyboxWindow']);
                }
        ],
        'create',
        'update',
        [
            'class' => 'yii\grid\DataColumn', // can be omitted, default
            'header'=>'Автор',
            'value' => function ($data) {
                    return $data->user->name;
                },
        ],
        'year',
        'format',
        [
            'class' => ActionColumn::className(),
            'template' => '{update} {delete}',
            'buttons' => [
                'update' => function ($url, $model) {
                        return Html::a('<span class="glyphicon glyphicon-pencil"></span>', $url, [
                            'title' => 'Редактировать',
                        ]);
                    },
                'delete' => function ($url, $model) {
                        return Html::a('<span class="glyphicon glyphicon-trash"></span>', $url, [
                            'title' =>'Удалить',
                            'data-confirm'=>"Хотите удалить?",
                        ]);
                    },
            ],

            'urlCreator' => function ($action, $model, $key, $index) {
                    if ($action === 'update') {
                        $url ='/panel/adverts/edition/update/'.$model->id;
                        return $url;
                    }
                    if ($action === 'delete') {
                        $url ='/panel/adverts/edition/delete/'.$model->id;
                        return $url;
                    }
                }
        ]
    ],
]);
\yii\widgets\Pjax::end();
?>
<a href="/panel/adverts/edition/create" class="btn btn-success">Создать</a>
Аватара пользователя
Neuromance
Сообщения: 716
Зарегистрирован: 2011.09.06, 13:04

Re: GridView и PJAX

Сообщение Neuromance »

У грида лучше использовать имеющиеся у него свойства 'pjax' =>true и pjaxSettings
arogachev
Сообщения: 52
Зарегистрирован: 2014.09.09, 14:32

Re: GridView и PJAX

Сообщение arogachev »

Собственно, а где у него такие свойства? Насколько помню, они в gridе от kartik есть, а тут стандартный используется.
Мой профиль на Github
Аватара пользователя
yiijeka
Сообщения: 3103
Зарегистрирован: 2012.01.28, 09:14
Откуда: Беларусь
Контактная информация:

Re: GridView и PJAX

Сообщение yiijeka »

не работает потому, что timeout в 2 секунды стоит по-умолчанию и его не хватает на загрузку страницы по ajax, поэтому страница загружается полностью. Настраивается он тут \yii\widgets\Pjax::begin(); - погуглите.

На любую ссылку внутри конструкции \yii\widgets\Pjax::begin(); .... \yii\widgets\Pjax::end(); можно повесить обработку по pjax, а можно убрать. Делается это с помощью атрибута в ссылке data-pjax=1 или 0. По-умолчанию у всех ссылок 1 стоит, которые попали в pjax обёртку.
Аватара пользователя
Neuromance
Сообщения: 716
Зарегистрирован: 2011.09.06, 13:04

Re: GridView и PJAX

Сообщение Neuromance »

arogachev писал(а):Собственно, а где у него такие свойства? Насколько помню, они в gridе от kartik есть, а тут стандартный используется.
Сори, был не прав, с картиковым гридом привык работать, вот и запарился)
Гимнаст
Сообщения: 67
Зарегистрирован: 2013.02.17, 23:27

Re: GridView и PJAX

Сообщение Гимнаст »

Все равно не работает. При нажатии кнопки удаления я сразу же перехожу по ссылке.
Пробовал поиграться с параметрами. Результат тот же.

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

\yii\widgets\Pjax::begin([
    'timeout' => 1,// 1 или 10000 пробовал
    'enablePushState'=>false
]);
Аватара пользователя
yiijeka
Сообщения: 3103
Зарегистрирован: 2012.01.28, 09:14
Откуда: Беларусь
Контактная информация:

Re: GridView и PJAX

Сообщение yiijeka »

Ссылке добавьте ['data-pjax'=>1]
Гимнаст
Сообщения: 67
Зарегистрирован: 2013.02.17, 23:27

Re: GridView и PJAX

Сообщение Гимнаст »

yiijeka писал(а):Ссылке добавьте ['data-pjax'=>1]
Так тоже не работает, увы. Все равно почти сразу же наблюдаю переход по урлу, экшн который его обратабывает пустой, это так, к слову.
Полный код вьюхи:

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

<h1>Выпуски</h1>

use yii\grid\GridView;
use yii\data\ActiveDataProvider;
use yii\grid\ActionColumn;
use yii\helpers\Html;

$dataProvider = new ActiveDataProvider([
    'query' => $model,
    'pagination' => [
        'pageSize' => 20,
    ],
]);

echo newerton\fancybox\FancyBox::widget([
    'target' => 'a[class=fancyboxWindow]',
    'config' => [
        'maxWidth' => '90%',
        'maxHeight' => '90%',
        'playSpeed' => 7000,
        'padding' => 0,
        'fitToView' => false,
        'width' => '70%',
        'height' => '70%',
        'autoSize' => false,
        'closeClick' => false,
        'openEffect' => 'elastic',
        'closeEffect' => 'elastic',
        'prevEffect' => 'elastic',
        'nextEffect' => 'elastic',
        'closeBtn' => false,
        'openOpacity' => true,
    ]
]);

\yii\widgets\Pjax::begin([
    'timeout' => 10000,
    'enablePushState'=>false
]);
echo GridView::widget([
    'dataProvider' => $dataProvider,
    'columns'=>[
        'id',
        'name',
        [
            'class' => 'yii\grid\DataColumn', // can be omitted, default
            'header'=>'Тип',
            'value' => function ($data) {
                    return $data->editionType->name;
                },
        ],
        [
            'format' => 'html',
            'value' => function($data) {
                    $name='/uploads/'.$data->img;
                    return Html::a(Html::img($name, ['width'=>'100px']), $name, ['class' => 'fancyboxWindow']);
                }
        ],
        'create',
        'update',
        [
            'class' => 'yii\grid\DataColumn', // can be omitted, default
            'header'=>'Автор',
            'value' => function ($data) {
                    return $data->user->name;
                },
        ],
        'year',
        'format',
        [
            'class' => ActionColumn::className(),
            'template' => '{update} {delete}',
            'buttons' => [
                'update' => function ($url, $model) {
                        return Html::a('<span class="glyphicon glyphicon-pencil"></span>', $url, [
                            'title' => 'Редактировать',
                        ]);
                    },
                'delete' => function ($url, $model) {
                        return Html::a('<span class="glyphicon glyphicon-trash"></span>', $url, [
                            'title' =>'Удалить',
//                            'data-confirm'=>"Хотите удалить?",
                            'data-pjax'=>'1'
                        ]);
                    },
            ],

            'urlCreator' => function ($action, $model, $key, $index) {
                    if ($action === 'update') {
                        $url ='/panel/adverts/edition/update/'.$model->id;
                        return $url;
                    }
                    if ($action === 'delete') {
                        $url ='/panel/adverts/matches/delete/'.$model->id;
                        return $url;
                    }
                }
        ]
    ],
]);
\yii\widgets\Pjax::end();
?>
<a href="/panel/adverts/edition/create" class="btn btn-success">Создать</a>
Гимнаст
Сообщения: 67
Зарегистрирован: 2013.02.17, 23:27

Re: GridView и PJAX

Сообщение Гимнаст »

Все-таки я допилил. И проблема оказалась не во вьюхе, там то все нормально оказалось.
Проблема была в экшене контроллера, он ничего не возвращал. И из-за этого после ajax запроса проходил редирект.
Но почему??? Может мне кто-нибудь объяснить почему так получилось?
Аватара пользователя
yiijeka
Сообщения: 3103
Зарегистрирован: 2012.01.28, 09:14
Откуда: Беларусь
Контактная информация:

Re: GridView и PJAX

Сообщение yiijeka »

https://github.com/defunkt/jquery-pjax# ... e-a-reload

>Page content that is blank. Pjax assumes that the server is unable to deliver proper pjax contents.
Igor88
Сообщения: 1
Зарегистрирован: 2015.04.04, 20:36

Re: GridView и PJAX

Сообщение Igor88 »

Гимнаст, можете выложить пример контроллера, у меня задача один в один Тоже не получается пока реализовать.
Ответить