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

时间:2019-03-28 19:28:17

标签: search gridview filter yii2

在Yii2中,我有一个控制器,该控制器会生成带有一些动态列的gridview(kartik),我必须为此列创建过滤器,但是要对列进行过滤,我需要在searchModel中使用具有该列名称的变量以及规则数组中也有该名称的条目,该怎么做,因为我的列是在控制器中动态生成的?

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

searchModel.php

#include<stdio.h>
int main()
{

int _a;
char _b;
printf("Zadaj cislo od 0 do 15: ");
scanf_s("%d",&_a);
asm(".intel_syntax noprefix \n"
 "mov eax, _a \n"
 "mov ecx, 9 \n"
 "cmp eax,ecx \n"
 "jg vacsie \n "                         
 "jl mensie \n"
 "mensie: \n"
     "add eax, '0' \n"
     "jmp end"
 "vacsie: \n"
    "add eax,55 \n"
"end:"
    "mov _b,al"
".att_syntax \n"
);
if (_a<=15 && _a>0)
    printf("v hexa %c \n",_b);
else printf("cislo nieje spravne");
getchar();
return 0;

}

controller.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
      ];
...

我现在被困住了。

2 个答案:

答案 0 :(得分:0)

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

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

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

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

答案 1 :(得分:-1)

欢迎来到stackoverflow

我认为您可以 rules()并添加 __ 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);
}