=================
Set Form Elements
=================
Let's start with a very simple example form, one that asks for one piece
of input: an email address. We'll also need a submit button called
"Save".
----------------------
Create the Form Object
----------------------
First, we create the form object itself:
{{code: php
require_once 'Solar.php';
Solar::start('/path/to/config/Solar.config.php');
$form = Solar::factory('Solar_Form');
}}
------------
Add Elements
------------
As it stands now, the form has no elements. We want to set a "text"
element named 'user_email' that uses a label of "Email Address:".
{{code: php
$form->setElement('user_email', array(
'type' => 'text',
'label' => 'Email Address:'
));
}}
Display the Form
================
Just to show we're on the right track, let's display the form output.
(This doesn't populate the values or validate the input, it just
displays for now.)
We need to use [[Solar_View::HomePage | Solar_View]] and its related
[[Solar_View_Helper_Form::HomePage | form helper]]. This is because
Solar_Form does not perform output functions, only collection and
processing.
Here is a combined controller and view extended from the earlier code.
(Normally you would separate your controller and view, but this example
is about instant feedback.)
{{code: php
// Start Solar
require_once 'Solar.php';
Solar::start('/path/to/config/Solar.config.php');
// Create a Form object
$form = Solar::factory('Solar_Form');
// Set the "user_email" element
$form->setElement('user_email', array(
'type' => 'text',
'label' => 'Email Address:'
));
// Set a submit button called "process" with a value of "Save"
$form->setElement('process', array(
'type' => 'submit',
'label' => 'Action:',
'value' => 'Save',
));
// Create a view object and output the form
// using the form() helper
$view = Solar::factory('Solar_View');
echo $view->form($form);
}}
The output will look something like this; note that the form helper uses
semantic markup, and can by styled using CSS.
{{code: html
}}
-----------------
Extended Examples
-----------------
This method appends one element to the form; if the *element name*
already exists (or if the *element name* and *element array name*
already exist), the element is reset to reflect the values passed into
the method.
All elements are placed into the [[Solar_Form::$elements]] public property;
if you wish to manipulate that property directly, you may, but this
method is generally more reliable.
Appending An Element
====================
To append one element to the form, you need three things: a Solar_Form
object, a name for your element, and a description of the element hint
information.
{{code: php
require_once 'Solar.php';
Solar::start('/path/to/config/Solar.config.php');
// create a form object
$form = Solar::factory('Solar_Form');
// we'll call our element 'email_addr'
$name = 'email_addr';
// describe the element information hints
$info = array(
// the XHTML element type
'type' => 'text',
// a short, human-readable label
'label' => 'Your email address:',
// a longer description for tooltips, etc.
'descr' => 'Your main email address, so we can contact you.',
// the default value before any new user input
'value' => null,
// what other XHTML attributes should be used for this
// element?
'attribs' => array(
'size' => 32,
'maxlength' => 64,
),
// an array of Solar_Filter calls to apply to user-input.
'filters' => array(
'validateEmail',
),
);
// now append the element to the form
$form->setElement($name, $info);
}}
Remember that Solar_Form does not generate any output; instead, it is
used as a set of "hints" for your template or view. With Solar_View,
all of the hints are honored. Having said that, the above element name
and description should generate something like the following output:
{{code: html
}}
Appending An Element As Part Of An Array
========================================
Sometimes you will want an element to be part of a larger array within a
form; this is useful when the user input will be used in multiple
different tables or data sources, and you need to know which elements go
with which source. Using the above 'email_addr' element as an example,
we can specify that the element should belong to an array called
'contact' (perhaps representing a contacts table).
{{code: php
// start Solar, create a form object,
// name the element, describe its info,
// and then:
$form->setElement($name, $info, 'contacts');
}}
Now the generated element output should look something like this:
{{code: html
}}
You can get the same effect by giving the element an array-like name to
begin with...
{{code: php
// start Solar, create a form object.
// name the element as part of an array:
$name = 'contacts[email_addr]';
// describe the info, and then:
$form->setElement($name, $info);
}}
This will generate the same output, to wit:
{{code: html
}}
Note that when you add an element as part of an array, its name becomes
the array-like name; thus, you will have to refer to the "email_addr"
element as "contacts[email_addr]".
Also note that the array-like name is in the format for the XHTML form
element, not a PHP array; that is, "contacts[email_addr]" and not
"contacts['email_addr']" (pay attention to the lack of single quotes).
Use this method to append multiple elements to a form at one time.
The associative array of elements is a series of key-value pairs where
the key is the element name, and the value is an element information
array (see the [[Solar_Form::setElement()]] method for more on the info
key-value pairs).
For example:
{{code: php
require_once 'Solar.php';
Solar::start('/path/to/config/Solar.config.php');
$form = Solar::factory('Solar_Form');
$elements = array(
'addr' => array(
'type' => 'text',
'label' => 'Street Address:',
'value' => '101 Main Street'
),
'city' => array(
'type' => 'text',
'label' => 'City:',
'value' => 'Beverly Hills'
),
'state' => array(
'type' => 'select',
'label' => 'State:',
'value' => 'CA',
'options' => array('AL' => 'Alabama', 'CA' => 'California'),
),
'zip' => array(
'type' => 'text',
'label' => 'ZIP:',
'value' => '90210',
'attribs' => array('maxlength' => 5, 'size' => 5),
),
);
$form->setElements($elements);
}}
This code will hint an output generator to create a form something like
this (labels and layout are excluded for the sake of brevity):
{{code: html
}}
As with [[Solar_Form::setElement()]], you can specify that each element
become part of an array within the form by adding a second parameter.
For example, with the above set of elements, you can make them part of
an array called 'contact' ...
{{code: php
$form->setElements($elements, 'contact');
}}
... which would lead to output something like this:
{{code: html
}}
------------------------
Adding Multiple Elements
------------------------
Use the [[Solar_Form::setElements()]] method to append multiple elements to a
form at one time. For example:
{{code: php
require_once 'Solar.php';
Solar::start('/path/to/config/Solar.config.php');
$form = Solar::factory('Solar_Form');
$elements = array(
'addr' => array(
'type' => 'text',
'label' => 'Street Address:',
'value' => '101 Main Street'
),
'city' => array(
'type' => 'text',
'label' => 'City:',
'value' => 'Beverly Hills'
),
'state' => array(
'type' => 'select',
'label' => 'State:',
'value' => 'CA',
'options' => array('AL' => 'Alabama', 'CA' => 'California'),
),
'zip' => array(
'type' => 'text',
'label' => 'ZIP:',
'value' => '90210',
'attribs' => array('maxlength' => 5, 'size' => 5),
),
);
$form->setElements($elements);
}}
The associative array of elements is a series of key-value pairs where
the key is the element name, and the value is an element information
array (see the [[Solar_Form::setElement()]] method for more on the info
key-value pairs).
This code will hint an output generator to create a form something like
this (labels and layout are excluded for the sake of brevity):
{{code: html
}}
As with [[Solar_Form::setElement()]], you can specify that each element
become part of an array within the form by adding a second parameter.
For example, with the above set of elements, you can make them part of
an array called 'contact' ...
{{code: php
$form->setElements($elements, 'contact');
}}
... which would lead to output something like this:
{{code: html
}}