首页 > 解决方案 > 在网格中为动态列制作过滤器

问题描述

在 Yii2 中,我有一个控制器,它生成一个带有一些动态列的 gridview(kartik),我必须为这些列制作过滤器,但是要为一个列做一个过滤器,我需要一个变量,其中包含 searchModel 中该列的名称和一个条目在具有该名称的规则数组中,如何在控制器中动态生成我的列?

我已经尝试使用数组作为变量,将键作为列的名称,但我不知道如何在 searchModel 中使用带有规则的数组。

搜索模型.php

...
public $loja_cnpj;
public $loja_nome;
public $forn_status;
//  public $forn10420318; <- this need to be generate dynamically

public function rules()
{
   return [
      [['id', 'empresa_id', 'grupo_loja_id', 'status', 'numero_checkout', 
      'numero_funcionarios', 'loja_id'], 'integer'],
      // [['nome', 'telefone', 'empresa','grupo_loja', 'email', 'cnpj', 
      'loja_nome', 'loja_cnpj', 'forn10420318'], 'safe'],
      [['nome', 'telefone', 'empresa','grupo_loja', 'email', 'cnpj', 
      'loja_nome', 'loja_cnpj', 'forn_status["forn10420318"]'], 'safe'],
      [['area_venda', 'tamanho_loja'], 'number'],
      ['forn_status', 'each', 'rule' => ['safe']], <- i'm stuck here
      ];
...

控制器.php

...
$searchModel   = new LojaFornecedorSearch();
...
foreach($queryFornecedor as $fornecedor){
         $colTemp = array([
            'attribute' => 'forn'.$fornecedor->id,
            'label'     => 'forn'.$fornecedor->id,
            'value'     => function($model)use($fornecedor)... <- dynamic columns array to be inserted in gridView

我被困在这一点上。

标签: searchgridviewfilteryii2

解决方案


您可以DynamicModel用于这种情况。首先,扩展LojaFornecedorSearchDynamicModel

class LojaFornecedorSearch extends \yii\base\DynamicModel {
    // ...
}

然后您可以通过这种方式动态定义属性:

$searchModel = new LojaFornecedorSearch();
// ...
foreach ($queryFornecedor as $fornecedor) {
    $searchModel->defineAttribute('forn' . $fornecedor->id);
    $searchModel->addRule('forn' . $fornecedor->id, 'safe');
    // ...
}

推荐阅读