【问题标题】:Yii CGridview indexed filtersYii CGridview 索引过滤器
【发布时间】:2014-09-14 11:31:09
【问题描述】:

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

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

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

过滤器下拉菜单是用代码生成的:

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>

知道怎么解决吗?

【问题讨论】:

  • 您能否添加为其中一个过滤器生成的不带字母的 html?
  • @topher 更新问题

标签: php yii cgridview


【解决方案1】:

问题

这是jquery.ba-bbq.jsdeparam function 处理url 参数的方式的问题。如果参数作为 url 字符串传递,即&amp;a=b&amp;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[]=

$(function(){
        $("#clickme").on("click", function(){
           var data = $(".filters select").serialize();
           $("#serialized").html(decodeURIComponent(data) + "\n\n" + decodeURIComponent($.param.querystring("", data)));
        });
    });
<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>

解决方案

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

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

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

【讨论】:

  • 第一个解决方案看起来浪费资源和时间来进行parcing。第二个是不可能的,因为索引必须与数据库中的索引相同。我会尝试第三种解决方案。
【解决方案2】:

我认为 yii 将CustomField[{$column-&gt;id}] 视为索引数组。这也与 yii 中的下拉列表形成有关。那么为什么不通过使nameid 相同来解决它: CustomField_{$column->id}

【讨论】:

  • 因为我需要它索引。如果我命名为CustomField_{$column-&gt;id},我将不得不另外解析_POST。
  • @Justinas,您是否尝试过强制解析器将 CustomField 的索引视为字符串:CustomField['{$column-&gt;id}']
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-02-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-10-07
  • 1970-01-01
  • 2014-01-03
相关资源
最近更新 更多