-- dbroderick <[EMAIL PROTECTED]> wrote
(on Wednesday, 05 November 2008, 02:38 PM -0800):
> I am relatively new to ZF (currently using 1.6.2) and am working on a
> multi-page form (subforms) and need to have one of my pages use the
> ViewScript so that I could write custom HTML for the layout.
>
> I found this post response that helped me in getting my subform partially
> working, one key bit of code I was missing was what you provided here:
>
>
>
> > Make sure that you call setView() on the elements. Easiest would be to
> > do the following at the top of your view script:
> >
> > foreach ($this->element as $item) {
> > $item->setView($this);
> > }
> >
>
> However, my subform validation was not working (basically anything I
> submitted whether valid or not would break validation) and so I dug into the
> ZF code to compare the Zend_Form_Decorator_FormElements render function with
> the Zend_Form_Decorator_ViewScript render function.
>
> What I noticed when I looked at the generated source code using the
> ViewScript is that my elements did not have the proper assignment to the
> subform.
>
> I noticed my form elements under viewscript rendered like this:
>
> <input type="text" name="lastName" id="lastName" value="" size="30" />
>
> Instead of this:
>
> <input type="text" name="person[lastName]" id="person-lastName" value="" />
>
> My fix was to make a copy of the ViewScript class, add the following code to
> it and set my decorator for that subform with my custom ViewScript.
>
> /*
> * Added to retain belongsto info for use in subforms
> */
> $belongsTo = ($element instanceof Zend_Form) ?
> $element->getElementsBelongTo() : null;
> $translator = $element->getTranslator();
>
> foreach ($element as $item) {
> $item->setView($view)
> ->setTranslator($translator);
> if ($item instanceof Zend_Form_Element) {
> $item->setBelongsTo($belongsTo);
> } elseif (!empty($belongsTo) && ($item instanceof Zend_Form)) {
> if ($item->isArray()) {
> $name = $this->_mergeBelongsTo($belongsTo,
> $item->getElementsBelongTo());
> $item->setElementsBelongTo($name, true);
> } else {
> $item->setElementsBelongTo($belongsTo, true);
> }
> } elseif (!empty($belongsTo) && ($item instanceof
> Zend_Form_DisplayGroup))
> {
> foreach ($item as $element) {
> $element->setBelongsTo($belongsTo);
> }
> }
> }
>
> The actual question I have here is, shouldn't this code or something like it
> already be a part of the current ViewScript class so that ViewScript can
> support subform validation?
Well, it can't be part of ViewScript, as ViewScript can be used with
individual elements as well as forms. However, this would be a good
candidate for a form decorator; you could then do this:
$form->setDecorators(array(
'PrepareElements',
array('ViewScript', array('form.phtml'))
);
I'm adding a request to the tracker for this improvement; I think it
will help a lot of people. The issue URL is:
http://framework.zend.com/issues/browse/ZF-4812
--
Matthew Weier O'Phinney
Software Architect | [EMAIL PROTECTED]
Zend Framework | http://framework.zend.com/