Как получить предыдущий и следующий идентификатор модели строки в строке данных yii2 gridview - PullRequest
0 голосов
/ 28 января 2019

Находясь в виджете GridView и отображая результаты ActiveDataprovider, которые я извлек из пользовательского запроса, я хочу получить следующую и предыдущую строку $ model-> id строки при отображении записей, что мне нужно сделать, чтобы показать ссылки на предыдущую и следующуюсообщений в режиме чтения, мой gridview уже генерирует ссылку на просмотр сообщений, но, похоже, нет возможности получить идентификатор записи следующей строки БД

Я уже пытался использовать значения по умолчанию в доступной функции, но ониКажется, не содержит никаких связанных данных

GridView::widget([
    'dataProvider' => $dataProvider,
    ...
    'columns' => [
        ...
        [
           'label'=>'Post Name',
           'format' => 'raw',
           'value'=>function ($data, $key, $index, $obj) {
                // this is what i have right now
                return Html::a($data->name, ['view', 'id' => $data->id]);

                //ideally i would like something like this
                return Html::a($data->name, ['view', 
                     'id' => $data->id,
                     'prev' => $prev->id,
                     'next' => $next->id
                ]);
            },
        ],
    ],
    ....
)];

Ответы [ 2 ]

0 голосов
/ 28 января 2019

Поскольку $index является правильным ключом для моделей, мы можем сделать что-то вроде этого.Не требуется звонить $models = $dataProvider->models; при каждом вызове делает его быстрее.

$keys = $dataProvider->keys;

GridView::widget([
    'dataProvider' => $dataProvider,
    ...
    'columns' => [
        ...
        [
           'label'=>'Post Name',
           'format' => 'raw',
           'value'=>function ($data, $key, $index, $obj) use ($keys) {


                // Check prev and next object
                $prevId = ($key > 0) ? $keys[$index-1] : '';
                $nextId = ($key < ((count($keys)-1)) ? $keys[$index+1] : '';

                return Html::a($data->name, ['view',
                    'id' => $data->id,
                    'prev' => $prevId,
                    'next' => $nextId,
                ]);
            },
        ],
    ],
    ....
)];
0 голосов
/ 28 января 2019

Попробуйте передать $dataProvider внутрь value callback:

GridView::widget([
    'dataProvider' => $dataProvider,
    ...
    'columns' => [
        ...
        [
           'label'=>'Post Name',
           'format' => 'raw',
           'value'=>function ($data, $key, $index, $obj) use($dataProvider) {


                // Check prev and next object
                $models = $dataProvider->models;
                $prev = ($index>0) ? $models[$index-1] : null;
                $next = ($index < ((count($model)-1)) ? $models[$index+1] : null; 

                //ideally i would like something like this
                return Html::a($data->name, ['view', 
                     'id' => $data->id,
                     'prev' => ($prev != null) ? $prev->id : '',
                     'next' => ($news != null) ? $next->id : '',
                ]);
            },
        ],
    ],
    ....
)];
...