在网格中为动态列创建过滤器

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了在网格中为动态列创建过滤器相关的知识,希望对你有一定的参考价值。

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

我已经尝试使用数组作为变量,键作为列的名称,但我不知道如何使用规则在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
      ];
...

Controller.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

我陷入了困境。

答案

您可以在这种情况下使用DynamicModel。首先,从LojaFornecedorSearch扩展DynamicModel

class LojaFornecedorSearch extends yiiaseDynamicModel {
    // ...
}

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

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

欢迎来到stackoverflow

我认为你可以做rule()并添加__construct()方法。

见打击:

function __construct(){
   // setting attributes
   $this->{$varname};
}

并将规则更改为:

public function rules()
{
    $default_rules = [
        [['id', 'empresa_id', 'grupo_loja_id', 'status', 'numero_checkout',
            'numero_funcionarios', 'loja_id'], 'integer'],
        // and whatever rule you have
    ];
    $new_rules = [
        ['Your_dynamic_var', 'safe']
    ];
    return array_merge($default_rules,$new_rules);
}

以上是关于在网格中为动态列创建过滤器的主要内容,如果未能解决你的问题,请参考以下文章

如何在剑道模板中动态设置列

穿梭列上的 Oracle APEX 交互式网格过滤器 APEX 19.2

剑道 - 通过页面上的代码保存网格过滤器仅存在日期过滤器网格列的问题

在角度控制器中动态创建剑道网格列

动态设置网格列/行宽/高

如何使用列设置动态创建角剑道网格列?