【问题标题】:Zend subform view script renderZend 子表单视图脚本渲染
【发布时间】:2011-11-27 07:29:57
【问题描述】:

我宁愿不处理装饰器,因为我的表单设计并不完全直截了当,但我想保留验证表单的功能。

所以我在子表单正常工作的地方设置了它,但是当我尝试在我的视图脚本中手动设置它的样式时,我得到了没有父表单的名称。我看过其他类似的帖子,但我没有找到解决方案。

例子:

这是我认为的脚本

<?php echo $this->form->username->renderViewHelper();?>

然后我得到

<input type="text" value="" id="username" name="username">

渲染时。应该是

<input type="text" value="" id="form1-username" name="form1[username]">

我如何获得 form1 部分?

谢谢!


编辑

好的,所以我找到了一种方法。

通过使用belongTo,它可以工作:

    $form1->addElements(array(
        new Zend_Form_Element_Text('username', array(
            'belongsTo' => 'form1',
            'required'   => true,
            'label'      => 'Username:',
            'filters'    => array('StringTrim', 'StringToLower'),
            'validators' => array(
                'Alnum',
                array('Regex',
                      false,
                      array('/^[a-z][a-z0-9]{2,}$/'))
            )
        ))
     ));

有没有更好的方法或者这是唯一的方法?


编辑2

public function prepareSubForm($spec){
    if (is_string($spec)) {
        $subForm = $this->{$spec};
    } elseif ($spec instanceof Zend_Form_SubForm) {
        $subForm = $spec;
    } else {
        throw new Exception('Invalid argument passed to ' .
                            __FUNCTION__ . '()');
    }
    $this->setSubFormDecorators($subForm)
         ->addSubmitButton($subForm)
         ->addSubFormActions($subForm);
    return $subForm;
}

public function setSubFormDecorators(Zend_Form_SubForm $subForm){
    $subForm->setDecorators(array(
        'FormElements', \\<--- I tried to change this to PrepareElements before.
        array('HtmlTag', array('tag' => 'dl',
                               'class' => 'zend_form')),
        'Form',
    ));
    return $this;
}

【问题讨论】:

  • 你在使用PrepareElements 装饰器吗?
  • Zend: ViewScript decorator and array notation 的完全相同的副本。这是过去几个小时发布的关于该主题的第二个问题,很奇怪
  • @fireeyedboy 不,我会用我正在使用的内容更新我的帖子。我是 Zend 的新手,所以我现在还不知道装饰器是如何工作的。
  • @Phil 不完全是,我没有元素数组。它现在只是一个文本框。但它不会添加验证所需的父表单名称。
  • @Matt 答案(由 fireeyedboy 指出)是一样的

标签: html forms zend-framework


【解决方案1】:

我相信您可以通过以下方式获得所需的输出:

<?php echo $this->form->username; ?>

在没有 renderViewHelper 的情况下调用它时,我得到了预期的输出。这也没有任何装饰器或准备子表单的特殊代码。我所要做的就是将belongsTo 添加到表单元素中。

更新:

如果将其设置为默认装饰器,则可以从渲染中消除 dd/dt 标签,而是使用 div。那么您可能更接近于获得您想要的自定义输出。您可以将HtmlTag 中的tagdiv 更改为您想要包装元素的任何标签。这是我最常用的:

array(
    'ViewHelper',
    'Errors',
    array('Description', array('tag' => 'p', 'class' => 'description')),
    array('HtmlTag', array('tag' => 'div', 'class' => 'form-div')),
    array('Label', array('class' => 'form-label', 'requiredSuffix' => '*'))
);

这是 Zend 框架的默认设置:

array(
    'ViewHelper',
    'Errors',
    array('Description', array('tag' => 'p', 'class' => 'description')),
    array('HtmlTag', array('tag' => 'dd', 'id' => array('callback' => $getId)))
    array('Label', array('tag' => 'dt'))
);

请注意,文件和提交/按钮元素使用不同的装饰器。

另见this answer

【讨论】:

  • 如果我像这样进行默认渲染,我会得到 dt/dd 标签,如果我想手动执行,我显然不想要。但是,是的,正如我的编辑中所述,如果我这样做,我可以这样做,但我不能让它与 PrepareElements 一起工作。
  • 是的,它仍然将所有元素包装在 dd/dt 标签中,但它将所有元素包装在一个容器 div 中,类为 form-div。所以我不知道。就像我说的,我不知道这些装饰器是如何工作的。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-10-21
  • 1970-01-01
  • 2011-06-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多