неделя, 3 май 2009 г.

Zend Form as array

I dont't like the way zend form renders in the view that's way i wrone my own render method. I render zend form into view as array for easy access of elements. Here is my class :

/**
* Zend_Form extension class for fast form creation and manipulation
*
* @creator d.georgiev - webmaster[at]silabg[dot]com
*
*/
class VatoFx_Form extends Zend_Form
{
/**
* Element types that represent buttons
* @var array
*/
protected $_buttonTypes = array(
'Zend_Form_Element_Button',
'Zend_Form_Element_Reset',
'Zend_Form_Element_Submit',
);

/**
* contructor for form creation
*
* @param string $name
* @param string $action
* @param string $method
* @param array $attribs
* @param array $options
*/
public function __construct( $name, $action, $method = 'POST', $attribs = array(), $options = null )
{
//set parent options if any
parent::__construct( $options );

$this->setAttribs( $attribs )
->setName( $name )
->setAction( $action )
->setMethod( $method );

}

/**
* Create form element
*
* @param string $element_type
* @param string $element_name
* @param string $element_label
* @param array $element_attribs
* @param array $requried
* @return Zend_Form_Element Object
*/
public function vatoFxFormCreateElement($element_type, $element_name, $element_label, $element_attribs = array())
{
$elementObject = $this->createElement( $element_type , $element_name );
$elementObject->setLabel( $element_label );

if(!empty($element_attribs)){
$elementObject->setAttribs( $element_attribs );
}

$this->addElement($elementObject);
}

/**
* Set form element as required
*
* @param string $element_name
* @param string $message
*/
public function vatoFxFormSetElementAsRequired( $element_name , $message = '' )
{
$elementObject = $this->getElement( $element_name );
if(!is_null( $elementObject )){
$elementObject->setRequired( true );
if(!empty( $message )){
$elementObject->addErrorMessage( $message );
}
}
}

/**
* Add validator to form field
*
* @param string $element_name
* @param string $validator
* @param boolean $breakChainOnFailure
* @param array $options
*/
public function vatoFxFormAddValidator( $element_name , $validator, $breakChainOnFailure = false, $options = array())
{
$elementObject = $this->getElement( $element_name );
if(!is_null( $elementObject )){
$elementObject->addValidator($validator, $breakChainOnFailure, $options);
}
}

/**
* Render form to array
*
* @return array
*/
public function vatoFxFormToArray()
{
$formArray = array();

//get form attributes as array
$formArray['formAttrib'] = $this->getAttribs();

//get form attributes as string
$formArray['formAttribString'] = '';
foreach($formArray['formAttrib'] as $k => $v){
$formArray['formAttribString'] .= $k . '="' . $v . '" ';
}

//get form elements as array
foreach( $this as $item ){

$helper = $item->helper;

$attribs = $item->getAttribs();
unset($attribs['helper']);

$html = $item->getView()->$helper( $item->getName(),
$this->getValue( $item ),
$attribs);

$errors = '';
$errorArray = $item->getMessages();
if(!empty( $errorArray )){
foreach ($item->getMessages() as $k => $v ){
$errors .= $v . '
';
}
}

$formArray['elements'][$item->getName()] = array( 'name' => $item->getName(),
'label' => $item->getLabel(),
'html' => $html,
'error' => $errors);
}

return $formArray;
}

/**
* Get value
*
* If element type is one of the button types, returns the label.
*
* @param Zend_Form_Element $element
* @return string|null
*/
public function getValue($element)
{
if (!$element instanceof Zend_Form_Element) {
return null;
}

foreach ($this->_buttonTypes as $type) {
if ($element instanceof $type) {
if (stristr($type, 'button')) {
$element->content = $element->getLabel();
return null;
}
return $element->getLabel();
}
}

return $element->getValue();
}
}


And here is the usage :

$form = new VatoFx_Form();
$form->setAction('/form')
->setMethod('post')
->setName('sql_query_form')
->setAttrib('id' , 'sql_query_form');

$form->vatoFxFormCreateElement('textarea', 'free_sql_query', 'Sql : ', array('rows' => 7, 'cols' => 70));
$form->vatoFxFormCreateElement('submit', 'login', 'login');

$form->vatoFxFormAddValidator('free_sql_query', 'alnum', false, array('messages' => 'samo bukvi i cifru'));
$form->vatoFxFormSetElementAsRequired('free_sql_query', 'This element is required');


$this->view->formArray = $form->vatoFxFormToArray();

Етикети: , ,