Back-End

17 nov, 2010

Classe Genérica para Formulários – Parte 02

Publicidade

Leia o artigo anterior:

Classe Genérica para Formulários Parte – 01

*

No artigo anterior, iniciamos uma série de artigos, na qual vamos ver a criação de uma classe php totalmente orientada a objeto para geração de formulários. Já criamos as classes commons, attribute e element, e vamos continuar o processo hoje.

Class input

Para criar as classes que estenderão elementos, devemos observar a estrutura do elemento a ser criado, nesse caso, o input.

Estrutura:

<input (atributos/valores) />

Observe que o elemento input é bastante simples, possuindo apenas as tags de abertura/fechamento e seus respectivos atributos/valores. Para retornar o elemento com a estrutura acima, vamos utilizar dos métodos hasAttributre e getAttribute da nossa classe pai element. Segue o código da classe input:

class input extends element {

public function draw() {

if( parent::hasAttributes() ) {
$input = '<input ';
$input .= parent::getAttributes();
$input .= ' />' . PHP_EOL;
return $input;
}
}
}

Class textarea

Repetiremos o raciocínio aplicado na classe input.

Estrutura:

<textarea (atributos/valores)> (texto) </textarea>

O código da classe é bem parecido com a classe input, a mudança fica na inclusão do construtor __construct(), que agrega à variável value o valor passado no ato da criação do objeto. Segue o código:

class textarea extends element {

protected $value;

function __construct( $value ) {
$this->value = $value;
}

public function draw() {

$textarea = '<textarea ';
if( parent::hasAttributes() ) { $textarea .= parent::getAttributes(); }
$textarea .= '>';
if( !empty( $this->value ) ) { $textarea .= $this->value; }
$textarea .= '</textarea>' . PHP_EOL;
return $textarea;
}
}

Class Label

A classe label segue exatamente a estrutura da classe textarea:

class label extends element {
protected $value;

function __construct( $value ) {
$this->value = $value;
}

public function draw() {

$label = '<label ';
if( parent::hasAttributes() ) { $label .= parent::getAttributes(); }
$label .= '>';
if( !empty( $this->value ) ) { $label .= $this->value; }
$label .= '</label>' . PHP_EOL;
return $label;
}
}

Class Form

A classe form obedece ao mesmo processo de agregação da classe element, tornando um objeto externo parte de si mesmo pela utilização de seus métodos. Ou seja, incluiremos ao objeto form instâncias dos elementos adicionais. Essas instâncias serão armazenadas na array elements e, para serem manipuladas dentro do objeto, utilizaremos dois métodos, addElement e hasElement. Eles exercem o mesmo trabalho feito na classe element pelos métodos addAttribute e hasAttribute, adicionar e verificar instâncias. Por fim, o método draw() desenha o formulário.

class form extends element { 
protected $elements;

final public function hasElements() {
return count( $this->elements) > 0;
}

final public function addElement( element $element ) {
$this->elements[] = $element;
}

function draw() {
if( $this->hasElements() ) {
$form = '<form>' . PHP_EOL;
foreach( $this->elements as $element ) {
$form .= $element->draw();
}
$form .= '</form>';
print $form;
}
}
}

Exemplo da utilização

Vamos realizar um teste para entender o processo obtido. Criaremos dois objetos label, um input e um textarea e os agregaremos ao objeto form. Depois, desenhamos o formulário executando o método draw().

$labelInput = new label( 'Label Input' );
$labelInput->addAttribute( new attribute( 'for','input' ) );
 
$labelTextarea = new label( 'Label Textarea' );
$labelTextarea->addAttribute( new attribute( 'for','textarea' ) );
 
$input = new input;
$input->addAttribute( new attribute( 'type','text' ) );
$input->addAttribute( new attribute( 'name','input' ) );
$input->addAttribute( new attribute( 'id','input' ) );
 
$textarea = new textarea;
$textarea->value = 'O texto da textarea caso possua!';
$textarea->addAttribute( new attribute( 'name','textarea' ) );
$textarea->addAttribute( new attribute( 'id','textarea' ) );
 
$form = new form;
$form->addElement( $labelInput );
$form->addElement( $input );
$form->addElement( $labelTextarea );
$form->addElement( $textarea );
$form->draw();

Veja o resultado no código-fonte:

<form>
<label for="input">Label Input</label>
<input type="text" name="input" id="input" />
<label for="textarea">Label Textarea</label>
<textarea name="textarea" id="textarea">O texto da textarea caso possua!</textarea>
</form>

No próximo artigo, desenvolveremos as classes dos elementos fieldset, option, optgroup e select. Até lá!!!