Forms ===== Phalcon\\Forms is a component that aid 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') ))); } } :doc:`Phalcon\\Forms\\Form <../api/Phalcon_Forms_Form>` extends :doc:`Phalcon\\DI\\Injectable <../api/Phalcon_DI_Injectable>` so you have access to the application services if needed: .. code-block:: php security->getToken(); } public function initialize() { //Set the same form as entity $this->setEntity($this); //Add a text element to capture the 'email' $this->add(new Text("email")); //Add a text element to put a hidden csrf $this->add(new Hidden("csrf")); } } The associated entity added to the form in the initialization and custom user options are passed to the form constructor: .. code-block:: php add(new Hidden('id')); } else { $this->add(new Text('id')); } $this->add(new Text('name')); } } In the form's instantiation you must use: .. code-block:: php true)); 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, '
'; } Filtering --------- A form is also able to filter data before be validated, you can set filters in each element: Setting User Options -------------------- Forms + Entities ---------------- An entity such as a model/collection/plain 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(); } Setting up a plain class as entity also is possible: .. code-block:: php add(new Select("timezone", array( 'America/New_York' => 'New York', 'Europe/Amsterdam' => 'Amsterdam', 'America/Sao_Paulo' => 'Sao Paulo', 'Asia/Tokio' => 'Tokio', ))); $form->add(new Select("receiveEmails", array( 'Yes' => 'Yes, please!', 'No' => 'No, thanks' ))); Entities can implement getters, which have more precedence than public propierties, these methods give you more free to produce values: .. code-block:: php ` | +--------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------+-------------------------------------------------------------------+ | 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>` | +--------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------+-------------------------------------------------------------------+ | Hidden | Generate INPUT[type=hidden] elements | :doc:`Example <../api/Phalcon_Forms_Element_Hidden>` | +--------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------+-------------------------------------------------------------------+ | File | Generate INPUT[type=file] elements | :doc:`Example <../api/Phalcon_Forms_Element_File>` | +--------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------+-------------------------------------------------------------------+ | Date | Generate INPUT[type=date] elements | :doc:`Example <../api/Phalcon_Forms_Element_Date>` | +--------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------+-------------------------------------------------------------------+ | Numeric | Generate INPUT[type=number] elements | :doc:`Example <../api/Phalcon_Forms_Element_Numeric>` | +--------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------+-------------------------------------------------------------------+ | Submit | Generate INPUT[type=submit] elements | :doc:`Example <../api/Phalcon_Forms_Element_Submit>` | +--------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------+-------------------------------------------------------------------+ Event Callbacks --------------- Whenever forms are implemented as classes, the callbacks: beforeValidation and afterValidation can be implemented in the form's class to perform pre-validations and post-validations: .. 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 $this->flash->error($message); } echo '
'; } echo '

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

'; } } In the view: .. code-block:: php renderDecorated('name'); echo $element->renderDecorated('telephone'); Creating Form Elements ---------------------- In addition to the form elements provided by Phalcon you can create your own custom elements: .. code-block:: php forms->set('login', new LoginForm()); Using the unique name, forms can be accesed in any part of the application: .. code-block:: php forms->get('login')->render(); External Resources ------------------ * `Vökuró `_, is a sample application that uses the forms builder to create and manage forms, [`Github `_]