Yii CGridview索引过滤器

时间:2014-07-23 10:18:50

标签: php yii cgridview

我有CGridView的自定义字段。每列都有不同的自定义字段及其ID。显示它们就好了。当我尝试为这些字段应用过滤器时,问题就开始了。

我有4个名称为CustomField[5]CustomField[6]CustomField[8]CustomField[12]的过滤器,其ID为id。过滤后,yii生成错误的查询:

Wrong query

正如你所看到的,它正在循环直到最后一个元素(因为最大的id是12,所以它循环到12)。但是如果我添加字母(将索引作为字符串),它会生成正确的查询:

Correct query

使用代码生成过滤器下拉列表:

echo CHtml::dropDownList(
    "CustomField[{$column->id}]",
    $this->getFilterValue($column),
    ['' => ''] + CustomFieldValue::getValue($column),
    $column->tagOptions
);

它生成这个html:

 <tr class="filters">
    <td>
        <select id="CustomField_5" name="CustomField[5]">
            <option selected="selected" value=""></option>
            <option value="29">Olympic Male Fly -58</option>
            <option value="33">Olympic Female Bantam -57</option>
        </select>
    </td>
    <td>
        <select id="CustomField_6" name="CustomField[6]">
            <option selected="selected" value=""></option>
            <option value="4">Quarter-finals</option
        </select>
    </td>
    <td>
        <select id="CustomField_8" name="CustomField[8]">
            <option selected="selected" value=""></option>
            <option value="3">Bronze</option>
            <option value="1">Gold</option>
            <option value="4">Participation</option>
        </select>
    </td>
    <td>
        <select id="CustomField_12" name="CustomField[12]">
            <option selected="selected" value=""></option>
            <option value="2">Silver</option>
            <option value="1">Gold</option>
        </select>
    </td>
</tr>

任何想法如何解决它?

2 个答案:

答案 0 :(得分:1)

问题

这是jquery.ba-bbq.js deparam function处理网址参数的问题。如果参数作为url字符串传递,即&a=b&c=d..,则会从中创建一个对象。在此过程中,它将任何以数字方式索引为数组的参数处理,并使用空元素填充它们。

以下是您的过滤器html上serialize的结果:

CustomField[5]=&CustomField[6]=&CustomField[8]=&CustomField[12]=

这是序列化字符串

$.param.querystring的结果
CustomField[]=&CustomField[]=&CustomField[]=&CustomField[]=&CustomField[]=&
CustomField[]=&CustomField[]=&CustomField[]=&CustomField[]=&CustomField[]=&
CustomField[]=&CustomField[]=&CustomField[]=

&#13;
&#13;
$(function(){
        $("#clickme").on("click", function(){
           var data = $(".filters select").serialize();
           $("#serialized").html(decodeURIComponent(data) + "\n\n" + decodeURIComponent($.param.querystring("", data)));
        });
    });
&#13;
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.9.1/jquery.min.js"></script>
<script src="https://raw.githubusercontent.com/yiisoft/yii/master/framework/web/js/source/jquery.ba-bbq.js"></script>

<div class="filters">
    <select id="CustomField_5" name="CustomField[5]">
      <option selected="selected" value=""></option>
      <option value="29">Olympic Male Fly -58</option>
      <option value="33">Olympic Female Bantam -57</option>
    </select>
    <select id="CustomField_6" name="CustomField[6]">
      <option selected="selected" value=""></option>
      <option value="4">Quarter-finals</option>
    </select>
    <select id="CustomField_8" name="CustomField[8]">
      <option selected="selected" value=""></option>
      <option value="3">Bronze</option>
      <option value="1">Gold</option>
      <option value="4">Participation</option>
    </select>
    <select id="CustomField_12" name="CustomField[12]">
      <option selected="selected" value=""></option>
      <option value="2">Silver</option>
      <option value="1">Gold</option>
    </select><br/>
    <button id ="clickme">Serialize</button>
  </div>  
  <pre><div id="serialized"></div></pre>
&#13;
&#13;
&#13;

解决方案

  1. 使用字符串为索引添加前缀可以解决问题,因为它会导致参数CustomField被视为对象而不是数组。

  2. 另一种解决方案是确保您的自定义字段具有连续索引,即0,1,2,3

  3. 此外,您可以忽略控制器操作中的任何空CustomField个参数。

答案 1 :(得分:0)

我认为yii认为CustomField[{$column->id}]是一个索引的数组。这也与yii中的下拉列表形成有关。那么为什么要通过使nameid相同来解决问题呢? CustomField _ {$ column-&gt; id}