gpt4 book ai didi

php - Yii CGridview 索引过滤器

转载 作者:搜寻专家 更新时间:2023-10-31 21:33:44 24 4
gpt4 key购买 nike

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

我有 4 个过滤器,名称分别为 CustomField[5]CustomField[6]CustomField[8]CustomField[ 12] 由它的 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>

知道出了什么问题如何解决吗?

最佳答案

问题

这是 jquery.ba-bbq.jsdeparam function 方式的问题处理 url 参数。如果参数作为 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[]=

$(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. 此外,您可以忽略 Controller 操作中的任何空 CustomField 参数。

关于php - Yii CGridview 索引过滤器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24907816/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com