samedi 20 août 2011

Zend Framework - Éléments de formulaires HTML5

Considérant qu'il était temps désormais de développer mes sites en HTML5, J'ai remarqué que les nouveaux éléments de formulaires de ce drenier (comme "tel" ou "email") étaient absent de la librairie Zend Framework.

À mon avis, ces nouveaux éléments sont intéressants, car ils apportent un bon nombre de nouvelles fonctionnalités, comme par exemple une forme "d'auto-validation".

Je les ai donc implémenté, et j'ai trouve que ce serait une bonne idée de les partager.

Prenons l'exemple d'un élément de formulaire email. Étant donné qu'il est très similaire à un élément text, je l'étend simplement de Zend_Form_Element_Text, en changeant simplement la variable $helper :

class Web82_Form_Element_Email
	extends Zend_Form_Element_Text
{
    /**
     * Default form view helper to use for rendering
     * @var string
     */
    public $helper = 'formEmail';

}

je crée ensuite un view helper, simplement en copiant/collant Zend_View_Helper_FormText et en changeant le input type :

class Web82_View_Helper_FormEmail
	extends Zend_View_Helper_FormElement
{

    /**
     * Generates a 'email' element.
     *
     * @access public
     *
     * @param string|array $name If a string, the element name.  If an
     * array, all other parameters are ignored, and the array elements
     * are used in place of added parameters.
     *
     * @param mixed $value The element value.
     *
     * @param array $attribs Attributes for the element tag.
     *
     * @return string The element XHTML.
     */
    public function formEmail ( $name , $value = null , $attribs = null )
    {
	$info = $this -> _getInfo ( $name , $value , $attribs ) ;
	extract ( $info ) ; // name, value, attribs, options, listsep, disable
	// build the element
	$disabled = '' ;
	if ( $disable ) {
	    // disabled
	    $disabled = ' disabled="disabled"' ;
	}

	// XHTML or HTML end tag?
	$endTag = ' />' ;
	if ( ($this -> view instanceof Zend_View_Abstract) && ! $this -> view -> doctype () -> isXhtml () ) {
	    $endTag = '>' ;
	}

	$xhtml = '<input type="email"' // LE CHANGEMENT EST LÀ
		. ' name="' . $this -> view -> escape ( $name ) . '"'
		. ' id="' . $this -> view -> escape ( $id ) . '"'
		. ' value="' . $this -> view -> escape ( $value ) . '"'
		. $disabled
		. $this -> _htmlAttribs ( $attribs )
		. $endTag ;

	return $xhtml ;

    }

}

Je dois maintenant ajouter mon chemin de helper dans mon application.ini :

autoloadernamespaces[] = "Web82"
...
resources.view.helperPath.Web82_View_Helper = "Web82/View/Helper"
...

... Et initialiser ma ressource de view dans mon Boostrap.php :

protected function _initViews ()
    {
	$this -> bootstrap ( 'view' ) ;
    }

Je peux maintenant appeler Web82_Form_Element_Email comme je le ferais pour n'importe quel élément :


$myEmailElement = new Web82_Form_Element_Email ( 'email' ) ;

Bien sûr, je peux faire exactement la même chose pour un élément "tel".

Merci d'ajouter vos commentaires et à bientôt.

Franck.

4 commentaires: