【问题标题】:Zend Framework: isValid() clears values from disabled form fields!Zend 框架:isValid() 从禁用的表单字段中清除值!
【发布时间】:2010-03-24 19:49:06
【问题描述】:

当您提交表单时,请求中不会提交禁用的表单字段。

因此,如果您的表单有一个禁用的表单字段,那么使用 Zend_Form::isValid() 会有点令人沮丧。

$form->populate($originalData);
$form->my_text_field->disabled = 'disabled';
if (!$form->isValid($_POST)) {
    //form is not valid
    //since my_text_field is disabled, it doesn't get submitted in the request
    //isValid() will clear the disabled field value, so now we have to re-populate the field
    $form->my_text_field->value($originalData['my_text_field']);
    $this->view->form = $form;
    return;
}

// if the form is valid, and we call $form->getValues() to save the data, our disabled field value has been cleared!

无需重新填充表单并创建重复的代码行,解决此问题的最佳方法是什么?

【问题讨论】:

  • 这并不取决于 Zend Form; HTML 规范说禁用元素不会被提交,而只读元素会提交(这解释了下面@robertbasic 的建议)。

标签: zend-framework zend-form


【解决方案1】:

您是否将元素设置为禁用,以便用户无法编辑其内容而只能查看它?如果是这样,只需将元素的 readonly 属性设置为 true,我认为它会这样工作。

【讨论】:

  • 我也遇到了同样的问题,这行得通。就像 robertbasic 所说,只需设置 'readonly' 属性而不是 'disabled' 属性。
  • Readonly 被提交,disabled 没有,按照规范;有关详细信息,请参阅WC3's Forms in HTML,特别是“禁用”、“只读”和"successful" 上的位 - 只读可以成功,而禁用不能(因此不提交)。
【解决方案2】:

我使用继承自 Zend_Form 的自定义类。类增加了一些特性,通过替换方法isValid解决了这个问题,如下:

class Murdej_Form extends Zend_Form {
    function isValid($data) {
        $_data = $this->getValues();
        $valid = parent::isValid($data);
        $this->populate($_data);
        return $valid;
    };
};

【讨论】:

    【解决方案3】:

    我们可以使用isValidPartial(),而不是使用isValid()。然而,与isValid() 不同的是,如果特定键不存在,它将不会对该特定元素运行验证。因此,isValidPartial() 不会验证禁用的字段。

    参考:ZF Documentation

    【讨论】:

    • 唯一的问题是如果一个必填字段没有在表单中提交,它将不会被验证。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-08-23
    • 1970-01-01
    • 1970-01-01
    • 2012-09-02
    • 1970-01-01
    • 2021-07-28
    • 2016-03-31
    相关资源
    最近更新 更多