【问题标题】:Zend Framework : Setting up default values for part of the multicheckbox element options not possibleZend 框架:无法为部分多复选框元素选项设置默认值
【发布时间】:2009-09-29 15:16:09
【问题描述】:

我写这个问题是因为我很难为 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' => 'value'。该字段显示得很好,我可以获得该元素的所有检查值。

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

$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() 表单方法按名称获取所有表单元素,并通过调用 setDefault() 表单方法和之后的 setValue() 元素方法提交它们的默认值。所以我的 multicheckbox 元素具有名称 elId (它不会一一获取所有元素选项)并为所有选项设置默认值,而不仅仅是数组中的给定值。

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

【问题讨论】:

    标签: zend-framework


    【解决方案1】:

    Chris 是正确的,setValue() 期望一个值数组被“检查”(而不是一个由您的选项 ID 键入的 bool 值数组)。

    如果您正在寻找表单生成背后的逻辑,请不要查看Zend_Form_Element 对象(或其中的许多扩展元素),请查看Zend_View_Helper 对象。特别是Zend_View_Helper_FormRadio 对象。

    在生成 HTML 时,选项数组被循环,然后根据值数组检查值 - 使用 in_array() 传递给 setValue() 的数组。

    来自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');
    

    应该工作。如果您可以包含一些代码,也许会更容易看到发生了什么?

    【讨论】:

    • 你们说的都对。我设法使它工作传递带有选项值的数组。感谢您的帮助。
    【解决方案2】:

    setValue() 需要一个包含需要检查的值的数组,例如,在这种情况下,您需要传递一个包含值 1222、1443 的数组,以便将它们标记为已检查。

    【讨论】:

    • 我在上面已经提到传递这样的数组也不起作用 - 没有检查任何选项元素。传递种类 array('1222', '1444') 的数组不会选中任何复选框。传递数组 ('1222' => true, '1444' => true) 检查所有复选框,但不仅是数组中指定的复选框。此外,我在 Form Element setValue() 方法中找不到将默认值设置为多元素的正确逻辑。无论如何,我也开始认为问题可能出在我用来渲染字段的 HtmlTag 装饰器或 ViewHelper 装饰器以及它的处理方式上。
    【解决方案3】:

    您需要在插入数据库之前序列化复选框值。要再次显示选择的数据库值,您必须取消序列化要显示的数据。

    您可以从以下链接阅读详细信息

    http://abser-web-tips.blogspot.com/2010/09/zend-framework-multiple-check-box.html

    谢谢

    【讨论】:

      猜你喜欢
      • 2020-06-26
      • 1970-01-01
      • 2021-03-18
      • 1970-01-01
      • 2016-10-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-05-05
      相关资源
      最近更新 更多