我有CGridView的自定义字段。每列都有不同的自定义字段及其ID。显示它们就好了。当我尝试为这些字段应用过滤器时,问题就开始了。
我有4个名称为CustomField[5]
,CustomField[6]
,CustomField[8]
和CustomField[12]
的过滤器,其ID为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>
任何想法如何解决它?
答案 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[]=
$(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;
解决方案
使用字符串为索引添加前缀可以解决问题,因为它会导致参数CustomField
被视为对象而不是数组。
另一种解决方案是确保您的自定义字段具有连续索引,即0,1,2,3
。
此外,您可以忽略控制器操作中的任何空CustomField
个参数。
答案 1 :(得分:0)
我认为yii认为CustomField[{$column->id}]
是一个索引的数组。这也与yii中的下拉列表形成有关。那么为什么要通过使name
与id
相同来解决问题呢?
CustomField _ {$ column-&gt; id}