The label wrapping logic is hardcoded in the view helper, specifically
Zend_View_Helper_FormRadio. Overriding that logic would involve a lot of
code duplication. If you're fine with that:

- create a file named MyMultiCheckbox.php in your application/views/helpers
directory

class Zend_View_Helper_MyMultiCheckbox extends
Zend_View_Helper_FormMultiCheckbox
{
    public function myMultiCheckbox($name, $value = null, $attribs = null,
        $options = null, $listsep = "<br />")
    {
        // stuff
    }
}

- open the file Zend/View/Helper/FormRadio.php, copy the contents of the
formRadio() method to the method above and modify it to fit your needs. You
might also want to move the break-every-3-elements behavior here.

- tell the element to use your helper

$foo = new Zend_Form_Element_MultiCheckbox('foo', array(
    'multiOptions' => $opts,
    'decorators' => $decorators,
    'helper' => 'MyMultiCheckbox'
));

   -- Mon


On Sat, Mar 7, 2009 at 3:45 AM, <fire-eyed-...@hotmail.com> wrote:

>  Ah oke, I see what you mean now. No, I am using the ViewScript on the
> whole form. So I have some more control over the placement of the elements
> in my ViewScript. The PrepareElements decorator makes sure that the forms
> elements are all made aware of the view and possible translators as far as I
> understand it. Have a look at:
> http://framework.zend.com/issues/browse/ZF-4812
>
> Yes you are right about the decorator placement options of course. Now it
> even makes more sense. In light of this, do you know of any way to make it
> so that labels are always appended on form elements in stead of wrapped
> around. I tried these thing:
>
> // define decorators
> $decorators = array(
>   'ViewHelper',
>   array( 'Label', array( 'placement' => 'append' ) ),
>   'Errors'
>   );
> // another try
> $decorators = array(
>   'ViewHelper',
>   array( 'Label', array( 'options' => array( 'placement' => 'append' ) ) ),
>   'Errors'
>   );
>
>
> // example of how I set the decorators on elements
> $products = new Zend_Form_Element_MultiCheckbox( 'products' );
>   $products->setDecorators( $decorators )
>   ->setLabel( 'products )
>   ->setAttribs( array( 'class' => 'check' ) )
>   ->setMultiOptions( $productList )
>   ->setSeparator( ' ' );
>
> But these decorator settings have no affect, it will still render the
> checkbox elements like (notice label wrapped around element):
> <label><input type="checkbox" [...]>The label</label>
>
> In stead of:
> <input type="checkbox" [...]><label>The label</label>
>
> Cheers
>
>
>
> ------------------------------
> Date: Sat, 7 Mar 2009 02:29:13 +0800
>
> From: mon...@gmail.com
> To: fw-general@lists.zend.com
> Subject: Re: [fw-general] Zend_Form: MultiCheckbox or Checkbox i.c.w.
> ViewScript and looping through individual elements
>
> No problem, I'm glad my suggestions worked for you.
>
> By 'echoing the whole form', I mean you were doing a <?= $this->form ?> in
> the view. I thought you were using ViewScript on the elements only and not
> the form. renderForm() is only useful if you're doing something like
> // controller
> $this->view->form = new Form_Foo();
> // view
> <?= $this->form->renderForm(false) ?>
>     <?= $this->form->foo ?><br />
>     <?= $this->form->bar ?><br />
>     <?= $this->form->submit ?>
> </form>
>
> A decorator does not necessarily wrap the output of the preceding
> decorator(s) though. It may append, prepend, wrap, or even completely ignore
> and replace the previous output with something else. The default behavior of
> most decorators is 'append', so what happened there was the output of the
> ViewScript was appended to the empty form which was returned by Form. (I
> don't know what PrepareElements does, apparently it doesn't touch the string
> passed to it). The 'placement' option allows you to override the default
> behavior in some decorators.
>
>    -- Mon
>
>
> On Sat, Mar 7, 2009 at 1:24 AM, <fire-eyed-...@hotmail.com> wrote:
>
>  Works like a charm Mon. Thanks again.
>
> I'm not sure though what you mean by echoing the whole form. If you mean
> echo each individual element with
> $form->element->someElement->renderViewHelper() then yes.
>
>
> Anyway, the decorators are starting to make sense more and more now. The
> decorator hierarchy, as I've read, does make a difference, as they wrap
> around the former. I had some notion of the decorator pattern, but couldn't
> get my head around it (no pun intended) too well at first. But this
> illustrates the workings of a decorator pattern quite vivid. I guess the
> Form decorator got overwritten by the ViewScript decorator when I had it the
> other way around. Which makes perfect sense. It would be silly to have
> ViewScript wrap around the Form decorator. If that is even possible at all.
>
> Cheers
>
>
> ------------------------------
> Date: Sat, 7 Mar 2009 00:55:59 +0800
> From: mon...@gmail.com
> To: fw-general@lists.zend.com
> Subject: Re: [fw-general] Zend_Form: MultiCheckbox or Checkbox i.c.w.
> ViewScript and looping through individual elements
>
> I see that you're echoing the whole form. There's no need for renderForm()
> in that case. Just put the Form decorator after ViewScript. The output of
> the ViewScript will be wrapped by <form> that way.
>
>    -- Mon
>
>
> On Sat, Mar 7, 2009 at 12:33 AM, <fire-eyed-...@hotmail.com> wrote:
>
>  I gues I was a bit hasty about point 2. <?= $form->renderForm( false ); ?>
> produces two form elements, one fully closed and one with only the starting
> tag:
>
> <form enctype="application/x-www-form-urlencoded" accept-charset="utf-8"
> class="offer" action="" method="post"></form>
> <form enctype="application/x-www-form-urlencoded" accept-charset="utf-8"
> class="offer" action="" method="post">
> <dl>
>   <dt>
> ... etc
>
> This is the code in my extended form:
>
> $this->setName( $this->_name )
>   ->setMethod( 'post' )
>   ->setAttribs( array( 'accept-charset' => 'utf-8', 'class' => 'offer' ) )
>   ->setDecorators( array(
>   'Form',
>   'PrepareElements',
>   array( 'ViewScript', array( 'viewScript' => 'offer/partials/form.phtml' )
> )
>   ) );
>
>
> Then from within my ViewScript:
>
> <? $form = $this->element; ?>
> <?= $form->renderForm( false ) . PHP_EOL; ?>
> <dl>
>  <dt>
> ... etc
>
>
> Any ideas of what might be going on here?
>
> Cheers
>
> ------------------------------
> From: fire-eyed-...@hotmail.com
> To: fw-general@lists.zend.com
> Date: Fri, 6 Mar 2009 16:10:53 +0000
> Subject: FW: [fw-general] Zend_Form: MultiCheckbox or Checkbox i.c.w.
> ViewScript and looping through individual elements
>
> Sorry guys, forgot to send to fw-gene...@lists.zend.com. So here you go:
>
> ------------------------------
> From: fire-eyed-...@hotmail.com
> To: mon...@gmail.com
> Subject: RE: [fw-general] Zend_Form: MultiCheckbox or Checkbox i.c.w.
> ViewScript and looping through individual elements
> Date: Fri, 6 Mar 2009 15:58:00 +0000
>
>
>
> ------------------------------
> Date: Fri, 6 Mar 2009 18:26:25 +0800
> From: mon...@gmail.com
> To: fw-general@lists.zend.com
> Subject: Re: [fw-general] Zend_Form: MultiCheckbox or Checkbox i.c.w.
> ViewScript and looping through individual elements
>
> 1. My suggestion is to take the string output of
> $multiCheckbox->renderViewHelper(), explode it using the separator, then
> loop through each line. e.g.
>
> $form->addElement('multiCheckbox', 'foo', array(
>     'multiOptions' => $options,
>     'separator' => '__SEPARATOR__'
> ));
> // view script
> $output = $this->element->renderViewHelper();
> $lines = explode('__SEPARATOR__', $output);
> $c = 0;
> foreach ($lines as $line) {
>     echo $line . (++$c % 3 == 0 ? '<br />' : '');
> }
> Just make sure that you use a unique separator that won't cause the string
> to split incorrectly.
>
> 2. If it's for rendering the form tag, <?php echo $form->renderForm(false)
> ?> would output the opening <form> tag complete with the form attributes.
>
>    -- Mon
>
> Hi Mon,
>
> 1) Good suggestion, seems like this is the way to go, yes. Thanks.
>
> 2) Yes! I was looking for something like that. But couldn't find it in de
> apidoc nor in the Zend_Form class itself. Now I realize it is a decorator
> being called through the magic __call() method. So I tried it just now, but
> couldn't get it to work at first, but now I realize this was due to the fact
> that I had overwritten the standard decorators with:
>
> $this->setDecorators( array(
>   'PrepareElements',
>   array( 'ViewScript', array( 'viewScript' => 'offer/partials/form.phtml' )
> );
>
>
> Now that I added 'Form' as the first element in the argument array all
> works fine.
> Once again thank you for your valuable input. Zend Frameworks community is
> ace! :-)
>
> Cheers
>
>
>
> On Fri, Mar 6, 2009 at 5:19 AM, <fire-eyed-...@hotmail.com> wrote:
>
>  Hi y'all,
>
> I'm using a ViewScript decorator for my Zend_Form. In this form I'ld like
> each third checkbox in a collection of checkboxes to start on a newline, or
> in a new block element or something similar. I tried it with a
> MultiCheckbox.
>
> I wish I could do something similar as beneath in my forms ViewScript:
> <?
> $c = 1;
> foreach( $this->element->myMultiCheckbox as $checkbox )
> {
>   $separator = $c % 2 == 0 ? '<br>' : '';
>   echo $checkbox->renderViewHelper() . $separator;
>   $c++;
> }
> ?>
>
> But sadly this doesn't seem possible. My next option I think would be to
> use seperate Checkbox elements with the multiple [] indicator in their
> names. But I have no idea how I would be able to loop through them in my
> ViewScript either. Do you perhaps have any hints on how I could achieve
> this?
>
> Also, with the Zend_Form ViewScript decorator, I thought I would be able to
> access the form object with something like $this->form from within the view.
> But I'm not able to access it. How would I be able to access for instance
> Zend_Form::getMethod(), Zend_Form::getEncType() and other (userland)
> attributes from within the ViewScript?
>
> Thank you for your pointers.
>
>
> ------------------------------
> Plan je feest, nodig mensen uit en deel je foto's met Windows Live 
> Events<http://windowslive.microsoft.nl/WL/Explore/Events>
>
>
>
> ------------------------------
> Deel en publiceer je favoriete foto's met Windows Live 
> Photos<http://windowslive.microsoft.nl/WL/Explore/Photos>
> ------------------------------
> Ook nieuwsgierig naar de nieuwe Messenger? Download 'm 
> hier<http://windowslive.microsoft.nl/WL/Explore/Messenger>
> ------------------------------
> Twee keer zo leuk. Deel foto's terwijl je chat met de nieuwe 
> Messenger<http://windowslive.microsoft.nl/WL/Explore/Messenger>
>
>
>
> ------------------------------
> Twee keer zo leuk. Deel foto's terwijl je chat met de nieuwe 
> Messenger<http://windowslive.microsoft.nl/WL/Explore/Messenger>
>
>
>
> ------------------------------
> Twee keer zo leuk. Deel foto's terwijl je chat met de nieuwe 
> Messenger<http://windowslive.microsoft.nl/WL/Explore/Messenger>
>

Reply via email to