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

Des*_*ova 4 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 );
Run Code Online (Sandbox Code Playgroud)

其中$ options数组是一个关联数组'key'=>'value'.该字段显示得很好,我可以获得该元素的所有选中值.

当返回到该页面时,我需要再次从DB恢复整个选项列表并标记选中的选项.我试过这样做:

$multiCheckbox ->setValue( $defaults );
Run Code Online (Sandbox Code Playgroud)

其中$ 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 []数组中的checked选项值.这是元素名称.setDefaults()form方法按名称获取所有表单元素,并通过调用setDefault()form方法并在setValue()元素方法之后提交其默认值.所以我的multicheckbox元素名称为elId(它不会逐个获取所有元素选项)并为所有选项设置默认值,而不是仅为数组中给定的值.

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

Tim*_*tle 9

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"';
}
Run Code Online (Sandbox Code Playgroud)

不确定那对你不起作用,但如果你要通过:

$element->setMultiOptions(array('1111' => 'Some Label', 
                                '2222' 'Some Other Label', 
                                '3333', 'Not Selected Label'));

$element->setValue(array('1111','2222');
Run Code Online (Sandbox Code Playgroud)

应该工作.也许如果你能包含一些代码,你会更容易看到发生了什么?