Zend Framework:为部分多重复选框元素选项设置默认值是不可能的

时间:2009-09-29 15:16:09

标签: zend-framework

我正在编写这个问题,因为我在设置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(它不会逐个获取所有元素选项)并为所有选项设置默认值,而不仅仅是数组中的给定值。

这就是我看到它的方法,我找不到解决方法如何仅为多个盒子元素的某些选项设置默认值。

3 个答案:

答案 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

由于