Yii2:使用 SqlDataProvider 时 GridView 中的 ActionColumn 不起作用
Yii2: ActionColumn in GridView doesn't work when using SqlDataProvider
为什么我的网格视图中的操作列(查看、更新、删除)return值id从零开始递增(不是来自数据库的 return 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 returns view?id=0
或 update?id=0
不是来自数据库的 id
。
我该如何解决?
ActionColumn creates the URL by default with method 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 模型实例,您也可以将该提供程序作为替代方案。
您需要在 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 注入会起作用。还有你如何有效地计算记录的方式。看classSqlDataProvider的例子。使用 COUNT(*)
需要相当少的数据传输。
为什么我的网格视图中的操作列(查看、更新、删除)return值id从零开始递增(不是来自数据库的 return 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 returns view?id=0
或 update?id=0
不是来自数据库的 id
。
我该如何解决?
ActionColumn creates the URL by default with method 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 模型实例,您也可以将该提供程序作为替代方案。
您需要在 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 注入会起作用。还有你如何有效地计算记录的方式。看classSqlDataProvider的例子。使用 COUNT(*)
需要相当少的数据传输。