views:

167

answers:

2

Well the title pretty much says it all. I had

$strata = new Zend_Form_Element_Select('strata');
$strata->setLabel('Select a strata: ')->setMultiOptions($this->stratalist)->setAttrib('onChange', 'this.form.submit()');

Then I need to use some fancy dojo form elements in other forms. So I decided to make them all look the same and did this:

$strata = new Zend_Dojo_Form_Element_FilteringSelect('strata');
$strata->setLabel('Select a strata: ')->setMultiOptions($this->stratalist)->setAttrib('onChange', 'this.form.submit()');

It shows up and looks fine, but the form is not submitted when I change the FilteringSelect. If I look at the HTML that is rendered, sure enough:

<select name="strata" id="strata" onChange="this.form.submit()">

I suspect that Dojo elements cannot or do not work like this. So how do I make this form submit when I change the FilteringSelect?

Thanks all!

A: 

Do you have parseOnLoad enabled? If you're building the form in php you can do this:

$form = new Zend_Form_Dojo();
$form->addElement(
            'FilteringSelect',
            'myId',
            array(
                'label' => 'Prerequisite:',
                'autocomplete' => true,
                'jsId' => 'myJsId',
            ),
    array(),        //attributes
        array(          //your select values
            'id1' => 'name1',
            'id2' => 'name2',
            'id3' => 'name3',
        )
);

you might need to set a few attributes on your $form. try this:

$form->setAttribs( array('jsId'=>'MyFormName') );

Then in your onClick:

MyFormName.submit()

If your form passes validation (presuming you have some), it should submit.

Will Olbrys
OK, so, what part of your code submits the form when you change the select?
sims
Is accessing form by name supported in all browsers?
sims
MyFormName is just a name, its really an object in Javascript.
Will Olbrys
A: 

Here it is:

When defining the form, give it an id:

$this->setName('StrataSelect');

or

$this->setAttrib('id', 'StrataSelect');

Then the onChange event uses getElementById:

$strata = new Zend_Dojo_Form_Element_FilteringSelect('strata');
$strata->setLabel('Select a strata: ')->setMultiOptions($this->stratalist)->setAttrib('onChange', "document.dojo.byId('StrataSelect').submit();");

or

$strata->setLabel('Select a strata: ')->setMultiOptions($this->stratalist)->setAttrib('onChange', "document.getElementById('StrataSelect').submit();");

Why this now works and none of the "old school" submit() calls probably has something to do with dojo handling the onchange event. So submit or this.form are not objects, methods, etc etc etc.

I don't want to put any javascript this form depends on into the view. I want this form to be "portable". So therefore I don't want to use dojo.connect

There are probably better ways to do this. So I'll leave this unanswered for now.

sims
I'm going to go ahead and accept my own answer ans the low acceptance % doesn't help get answers elsewhere.
sims