在嵌套子表单上使用ViewScript Decorator(Zend表单)

Ran*_*Ran 6 zend-framework zend-form zend-form-sub-form

我想使用视图脚本来呈现我的zend表单,因为它似乎是在使用Zend_Elements类时控制表单的布局/设计的最佳方法.

从视图脚本中,我使用了渲染元素$this->element->getElement('elementName').

我遇到了元素名称的问题.这实际上是表单内部子表单内的子表单.

当我使用FormElements装饰器时,元素的完全限定名称是[subForm] [subForm] [element],这很好.我转移到viewScript装饰器,它改为subForm [subForm] [element].

我知道我需要使用PrepareElements装饰器来解决这个问题,但这导致名称改变形式[subForm] [form] [subForm] [subForm] [elements](它在开头的前两个名字加倍).

任何想法我应该如何处理这个?

谢谢.

更新:我试图调试PrepareElements,我真的不明白在做什么.看起来它在第一次迭代中工作正常,但是当在其中一个中间子表单上运行时,它再次添​​加形式[subform]前缀.

当我没有使用PrepareElements装饰器时,我只是在名称中缺少"form"前缀(即,而不是形式[subForm] [element],我只得到subForm [element]).

可能我可以解决这个问题吗?

我试图更改belongsTo,但只替换了"subForm"前缀.

实际上,缺少的是subForm上的belongsTo方法.

同样,这完全是因为ViewScript装饰器.它适用于FormElements装饰器.

更新2:为了澄清,我不介意这个名称更改,但是当我调用form-> populate时,它会导致我的字段不填充.

编辑:我认为我已经将问题缩小到了这一点:当我在setDefaults中获取我的值时,它们的排序方式如下:

array(
\"formElements1-name\" => value1... \"subFormName\" => array(
\"parentFormName\" => array(
\"subFormName\" => subForm-values-array
)
)
Run Code Online (Sandbox Code Playgroud)

......这里的主要问题是"parentFormName" => "subFormNAme"..它重演的是什么?我已经是主要形式了.我猜这是因为我设置了setElementsBelongTo(formName[subFormName]),但如果我不这样做,那么我会将我的子表单值与表单完全分开,

ie values array = array(\"formName \"=> array(formValues),\"subFormNAme \"=> array(subFormValues)

,虽然我把它贬低了

array(
formName => array(
subFormNAme => values-array
)
)...
Run Code Online (Sandbox Code Playgroud)

是否有可能使这项工作?

dre*_*010 8

您是否只是尝试使用<?php echo $this->form; ?>视图脚本输出表单?

这适用于简单的表单,但对于我更复杂的表单,我倾向于单独呈现每个元素,但不需要在每个单独的元素上使用ViewScript装饰器来执行此操作.只需从您的视图脚本中尝试这样的操作:

<div class="form">
    <fieldset>
        <legend>Some Form Name</legend>
        <form action="<?php echo $this->escape($this->form->getAction()) ?>"
              method="<?php echo $this->escape($this->form->getMethod()) ?>"
              enctype="multipart/form-data">

            <?php echo $this->form->id; // render the id element here ?>

            <div class="half">
                <?php echo $this->form->name; // render the user name field here ?>
            </div>
            <div class="half">
                <?php echo $this->form->description; // render the description element here ?>
            </div>
            <div class="clear"></div>

            <div class="half">
                <?php echo $this->form->address1; // render the address ?>
            </div>
            <div class="half">
                <?php echo $this->form->address2; // render address2 ?>
            </div>
            <div class="clear"></div>

            <div class="third">
                <?php echo $this->form->zip; // render zip code ?>
            </div>
            <div class="third">
                <?php echo $this->form->city; // render city ?>
            </div>
            <div class="third">
                <?php echo $this->form->state; // render state ?>
            </div>
            <div class="clear"></div>

            <div class="half">
                <?php echo $this->form->country; // render country ?>
            </div>
            <div class="clear"></div>

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

        </form>
    </fieldset>
</div>
Run Code Online (Sandbox Code Playgroud)

这就是我做大部分表格的原因,因为我希望有一些元素占据宽度的一半而其他元素占据整个宽度.

令人惊讶的是,参考指南并未告诉您可以执行此操作.我似乎在过去记得有关它的页面但现在找不到它.当我开始使用Zend Framework时,我认为唯一可以让我的表单输出我想要的方式就是创建复杂的装饰器,但事实并非如此.

Matthew Weier O'Phinney有一篇关于单独渲染Zend_Form装饰器的博文,这解释了我上面做了什么.我希望他们把这个添加到Zend Form的第一页,因为这对我来说是令人沮丧的.事实是,90%的表单单独呈现元素而不是仅仅回显表单本身.

注意:要阻止ZF将表单元素包含在dt和dd标记中,我将此装饰器应用于所有标准表单元素.我有一个基本表单类,我扩展了所有表单,所以我不必在任何地方重复这个.这是元素的装饰器,所以我可以使用标签来封闭我的元素.

public $elementDecorators = 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' => '*'))
);
Run Code Online (Sandbox Code Playgroud)

对于我使用的提交按钮

public $buttonDecorators = array(
    'ViewHelper',
    array('HtmlTag', array('tag' => 'div', 'class' => 'form-button'))
);
Run Code Online (Sandbox Code Playgroud)


Ran*_*Ran 2

当前的解决方案是在子表单上使用PrepareElements 装饰器,并进行一项更改 - 删除PrepareElements 代码中的递归调用。此外,不需要“setElementsBelongTo”。

这似乎生成了正确的名称和 ID。