Yii2:GridView中的ActionColumn在使用SqlDataProvider时不起作用

时间:2015-06-23 05:14:46

标签: gridview yii2

为什么我的网格视图中的Action Column(查看,更新,删除)从零返回值 id 增量(不是从数据库返回id)?

我的控制器

public function actionIndex()
{
    $jenjang = Yii::$app->request->get('jenjang');

    $sql = "SELECT * FROM adikbinaan";

    if($jenjang!=0){
        $sql = "SELECT * FROM adikbinaan WHERE adikbinaan.jenjang_id = $jenjang";
    }

    $n = count(CariAdikBinaan::findBySql($sql)->all());

    $adikbinaan = new SqlDataProvider([
        'sql' => $sql,
        'totalCount' => $n,
        'sort' => [
            'attributes' => [
                'ADIKBINAAN_NAMALENGKAP',
            ],
        ],
        'pagination' => [
            'pageSize' => 20,
        ],
    ]);

    $adik = new CariAdikBinaan();

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

我的观点

    <?= GridView::widget([
    'dataProvider' => $dataProvider,
    'layout'=>"{pager}\n{items}\n{summary}",
    'showFooter'=>true,
    'showHeader'=>true,
    'showOnEmpty'=>false,
    'columns' => [
        'ADIKBINAAN_NAMALENGKAP',
        'ADIKBINAAN_TEMPATLAHIR',
        'ADIKBINAAN_TANGGALLAHIR',
        ['class' => 'yii\grid\ActionColumn'],
    ],
]); ?>

当我从操作列中单击查看更新按钮时,URL会从数据库返回view?id=0update?id=0而不是id

我该如何解决?

2 个答案:

答案 0 :(得分:3)

您需要声明哪个列是SqlDataProvider中的标识列。否则你只需要获得该序列号。因此,将key属性放入提供程序:

$adikbinaan = new SqlDataProvider([
    'sql'        => $sql,
    'totalCount' => $n,
    'key'        => 'id'  // <---- here it is, can also be an array of strings if more columns are identifiying ones
    'sort'       => [
        'attributes' => [
            'ADIKBINAAN_NAMALENGKAP',
        ],
    ],
    'pagination' => [
        'pageSize' => 20,
    ],
]);

这对你有用吗?我想我的另一个答案不太有价值......

顺便说一句:这个

$sql = "SELECT * FROM adikbinaan WHERE adikbinaan.jenjang_id = $jenjang";

是危险的,因为SQL注入会起作用。还有你如何有效计算记录的方式。查看类SqlDataProvider的示例。使用了COUNT(*),这需要更少的数据传输。

答案 1 :(得分:0)

ActionColumn默认使用方法createUrl()创建网址。您可以通过声明替代实现来覆盖它:

'columns' => [
    'ADIKBINAAN_NAMALENGKAP',
    'ADIKBINAAN_TEMPATLAHIR',
    'ADIKBINAAN_TANGGALLAHIR',
    [
        'class'      => 'yii\grid\ActionColumn', 
        'urlCreator' => function($action, $model, $key, $index) {
            return Url::to([
                'someController/' . $action, 
                // not sure: either this
                'id' => $model->fieldThatContainsId,
                // or this:
                'id' => $model['fieldThatContainsId'],
            ]);
        }
    ],
],

我发布的内容并不知道它是否可行。我还没有尝试过。通常,ActionColumn与使用ActiveDataProvider时获得的ActiveRecord实例一起使用。如果您有这样的ActiveRecord模型实例,您也可以将该提供程序作为替代。