Arquivo de Sep/2009

07 SepZend Framework – Tutorial – Personalizando os decorators

php, zend, hospedagem, ajax, programação, tutorial, curso, apostila, site, criar site, html
Continuando o tutorial sobre decorators, vou abordar agora como personalizar as tags entre os campos. Como todo mundo deve estar cansado de saber, por padrão o ZF cria o formulário HTML dentro das tags DL/DT/DD. As vezes é conveniente para o layout que os campos fiquem entre DIVs e os rótulos entre as tags LABEL.

Nesse tutorial, além de resolver o problema das tags vamos criar uma feature a mais. Todos os campos que forem requeridos (setRequired(true)), irão receber automáticamente um “*” no seu rótulo.



Escrevendo o decorator

<?php
class Decorators_Composite extends Zend_Form_Decorator_Abstract implements Zend_Form_Decorator_Marker_File_Interface
{
    public function buildLabel()
    {
        $element = $this->getElement();
        $label = $element->getLabel();
        if ($translator = $element->getTranslator()) {
            $label = $translator->translate($label);
        }

        /* Se o elemento for requerido, será adicionado um "*" após o seu nome */
        if ($element->isRequired()) {
            $label .= '*';
        }
        $label .= ':';
        return $element->getView()
                       ->formLabel($element->getName(), $label);
    }

    public function buildInput()
    {
        $element = $this->getElement();
        $helper  = $element->helper;
        return $element->getView()->$helper(
            $element->getName(),
            $element->getValue(),
            $element->getAttribs(),
            $element->options
        );
    }

    public function buildErrors()
    {
        $element  = $this->getElement();
        $messages = $element->getMessages();
        if (empty($messages)) {
            return '';
        }
        return '
<div class="errors">' .
               $element->getView()->formErrors($messages) . '</div>
';
    }

    public function buildDescription()
    {
        $element = $this->getElement();
        $desc    = $element->getDescription();
        if (empty($desc)) {
            return '';
        }
        return '
<div class="description">' . $desc . '</div>
';
    }

    public function render($content)
    {
        $element = $this->getElement();
        if (!$element instanceof Zend_Form_Element) {
            return $content;
        }
        if (null === $element->getView()) {
            return $content;
        }

        /* Gera todos os códigos */
        $separator = $this->getSeparator();
        $placement = $this->getPlacement();
        $label     = $this->buildLabel();
        $input     = $this->buildInput();
        $errors    = $this->buildErrors();
        $desc      = $this->buildDescription();

        /* Cria o elemento usando div */
        $output = '
<div class="form element">'
                . $label
                . $input
                . $errors
                . $desc
                . '</div>
';

        switch ($placement) {
            case (self::PREPEND):
                return $output . $separator . $content;
            case (self::APPEND):
            default:
                return $content . $separator . $output;
        }
    }
}
?>

Salve esse arquivo dentro de library/Decorators/Composite.php



Utilizando o decorator personalizado

No form que você desejar, adicione esses 2 blocos de códigos em php:
php, zend, hospedagem, ajax, programação, tutorial, curso, apostila, site, criar site, html




No começo da classe(inclui o decorator):

$this->addElementPrefixPath('Decorators', 'Decorators/', 'decorator');

Esse vai bem no final da classe(Ativa o decorator):

$this->setElementDecorators(array('Composite'));

É isso, aos poucos vamos desvendando por completo os decorators, que tem material até para fazer uma apostila. hehe.

^^

SEO Powered by Platinum SEO from Techblissonline