Form fields clean-up

Added a FieldView interface which must be implemented by field
renderers. The form's main view will look for FieldView implementations
to determine how to render specific field types. The only exception are
hidden fields, which are handled separately.
This commit is contained in:
Emmanuel BENOîT 2012-02-07 09:25:10 +01:00
parent 47b759d993
commit cdb2e952f5
3 changed files with 153 additions and 76 deletions
includes/form

View file

@ -0,0 +1,124 @@
<?php
interface FieldView
{
public function getFieldType( );
public function render( Field $field , $prefix );
}
class FieldView_Label
implements FieldView
{
public function getFieldType( )
{
return 'label';
}
public function render( Field $field , $prefix )
{
return HTML::make( 'span' )
->appendText( $field->value( ) )
->setAttribute( 'id' , $prefix . 'field' );
}
}
class FieldView_Text
implements FieldView
{
public function getFieldType( )
{
return 'text';
}
public function render( Field $field , $prefix )
{
return HTML::make( 'input' )
->setAttribute( 'type' , 'text' )
->setAttribute( 'name' , $field->name( ) )
->setAttribute( 'id' , $prefix . 'field' )
->setAttribute( 'class' , 'form-text-field' )
->setAttribute( 'value' , HTML::from( $field->value( ) ) );
}
}
class FieldView_Password
implements FieldView
{
public function getFieldType( )
{
return 'password';
}
public function render( Field $field , $prefix )
{
return HTML::make( 'input' )
->setAttribute( 'type' , 'password' )
->setAttribute( 'name' , $field->name( ) )
->setAttribute( 'id' , $prefix . 'field' )
->setAttribute( 'class' , 'form-text-field' );
}
}
class FieldView_TextArea
implements FieldView
{
public function getFieldType( )
{
return 'textarea';
}
public function render( Field $field , $prefix )
{
return HTML::make( 'textarea' )
->setAttribute( 'name' , $field->name( ) )
->setAttribute( 'id' , $prefix . 'field' )
->setAttribute( 'class' , 'form-text-field' )
->appendText( (string) $field->value( ) );
}
}
class FieldView_Select
implements FieldView
{
public function getFieldType( )
{
return 'select';
}
public function render( Field $field , $prefix )
{
$select = HTML::make( 'select' )
->setAttribute( 'name' , $field->name( ) )
->setAttribute( 'id' , $prefix . 'field' )
->setAttribute( 'class' , 'form-select' );
$selected = $field->value( );
foreach ( $field->options( ) as $value => $obj ) {
$option = HTML::make( 'option' )
->setAttribute( 'value' , $value )
->setAttribute( 'disabled' , $obj->disabled ? 'disabled' : null )
->appendText( $obj->text );
if ( "$value" === "$selected" ) {
$option->setAttribute( 'selected' , 'selected' );
}
$select->appendElement( $option );
}
return $select;
}
}