arse/includes/form/ctrl.inc.php
Emmanuel BENOîT a1d327d465 Form controllers improvement
Form controllers are now able to return something other than true or
null. Whatever is returned by the form controller will be passed on by
the form if it isn't a boolean.
2012-02-06 17:26:55 +01:00

81 lines
1.4 KiB
PHP

<?php
class Ctrl_Form
extends Controller
{
protected $form;
public function __construct( Form $form )
{
$this->form = $form;
}
protected function getValues( )
{
$success = true;
foreach ( $this->form->fields( ) as $field ) {
if ( $field === null ) {
continue;
}
try {
$value = $this->getParameter( $field->name( ) , $this->form->method( ) );
} catch ( ParameterException $e ) {
$value = null;
}
$field->setFormValue( $value );
$vResult = $field->validate( );
$success = $success && $vResult;
}
return $success;
}
protected function applyFormControllers( $page )
{
foreach ( $this->form->controllers( ) as $controller ) {
$result = $controller->handle( $page );
if ( $result === null ) {
continue;
}
return $result;
}
return null;
}
public function handle( Page $page )
{
try {
$this->getParameter( $this->form->name( ) . '-submit' );
} catch ( ParameterException $e ) {
return $this->form->view( );
}
if ( ! $this->getValues( ) ) {
return $this->form->view( );
}
$cResult = $this->applyFormControllers( $page );
if ( $cResult === null ) {
return $this->form->view( );
}
if ( $cResult === true ) {
$url = $this->form->successURL( );
} elseif ( $cResult ) {
return $cResult;
} else {
$url = $this->form->cancelURL( );
}
if ( $url{0} != '/' ) {
$url = "/$url";
}
return $page->getBaseURL( ) . $url;
}
}