symfony: domesticando los formularios

79
organizan patrocinan colaboran Jornadas Symfony 5 y 6 de julio 2010 Universitat Jaume I, Castell ttp://decharlas.uji.es/symfony

Upload: jose-antonio-pio

Post on 10-May-2015

3.567 views

Category:

Technology


3 download

TRANSCRIPT

Page 1: Symfony: Domesticando los Formularios

organizan patrocinan

colaboran

Jornadas Symfony 5 y 6 de julio 2010Universitat Jaume I, Castellón

http://decharlas.uji.es/symfony

Page 2: Symfony: Domesticando los Formularios

tr

Jornadas Symfony http://decharlas.uji.es/symfonyJornadas Symfony http://decharlas.uji.es/symfony

hacemos Webs!

Page 3: Symfony: Domesticando los Formularios

Jornadas Symfony 5 y 6 de julio 2010Universitat Jaume I, Castellón

http://decharlas.uji.es/symfony

Domesticando los formularios: sfFormJose Antonio Pio Acilia.es

Page 4: Symfony: Domesticando los Formularios

Jornadas Symfony http://decharlas.uji.es/symfony

PresentaciónCTO Acilia Internet Madrid

Jornadas Symfony http://decharlas.uji.es/symfony

Background

+ Estudie Ingeniería Electrónica

+ Empece a trabajar con internet en el 2001... y aquí sigo.

+ PHP y Ruby

+ CakePHP, Rails, CodeIgniter y Symfony 1.2 - 1.4

Page 5: Symfony: Domesticando los Formularios

Jornadas Symfony http://decharlas.uji.es/symfony

PresentaciónProyectos con Symfony

Jornadas Symfony http://decharlas.uji.es/symfony

Page 6: Symfony: Domesticando los Formularios

Jornadas Symfony http://decharlas.uji.es/symfony

PresentaciónProyectos con Symfony

Jornadas Symfony http://decharlas.uji.es/symfonynotodohoteles.com, quiniela15.com (cache)CondeNast - Profesional Vogue GQ

Page 7: Symfony: Domesticando los Formularios

Jornadas Symfony http://decharlas.uji.es/symfonyJornadas Symfony http://decharlas.uji.es/symfony

Domesticando los formularios: sfFormContenido

Page 8: Symfony: Domesticando los Formularios

Jornadas Symfony http://decharlas.uji.es/symfonyJornadas Symfony http://decharlas.uji.es/symfony

Contenido

+ Formularios el SubFramework

+ Las Clases

+ Formularios

+ Widgets

+ Validators

+ Funcionalidades y clases

Page 9: Symfony: Domesticando los Formularios

Jornadas Symfony http://decharlas.uji.es/symfonyJornadas Symfony http://decharlas.uji.es/symfony

Domestiquemos los Formularios¿Cómo se hace un embedded form?

Page 10: Symfony: Domesticando los Formularios

Jornadas Symfony http://decharlas.uji.es/symfonyJornadas Symfony http://decharlas.uji.es/symfony

EmbeddedFormAsí se hace

public function configure(){ ... $this->embedForm('newPhotos', new ObjectForm($ObjectRelated) );}

Page 11: Symfony: Domesticando los Formularios

Jornadas Symfony http://decharlas.uji.es/symfonyJornadas Symfony http://decharlas.uji.es/symfony

EmbeddedFormPara esto lo he usado

class UserAdminForm extends BasesfGuardUserAdminForm{ public function configure() { ... $profileForm = new sfGuardUserProfileForm($this->object->profile); $this->embedForm("profile", $profileForm); }

}

Page 12: Symfony: Domesticando los Formularios

Jornadas Symfony http://decharlas.uji.es/symfonyJornadas Symfony http://decharlas.uji.es/symfony

Symfony Forms SubFrameWork

Page 13: Symfony: Domesticando los Formularios

Jornadas Symfony http://decharlas.uji.es/symfonyJornadas Symfony http://decharlas.uji.es/symfony

Symfony Forms SubFrameWork

+ Objeto Formulario: sfForm

+ Objeto Widget: sfWidget

+ Objeto Validator: sfValidator

sfForm sfWidget sfValidator

Page 14: Symfony: Domesticando los Formularios

Jornadas Symfony http://decharlas.uji.es/symfonyJornadas Symfony http://decharlas.uji.es/symfony

Las ClasessfForm

public function executeContact($request){ $this->form = new sfForm(); $this->form->setWidgets(array( 'name' => new sfWidgetFormInputText(), 'email' => new sfWidgetFormInputText(array('default' => '[email protected]')), 'subject' => new sfWidgetFormChoice(array('choices' => array('Subject A', 'Subject B', 'Subject C'))), 'message' => new sfWidgetFormTextarea(), ));}

sfForm

Page 15: Symfony: Domesticando los Formularios

Jornadas Symfony http://decharlas.uji.es/symfonyJornadas Symfony http://decharlas.uji.es/symfony

Las ClasessfWidget

class ArticleForm extends BaseArticleForm{

public function configure(){$this->widgetSchema['template_id'] = new sfWidgetFormInputHidden();$this->validatorSchema['cover_image_id'] = new

sfValidatorDoctrineChoice( array ('model'=>'Image', 'required'=>false));$this->widgetSchema['document_id'] = new sfWidgetFormDocument();}

}

sfWidget

Page 16: Symfony: Domesticando los Formularios

Jornadas Symfony http://decharlas.uji.es/symfonyJornadas Symfony http://decharlas.uji.es/symfony

Las ClasessfValidator

class ArticleForm extends BaseArticleForm{

public function configure(){$this->validatorSchema['title'] = new

sfValidatorString(array('max_length' => 255))$this->validatorSchema['template_id'] = new

sfValidatorDoctrineChoice( array ('model'=>'Template', 'required'=>false));

$this->validatorSchema['video_id'] = new sfValidatorArticleVideo( array ( 'object' => $this->object ) );

}

}

sfValidator

Page 17: Symfony: Domesticando los Formularios

Jornadas Symfony http://decharlas.uji.es/symfonyJornadas Symfony http://decharlas.uji.es/symfony

FomulariossfForms

Page 18: Symfony: Domesticando los Formularios

Jornadas Symfony http://decharlas.uji.es/symfonyJornadas Symfony http://decharlas.uji.es/symfony

FormulariosEjemplo Formulario de Contactopublic function executeContact($request){

$this->form = new sfForm();$this->form->setWidgets(array(

'name' => new sfWidgetFormInputText(), 'message' => new sfWidgetFormTextarea(),));$this->form->setValidators(array(

'name' => new sfValidatorString( array ( 'max_length' => 10 ) ),'message' => new sfValidatorString( array ( 'max_length' =>

20 ))));

$this->form->getWidgetSchema()->setNameFormat('contact[%s]');

// Deal with the requestif ($request->isMethod('post')){

$this->form->bind( $request->getParameter($this->form->getName()) );

if ( $this->form->isValid() ){var_export ( $this->form->getValues() );

}$this->redirect("module/contact");}

}

Page 19: Symfony: Domesticando los Formularios

Jornadas Symfony http://decharlas.uji.es/symfonyJornadas Symfony http://decharlas.uji.es/symfony

FormulariosEjemplo Formulario de Contactopublic function executeContact($request){

$this->form = new sfForm();$this->form->setWidgets(array(

'name' => new sfWidgetFormInputText(), 'message' => new sfWidgetFormTextarea(),));$this->form->setValidators(array(

'name' => new sfValidatorString( array ( 'max_length' => 10 ) ),'message' => new sfValidatorString( array ( 'max_length' =>

20 ))));

$this->form->getWidgetSchema()->setNameFormat('contact[%s]');

// Deal with the requestif ($request->isMethod('post')){

$this->form->bind( $request->getParameter($this->form->getName()) );

if ( $this->form->isValid() ){var_export ( $this->form->getValues() );

}$this->redirect("module/contact");}

}

Page 20: Symfony: Domesticando los Formularios

Jornadas Symfony http://decharlas.uji.es/symfonyJornadas Symfony http://decharlas.uji.es/symfony

FormulariosEjemplo Formulario de Contactopublic function executeContact($request){

$this->form = new sfForm();$this->form->setWidgets(array(

'name' => new sfWidgetFormInputText(), 'message' => new sfWidgetFormTextarea(),));$this->form->setValidators(array(

'name' => new sfValidatorString( array ( 'max_length' => 10 ) ),'message' => new sfValidatorString( array ( 'max_length' =>

20 ))));

$this->form->getWidgetSchema()->setNameFormat('contact[%s]');

// Deal with the requestif ($request->isMethod('post')){

$this->form->bind( $request->getParameter($this->form->getName()) );

if ( $this->form->isValid() ){var_export ( $this->form->getValues() );

}$this->redirect("module/contact");}

}

Page 21: Symfony: Domesticando los Formularios

Jornadas Symfony http://decharlas.uji.es/symfonyJornadas Symfony http://decharlas.uji.es/symfony

FormulariosEjemplo Formulario de Contactopublic function executeContact($request){

$this->form = new sfForm();$this->form->setWidgets(array(

'name' => new sfWidgetFormInputText(), 'message' => new sfWidgetFormTextarea(),));$this->form->setValidators(array(

'name' => new sfValidatorString( array ( 'max_length' => 10 ) ),'message' => new sfValidatorString( array ( 'max_length' =>

20 )))); // Error extra Form Field si no hay validador ->isValid

$this->form->getWidgetSchema()->setNameFormat('contact[%s]');

// Deal with the requestif ($request->isMethod('post')){

$this->form->bind( $request->getParameter($this->form->getName()) );

if ( $this->form->isValid() ){var_export ( $this->form->getValues() );

}$this->redirect("module/contact");}

}

Page 22: Symfony: Domesticando los Formularios

Jornadas Symfony http://decharlas.uji.es/symfonyJornadas Symfony http://decharlas.uji.es/symfony

FormulariosEjemplo Formulario de Contactopublic function executeContact($request){

$this->form = new sfForm();$this->form->setWidgets(array(

'name' => new sfWidgetFormInputText(), 'message' => new sfWidgetFormTextarea(),));$this->form->setValidators(array(

'name' => new sfValidatorString( array ( 'max_length' => 10 ) ),'message' => new sfValidatorString( array ( 'max_length' =>

20 ))));

$this->form->getWidgetSchema()->setNameFormat('contact[%s]');

// Deal with the requestif ($request->isMethod('post')){

$this->form->bind( $request->getParameter($this->form->getName()) );

if ( $this->form->isValid() ){var_export ( $this->form->getValues() );

}$this->redirect("module/contact");}

}

Page 23: Symfony: Domesticando los Formularios

Jornadas Symfony http://decharlas.uji.es/symfonyJornadas Symfony http://decharlas.uji.es/symfony

FormulariosEjemplo Formulario de Contactopublic function executeContact($request){

$this->form = new sfForm();$this->form->setWidgets(array(

'name' => new sfWidgetFormInputText(), 'message' => new sfWidgetFormTextarea(),));$this->form->setValidators(array(

'name' => new sfValidatorString( array ( 'max_length' => 10 ) ),'message' => new sfValidatorString( array ( 'max_length' =>

20 ))));

$this->form->getWidgetSchema()->setNameFormat('contact[%s]');

// Deal with the requestif ($request->isMethod('post')){

$this->form->bind( $request->getParameter($this->form->getName()) );

if ( $this->form->isValid() ){var_export ( $this->form->getValues() );

}$this->redirect("module/contact");}

}

Page 24: Symfony: Domesticando los Formularios

Jornadas Symfony http://decharlas.uji.es/symfonyJornadas Symfony http://decharlas.uji.es/symfony

FormulariosEjemplo Formulario de Contactopublic function executeContact($request){

$this->form = new sfForm();$this->form->setWidgets(array(

'name' => new sfWidgetFormInputText(), 'message' => new sfWidgetFormTextarea(),));$this->form->setValidators(array(

'name' => new sfValidatorString( array ( 'max_length' => 10 ) ),'message' => new sfValidatorString( array ( 'max_length' =>

20 ))));

$this->form->getWidgetSchema()->setNameFormat('contact[%s]');

// Deal with the requestif ($request->isMethod('post')){

$this->form->bind( $request->getParameter($this->form->getName()) );

if ( $this->form->isValid() ){var_export ( $this->form->getValues() );

}$this->redirect("module/contact");}

}

Page 25: Symfony: Domesticando los Formularios

Jornadas Symfony http://decharlas.uji.es/symfonyJornadas Symfony http://decharlas.uji.es/symfony

FomulariosImprimiendo los Formularios

Page 26: Symfony: Domesticando los Formularios

Jornadas Symfony http://decharlas.uji.es/symfonyJornadas Symfony http://decharlas.uji.es/symfony

FormulariosVista del Formulario de Contacto

<?php echo $form->renderFormTag('') ?> <table> <?php echo $form ?> <tr> <td colspan="2"> <input type="submit" /> </td> </tr> </table></form>

<?php echo $form->renderFormTag('') ?> <ul> <?php foreach ($form as $field): ?> <li> <?php echo $fiel->renderRow() ?> </li> <?php endforeach; ?> <li> <input type="submit" /d> </li> </ul></form>

Page 27: Symfony: Domesticando los Formularios

Jornadas Symfony http://decharlas.uji.es/symfonyJornadas Symfony http://decharlas.uji.es/symfony

FormulariosManipulando los campos del formulario

<?php echo $form->renderFormTag('') ?> <ul> <?php foreach ($form as $field): ?> <li> <?php if ( $field->hasError() ): ?> <div class="error"> <?php echo $field->renderError() ?> </div> <?php endif; ?> <?php echo $field->renderLabel() ?> <?php echo $field->render() ?> <?php if ( $field->renderHelp() ): ?> <?php echo $field->renderHelp() ?> <?php endif; ?> </li> <?php endforeach; ?> <li> <input type="submit" /> </li> </ul></form>

Page 28: Symfony: Domesticando los Formularios

Jornadas Symfony http://decharlas.uji.es/symfonyJornadas Symfony http://decharlas.uji.es/symfony

sfForm

Page 29: Symfony: Domesticando los Formularios

Jornadas Symfony http://decharlas.uji.es/symfonyJornadas Symfony http://decharlas.uji.es/symfony

sfFormsfForms, Options y Attributes

class sfForm implements ArrayAccess, Iterator, Countable{ protected static $CSRFSecret = false, $CSRFFieldName = '_csrf_token', $toStringException = null;

protected $widgetSchema = null, $validatorSchema = null, $errorSchema = null, $formFieldSchema = null, $formFields = array(), $isBound = false, $taintedValues = array(), $taintedFiles = array(), $values = null, $defaults = array(), $fieldNames = array(), $options = array(), $count = 0, $localCSRFSecret = null, $embeddedForms = array();

public function __construct($defaults = array(), $options = array(), $CSRFSecret = null) { } public function configure(){ } public function setup() { } public function render($attributes = array()) {}

}

Page 30: Symfony: Domesticando los Formularios

Jornadas Symfony http://decharlas.uji.es/symfonyJornadas Symfony http://decharlas.uji.es/symfony

sfForm

sfFormFieldSchemasfFormField

sfForm

ArrayAccess CountableIterator

Clases Relativas a los Formularios

Page 31: Symfony: Domesticando los Formularios

Jornadas Symfony http://decharlas.uji.es/symfonyJornadas Symfony http://decharlas.uji.es/symfony

sfFormClases Relativas a los Formularios

sfForm

ArrayAccess CountableIterator

sfFormSymfony BaseForm sfFormObject

Page 32: Symfony: Domesticando los Formularios

Jornadas Symfony http://decharlas.uji.es/symfonyJornadas Symfony http://decharlas.uji.es/symfony

Widgets

sfWidget sfWidgetForm sfWidgetFormInput

Page 33: Symfony: Domesticando los Formularios

Jornadas Symfony http://decharlas.uji.es/symfonyJornadas Symfony http://decharlas.uji.es/symfony

WidgetssfWidgets, Options y Attributesabstract class sfWidget{ protected $requiredOptions = array(), $attributes = array(), $options = array();

protected static $xhtml = true, $charset = 'UTF-8';

public function __construct($options = array(), $attributes = array()) { $this->configure($options, $attributes);. .. } protected function configure($options = array(), $attributes = array()) { }

abstract public function render($name, $value = null, $attributes = array(), $errors = array());

}

Page 34: Symfony: Domesticando los Formularios

Jornadas Symfony http://decharlas.uji.es/symfonyJornadas Symfony http://decharlas.uji.es/symfony

WidgetsWidgets en Symfony

sfWidgetFormPropelChoicesfWidgetFormDoctrineChoice

sfWidgetFormsfWidgetFormDateTimesfWidgetFormSelectRadiosfWidgetFormSelectsfWidgetFormFilterInputsfWidgetFormDateRangesfWidgetFormInputHiddensfWidgetFormInputFilesfWidgetFormInputTextsfWidgetFormInputPasswordsfWidgetFormInputFileEditablesfWidgetFormDatesfWidgetFormTimesfWidgetFormSelectCheckboxsfWidgetFormSelectManysfWidgetFormFilterDatesfWidgetFormInputsfWidgetFormSchemaDecoratorsfWidgetFormTextareasfWidgetFormInputCheckboxsfWidgetFormChoiceBase

sfWidgetFormChoice

sfWidgetFormSchemasfWidgetFormSchemaFormatterTablesfWidgetFormSchemaFormatterListsfWidgetFormSchemaForEachsfWidgetFormSchemaFormatter

sfWidgetFormI18nChoiceCountrysfWidgetFormI18nDatesfWidgetFormI18nTimesfWidgetFormI18nDateTimesfWidgetFormI18nChoiceCurrencysfWidgetFormI18nChoiceTimezonesfWidgetFormI18nChoiceLanguage

Page 35: Symfony: Domesticando los Formularios

Jornadas Symfony http://decharlas.uji.es/symfonyJornadas Symfony http://decharlas.uji.es/symfony

WidgetsWidgets más usados

new sfWidgetFormInput(array('default' => 'John Doe'));new sfWidgetFormTextarea(array('default' => 'Enter your address here'), array('cols' => 20, 'rows' => 5));new sfWidgetFormInputPassword();new sfWidgetFormInputHidden(array('default' => 1234));new sfWidgetFormInputCheckbox(array('value_attribute_value' => 'single', 'default' => true));new sfWidgetFormChoice(array( 'choices' => array('' => 'Select from the list', 'us' => 'USA', 'ca' => 'Canada', 'uk' => 'UK', 'other'), 'default' => 'uk'));new sfWidgetFormDate(array( 'label' => 'Date of birth', 'default' => '01/01/1950', // can be a timestamp or a string understandable by strtotime() 'years' => $years,));

Page 36: Symfony: Domesticando los Formularios

Jornadas Symfony http://decharlas.uji.es/symfonyJornadas Symfony http://decharlas.uji.es/symfony

WidgetsWidgets más usados

new sfWidgetFormTime(array('default' => '12:00'));new sfWidgetFormDateTime(array('default' => '01/01/2008 12:00'));new sfWidgetFormI18nDate(array( 'culture' => $this->getUser()->getCulture(), 'month_format' => 'name', // Use any of 'name' (default), 'short_name', and 'number' 'label' => 'Date of birth', 'default' => '01/01/1950', 'years' => $years));new sfWidgetFormI18nCountryChoice(array('default' => 'UK'));new sfWidgetFormI18nLanguageChoice(array( 'languages' => array('en', 'fr', 'de'), // optional restricted list of languages 'default' => 'en'));new sfWidgetFormInputFile();new sfWidgetFormInputFileEditable(array('default' => '/images/foo.png'));

Page 37: Symfony: Domesticando los Formularios

Jornadas Symfony http://decharlas.uji.es/symfonyJornadas Symfony http://decharlas.uji.es/symfony

WidgetsCrear un Widget propio

class sfWidgetFormCKeditor extends sfWidgetFormTextarea{

public function __construct($options = array (), $attributes = array ()) { $this->addOption('ckconfig', array( 'toolbar' => "Full", 'rows' => 10 , 'cols' => 80 ) );$this->addOption('verify', false ); parent::__construct($options, $attributes); } protected function configure($options = array (), $attributes = array ()) { $this->setAttribute('class', "ck_textarea"); } }}

Page 38: Symfony: Domesticando los Formularios

Jornadas Symfony http://decharlas.uji.es/symfonyJornadas Symfony http://decharlas.uji.es/symfony

WidgetsWidgets más usados

public function render($name, $value = null, $attributes = array (), $errors = array ()){$config = "";$editor = $this->renderContentTag('textarea', self::escapeOnce($value), array_merge( array ('name'=>$name), $attributes));$id_name = trim(preg_replace("/_{2,}/", "_", preg_replace("/_{1,}$/", "", preg_replace("/\[|\]/", "_", $name))));$configout = array ();foreach($this->getOption('ckconfig') as $key => $value){$configout[] .= " {$key} : \"{$value}\" ";}$config = ", { ".join(",", $configout)." }";$editor .= '<script type="text/javascript">$(document).ready(function(){try{var instance = CKEDITOR.instances[\''.$id_name.'\'];if ( instance ){instance.destroy(true); instance = null; CKEDITOR.replace( \''.$name.'\' '.$config.'); }else{ CKEDITOR.replace( \''.$name.'\' '.$config.' ); }}catch(e){}});

</script>'; return $editor; } }

Page 39: Symfony: Domesticando los Formularios

Jornadas Symfony http://decharlas.uji.es/symfonyJornadas Symfony http://decharlas.uji.es/symfony

WidgetssfWidgetabstract class sfWidget{

public function renderTag($tag, $attributes = array()) { if (empty($tag)) { return ''; }

return sprintf('<%s%s%s', $tag, $this->attributesToHtml($attributes), self::$xhtml ? ' />' : (strtolower($tag) == 'input' ? '>' : sprintf('></%s>', $tag))); } public function renderContentTag($tag, $content = null, $attributes = array()) { if (empty($tag)) { return ''; } return sprintf('<%s%s>%s</%s>', $tag, $this->attributesToHtml($attributes), $content, $tag); }

Page 40: Symfony: Domesticando los Formularios

Jornadas Symfony http://decharlas.uji.es/symfonyJornadas Symfony http://decharlas.uji.es/symfony

Validators

Page 41: Symfony: Domesticando los Formularios

Jornadas Symfony http://decharlas.uji.es/symfonyJornadas Symfony http://decharlas.uji.es/symfony

ValidatorssfValidatorBase, Options y Attributes

abstract class sfValidatorBase{

protected static $charset = 'UTF-8',$globalDefaultMessages = array('invalid' => 'Invalid.', 'required'

=> 'Required.');

protected$requiredOptions = array(), $defaultMessages = array(),$defaultOptions = array(), $messages = array(),$options = array();

public function __construct($options = array(), $messages = array()){{

$this->configure($options, $messages);...

}protected function configure($options = array(), $messages =

array()) {}

abstract protected function doClean($value);

}

Page 42: Symfony: Domesticando los Formularios

Jornadas Symfony http://decharlas.uji.es/symfonyJornadas Symfony http://decharlas.uji.es/symfony

ValidatorsValidadores de Symfony

sfValidatorBasesfValidatedFilesfValidatorBooleansfValidatorChoicesfValidatorCSRFTokensfValidatorDatesfValidatorDateRangesfValidatorDateTimesfValidatorEmailsfValidatorFilesfValidatorIntegersfValidatorNumbersfValidatorPasssfValidatorRegexsfValidatorStringsfValidatorTimesfValidatorUrlsfValidatorFromDescription

sfValidatorAndsfValidatorOrsfValidatorCallback

sfValidatorSchemasfValidatorSchemaComparesfValidatorSchemaFiltersfValidatorSchemaForEachsfValidatorErrorsfValidatorErrorSchemasfValidatorDecorator

Page 43: Symfony: Domesticando los Formularios

Jornadas Symfony http://decharlas.uji.es/symfonyJornadas Symfony http://decharlas.uji.es/symfony

ValidatorsValidadores mas usados

new sfValidatorString(array( 'min_length' => 4, 'max_length' => 50,),array( 'min_length' => 'Es muy corto', 'max_length' => 'Es muy largo',));

new sfValidatorNumber(array( 'min' => 18, 'max' => 99.99,),array( 'min' => 'Mas de 18', 'max' => 'No te creo',));new sfValidatorEmail();new sfValidatorUrl();new sfValidatorRegex(array( 'pattern' => '^[0-9]{3}\.[0-9]{3}\.[0-9]{2}\.[0-9]{3}$' ));new sfValidatorBoolean();

Page 44: Symfony: Domesticando los Formularios

Jornadas Symfony http://decharlas.uji.es/symfonyJornadas Symfony http://decharlas.uji.es/symfony

ValidatorsValidadores mas usados

new sfValidatorChoice(array('choices' => array('Subject A', 'Subject B', 'Subject C')));new sfValidatorChoice(array('multiple' => true, 'choices' => array('en' => 'English', 'fr' => 'French', 'other')));new sfValidatorPropelChoice(array('model' => 'Section','column' => 'name'));new sfValidatorDoctrineChoice(array('model' => 'Section','column' => 'name'));

new sfValidatorPropelUnique(array('model' => 'User', 'column' => 'login'));new sfValidatorDoctrineUnique(array('model' => 'User', 'column' => 'login'));new sfValidatorFile( array ('required'=>true, 'path'=>"///folder", 'mime_types'=>'web_images', 'max_size'=>10485760 ) );

Page 45: Symfony: Domesticando los Formularios

Jornadas Symfony http://decharlas.uji.es/symfonyJornadas Symfony http://decharlas.uji.es/symfony

ValidatorsInicio de la Validación

// Validación en la acciónif ($request->isMethod('post')){

$this->form->bind( $request->getParameter($this->form->getName()) );

if ( $this->form->isValid() ){var_export ( $this->form->getValues() );

}}

public function bindAndSave($taintedValues, $taintedFiles = null, $con = null) { $this->bind($taintedValues, $taintedFiles); if ($this->isValid()){ { $this->save($con); return true; } return false; }

Page 46: Symfony: Domesticando los Formularios

Jornadas Symfony http://decharlas.uji.es/symfonyJornadas Symfony http://decharlas.uji.es/symfony

ValidatorsMas sobre el proceso de Validación

$form->bind( $values, $fliles );sfForm::doBind($values);

$this->$this->validatorSchema->clean($values)sfValidatorSchema::clean($values);

$this->doClean($values);$this->preClean($values);foreach ($values as $name => $value)

$clean[$name] = $this->fields[$name]->clean($value);

$clean = $this->postClean($clean);return $clean;

Page 47: Symfony: Domesticando los Formularios

Jornadas Symfony http://decharlas.uji.es/symfonyJornadas Symfony http://decharlas.uji.es/symfony

ValidatorsMas sobre el proceso de Validación

$form->bind( $values, $fliles );sfForm::doBind($values);

$this->$this->validatorSchema->clean($values)sfValidatorSchema::clean($values);

$this->doClean($values);$this->preClean($values);foreach ($values as $name => $value)

$clean[$name] = $this->fields[$name]->clean($value);

$clean = $this->postClean($clean);return $clean;

Page 48: Symfony: Domesticando los Formularios

Jornadas Symfony http://decharlas.uji.es/symfonyJornadas Symfony http://decharlas.uji.es/symfony

ValidatorsMas sobre el proceso de Validación

$this->form->bind( $request->getParameter($this->form->getName()) );

public function bind(array $taintedValues = null, array $taintedFiles = null){ ... try { $this->doBind(self::deepArrayUnion($this->taintedValues, self::convertFileInformation($this->taintedFiles))); ... }... } protected function doBind(array $values){ $this->values = $this->validatorSchema->clean($values); }

Page 49: Symfony: Domesticando los Formularios

Jornadas Symfony http://decharlas.uji.es/symfonyJornadas Symfony http://decharlas.uji.es/symfony

ValidatorsMas sobre el proceso de Validación

$form->bind( $values, $fliles );sfForm::doBind($values);

$this->$this->validatorSchema->clean($values)sfValidatorSchema::clean($values);

$this->doClean($values);$this->preClean($values);foreach ($values as $name => $value)

$clean[$name] = $this->fields[$name]->clean($value);

$clean = $this->postClean($clean);return $clean;

Page 50: Symfony: Domesticando los Formularios

Jornadas Symfony http://decharlas.uji.es/symfonyJornadas Symfony http://decharlas.uji.es/symfony

ValidatorsMas sobre el proceso de Validación

$form->bind( $values, $fliles );sfForm::doBind($values);

$this->$this->validatorSchema->clean($values)sfValidatorSchema::clean($values);

$this->doClean($values);$this->preClean($values);foreach ($values as $name => $value)

$clean[$name] = $this->fields[$name]->clean($value);

$clean = $this->postClean($clean);return $clean;

Page 51: Symfony: Domesticando los Formularios

Jornadas Symfony http://decharlas.uji.es/symfonyJornadas Symfony http://decharlas.uji.es/symfony

ValidatorsMas sobre el proceso de Validación

$form->bind( $values, $fliles );sfForm::doBind($values);

$this->$this->validatorSchema->clean($values)sfValidatorSchema::clean($values);

$this->doClean($values);$this->preClean($values);foreach ($values as $name => $value)

$clean[$name] = $this->fields[$name]->clean($value);

$clean = $this->postClean($clean);return $clean;

Page 52: Symfony: Domesticando los Formularios

Jornadas Symfony http://decharlas.uji.es/symfonyJornadas Symfony http://decharlas.uji.es/symfony

ValidatorsMas sobre el proceso de Validación

$form->bind( $values, $fliles );sfForm::doBind($values);

$this->$this->validatorSchema->clean($values)sfValidatorSchema::clean($values);

$this->doClean($values);$this->preClean($values);foreach ($values as $name => $value)

$clean[$name] = $this->fields[$name]->clean($value);

$clean = $this->postClean($clean);return $clean;

Page 53: Symfony: Domesticando los Formularios

Jornadas Symfony http://decharlas.uji.es/symfonyJornadas Symfony http://decharlas.uji.es/symfony

ValidatorsProceso de Validación

protected function doClean($values){ // pre validator try{ $this->preClean($values); }catch ... // validate given values foreach ($values as $name => $value) { try{ $clean[$name] = $this->fields[$name]->clean($value); }catch (sfValidatorError $e){ $clean[$name] = null; $errorSchema->addError($e, (string) $name); } }.... // post validator try{ $clean = $this->postClean($clean); }catch ... return $clean; }

Page 54: Symfony: Domesticando los Formularios

Jornadas Symfony http://decharlas.uji.es/symfonyJornadas Symfony http://decharlas.uji.es/symfony

ValidatorsMas sobre el proceso de Validación

$form->bind( $values, $fliles );sfForm::doBind($values);

$this->$this->validatorSchema->clean($values)sfValidatorSchema::clean($values);

$this->doClean($values);$this->preClean($values);foreach ($values as $name => $value)

$clean[$name] = $this->fields[$name]->clean($value);

$clean = $this->postClean($clean);return $clean;

Page 55: Symfony: Domesticando los Formularios

Jornadas Symfony http://decharlas.uji.es/symfonyJornadas Symfony http://decharlas.uji.es/symfony

ValidatorsMas sobre el proceso de Validación

$form->bind( $values, $fliles );sfForm::doBind($values);

$this->$this->validatorSchema->clean($values)sfValidatorSchema::clean($values);

$this->doClean($values);$this->preClean($values);foreach ($values as $name => $value)

$clean[$name] = $this->fields[$name]->clean($value);

$clean = $this->postClean($clean);return $clean;

Page 56: Symfony: Domesticando los Formularios

Jornadas Symfony http://decharlas.uji.es/symfonyJornadas Symfony http://decharlas.uji.es/symfony

ValidatorsMas sobre el proceso de Validación

$form->bind( $values, $fliles );sfForm::doBind($values);

$this->$this->validatorSchema->clean($values)sfValidatorSchema::clean($values);

$this->doClean($values);$this->preClean($values);foreach ($values as $name => $value)

$clean[$name] = $this->fields[$name]->clean($value);

$clean = $this->postClean($clean);return $clean;

Page 57: Symfony: Domesticando los Formularios

Jornadas Symfony http://decharlas.uji.es/symfonyJornadas Symfony http://decharlas.uji.es/symfony

ValidatorsMas sobre el proceso de Validación

$form->bind( $values, $fliles );sfForm::doBind($values);

$this->$this->validatorSchema->clean($values)sfValidatorSchema::clean($values);

$this->doClean($values);$this->preClean($values);foreach ($values as $name => $value)

$clean[$name] = $this->fields[$name]->clean($value);

$clean = $this->postClean($clean);return $clean;

Page 58: Symfony: Domesticando los Formularios

Jornadas Symfony http://decharlas.uji.es/symfonyJornadas Symfony http://decharlas.uji.es/symfony

ValidatorsMas sobre el proceso de Validación

$this->form->bind( $request->getParameter($this->form->getName()) );

public function bind(array $taintedValues = null, array $taintedFiles = null){ ... try { $this->doBind(self::deepArrayUnion($this->taintedValues, self::convertFileInformation($this->taintedFiles))); ... }... } protected function doBind(array $values){ $this->values = $this->validatorSchema->clean($values); }

Page 59: Symfony: Domesticando los Formularios

Jornadas Symfony http://decharlas.uji.es/symfonyJornadas Symfony http://decharlas.uji.es/symfony

Funcionalidades y Clases

Page 60: Symfony: Domesticando los Formularios

Jornadas Symfony http://decharlas.uji.es/symfonyJornadas Symfony http://decharlas.uji.es/symfony

Guardando los Formularios de ObjetosSave y doSave

Page 61: Symfony: Domesticando los Formularios

Jornadas Symfony http://decharlas.uji.es/symfonyJornadas Symfony http://decharlas.uji.es/symfony

Image: actAs: Timestampable: ~ columns: name: { type: string(255), notblank: true, notnull: true } file_name: { type: string(255), notblank: true, notnull: true } description: { type: blob } width: { type: integer } height: { type: integer } size: { type: integer } mime_type: { type:string(255) } alt: { type: blob, notnull: true, notblank:true } title: { type: blob, notnull: true, notblank:true } caption: { type: string(255) } copy_right: { type: string(255) } longdesc: { type: blob } gravity: { type:string , default: north }

Guardando los Formularios de Objetos

Page 62: Symfony: Domesticando los Formularios

Jornadas Symfony http://decharlas.uji.es/symfonyJornadas Symfony http://decharlas.uji.es/symfony

Invocando el método save()

Guardando los Formularios de Objetos

class imageActions extends autoImageActions{

public function executeCreate(sfWebRequest $request){$this->form = new ImageForm();$this->image = $this->form->getObject();if ($this->processForm($request, $this->form)){

$this->redirect(“edit...”);} else {

$this->execute("new");}

}...protected function processForm(sfWebRequest $request, sfForm $form){

$form->bind($request->getParameter($form->getName()), $request->getFiles($form->getName()));

Try{ $tree = $form->save(); }}catch(Exception $e) { return false; }

return true;

}...

}

Page 63: Symfony: Domesticando los Formularios

Jornadas Symfony http://decharlas.uji.es/symfonyJornadas Symfony http://decharlas.uji.es/symfony

Guardando los Formularios de ObjetosSave y doSave

sfFormObject::save();

sfFormObject::doSave();

sfFormsObject::updateObject();

sfFormDoctrine::processValues($values);

sfFormObject::updateXXXColumn ($value);

sfFormDoctrine::processUploadedFile();

sfFormDoctrine::doUpdateObject();

sfFormObject::updateObjectEmbeddedForms($values);

Page 64: Symfony: Domesticando los Formularios

Jornadas Symfony http://decharlas.uji.es/symfonyJornadas Symfony http://decharlas.uji.es/symfony

Save y doSave

sfFormObject::save();

sfFormObject::doSave();

sfFormsObject::updateObject();

sfFormDoctrine::processValues($values);

sfFormObject::updateXXXColumn ($value);

sfFormDoctrine::processUploadedFile();

sfFormDoctrine::doUpdateObject();

sfFormObject::updateObjectEmbeddedForms($values);

Guardando los Formularios de Objetos

Page 65: Symfony: Domesticando los Formularios

Jornadas Symfony http://decharlas.uji.es/symfonyJornadas Symfony http://decharlas.uji.es/symfony

Save y doSave

sfFormObject::save();

sfFormObject::doSave();

sfFormsObject::updateObject();

sfFormDoctrine::processValues($values);

sfFormObject::updateXXXColumn ($value);

sfFormDoctrine::processUploadedFile();

sfFormDoctrine::doUpdateObject();

sfFormObject::updateObjectEmbeddedForms($values);

Guardando los Formularios de Objetos

Page 66: Symfony: Domesticando los Formularios

Jornadas Symfony http://decharlas.uji.es/symfonyJornadas Symfony http://decharlas.uji.es/symfony

Save y doSave

sfFormObject::save();

sfFormObject::doSave();

sfFormsObject::updateObject();

sfFormDoctrine::processValues($values);

sfFormObject::updateXXXColumn ($value);

sfFormDoctrine::processUploadedFile();

sfFormDoctrine::doUpdateObject();

sfFormObject::updateObjectEmbeddedForms($values);

Guardando los Formularios de Objetos

Page 67: Symfony: Domesticando los Formularios

Jornadas Symfony http://decharlas.uji.es/symfonyJornadas Symfony http://decharlas.uji.es/symfony

Save y doSave

sfFormObject::save();

sfFormObject::doSave();

sfFormsObject::updateObject();

sfFormDoctrine::processValues($values);

sfFormObject::updateXXXColumn ($value);

sfFormDoctrine::processUploadedFile();

sfFormDoctrine::doUpdateObject();

sfFormObject::updateObjectEmbeddedForms($values);

Guardando los Formularios de Objetos

Page 68: Symfony: Domesticando los Formularios

Jornadas Symfony http://decharlas.uji.es/symfonyJornadas Symfony http://decharlas.uji.es/symfony

Save y doSave

sfFormObject::save();

sfFormObject::doSave();

sfFormsObject::updateObject();

sfFormDoctrine::processValues($values);

sfFormObject::updateXXXColumn ($value);

sfFormDoctrine::processUploadedFile();

sfFormDoctrine::doUpdateObject();

sfFormObject::updateObjectEmbeddedForms($values);

Guardando los Formularios de Objetos

Page 69: Symfony: Domesticando los Formularios

Jornadas Symfony http://decharlas.uji.es/symfonyJornadas Symfony http://decharlas.uji.es/symfony

sfForm updateXXXColumn

class ImageForm extends BaseImageForm{

...protected function updateGravityColumn ($field){$valids = array ('north', 'center', 'south');if ( in_array ( $field, $valids ) ){

return $field;}return 'north';}

protected function updateDescriptionColumn($field){$this->object->longdesc = $field;return $field;}...

}

Guardando los Formularios de Objetos

Page 70: Symfony: Domesticando los Formularios

Jornadas Symfony http://decharlas.uji.es/symfonyJornadas Symfony http://decharlas.uji.es/symfony

Save y doSave

sfFormObject::save();

sfFormObject::doSave();

sfFormsObject::updateObject();

sfFormDoctrine::processValues($values);

sfFormObject::updateXXXColumn ($value);

sfFormDoctrine::processUploadedFile();

sfFormDoctrine::doUpdateObject();

sfFormObject::updateObjectEmbeddedForms($values);

Guardando los Formularios de Objetos

Page 71: Symfony: Domesticando los Formularios

Jornadas Symfony http://decharlas.uji.es/symfonyJornadas Symfony http://decharlas.uji.es/symfony

Save y doSave

sfFormObject::save();

sfFormObject::doSave();

sfFormsObject::updateObject();

sfFormDoctrine::processValues($values);

sfFormObject::updateXXXColumn ($value);

sfFormDoctrine::processUploadedFile();

sfFormDoctrine::doUpdateObject();

sfFormObject::updateObjectEmbeddedForms($values);

Guardando los Formularios de Objetos

Page 72: Symfony: Domesticando los Formularios

Jornadas Symfony http://decharlas.uji.es/symfonyJornadas Symfony http://decharlas.uji.es/symfony

Save y doSave

sfFormObject::save();

sfFormObject::doSave();

sfFormsObject::updateObject();

sfFormDoctrine::processValues($values);

sfFormObject::updateXXXColumn ($value);

sfFormDoctrine::processUploadedFile();

sfFormDoctrine::doUpdateObject();

sfFormObject::updateObjectEmbeddedForms($values);

Guardando los Formularios de Objetos

Page 73: Symfony: Domesticando los Formularios

Jornadas Symfony http://decharlas.uji.es/symfonyJornadas Symfony http://decharlas.uji.es/symfony

Formularios de ObjetosLas Clases

Page 74: Symfony: Domesticando los Formularios

Jornadas Symfony http://decharlas.uji.es/symfonyJornadas Symfony http://decharlas.uji.es/symfony

Formularios de Objetos

sfForm

Las Clases

ArticleFormBaseArticleFormBaseFormDoctrine

sfFormDoctrinesfFormObjectBaseFormsfFormSymfony

ArrayAccess CountableIterator

Page 75: Symfony: Domesticando los Formularios

Jornadas Symfony http://decharlas.uji.es/symfonyJornadas Symfony http://decharlas.uji.es/symfony

Filtros del Admin GeneratorLas Clases

Page 76: Symfony: Domesticando los Formularios

Jornadas Symfony http://decharlas.uji.es/symfonyJornadas Symfony http://decharlas.uji.es/symfony

Formularios de Objetos

sfForm

Las Clases

ArticleFormBaseArticleFormFilterBaseFormFilterDoctrine

sfFormFilterDoctrinesfFormFilterBaseFormsfFormSymfony

ArrayAccess CountableIterator

Page 77: Symfony: Domesticando los Formularios

Jornadas Symfony http://decharlas.uji.es/symfonyJornadas Symfony http://decharlas.uji.es/symfony

Comparación de ClasesLas Clases

ArticleFormFilterBaseArticleFormFilterBaseFormFilterDoctrine

sfFormFilterDoctrinesfFormFilterBaseForm

ArticleFormBaseArticleFormBaseFormDoctrine

sfFormDoctrinesfFormObjectBaseForm

Page 78: Symfony: Domesticando los Formularios

Jornadas Symfony http://decharlas.uji.es/symfonyJornadas Symfony http://decharlas.uji.es/symfony

Muchas GraciasCTO José Antonio Pio Gil

Page 79: Symfony: Domesticando los Formularios

Jornadas Symfony http://decharlas.uji.es/symfonyJornadas Symfony http://decharlas.uji.es/symfony

[email protected]

http://twitter.com/josetonyp