Forms ===== Phalcon\\Forms is a component aids the developer in the creation and maintenance of forms in web applications. The following example shows its basic usage: .. code-block:: php add(new Text("name")); $form->add(new Text("telephone")); $form->add(new Select("telephoneType", array( 'H' => 'Home', 'C' => 'Cell' ))); Forms can be rendered based on the form definition: .. code-block:: html+php

Contacts

render("name") ?>

render("telephone") ?>

render("telephoneType") ?>

Each element in the form can be rendered as required by the developer. Internally, :doc:`Phalcon\\Tag <../api/Phalcon_Tag>` is used to produce the right HTML for each element, you can pass additional html attributes as second parameter for render: .. code-block:: html+php

render("name", array('maxlength' => 30, 'placeholder' => 'Type your name')) ?>

HTML Attributes also can be set in the element's definition: .. code-block:: php add(new Text("name", array( 'maxlength' => 30, 'placeholder' => 'Type your name' ))); Initializing forms ------------------ As seen before, forms can be initialized outside the form class by adding elements to it. You can re-use code or organize your form classes implementing the form in a separated file: .. code-block:: php add(new Text("name")); $this->add(new Text("telephone")); $this->add(new Select("telephoneType", TelephoneTypes::find(), array( 'using' => array('id', 'name') ))); } } Validation ---------- Phalcon forms are integrated with the :doc:`validation ` component to offer instant validation. Built-in or custom validators could be set to each element: .. code-block:: php addValidator(new PresenceOf(array( 'message' => 'The name is required' ))); $name->addValidator(new StringLength(array( 'min' => 10, 'messageMinimum' => 'The name is too short' ))); $form->add($name); Then you can validate the form according to the input entered by the user: .. code-block:: php isValid($_POST)) { foreach ($form->getMessages() as $message) { echo $message, '
'; } } Validators are executed in the same order as they were registered. By default messages generated by all the elements in the form are joined so they can be traversed using a single foreach, you can change this behavior to get the messages separated by the field: .. code-block:: php getMessages(false) as $attribute => $messages) { echo 'Messages generated by ', $attribute, ':', "\n"; foreach ($messages as $message) { echo $message, '
; } } Or get specific messages for an element: .. code-block:: php getMessagesFor('name') as $message) { echo $message, '
; } Forms + Entities ---------------- An entity such as a model/collection instance or just a plain PHP class can be linked to the form in order to set default values in the form's elements or assign the values from the form to the entity easily: .. code-block:: php add(new Text("name")); $form->add(new Text("year")); Once the form is rendered if there is no default values assigned to the elements it will use the ones provided by the entiy: .. code-block:: html+php render('name') ?> You can validate the form and assign the values from the user input in the following way: .. code-block:: php bind($_POST, $robot); //Check if the form is valid if ($form->isValid()) { //Save the entity $robot->save(); } Form Elements ------------- Phalcon provides a set of built-in elements to use in your forms: +--------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------+-------------------------------------------------------------------+ | Name | Description | Example | +==============+==================================================================================================================================================================+===================================================================+ | Text | Generate INPUT[type=text] elements | :doc:`Example <../api/Phalcon_Forms_Element_Text>` | +--------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------+-------------------------------------------------------------------+ | Password | Generate INPUT[type=password] elements | :doc:`Example <../api/Phalcon_Forms_Element_Password>` | +--------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------+-------------------------------------------------------------------+ | Select | Generate SELECT tag (combo lists) elements based on choices | :doc:`Example <../api/Phalcon_Forms_Element_Select>` | +--------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------+-------------------------------------------------------------------+ | Check | Generate INPUT[type=check] elements | :doc:`Example <../api/Phalcon_Forms_Element_Check>` | +--------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------+-------------------------------------------------------------------+ | Textarea | Generate TEXTAREA elements | :doc:`Example <../api/Phalcon_Forms_Element_TextArea>` | +--------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------+-------------------------------------------------------------------+ Rendering Forms --------------- You can render the form with total flexibility, the following example shows how to render each element using an standard procedure: .. code-block:: html+php getMessagesFor($element->getName()); if (count($messages)) { //Print each element echo '
'; foreach ($messages as $message) { echo $message; } echo '
'; } echo '

'; echo ''; echo $element; echo '

'; } ?> Or reuse the logic in your form class: .. code-block:: php get($name); //Get any generated messages for the current element $messages = $this->getMessagesFor($element->getName()); if (count($messages)) { //Print each element echo '
'; foreach ($messages as $message) { echo $message; } echo '
'; } echo '

'; echo ''; echo $element; echo '

'; } } Creating Form Elements ---------------------- In addition to the form elements provided by Phalcon you can create your own custom elements: .. code-block:: php