【问题标题】:Yii2: GridView, Why some data-key returns id and others returns object?Yii2:GridView,为什么有些数据键返回 id 而有些返回对象?
【发布时间】:2015-12-24 08:55:55
【问题描述】:

我一直在编写代码,该代码将使用CheckboxColumn 类获取每一列行的数据值。他们都将对象模型作为值返回,但我刚刚添加的网格之一是返回 id 模型,而不是像其他人那样返回对象..

代码是这样的:

<?= GridView::widget([
    'dataProvider' => $dataProvider,
    'filterModel' => $searchModel,
    'tableOptions'=>[
        'class'=>'table table-striped table-bordered table-hover',
        'data'=>[
            'selector'=>'parametros'
        ]
    ],
    'columns' => [
        ['class' => 'yii\grid\SerialColumn'],

        'liminf',
        'limsup',
        'departamento.nombre',
        'decreto.nombre',
        'tipo.nombre',
        'subTipo.nombre',
        'caracterizacion.nombre',
        'rama.nombre',  
        [
            'class' => 'yii\grid\CheckboxColumn'
        ],
    ],
]); ?>

返回对象的其他网格具有相同的代码结构..没有什么不同..甚至在模型中也没有。搜索模型代码是这样的:

class LimitesSearch extends Limites
{
    public $departamento, $decreto, $tipo, $subTipo, $caracterizacion, $rama;

    /**
     * @inheritdoc
     */
    public function rules()
    {
        return [
            [['id', 'Departamento_id', 'Decreto_id', 'Caracterizacion_id'], 'integer'],
            [['Tipo_id', 'SubTipo_id', 'Rama_id'], 'each', 'rule'=>['integer']],
            [['liminf', 'limsup'], 'number'],
            [['rama','caracterizacion','subTipo','tipo','decreto','departamento','existente'], 'safe'],
        ];
    }

    /**
     * @inheritdoc
     */
    public function scenarios()
    {
        // bypass scenarios() implementation in the parent class
        return Model::scenarios();
    }

    /**
     * Creates data provider instance with search query applied
     *
     * @param array $params
     *
     * @return ActiveDataProvider
     */
    public function search($params)
    {
        $query = Limites::find();

        $query->joinWith(['departamento', 'decreto', 'tipo', 'subTipo', 'caracterizacion', 'rama']);

        $dataProvider = new ActiveDataProvider([
            'query' => $query,
        ]);

        $this->load($params);

        if (!$this->validate()) {
            // uncomment the following line if you do not want to return any records when validation fails
            // $query->where('0=1');
            return $dataProvider;
        }

        $query->andFilterWhere([
            'id' => $this->id,
            'liminf' => $this->liminf,
            'limsup' => $this->limsup,
            'Departamento_id' => $this->Departamento_id,
            'Decreto_id' => $this->Decreto_id,
            'Tipo_id' => $this->Tipo_id,
            'SubTipo_id' => $this->SubTipo_id,
            'Caracterizacion_id' => $this->Caracterizacion_id,
            'Rama_id' => $this->Rama_id,
        ]);

        $query->andFilterWhere(['like', 'existente', $this->existente]);
        $query->andFilterWhere(['like', 'departamento.nombre', $this->departamento]);
        $query->andFilterWhere(['like', 'decreto.nombre', $this->decreto]);
        $query->andFilterWhere(['like', 'tipo.nombre', $this->tipo]);
        $query->andFilterWhere(['like', 'subTipo.nombre', $this->subTipo]);
        $query->andFilterWhere(['like', 'caracterizacion.nombre', $this->caracterizacion]);
        $query->andFilterWhere(['like', 'rama.nombre', $this->rama]);

        return $dataProvider;
    }
}

和控制器/功能:

public function actionSelect()
{
    if(Yii::$app->user->can('limites-index'))
    {    
        $searchModel = new LimitesSearch();
        $dataProvider = $searchModel->search(['LimitesSearch'=>Yii::$app->request->queryParams]);
        return $this->renderAjax('select', [
            'searchModel' => $searchModel,
            'dataProvider' => $dataProvider,
        ]);
    }
}

PS: 我注意到只有来自关系表模型的具有dataProvider 的网格才会返回对象和这个对象,这实际上不是关系表模型只是返回 id.. 为什么会发生这种情况?.. 不知道,也许我可以通过添加 CheckboxColumn 选项函数来解决这个问题.. 但我想知道为什么会发生这种情况

编辑: 这就是我想要得到的......这来自关系表模型

<tr data-key="{&quot;Decreto_id&quot;:1,&quot;Tipo_id&quot;:3}"><td>Normas Sanitarias de Calidad del Agua Potable</td><td>Capitulo 2 Aspectos Microbiologicos</td><td><input name="selection[]" value="{&quot;Decreto_id&quot;:1,&quot;Tipo_id&quot;:3}" type="checkbox"></td></tr>
<tr data-key="{&quot;Decreto_id&quot;:1,&quot;Tipo_id&quot;:4}"><td>Normas Sanitarias de Calidad del Agua Potable</td><td>Capitulo 3 - Aspectos organolépticos, físi...</td><td><input name="selection[]" value="{&quot;Decreto_id&quot;:1,&quot;Tipo_id&quot;:4}" type="checkbox"></td></tr>
<tr data-key="{&quot;Decreto_id&quot;:1,&quot;Tipo_id&quot;:5}"><td>Normas Sanitarias de Calidad del Agua Potable</td><td>Capitulo 4 - Los aspectos radiactivos</td><td><input name="selection[]" value="{&quot;Decreto_id&quot;:1,&quot;Tipo_id&quot;:5}" type="checkbox"></td></tr>

但这是我从非关系表模型渲染的表中得到的

<tr data-key="1104"><td>1</td><td>0</td><td>0</td><td>Agua</td><td>Normas Sanitarias de Calidad del Agua Potable</td><td>Capitulo 2 Aspectos Microbiologicos</td><td>Articulos 8, 9,10,11,12,13</td><td>Organismos coliformes</td><td>NULL</td><td><input name="selection[]" value="1104" type="checkbox"></td></tr>
<tr data-key="1105"><td>2</td><td>0</td><td>5</td><td>Agua</td><td>Normas Sanitarias de Calidad del Agua Potable</td><td>Capitulo 2 Aspectos Microbiologicos</td><td>Articulos 8, 9,10,11,12,13</td><td>Organismos coliformes Totales</td><td>NULL</td><td><input name="selection[]" value="1105" type="checkbox"></td></tr>
<tr data-key="1106"><td>3</td><td>0</td><td>0</td><td>Agua</td><td>Normas Sanitarias de Calidad del Agua Potable</td><td>Capitulo 2 Aspectos Microbiologicos</td><td>Articulos 8, 9,10,11,12,13</td><td>Examen Virus</td><td>NULL</td><td><input name="selection[]" value="1106" type="checkbox"></td></tr>
<tr data-key="1107"><td>4</td><td>0</td><td>0</td><td>Agua</td><td>Normas Sanitarias de Calidad del Agua Potable</td><td>Capitulo 2 Aspectos Microbiologicos</td><td>Articulos 8, 9,10,11,12,13</td><td>Examen de Bacterias</td><td>NULL</td><td><input name="selection[]" value="1107" type="checkbox"></td></tr>

如您所见。复选框值和data-key 值中的第一个表具有JSON 对象.. 但在第二个表中只有行的ID

【问题讨论】:

  • 请解释清楚,使用示例
  • @scaisEdge 我已经为示例添加了渲染表
  • 请显示您提到的控制器/动作相关和(如果有的话)关系..
  • @scaisEdge 我已经添加了控制器/动作并将模型更改为 modelSearch 就像动作请求它一样
  • 请显示我需要的所有 Limites 型号代码检查几件事。

标签: gridview yii


【解决方案1】:

data-keydata属性保存GridView每一行关联的记录的主键值。

如果是单个主键,它是一个简单的数字,如果是复合主键(例如用于具有多对多关系的表),它是对象,否则无法解决它。在这两种情况下,这仍然是 DOM 中的字符串,因为它是属性值。

yii.gridView.js 中用于获取带有yii\grid\CheckboxColumn 的选定行:

getSelectedRows: function () {
    var $grid = $(this);
    var data = gridData[$grid.attr('id')];
    var keys = [];
    if (data.selectionColumn) {
        $grid.find("input[name='" + data.selectionColumn + "']:checked").each(function () {
            keys.push($(this).parent().closest('tr').data('key'));
        });
    }
    return keys;
},

当你像这样在 Javascript 中获取选定的行时调用此方法:

$('#grid').yiiGridView('getSelectedRows');

【讨论】:

  • 哦,好吧,我不知道..看起来我必须为所有网格创建一个新数据来显示模型对象..不管关系如何,感谢您提供此信息..很有用
  • 但很奇怪,data-key 的值总是等于实际值-1,我该如何解决这个问题?截图:i.imgur.com/Xr1U6Ez.jpg
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-01-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-08-20
  • 2022-12-18
  • 1970-01-01
相关资源
最近更新 更多