Creating Forms Using Zend_FormThe Zend_Form class is used to aggregate form elements, display groups, and subforms. It can then perform the following actions on those items:
While forms created with Zend_Form may be complex, probably the best use case is for simple forms; its best use is for Rapid Application Development (RAD) and prototyping. At its most basic, you simply instantiate a form object:
You can optionally pass in a instance of Zend_Config or an array, which will be used to set object state and potentially create new elements:
Zend_Form is iterable, and will iterate over elements, display groups, and subforms, using the order they were registered and any order index each may have. This is useful in cases where you wish to render the elements manually in the appropriate order. Zend_Form's magic lies in its ability to serve as a factory for elements and display groups, as well as the ability to render itself through decorators. Plugin LoadersZend_Form makes use of Zend_Loader_PluginLoader to allow developers to specify the locations of alternate elements and decorators. Each has its own plugin loader associated with it, and general accessors are used to retrieve and modify each. The following loader types are used with the various plugin loader methods: 'element' and 'decorator'. The type names are case insensitive. The methods used to interact with plugin loaders are as follows:
Additionally, you can specify prefix paths for all elements and display groups created through a Zend_Form instance using the following methods:
Custom elements and decorators are an easy way to share functionality between forms and encapsulate custom functionality. See the Custom Label example in the elements documentation for an example of how custom elements can be used as replacements for standard classes. ElementsZend_Form provides several accessors for adding and removing form elements from a form. These can take element object instances or serve as factories for instantiating the element objects themselves. The most basic method for adding an element is addElement(). This method can take either an object of type Zend_Form_Element (or of a class extending Zend_Form_Element), or arguments for building a new element -- including the element type, name, and any configuration options. Some examples:
Once an element has been added to the form, you can retrieve it by name. This can be done either by using the getElement() method or by using overloading to access the element as an object property:
Occasionally, you may want to create an element without attaching it to the form (for instance, if you wish to make use of the various plugin paths registered with the form, but wish to later attach the object to a sub form). The createElement() method allows you to do so:
Populating and Retrieving ValuesAfter validating a form, you will typically need to retrieve the values so you can perform other operations, such as updating a database or notifying a web service. You can retrieve all values for all elements using getValues(); getValue($name) allows you to retrieve a single element's value by element name:
Sometimes you'll want to populate the form with specified values prior to rendering. This can be done with either the setDefaults() or populate() methods: On the flip side, you may want to clear a form after populating or validating it; this can be done using the reset() method: Global OperationsOccasionally you will want certain operations to affect all elements. Common scenarios include needing to set plugin prefix paths for all elements, setting decorators for all elements, and setting filters for all elements. As examples: Example #1 Setting Prefix Paths for All Elements You can set prefix paths for all elements by type, or using a global prefix. Some examples:
Example #2 Setting Decorators for All Elements You can set decorators for all elements. setElementDecorators() accepts an array of decorators, just like setDecorators(), and will overwrite any previously set decorators in each element. In this example, we set the decorators to simply a ViewHelper and a Label:
Example #3 Setting Decorators for Some Elements You can also set decorators for a subset of elements, either by inclusion or exclusion. The second argument to setElementDecorators() may be an array of element names; by default, specifying such an array will set the specified decorators on those elements only. You may also pass a third argument, a flag indicating whether this list of elements is for inclusion or exclusion purposes. If the flag is FALSE, it will decorate all elements except those in the passed list. As with standard usage of the method, any decorators passed will overwrite any previously set decorators in each element. In the following snippet, we indicate that we want only the ViewHelper and Label decorators for the 'foo' and 'bar' elements:
On the flip side, with this snippet, we'll now indicate that we want to use only the ViewHelper and Label decorators for every element except the 'foo' and 'bar' elements:
Example #4 Setting Filters for All Elements In some cases, you may want to apply the same filter to all elements; a common case is to trim() all values:
Methods For Interacting With ElementsThe following methods may be used to interact with elements:
Display GroupsDisplay groups are a way to create virtual groupings of elements for display purposes. All elements remain accessible by name in the form, but when iterating over the form or rendering, any elements in a display group are rendered together. The most common use case for this is for grouping elements in fieldsets. The base class for display groups is Zend_Form_DisplayGroup. While it can be instantiated directly, it is usually best to use Zend_Form's addDisplayGroup() method to do so. This method takes an array of element names as its first argument, and a name for the display group as its second argument. You may optionally pass in an array of options or a Zend_Config object as the third argument. Assuming that the elements 'username' and 'password' are already set in the form, the following code would group these elements in a 'login' display group:
You can access display groups using the getDisplayGroup() method, or via overloading using the display group's name:
|
|