我正在编写这个问题,因为我在设置Zend Framework 1.9.3的_MultiCheckbox元素的默认值时遇到了困难。 我使用多个选项创建Zend_Form_Element_MultiCheckbox,如下所示:
$multiCheckbox = new Zend_Form_Element_MultiCheckbox( 'elId',
array ( 'disableLoadDefaultDecorators' =>true ) );
$multiCheckbox ->setName( 'elId' )
->setLabel('elId')
->setRequired( false )
->setAttrib('class', 'inputtext')
->setDecorators( array( 'ViewHelper' ) )
->setMultiOptions( $options );
其中$ options数组是关联数组'key'=> '值'。该字段显示得很好,我可以获得该元素的所有选中值。
当返回到该页面时,我需要再次从DB恢复整个选项列表并标记选中的选项。我试过这样做:
$multiCheckbox ->setValue( $defaults );
其中$ default是数组,包含'checked_option_field_id'=>类型的元素true
(例如:array('1222'=> true,'1443'=> true))。
该动作检查所有复选框,而不仅仅是我需要的一次,而且我已经传递给了setValue()方法。
我试图传递一个包含类型'checked_option_field_id',
的元素的数组(例如数组('1222','1443'))
但是这也不起作用 - 没有复选框检查。
我使用了形式setDefaults()方法和这两种数组,但结果是相同的 - 因为这个方法再次使用setValue()为每个元素。
MultiCheckbox元素的呈现方式如此(尝试仅为一个选项设置选中的值时的结果):
<label for="elId-1222"><input type="checkbox" name="elId[]" id="elId-1222" value="1222" checked="checked" class="inputtext">BoRoom </label><br />
<label for="elId-1443"><input type="checkbox" name="elId[]" id="elId-1443" value="1443" checked="checked" class="inputtext">BoRoom Eng2 </label><br/>
该元素填充elId []数组中的已检查选项值。这是元素名称。 setDefaults()form方法按名称获取所有表单元素,并通过调用setDefault()form方法并在setValue()元素方法之后提交其默认值。所以我的multiheckbox元素名称为elId(它不会逐个获取所有元素选项)并为所有选项设置默认值,而不仅仅是数组中的给定值。
这就是我看到它的方法,我找不到解决方法如何仅为多个盒子元素的某些选项设置默认值。
答案 0 :(得分:8)
Chris是正确的,setValue()期望“检查”一组值(不是由您的选项ID键入的bool值数组)。
如果您正在寻找表单生成背后的逻辑,请不要查看Zend_Form_Element
对象(或其中的许多扩展元素),查看Zend_View_Helper
对象。特别是Zend_View_Helper_FormRadio
对象。
生成HTML时,选项数组循环,然后使用setValue()
对数组 - 使用in_array()
传递给Zend_View_Helper_FormRadio
的数组检查值。
来自150
行:// is it checked?
$checked = '';
if (in_array($opt_value, $value)) {
$checked = ' checked="checked"';
}
$element->setMultiOptions(array('1111' => 'Some Label',
'2222' 'Some Other Label',
'3333', 'Not Selected Label'));
$element->setValue(array('1111','2222');
不确定那对你不起作用,但如果你正在通过:
{{1}}
应该工作。也许如果您可以包含一些代码,那么更容易看到发生了什么?
答案 1 :(得分:2)
setValue()需要一个数组,其中包含需要检查的值,在这种情况下,例如,您需要传递一个值为1222,1443的数组,以便将它们标记为已选中。
答案 2 :(得分:1)
在插入数据库之前,需要序列化复选框值。要再次显示所选的数据库值,您必须反序列化要显示的数据。
您可以从以下链接中了解详细信息
http://abser-web-tips.blogspot.com/2010/09/zend-framework-multiple-check-box.html
由于