简体   繁体   中英

How to Zend_Dojo_Form_Element_FilteringSelect onchange submit

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?

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.

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.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM