# ZendX_JQuery Form Elements and Decorators

All View Helpers are pressed into Zend_Form elements or decorators also. They can even be easily integrated into your already existing forms. To enable a Form for Zend_JQuery support you can use two ways: Init your form as `$form = new ZendX_JQuery_Form();` or use the static method `ZendX_JQuery::enableForm($form)` to enable jQuery element support.

## General Elements and Decorator Usage

Both elements and decorators of the Zend jQuery Form set can be initialized with the option key `jQueryParams` to set certain jQuery object related parameters. This jQueryParams array of options matches to the `$params` variable of the corresponding view helpers. For example:

    $element = new ZendX_JQuery_Form_Element_DatePicker(
                        'dp1',
                        array('jQueryParams' => array('defaultDate' => '2007/10/10'))
                    );
    // would internally call to:
    $view->datePicker("dp1", "", array('defaultDate' => '2007/10/10'), array());

Additionally elements jQuery options can be customized by the following methods:

- `setJQueryParam($name, $value)`: Set the jQuery option `$name` to the given value.

- `setJQueryParams($params)`: Set key value pairs of jQuery options and merge them with the already set options.

- `getJQueryParam($name)`: Return the jQuery option with the given name.

- `getJQueryParams()`: Return an array of all currently set jQuery options.

Each jQuery related Decorator also owns a `getJQueryParams()` method, to set options you have to use the `setDecorators()`, `addDecorator()` or `addDecorators()` functionality of a form element and set the jQueryParams key as option:

    $form->setDecorators(array(
        'FormElements',
        array('AccordionContainer', array(
            'id'          => 'tabContainer',
            'style'       => 'width: 600px;',
            'jQueryParams' => array(
                'alwaysOpen' => false,
                'animated'   => "easeslide"
            ),
        )),
        'Form'
    ));

## Form Elements

The Zend Framework jQuery Extras Extension comes with the following Form Elements:

- `ZendX_JQuery_Form_Element_AutoComplete`: Proxy to AutoComplete View Helper

- `ZendX_JQuery_Form_Element_ColorPicker`: Proxy to ColorPicker View Helper

- `ZendX_JQuery_Form_Element_DatePicker`: Proxy to DatePicker View Helper

- `ZendX_JQuery_Form_Element_Slider`: Proxy to Slider View Helper

- `ZendX_JQuery_Form_Element_Spinner`: Proxy to Spinner View Helper

### jQuery Decorators: Beware the Marker Interface for UiWidgetElements

By default all the jQuery Form elements use the `ZendX_JQuery_Form_Decorator_UiWidgetElement` decorator for rendering the jQuery element with its specific view helper. This decorator is inheritly different from the ViewHelper decorator that is used for most of the default form elements in Zend_Form. To ensure that rendering works correctly for jQuery form elements at least one decorator has to implement the `ZendX_JQuery_Form_Decorator_UiWidgetElementMarker` interface, which the default decorator does. If no marker interface is found an exception is thrown. Use the marker interface if you want to implement your own decorator for the jQuery form element specific rendering.

## Form Decorators

The following Decorators come with the Zend Framework jQuery Extension:

- `ZendX_JQuery_Form_Decorator_AccordionContainer`: Proxy to AccordionContainer View Helper

- `ZendX_JQuery_Form_Decorator_AccordionPane`: Proxy to AccordionPane View Helper

- `ZendX_JQuery_Form_Decorator_DialogContainer`: Proxy to DialogContainer View Helper

- `ZendX_JQuery_Form_Decorator_TabContainer`: Proxy to TabContainer View Helper

- `ZendX_JQuery_Form_Decorator_TabPane`: Proxy to TabPane View Helper

- `ZendX_JQuery_Form_Decorator_UiWidgetElement`: Decorator to Display jQuery Form Elements

Utilizing the Container elements is a bit more complicated, the following example builds a Form with 2 SubForms in a TabContainer:

### SubForms with TabContainer Decorator

The following example makes use of all Form elements and wraps them into 2 subforms that are decorated with a tab container. First we build the basic `ZendX_JQuery_Form`:

    $form = new ZendX_JQuery_Form();
    $form->setAction('formdemo.php');
    $form->setAttrib('id', 'mainForm');
    $form->setAttrib('class', 'flora');

    $form->setDecorators(array(
        'FormElements',
        array('TabContainer', array(
            'id'          => 'tabContainer',
            'style'       => 'width: 600px;',
        )),
        'Form',
    ));

Setting the Form Id (in this case to 'mainForm') is an important step for the TabContainer. It is needed that the subforms can relate to the Container Id in a later form building stage. We now initialize two SubForms that will be decorated with the `TabPane` decorators:

    $subForm1 = new ZendX_JQuery_Form();
    $subForm1->setDecorators(array(
        'FormElements',
        array('HtmlTag',
              array('tag' => 'dl')),
        array('TabPane',
              array('jQueryParams' => array('containerId' => 'mainForm',
                                            'title' => 'DatePicker and Slider')))
    ));

    $subForm2 = new ZendX_JQuery_Form();
    $subForm2->setDecorators(array(
       'FormElements',
       array('HtmlTag',
             array('tag' => 'dl')),
       array('TabPane',
             array('jQueryParams' => array('containerId' => 'mainForm',
                                           'title' => 'AutoComplete and Spinner')))
    ));

In this stage it is important that the `'containerId'` option is set in each SubForm TabPane, or the subforms cannot relate back to the tab Container and would not be displayed. To enforce this setting, an exception of the type `ZendX_JQuery_Exception` is thrown if the option is not set. We can now add all the desired elements to the subforms:

    // Add Element Date Picker
    $elem = new ZendX_JQuery_Form_Element_DatePicker(
                    "datePicker1", array("label" => "Date Picker:")
                );
    $elem->setJQueryParam('dateFormat', 'dd.mm.yy');
    $subForm1->addElement($elem);

    // Add Element Spinner
    $elem = new ZendX_JQuery_Form_Element_Spinner(
                    "spinner1", array('label' => 'Spinner:')
                );
    $elem->setJQueryParams(array('min' => 0, 'max' => 1000, 'start' => 100));
    $subForm1->addElement($elem);

    // Add Slider Element
    $elem = new ZendX_JQuery_Form_Element_Slider(
                    "slider1", array('label' => 'Slider:')
                );
    $elem->setJQueryParams(array('defaultValue' => '75'));
    $subForm2->addElement($elem);

    // Add Autocomplete Element
    $elem = new ZendX_JQuery_Form_Element_AutoComplete(
                    "ac1", array('label' => 'Autocomplete:')
                );
    $elem->setJQueryParams(array('source' => array('New York',
                                                 'Berlin',
                                                 'Bern',
                                                 'Boston')));
    $subForm2->addElement($elem);

    // Submit Button
    $elem = new Zend_Form_Element_Submit("btn1", array('value' => 'Submit'));
    $subForm1->addElement($elem);

Three additional lines are missing to put it all together and we have a jQuery animated form:

    $form->addSubForm($subForm1, 'subform1');
    $form->addSubForm($subForm2, 'subform2');

    $formString = $form->render($view);

### Wrapping a Form into the Dialog Container

The only use for the Dialog Container in Zend Form context is to wrap itself around a form and display it in a dialog. Its important to remember that the order of the decorators has to be different than in the Accordion and Tab Container examples.

    // Create new jQuery Form
    $form = new ZendX_JQuery_Form();
    $form->setAction('formdemo.php');

    // Wrap the complete form inside a Dialog box
    $form->setDecorators(array(
        'FormElements',
        'Form',
        array('DialogContainer', array(
            'id'          => 'tabContainer',
            'style'       => 'width: 600px;',
            'jQueryParams' => array(
                'tabPosition' => 'top'
            ),
        )),
    ));

    // Add Element Spinner
    $elem = new ZendX_JQuery_Form_Element_Spinner("spinner1", array('label' => 'Spinner:', 'attribs' => array('class' => 'flora')));
    $elem->setJQueryParams(array('min' => 0, 'max' => 1000, 'start' => 100));

    $form->addElement($elem);