SlideShare a Scribd company logo
Castellón - 5 y 6 de Julio 2010 – Universitat Jaume I organizan patrocinan colaboran Jornadas Symfony 5 y 6 de julio 2010 Universitat Jaume I, Castellón http://decharlas.uji.es/symfony
tr Jornadas Symfony  http://decharlas.uji.es/symfony Jornadas Symfony  http://decharlas.uji.es/symfony hacemos Webs!
Jornadas Symfony 5 y 6 de julio 2010 Universitat Jaume I, Castellón http://decharlas.uji.es/symfony Domesticando los formularios: sfForm Jose Antonio Pio  Acilia.es
Jornadas Symfony  http://decharlas.uji.es/symfony Presentación CTO 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
Jornadas Symfony  http://decharlas.uji.es/symfony Presentación Proyectos con Symfony Jornadas Symfony  http://decharlas.uji.es/symfony
Jornadas Symfony  http://decharlas.uji.es/symfony Presentación Proyectos con Symfony Jornadas Symfony  http://decharlas.uji.es/symfony notodohoteles.com, quiniela15.com (cache) CondeNast - Profesional    Vogue  GQ
Jornadas Symfony  http://decharlas.uji.es/symfony Jornadas Symfony  http://decharlas.uji.es/symfony Domesticando los formularios: sfForm Contenido
Jornadas Symfony  http://decharlas.uji.es/symfony Jornadas Symfony  http://decharlas.uji.es/symfony Contenido +  Formularios el SubFramework +  Las Clases +  Formularios +  Widgets +  Validators +  Funcionalidades y clases
Jornadas Symfony  http://decharlas.uji.es/symfony Jornadas Symfony  http://decharlas.uji.es/symfony Domestiquemos los Formularios ¿Cómo se hace un embedded form?
Jornadas Symfony  http://decharlas.uji.es/symfony Jornadas Symfony  http://decharlas.uji.es/symfony EmbeddedForm Así se hace public function  configure() { . .. $this ->embedForm( 'newPhotos' ,  new  ObjectForm( $ObjectRelated ) ); }
Jornadas Symfony  http://decharlas.uji.es/symfony Jornadas Symfony  http://decharlas.uji.es/symfony EmbeddedForm Para esto lo he usado class  UserAdminForm  extends  BasesfGuardUserAdminForm { public function  configure() { . .. $profileForm  =  new  sfGuardUserProfileForm( $this ->object->profile); $this ->embedForm( "profile" ,  $profileForm ); } }
Jornadas Symfony  http://decharlas.uji.es/symfony Jornadas Symfony  http://decharlas.uji.es/symfony Symfony Forms SubFrameWork
Jornadas Symfony  http://decharlas.uji.es/symfony Jornadas Symfony  http://decharlas.uji.es/symfony Symfony Forms SubFrameWork +  Objeto Formulario: sfForm +  Objeto Widget: sfWidget +  Objeto Validator: sfValidator sfForm sfWidget sfValidator
Jornadas Symfony  http://decharlas.uji.es/symfony Jornadas Symfony  http://decharlas.uji.es/symfony Las Clases sfForm public function  executeContact( $request ) { $this ->form =  new  sfForm (); $this ->form->setWidgets( array ( 'name'  =>  new  sfWidgetFormInputText(), 'email'  =>  new  sfWidgetFormInputText( array ( 'default'  =>  'me@example.com' )), 'subject'  =>  new  sfWidgetFormChoice( array ( 'choices'  =>  array ( 'Subject A' ,  'Subject B' ,  'Subject C' ))), 'message'  =>  new  sfWidgetFormTextarea(), )); } sfForm
Jornadas Symfony  http://decharlas.uji.es/symfony Jornadas Symfony  http://decharlas.uji.es/symfony Las Clases sfWidget 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
Jornadas Symfony  http://decharlas.uji.es/symfony Jornadas Symfony  http://decharlas.uji.es/symfony Las Clases sfValidator 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
Jornadas Symfony  http://decharlas.uji.es/symfony Jornadas Symfony  http://decharlas.uji.es/symfony Fomularios sfForms
Jornadas Symfony  http://decharlas.uji.es/symfony Jornadas Symfony  http://decharlas.uji.es/symfony Formularios Ejemplo Formulario de Contacto public 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 request if  ( $request ->isMethod( 'post' )){ $this ->form->bind(  $request ->getParameter( $this ->form->getName()) ); if  (  $this ->form->isValid() ){ var_export (  $this ->form->getValues() ); } $this ->redirect( "module/contact" ); } }
Jornadas Symfony  http://decharlas.uji.es/symfony Jornadas Symfony  http://decharlas.uji.es/symfony Formularios Ejemplo Formulario de Contacto public 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 request if ($request->isMethod('post')){ $this->form->bind( $request->getParameter($this->form->getName()) ); if ( $this->form->isValid() ){ var_export ( $this->form->getValues() ); } $this->redirect("module/contact"); } }
Jornadas Symfony  http://decharlas.uji.es/symfony Jornadas Symfony  http://decharlas.uji.es/symfony Formularios Ejemplo Formulario de Contacto public 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 request if ($request->isMethod('post')){ $this->form->bind( $request->getParameter($this->form->getName()) ); if ( $this->form->isValid() ){ var_export ( $this->form->getValues() ); } $this->redirect("module/contact"); } }
Jornadas Symfony  http://decharlas.uji.es/symfony Jornadas Symfony  http://decharlas.uji.es/symfony Formularios Ejemplo Formulario de Contacto public 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 request if ($request->isMethod('post')){ $this->form->bind( $request->getParameter($this->form->getName()) ); if ( $this->form->isValid() ){ var_export ( $this->form->getValues() ); } $this->redirect("module/contact"); } }
Jornadas Symfony  http://decharlas.uji.es/symfony Jornadas Symfony  http://decharlas.uji.es/symfony Formularios Ejemplo Formulario de Contacto public 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 request if ($request->isMethod('post')){ $this->form->bind( $request->getParameter($this->form->getName()) ); if ( $this->form->isValid() ){ var_export ( $this->form->getValues() ); } $this->redirect("module/contact"); } }
Jornadas Symfony  http://decharlas.uji.es/symfony Jornadas Symfony  http://decharlas.uji.es/symfony Formularios Ejemplo Formulario de Contacto public 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 request if  ( $request ->isMethod( 'post' )){ $this ->form->bind(  $request ->getParameter( $this ->form->getName()) ); if  (  $this ->form->isValid() ){ var_export (  $this ->form->getValues() ); } $this->redirect("module/contact"); } }
Jornadas Symfony  http://decharlas.uji.es/symfony Jornadas Symfony  http://decharlas.uji.es/symfony Formularios Ejemplo Formulario de Contacto public 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 request if ($request->isMethod('post')){ $this->form->bind( $request->getParameter($this->form->getName()) ); if ( $this->form->isValid() ){ var_export ( $this->form->getValues() ); } $this ->redirect( "module/contact" ); } }
Jornadas Symfony  http://decharlas.uji.es/symfony Jornadas Symfony  http://decharlas.uji.es/symfony Fomularios Imprimiendo los Formularios
Jornadas Symfony  http://decharlas.uji.es/symfony Jornadas Symfony  http://decharlas.uji.es/symfony Formularios Vista del Formulario de Contacto <?php   echo  $form ->renderFormTag( '' )  ?> < table > <?php   echo  $form  ?> < tr > < td   colspan = &quot;2&quot; > < input   type = &quot;submit&quot;   /> </ 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 = &quot;submit&quot;   / d > </ li > </ ul > </ form >
Jornadas Symfony  http://decharlas.uji.es/symfony Jornadas Symfony  http://decharlas.uji.es/symfony Formularios Manipulando los campos del formulario <?php   echo  $form ->renderFormTag( '' )  ?> < ul > <?php   foreach  ( $form  as  $field ):  ?> < li > <?php   if  (  $field ->hasError() ):  ?> < div   class = &quot;error&quot; >   <?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 = &quot;submit&quot;   /> </ li > </ ul > </ form >
Jornadas Symfony  http://decharlas.uji.es/symfony Jornadas Symfony  http://decharlas.uji.es/symfony sfForm
Jornadas Symfony  http://decharlas.uji.es/symfony Jornadas Symfony  http://decharlas.uji.es/symfony sfForm sfForms, 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 ()) {} }
Jornadas Symfony  http://decharlas.uji.es/symfony Jornadas Symfony  http://decharlas.uji.es/symfony sfForm sfForm. class .php sfFormField. class .php sfFormFieldSchema. class .php sfFormFilter. class .php sfFormObject. class .php sfFormSymfony. class .php sfFormFieldSchema sfFormField sfForm ArrayAccess Countable Iterator Clases Relativas a los Formularios
Jornadas Symfony  http://decharlas.uji.es/symfony Jornadas Symfony  http://decharlas.uji.es/symfony sfForm Clases Relativas a los Formularios sfForm ArrayAccess Countable Iterator sfFormSymfony BaseForm sfFormObject
Jornadas Symfony  http://decharlas.uji.es/symfony Jornadas Symfony  http://decharlas.uji.es/symfony Widgets sfWidget sfWidgetForm sfWidgetFormInput
Jornadas Symfony  http://decharlas.uji.es/symfony Jornadas Symfony  http://decharlas.uji.es/symfony Widgets sfWidgets, Options y Attributes abstract 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 ()); }
Jornadas Symfony  http://decharlas.uji.es/symfony Jornadas Symfony  http://decharlas.uji.es/symfony Widgets Widgets en Symfony sfWidgetFormPropelChoice sfWidgetFormDoctrineChoice sfWidgetForm sfWidgetFormDateTime sfWidgetFormSelectRadio sfWidgetFormSelect sfWidgetFormFilterInput sfWidgetFormDateRange sfWidgetFormInputHidden sfWidgetFormInputFile sfWidgetFormInputText sfWidgetFormInputPassword sfWidgetFormInputFileEditable sfWidgetFormDate sfWidgetFormTime sfWidgetFormSelectCheckbox sfWidgetFormSelectMany sfWidgetFormFilterDate sfWidgetFormInput sfWidgetFormSchemaDecorator sfWidgetFormTextarea sfWidgetFormInputCheckbox sfWidgetFormChoiceBase sfWidgetFormChoice sfWidgetFormSchema sfWidgetFormSchemaFormatterTable sfWidgetFormSchemaFormatterList sfWidgetFormSchemaForEach sfWidgetFormSchemaFormatter sfWidgetFormI18nChoiceCountry sfWidgetFormI18nDate sfWidgetFormI18nTime sfWidgetFormI18nDateTime sfWidgetFormI18nChoiceCurrency sfWidgetFormI18nChoiceTimezone sfWidgetFormI18nChoiceLanguage
Jornadas Symfony  http://decharlas.uji.es/symfony Jornadas Symfony  http://decharlas.uji.es/symfony Widgets Widgets 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 , ));
Jornadas Symfony  http://decharlas.uji.es/symfony Jornadas Symfony  http://decharlas.uji.es/symfony Widgets Widgets 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' ));
Jornadas Symfony  http://decharlas.uji.es/symfony Jornadas Symfony  http://decharlas.uji.es/symfony Widgets Crear un Widget propio class  sfWidgetFormCKeditor  extends  sfWidgetFormTextarea { public function  __construct( $options  =  array  (),  $attributes  =  array  ()) { $this ->addOption( 'ckconfig' ,  array (  'toolbar'  =>  &quot;Full&quot; ,  'rows'  =>  10  ,  'cols'  =>  80  ) ); $this ->addOption( 'verify' ,  false  ); parent ::__construct( $options ,  $attributes ); } protected function  configure( $options  =  array  (),  $attributes  =  array  ()) { $this ->setAttribute( 'class' ,  &quot;ck_textarea&quot; ); } } }
Jornadas Symfony  http://decharlas.uji.es/symfony Jornadas Symfony  http://decharlas.uji.es/symfony Widgets Widgets más usados public function  render( $name ,  $value  = null,  $attributes  =  array  (),  $errors  =  array  ()){ $config = &quot;&quot;; $editor  =  $this ->renderContentTag( 'textarea' ,  self ::escapeOnce( $value ), array_merge(  array  ( 'name' => $name ),  $attributes )); $id_name = trim(preg_replace(&quot;/_{2,}/&quot;, &quot;_&quot;, preg_replace(&quot;/_{1,}$/&quot;, &quot;&quot;, preg_replace(&quot;/\[|\]/&quot;, &quot;_&quot;, $name)))); $configout = array (); foreach($this->getOption('ckconfig') as $key => $value){ $configout[] .= &quot; {$key} : \&quot;{$value}\&quot;  &quot;; } $config = &quot;, { &quot;.join(&quot;,&quot;, $configout).&quot; }&quot;; $editor .= '<script type=&quot;text/javascript&quot;> $(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 ;  } }
Jornadas Symfony  http://decharlas.uji.es/symfony Jornadas Symfony  http://decharlas.uji.es/symfony Widgets sfWidget abstract 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 ); }
Jornadas Symfony  http://decharlas.uji.es/symfony Jornadas Symfony  http://decharlas.uji.es/symfony Validators
Jornadas Symfony  http://decharlas.uji.es/symfony Jornadas Symfony  http://decharlas.uji.es/symfony Validators sfValidatorBase, 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 ); }
Jornadas Symfony  http://decharlas.uji.es/symfony Jornadas Symfony  http://decharlas.uji.es/symfony Validators Validadores de Symfony sfValidatorBase sfValidatedFile sfValidatorBoolean sfValidatorChoice sfValidatorCSRFToken sfValidatorDate sfValidatorDateRange sfValidatorDateTime sfValidatorEmail sfValidatorFile sfValidatorInteger sfValidatorNumber sfValidatorPass sfValidatorRegex sfValidatorString sfValidatorTime sfValidatorUrl sfValidatorFromDescription sfValidatorAnd sfValidatorOr sfValidatorCallback sfValidatorSchema sfValidatorSchemaCompare sfValidatorSchemaFilter sfValidatorSchemaForEach sfValidatorError sfValidatorErrorSchema sfValidatorDecorator
Jornadas Symfony  http://decharlas.uji.es/symfony Jornadas Symfony  http://decharlas.uji.es/symfony Validators Validadores 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();
Jornadas Symfony  http://decharlas.uji.es/symfony Jornadas Symfony  http://decharlas.uji.es/symfony Validators Validadores 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' => &quot;///folder&quot; ,  'mime_types' => 'web_images' ,  'max_size' => 10485760  ) );
Jornadas Symfony  http://decharlas.uji.es/symfony Jornadas Symfony  http://decharlas.uji.es/symfony Validators Inicio de la Validación //  Validación en la acción if  ( $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 ; }
Jornadas Symfony  http://decharlas.uji.es/symfony Jornadas Symfony  http://decharlas.uji.es/symfony Validators Mas 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;
Jornadas Symfony  http://decharlas.uji.es/symfony Jornadas Symfony  http://decharlas.uji.es/symfony Validators Mas 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;
Jornadas Symfony  http://decharlas.uji.es/symfony Jornadas Symfony  http://decharlas.uji.es/symfony Validators Mas 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 ); }
Jornadas Symfony  http://decharlas.uji.es/symfony Jornadas Symfony  http://decharlas.uji.es/symfony Validators Mas 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;
Jornadas Symfony  http://decharlas.uji.es/symfony Jornadas Symfony  http://decharlas.uji.es/symfony Validators Mas 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;
Jornadas Symfony  http://decharlas.uji.es/symfony Jornadas Symfony  http://decharlas.uji.es/symfony Validators Mas 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;
Jornadas Symfony  http://decharlas.uji.es/symfony Jornadas Symfony  http://decharlas.uji.es/symfony Validators Mas 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;
Jornadas Symfony  http://decharlas.uji.es/symfony Jornadas Symfony  http://decharlas.uji.es/symfony Validators Proceso 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 ; }
Jornadas Symfony  http://decharlas.uji.es/symfony Jornadas Symfony  http://decharlas.uji.es/symfony Validators Mas 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;
Jornadas Symfony  http://decharlas.uji.es/symfony Jornadas Symfony  http://decharlas.uji.es/symfony Validators Mas 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;
Jornadas Symfony  http://decharlas.uji.es/symfony Jornadas Symfony  http://decharlas.uji.es/symfony Validators Mas 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;
Jornadas Symfony  http://decharlas.uji.es/symfony Jornadas Symfony  http://decharlas.uji.es/symfony Validators Mas 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;
Jornadas Symfony  http://decharlas.uji.es/symfony Jornadas Symfony  http://decharlas.uji.es/symfony Validators Mas 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 ); }
Jornadas Symfony  http://decharlas.uji.es/symfony Jornadas Symfony  http://decharlas.uji.es/symfony Funcionalidades y Clases
Jornadas Symfony  http://decharlas.uji.es/symfony Jornadas Symfony  http://decharlas.uji.es/symfony Guardando los Formularios de Objetos Save y doSave
Jornadas Symfony  http://decharlas.uji.es/symfony Jornadas 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
Jornadas Symfony  http://decharlas.uji.es/symfony Jornadas 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( &quot;new&quot; ); } } ... 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 ; } ... }
Jornadas Symfony  http://decharlas.uji.es/symfony Jornadas Symfony  http://decharlas.uji.es/symfony Guardando los Formularios de Objetos Save y doSave sfFormObject::save(); sfFormObject::doSave(); sfFormsObject::updateObject(); sfFormDoctrine::processValues($values); sfFormObject::updateXXXColumn ($value); sfFormDoctrine::processUploadedFile(); sfFormDoctrine::doUpdateObject(); sfFormObject::updateObjectEmbeddedForms($values);
Jornadas Symfony  http://decharlas.uji.es/symfony Jornadas 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
Jornadas Symfony  http://decharlas.uji.es/symfony Jornadas 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
Jornadas Symfony  http://decharlas.uji.es/symfony Jornadas 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
Jornadas Symfony  http://decharlas.uji.es/symfony Jornadas 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
Jornadas Symfony  http://decharlas.uji.es/symfony Jornadas 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
Jornadas Symfony  http://decharlas.uji.es/symfony Jornadas 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
Jornadas Symfony  http://decharlas.uji.es/symfony Jornadas 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
Jornadas Symfony  http://decharlas.uji.es/symfony Jornadas 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
Jornadas Symfony  http://decharlas.uji.es/symfony Jornadas 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
Jornadas Symfony  http://decharlas.uji.es/symfony Jornadas Symfony  http://decharlas.uji.es/symfony Formularios de Objetos Las Clases
Jornadas Symfony  http://decharlas.uji.es/symfony Jornadas Symfony  http://decharlas.uji.es/symfony Formularios de Objetos sfForm Las Clases ArticleForm BaseArticleForm BaseFormDoctrine sfFormDoctrine sfFormObject BaseForm sfFormSymfony ArrayAccess Countable Iterator
Jornadas Symfony  http://decharlas.uji.es/symfony Jornadas Symfony  http://decharlas.uji.es/symfony Filtros del Admin Generator Las Clases
Jornadas Symfony  http://decharlas.uji.es/symfony Jornadas Symfony  http://decharlas.uji.es/symfony Formularios de Objetos sfForm Las Clases ArticleForm BaseArticleFormFilter BaseFormFilterDoctrine sfFormFilterDoctrine sfFormFilter BaseForm sfFormSymfony ArrayAccess Countable Iterator
Jornadas Symfony  http://decharlas.uji.es/symfony Jornadas Symfony  http://decharlas.uji.es/symfony Comparación de Clases Las Clases ArticleFormFilter BaseArticleFormFilter BaseFormFilterDoctrine sfFormFilterDoctrine sfFormFilter BaseForm ArticleForm BaseArticleForm BaseFormDoctrine sfFormDoctrine sfFormObject BaseForm
Jornadas Symfony  http://decharlas.uji.es/symfony Jornadas Symfony  http://decharlas.uji.es/symfony Muchas Gracias CTO José Antonio Pio Gil
Jornadas Symfony  http://decharlas.uji.es/symfony Jornadas Symfony  http://decharlas.uji.es/symfony [email_address] http://twitter.com/josetonyp

More Related Content

PDF
Curso Symfony - Clase 1
Javier Eguiluz
 
PDF
Silex al límite
Javier Eguiluz
 
PDF
Twig, los mejores trucos y técnicas avanzadas
Javier Eguiluz
 
PDF
Aviso concurso ingreso planta ssmn (1)
SSMN
 
PDF
Good practices in intermunicipal co-operation in Europe
Inter-municipal Land Use Planning (see also on Wikipedia)
 
PDF
Carta de veneza
Beatriz Ariane Gouveia
 
PPT
Drupal Cms Prezentace
guest3d443e
 
PDF
udt
Movb Glez
 
Curso Symfony - Clase 1
Javier Eguiluz
 
Silex al límite
Javier Eguiluz
 
Twig, los mejores trucos y técnicas avanzadas
Javier Eguiluz
 
Aviso concurso ingreso planta ssmn (1)
SSMN
 
Good practices in intermunicipal co-operation in Europe
Inter-municipal Land Use Planning (see also on Wikipedia)
 
Carta de veneza
Beatriz Ariane Gouveia
 
Drupal Cms Prezentace
guest3d443e
 

What's hot (19)

PPTX
Silex. Микрофреймворк для микроприложений
Softline
 
PDF
Performance Web além do carregamento
Caelum
 
PDF
Romo morin ana paola la educacion democratica en john dewey
Adalberto
 
PDF
Desafios de Performance Web - BrazilJS
Caelum
 
PDF
Fisioterapia acelerada lesiones_musculares
Israel Kine Cortes
 
PDF
AMEDEO CENCINI: CARTA A UN JOVEN QUE NO SABE QUE ES LLAMADO
COMISION INTERNACIONAL DE DIVULGACION
 
ODP
Form refactoring
Manuel Baldassarri
 
PDF
3dsmax co ban
Giang Nguyễn
 
PDF
Noticias128
Museo de Cáceres
 
PDF
Introduction To Financial Planning And Wealth Advice
Frank Agliotti
 
PDF
Ciclo vital administracion documental
jeniffer4
 
PDF
Presentatie voor personeelsvergadering 20090414
Karla De Greeve
 
PDF
Moinho
Amadeu Sousa
 
PDF
MUSEO DE CACERES
MALTLuengo
 
TXT
Banner kiri kanan1
Afrianto Budi
 
PDF
การตกแต่งพื้นหลังให้กับสไลด์
เทวัญ ภูพานทอง
 
PDF
PHPのすべらない話#3
Moriyoshi Koizumi
 
PDF
Derecho ad
Alejandro Blnn
 
Silex. Микрофреймворк для микроприложений
Softline
 
Performance Web além do carregamento
Caelum
 
Romo morin ana paola la educacion democratica en john dewey
Adalberto
 
Desafios de Performance Web - BrazilJS
Caelum
 
Fisioterapia acelerada lesiones_musculares
Israel Kine Cortes
 
AMEDEO CENCINI: CARTA A UN JOVEN QUE NO SABE QUE ES LLAMADO
COMISION INTERNACIONAL DE DIVULGACION
 
Form refactoring
Manuel Baldassarri
 
3dsmax co ban
Giang Nguyễn
 
Noticias128
Museo de Cáceres
 
Introduction To Financial Planning And Wealth Advice
Frank Agliotti
 
Ciclo vital administracion documental
jeniffer4
 
Presentatie voor personeelsvergadering 20090414
Karla De Greeve
 
Moinho
Amadeu Sousa
 
MUSEO DE CACERES
MALTLuengo
 
Banner kiri kanan1
Afrianto Budi
 
การตกแต่งพื้นหลังให้กับสไลด์
เทวัญ ภูพานทอง
 
PHPのすべらない話#3
Moriyoshi Koizumi
 
Derecho ad
Alejandro Blnn
 
Ad

Viewers also liked (8)

PPTX
Media evaluation 1
kerrymay
 
DOC
Thi pháp: Thơ Đường luật Việt Nam
longvanhien
 
PPTX
Log into glogster edu
InfowhizDCSD
 
PPTX
EDU PPT
harig1nj
 
PPT
Full Interview
kerrymay
 
PPTX
La importancia de las palabras clave
SMOing
 
PDF
How to Become a Thought Leader in Your Niche
Leslie Samuel
 
Media evaluation 1
kerrymay
 
Thi pháp: Thơ Đường luật Việt Nam
longvanhien
 
Log into glogster edu
InfowhizDCSD
 
EDU PPT
harig1nj
 
Full Interview
kerrymay
 
La importancia de las palabras clave
SMOing
 
How to Become a Thought Leader in Your Niche
Leslie Samuel
 
Ad

Symfony: Domesticando los Formularios

  • 1. Castellón - 5 y 6 de Julio 2010 – Universitat Jaume I organizan patrocinan colaboran Jornadas Symfony 5 y 6 de julio 2010 Universitat Jaume I, Castellón http://decharlas.uji.es/symfony
  • 2. tr Jornadas Symfony http://decharlas.uji.es/symfony Jornadas Symfony http://decharlas.uji.es/symfony hacemos Webs!
  • 3. Jornadas Symfony 5 y 6 de julio 2010 Universitat Jaume I, Castellón http://decharlas.uji.es/symfony Domesticando los formularios: sfForm Jose Antonio Pio Acilia.es
  • 4. Jornadas Symfony http://decharlas.uji.es/symfony Presentación CTO 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
  • 5. Jornadas Symfony http://decharlas.uji.es/symfony Presentación Proyectos con Symfony Jornadas Symfony http://decharlas.uji.es/symfony
  • 6. Jornadas Symfony http://decharlas.uji.es/symfony Presentación Proyectos con Symfony Jornadas Symfony http://decharlas.uji.es/symfony notodohoteles.com, quiniela15.com (cache) CondeNast - Profesional Vogue GQ
  • 7. Jornadas Symfony http://decharlas.uji.es/symfony Jornadas Symfony http://decharlas.uji.es/symfony Domesticando los formularios: sfForm Contenido
  • 8. Jornadas Symfony http://decharlas.uji.es/symfony Jornadas Symfony http://decharlas.uji.es/symfony Contenido + Formularios el SubFramework + Las Clases + Formularios + Widgets + Validators + Funcionalidades y clases
  • 9. Jornadas Symfony http://decharlas.uji.es/symfony Jornadas Symfony http://decharlas.uji.es/symfony Domestiquemos los Formularios ¿Cómo se hace un embedded form?
  • 10. Jornadas Symfony http://decharlas.uji.es/symfony Jornadas Symfony http://decharlas.uji.es/symfony EmbeddedForm Así se hace public function configure() { . .. $this ->embedForm( 'newPhotos' , new ObjectForm( $ObjectRelated ) ); }
  • 11. Jornadas Symfony http://decharlas.uji.es/symfony Jornadas Symfony http://decharlas.uji.es/symfony EmbeddedForm Para esto lo he usado class UserAdminForm extends BasesfGuardUserAdminForm { public function configure() { . .. $profileForm = new sfGuardUserProfileForm( $this ->object->profile); $this ->embedForm( &quot;profile&quot; , $profileForm ); } }
  • 12. Jornadas Symfony http://decharlas.uji.es/symfony Jornadas Symfony http://decharlas.uji.es/symfony Symfony Forms SubFrameWork
  • 13. Jornadas Symfony http://decharlas.uji.es/symfony Jornadas Symfony http://decharlas.uji.es/symfony Symfony Forms SubFrameWork + Objeto Formulario: sfForm + Objeto Widget: sfWidget + Objeto Validator: sfValidator sfForm sfWidget sfValidator
  • 14. Jornadas Symfony http://decharlas.uji.es/symfony Jornadas Symfony http://decharlas.uji.es/symfony Las Clases sfForm 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
  • 15. Jornadas Symfony http://decharlas.uji.es/symfony Jornadas Symfony http://decharlas.uji.es/symfony Las Clases sfWidget 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
  • 16. Jornadas Symfony http://decharlas.uji.es/symfony Jornadas Symfony http://decharlas.uji.es/symfony Las Clases sfValidator 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
  • 17. Jornadas Symfony http://decharlas.uji.es/symfony Jornadas Symfony http://decharlas.uji.es/symfony Fomularios sfForms
  • 18. Jornadas Symfony http://decharlas.uji.es/symfony Jornadas Symfony http://decharlas.uji.es/symfony Formularios Ejemplo Formulario de Contacto public 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 request if ( $request ->isMethod( 'post' )){ $this ->form->bind( $request ->getParameter( $this ->form->getName()) ); if ( $this ->form->isValid() ){ var_export ( $this ->form->getValues() ); } $this ->redirect( &quot;module/contact&quot; ); } }
  • 19. Jornadas Symfony http://decharlas.uji.es/symfony Jornadas Symfony http://decharlas.uji.es/symfony Formularios Ejemplo Formulario de Contacto public 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 request if ($request->isMethod('post')){ $this->form->bind( $request->getParameter($this->form->getName()) ); if ( $this->form->isValid() ){ var_export ( $this->form->getValues() ); } $this->redirect(&quot;module/contact&quot;); } }
  • 20. Jornadas Symfony http://decharlas.uji.es/symfony Jornadas Symfony http://decharlas.uji.es/symfony Formularios Ejemplo Formulario de Contacto public 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 request if ($request->isMethod('post')){ $this->form->bind( $request->getParameter($this->form->getName()) ); if ( $this->form->isValid() ){ var_export ( $this->form->getValues() ); } $this->redirect(&quot;module/contact&quot;); } }
  • 21. Jornadas Symfony http://decharlas.uji.es/symfony Jornadas Symfony http://decharlas.uji.es/symfony Formularios Ejemplo Formulario de Contacto public 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 request if ($request->isMethod('post')){ $this->form->bind( $request->getParameter($this->form->getName()) ); if ( $this->form->isValid() ){ var_export ( $this->form->getValues() ); } $this->redirect(&quot;module/contact&quot;); } }
  • 22. Jornadas Symfony http://decharlas.uji.es/symfony Jornadas Symfony http://decharlas.uji.es/symfony Formularios Ejemplo Formulario de Contacto public 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 request if ($request->isMethod('post')){ $this->form->bind( $request->getParameter($this->form->getName()) ); if ( $this->form->isValid() ){ var_export ( $this->form->getValues() ); } $this->redirect(&quot;module/contact&quot;); } }
  • 23. Jornadas Symfony http://decharlas.uji.es/symfony Jornadas Symfony http://decharlas.uji.es/symfony Formularios Ejemplo Formulario de Contacto public 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 request if ( $request ->isMethod( 'post' )){ $this ->form->bind( $request ->getParameter( $this ->form->getName()) ); if ( $this ->form->isValid() ){ var_export ( $this ->form->getValues() ); } $this->redirect(&quot;module/contact&quot;); } }
  • 24. Jornadas Symfony http://decharlas.uji.es/symfony Jornadas Symfony http://decharlas.uji.es/symfony Formularios Ejemplo Formulario de Contacto public 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 request if ($request->isMethod('post')){ $this->form->bind( $request->getParameter($this->form->getName()) ); if ( $this->form->isValid() ){ var_export ( $this->form->getValues() ); } $this ->redirect( &quot;module/contact&quot; ); } }
  • 25. Jornadas Symfony http://decharlas.uji.es/symfony Jornadas Symfony http://decharlas.uji.es/symfony Fomularios Imprimiendo los Formularios
  • 26. Jornadas Symfony http://decharlas.uji.es/symfony Jornadas Symfony http://decharlas.uji.es/symfony Formularios Vista del Formulario de Contacto <?php echo $form ->renderFormTag( '' ) ?> < table > <?php echo $form ?> < tr > < td colspan = &quot;2&quot; > < input type = &quot;submit&quot; /> </ 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 = &quot;submit&quot; / d > </ li > </ ul > </ form >
  • 27. Jornadas Symfony http://decharlas.uji.es/symfony Jornadas Symfony http://decharlas.uji.es/symfony Formularios Manipulando los campos del formulario <?php echo $form ->renderFormTag( '' ) ?> < ul > <?php foreach ( $form as $field ): ?> < li > <?php if ( $field ->hasError() ): ?> < div class = &quot;error&quot; > <?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 = &quot;submit&quot; /> </ li > </ ul > </ form >
  • 28. Jornadas Symfony http://decharlas.uji.es/symfony Jornadas Symfony http://decharlas.uji.es/symfony sfForm
  • 29. Jornadas Symfony http://decharlas.uji.es/symfony Jornadas Symfony http://decharlas.uji.es/symfony sfForm sfForms, 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 ()) {} }
  • 30. Jornadas Symfony http://decharlas.uji.es/symfony Jornadas Symfony http://decharlas.uji.es/symfony sfForm sfForm. class .php sfFormField. class .php sfFormFieldSchema. class .php sfFormFilter. class .php sfFormObject. class .php sfFormSymfony. class .php sfFormFieldSchema sfFormField sfForm ArrayAccess Countable Iterator Clases Relativas a los Formularios
  • 31. Jornadas Symfony http://decharlas.uji.es/symfony Jornadas Symfony http://decharlas.uji.es/symfony sfForm Clases Relativas a los Formularios sfForm ArrayAccess Countable Iterator sfFormSymfony BaseForm sfFormObject
  • 32. Jornadas Symfony http://decharlas.uji.es/symfony Jornadas Symfony http://decharlas.uji.es/symfony Widgets sfWidget sfWidgetForm sfWidgetFormInput
  • 33. Jornadas Symfony http://decharlas.uji.es/symfony Jornadas Symfony http://decharlas.uji.es/symfony Widgets sfWidgets, Options y Attributes abstract 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 ()); }
  • 34. Jornadas Symfony http://decharlas.uji.es/symfony Jornadas Symfony http://decharlas.uji.es/symfony Widgets Widgets en Symfony sfWidgetFormPropelChoice sfWidgetFormDoctrineChoice sfWidgetForm sfWidgetFormDateTime sfWidgetFormSelectRadio sfWidgetFormSelect sfWidgetFormFilterInput sfWidgetFormDateRange sfWidgetFormInputHidden sfWidgetFormInputFile sfWidgetFormInputText sfWidgetFormInputPassword sfWidgetFormInputFileEditable sfWidgetFormDate sfWidgetFormTime sfWidgetFormSelectCheckbox sfWidgetFormSelectMany sfWidgetFormFilterDate sfWidgetFormInput sfWidgetFormSchemaDecorator sfWidgetFormTextarea sfWidgetFormInputCheckbox sfWidgetFormChoiceBase sfWidgetFormChoice sfWidgetFormSchema sfWidgetFormSchemaFormatterTable sfWidgetFormSchemaFormatterList sfWidgetFormSchemaForEach sfWidgetFormSchemaFormatter sfWidgetFormI18nChoiceCountry sfWidgetFormI18nDate sfWidgetFormI18nTime sfWidgetFormI18nDateTime sfWidgetFormI18nChoiceCurrency sfWidgetFormI18nChoiceTimezone sfWidgetFormI18nChoiceLanguage
  • 35. Jornadas Symfony http://decharlas.uji.es/symfony Jornadas Symfony http://decharlas.uji.es/symfony Widgets Widgets 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 , ));
  • 36. Jornadas Symfony http://decharlas.uji.es/symfony Jornadas Symfony http://decharlas.uji.es/symfony Widgets Widgets 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' ));
  • 37. Jornadas Symfony http://decharlas.uji.es/symfony Jornadas Symfony http://decharlas.uji.es/symfony Widgets Crear un Widget propio class sfWidgetFormCKeditor extends sfWidgetFormTextarea { public function __construct( $options = array (), $attributes = array ()) { $this ->addOption( 'ckconfig' , array ( 'toolbar' => &quot;Full&quot; , 'rows' => 10 , 'cols' => 80 ) ); $this ->addOption( 'verify' , false ); parent ::__construct( $options , $attributes ); } protected function configure( $options = array (), $attributes = array ()) { $this ->setAttribute( 'class' , &quot;ck_textarea&quot; ); } } }
  • 38. Jornadas Symfony http://decharlas.uji.es/symfony Jornadas Symfony http://decharlas.uji.es/symfony Widgets Widgets más usados public function render( $name , $value = null, $attributes = array (), $errors = array ()){ $config = &quot;&quot;; $editor = $this ->renderContentTag( 'textarea' , self ::escapeOnce( $value ), array_merge( array ( 'name' => $name ), $attributes )); $id_name = trim(preg_replace(&quot;/_{2,}/&quot;, &quot;_&quot;, preg_replace(&quot;/_{1,}$/&quot;, &quot;&quot;, preg_replace(&quot;/\[|\]/&quot;, &quot;_&quot;, $name)))); $configout = array (); foreach($this->getOption('ckconfig') as $key => $value){ $configout[] .= &quot; {$key} : \&quot;{$value}\&quot; &quot;; } $config = &quot;, { &quot;.join(&quot;,&quot;, $configout).&quot; }&quot;; $editor .= '<script type=&quot;text/javascript&quot;> $(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 ; } }
  • 39. Jornadas Symfony http://decharlas.uji.es/symfony Jornadas Symfony http://decharlas.uji.es/symfony Widgets sfWidget abstract 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 ); }
  • 40. Jornadas Symfony http://decharlas.uji.es/symfony Jornadas Symfony http://decharlas.uji.es/symfony Validators
  • 41. Jornadas Symfony http://decharlas.uji.es/symfony Jornadas Symfony http://decharlas.uji.es/symfony Validators sfValidatorBase, 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 ); }
  • 42. Jornadas Symfony http://decharlas.uji.es/symfony Jornadas Symfony http://decharlas.uji.es/symfony Validators Validadores de Symfony sfValidatorBase sfValidatedFile sfValidatorBoolean sfValidatorChoice sfValidatorCSRFToken sfValidatorDate sfValidatorDateRange sfValidatorDateTime sfValidatorEmail sfValidatorFile sfValidatorInteger sfValidatorNumber sfValidatorPass sfValidatorRegex sfValidatorString sfValidatorTime sfValidatorUrl sfValidatorFromDescription sfValidatorAnd sfValidatorOr sfValidatorCallback sfValidatorSchema sfValidatorSchemaCompare sfValidatorSchemaFilter sfValidatorSchemaForEach sfValidatorError sfValidatorErrorSchema sfValidatorDecorator
  • 43. Jornadas Symfony http://decharlas.uji.es/symfony Jornadas Symfony http://decharlas.uji.es/symfony Validators Validadores 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();
  • 44. Jornadas Symfony http://decharlas.uji.es/symfony Jornadas Symfony http://decharlas.uji.es/symfony Validators Validadores 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' => &quot;///folder&quot; , 'mime_types' => 'web_images' , 'max_size' => 10485760 ) );
  • 45. Jornadas Symfony http://decharlas.uji.es/symfony Jornadas Symfony http://decharlas.uji.es/symfony Validators Inicio de la Validación // Validación en la acción if ( $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 ; }
  • 46. Jornadas Symfony http://decharlas.uji.es/symfony Jornadas Symfony http://decharlas.uji.es/symfony Validators Mas 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;
  • 47. Jornadas Symfony http://decharlas.uji.es/symfony Jornadas Symfony http://decharlas.uji.es/symfony Validators Mas 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;
  • 48. Jornadas Symfony http://decharlas.uji.es/symfony Jornadas Symfony http://decharlas.uji.es/symfony Validators Mas 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 ); }
  • 49. Jornadas Symfony http://decharlas.uji.es/symfony Jornadas Symfony http://decharlas.uji.es/symfony Validators Mas 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;
  • 50. Jornadas Symfony http://decharlas.uji.es/symfony Jornadas Symfony http://decharlas.uji.es/symfony Validators Mas 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;
  • 51. Jornadas Symfony http://decharlas.uji.es/symfony Jornadas Symfony http://decharlas.uji.es/symfony Validators Mas 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;
  • 52. Jornadas Symfony http://decharlas.uji.es/symfony Jornadas Symfony http://decharlas.uji.es/symfony Validators Mas 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;
  • 53. Jornadas Symfony http://decharlas.uji.es/symfony Jornadas Symfony http://decharlas.uji.es/symfony Validators Proceso 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 ; }
  • 54. Jornadas Symfony http://decharlas.uji.es/symfony Jornadas Symfony http://decharlas.uji.es/symfony Validators Mas 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;
  • 55. Jornadas Symfony http://decharlas.uji.es/symfony Jornadas Symfony http://decharlas.uji.es/symfony Validators Mas 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;
  • 56. Jornadas Symfony http://decharlas.uji.es/symfony Jornadas Symfony http://decharlas.uji.es/symfony Validators Mas 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;
  • 57. Jornadas Symfony http://decharlas.uji.es/symfony Jornadas Symfony http://decharlas.uji.es/symfony Validators Mas 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;
  • 58. Jornadas Symfony http://decharlas.uji.es/symfony Jornadas Symfony http://decharlas.uji.es/symfony Validators Mas 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 ); }
  • 59. Jornadas Symfony http://decharlas.uji.es/symfony Jornadas Symfony http://decharlas.uji.es/symfony Funcionalidades y Clases
  • 60. Jornadas Symfony http://decharlas.uji.es/symfony Jornadas Symfony http://decharlas.uji.es/symfony Guardando los Formularios de Objetos Save y doSave
  • 61. Jornadas Symfony http://decharlas.uji.es/symfony Jornadas 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
  • 62. Jornadas Symfony http://decharlas.uji.es/symfony Jornadas 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( &quot;new&quot; ); } } ... 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 ; } ... }
  • 63. Jornadas Symfony http://decharlas.uji.es/symfony Jornadas Symfony http://decharlas.uji.es/symfony Guardando los Formularios de Objetos Save y doSave sfFormObject::save(); sfFormObject::doSave(); sfFormsObject::updateObject(); sfFormDoctrine::processValues($values); sfFormObject::updateXXXColumn ($value); sfFormDoctrine::processUploadedFile(); sfFormDoctrine::doUpdateObject(); sfFormObject::updateObjectEmbeddedForms($values);
  • 64. Jornadas Symfony http://decharlas.uji.es/symfony Jornadas 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
  • 65. Jornadas Symfony http://decharlas.uji.es/symfony Jornadas 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
  • 66. Jornadas Symfony http://decharlas.uji.es/symfony Jornadas 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
  • 67. Jornadas Symfony http://decharlas.uji.es/symfony Jornadas 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
  • 68. Jornadas Symfony http://decharlas.uji.es/symfony Jornadas 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
  • 69. Jornadas Symfony http://decharlas.uji.es/symfony Jornadas 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
  • 70. Jornadas Symfony http://decharlas.uji.es/symfony Jornadas 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
  • 71. Jornadas Symfony http://decharlas.uji.es/symfony Jornadas 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
  • 72. Jornadas Symfony http://decharlas.uji.es/symfony Jornadas 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
  • 73. Jornadas Symfony http://decharlas.uji.es/symfony Jornadas Symfony http://decharlas.uji.es/symfony Formularios de Objetos Las Clases
  • 74. Jornadas Symfony http://decharlas.uji.es/symfony Jornadas Symfony http://decharlas.uji.es/symfony Formularios de Objetos sfForm Las Clases ArticleForm BaseArticleForm BaseFormDoctrine sfFormDoctrine sfFormObject BaseForm sfFormSymfony ArrayAccess Countable Iterator
  • 75. Jornadas Symfony http://decharlas.uji.es/symfony Jornadas Symfony http://decharlas.uji.es/symfony Filtros del Admin Generator Las Clases
  • 76. Jornadas Symfony http://decharlas.uji.es/symfony Jornadas Symfony http://decharlas.uji.es/symfony Formularios de Objetos sfForm Las Clases ArticleForm BaseArticleFormFilter BaseFormFilterDoctrine sfFormFilterDoctrine sfFormFilter BaseForm sfFormSymfony ArrayAccess Countable Iterator
  • 77. Jornadas Symfony http://decharlas.uji.es/symfony Jornadas Symfony http://decharlas.uji.es/symfony Comparación de Clases Las Clases ArticleFormFilter BaseArticleFormFilter BaseFormFilterDoctrine sfFormFilterDoctrine sfFormFilter BaseForm ArticleForm BaseArticleForm BaseFormDoctrine sfFormDoctrine sfFormObject BaseForm
  • 78. Jornadas Symfony http://decharlas.uji.es/symfony Jornadas Symfony http://decharlas.uji.es/symfony Muchas Gracias CTO José Antonio Pio Gil
  • 79. Jornadas Symfony http://decharlas.uji.es/symfony Jornadas Symfony http://decharlas.uji.es/symfony [email_address] http://twitter.com/josetonyp

Editor's Notes

  • #3: Mejoras que intenta aportar: Es mejor utilizar un pie de página en vez de una cabecera, para dejar libre la parte superior de cada transparencia. El pie de página incluye una vez más publicidad de decharlas.com
  • #5: Mejoras que intenta aportar: Es mejor utilizar un pie de página en vez de una cabecera, para dejar libre la parte superior de cada transparencia. El pie de página incluye una vez más publicidad de decharlas.com
  • #6: Mejoras que intenta aportar: Es mejor utilizar un pie de página en vez de una cabecera, para dejar libre la parte superior de cada transparencia. El pie de página incluye una vez más publicidad de decharlas.com
  • #7: Mejoras que intenta aportar: Es mejor utilizar un pie de página en vez de una cabecera, para dejar libre la parte superior de cada transparencia. El pie de página incluye una vez más publicidad de decharlas.com
  • #8: Mejoras que intenta aportar: Es mejor utilizar un pie de página en vez de una cabecera, para dejar libre la parte superior de cada transparencia. El pie de página incluye una vez más publicidad de decharlas.com
  • #9: Mejoras que intenta aportar: Es mejor utilizar un pie de página en vez de una cabecera, para dejar libre la parte superior de cada transparencia. El pie de página incluye una vez más publicidad de decharlas.com
  • #10: Mejoras que intenta aportar: Es mejor utilizar un pie de página en vez de una cabecera, para dejar libre la parte superior de cada transparencia. El pie de página incluye una vez más publicidad de decharlas.com
  • #11: Mejoras que intenta aportar: Es mejor utilizar un pie de página en vez de una cabecera, para dejar libre la parte superior de cada transparencia. El pie de página incluye una vez más publicidad de decharlas.com
  • #12: Mejoras que intenta aportar: Es mejor utilizar un pie de página en vez de una cabecera, para dejar libre la parte superior de cada transparencia. El pie de página incluye una vez más publicidad de decharlas.com
  • #13: Mejoras que intenta aportar: Es mejor utilizar un pie de página en vez de una cabecera, para dejar libre la parte superior de cada transparencia. El pie de página incluye una vez más publicidad de decharlas.com
  • #14: Mejoras que intenta aportar: Es mejor utilizar un pie de página en vez de una cabecera, para dejar libre la parte superior de cada transparencia. El pie de página incluye una vez más publicidad de decharlas.com
  • #15: Mejoras que intenta aportar: Es mejor utilizar un pie de página en vez de una cabecera, para dejar libre la parte superior de cada transparencia. El pie de página incluye una vez más publicidad de decharlas.com
  • #16: Mejoras que intenta aportar: Es mejor utilizar un pie de página en vez de una cabecera, para dejar libre la parte superior de cada transparencia. El pie de página incluye una vez más publicidad de decharlas.com
  • #17: Mejoras que intenta aportar: Es mejor utilizar un pie de página en vez de una cabecera, para dejar libre la parte superior de cada transparencia. El pie de página incluye una vez más publicidad de decharlas.com
  • #18: Mejoras que intenta aportar: Es mejor utilizar un pie de página en vez de una cabecera, para dejar libre la parte superior de cada transparencia. El pie de página incluye una vez más publicidad de decharlas.com
  • #19: Mejoras que intenta aportar: Es mejor utilizar un pie de página en vez de una cabecera, para dejar libre la parte superior de cada transparencia. El pie de página incluye una vez más publicidad de decharlas.com
  • #20: Mejoras que intenta aportar: Es mejor utilizar un pie de página en vez de una cabecera, para dejar libre la parte superior de cada transparencia. El pie de página incluye una vez más publicidad de decharlas.com
  • #21: Mejoras que intenta aportar: Es mejor utilizar un pie de página en vez de una cabecera, para dejar libre la parte superior de cada transparencia. El pie de página incluye una vez más publicidad de decharlas.com
  • #22: Mejoras que intenta aportar: Es mejor utilizar un pie de página en vez de una cabecera, para dejar libre la parte superior de cada transparencia. El pie de página incluye una vez más publicidad de decharlas.com
  • #23: Mejoras que intenta aportar: Es mejor utilizar un pie de página en vez de una cabecera, para dejar libre la parte superior de cada transparencia. El pie de página incluye una vez más publicidad de decharlas.com
  • #24: Mejoras que intenta aportar: Es mejor utilizar un pie de página en vez de una cabecera, para dejar libre la parte superior de cada transparencia. El pie de página incluye una vez más publicidad de decharlas.com
  • #25: Mejoras que intenta aportar: Es mejor utilizar un pie de página en vez de una cabecera, para dejar libre la parte superior de cada transparencia. El pie de página incluye una vez más publicidad de decharlas.com
  • #26: Mejoras que intenta aportar: Es mejor utilizar un pie de página en vez de una cabecera, para dejar libre la parte superior de cada transparencia. El pie de página incluye una vez más publicidad de decharlas.com
  • #27: Mejoras que intenta aportar: Es mejor utilizar un pie de página en vez de una cabecera, para dejar libre la parte superior de cada transparencia. El pie de página incluye una vez más publicidad de decharlas.com
  • #28: Mejoras que intenta aportar: Es mejor utilizar un pie de página en vez de una cabecera, para dejar libre la parte superior de cada transparencia. El pie de página incluye una vez más publicidad de decharlas.com
  • #29: Mejoras que intenta aportar: Es mejor utilizar un pie de página en vez de una cabecera, para dejar libre la parte superior de cada transparencia. El pie de página incluye una vez más publicidad de decharlas.com
  • #30: Mejoras que intenta aportar: Es mejor utilizar un pie de página en vez de una cabecera, para dejar libre la parte superior de cada transparencia. El pie de página incluye una vez más publicidad de decharlas.com
  • #31: Mejoras que intenta aportar: Es mejor utilizar un pie de página en vez de una cabecera, para dejar libre la parte superior de cada transparencia. El pie de página incluye una vez más publicidad de decharlas.com
  • #32: Mejoras que intenta aportar: Es mejor utilizar un pie de página en vez de una cabecera, para dejar libre la parte superior de cada transparencia. El pie de página incluye una vez más publicidad de decharlas.com
  • #33: Mejoras que intenta aportar: Es mejor utilizar un pie de página en vez de una cabecera, para dejar libre la parte superior de cada transparencia. El pie de página incluye una vez más publicidad de decharlas.com
  • #34: Mejoras que intenta aportar: Es mejor utilizar un pie de página en vez de una cabecera, para dejar libre la parte superior de cada transparencia. El pie de página incluye una vez más publicidad de decharlas.com
  • #35: Mejoras que intenta aportar: Es mejor utilizar un pie de página en vez de una cabecera, para dejar libre la parte superior de cada transparencia. El pie de página incluye una vez más publicidad de decharlas.com
  • #36: Mejoras que intenta aportar: Es mejor utilizar un pie de página en vez de una cabecera, para dejar libre la parte superior de cada transparencia. El pie de página incluye una vez más publicidad de decharlas.com
  • #37: Mejoras que intenta aportar: Es mejor utilizar un pie de página en vez de una cabecera, para dejar libre la parte superior de cada transparencia. El pie de página incluye una vez más publicidad de decharlas.com
  • #38: Mejoras que intenta aportar: Es mejor utilizar un pie de página en vez de una cabecera, para dejar libre la parte superior de cada transparencia. El pie de página incluye una vez más publicidad de decharlas.com
  • #39: Mejoras que intenta aportar: Es mejor utilizar un pie de página en vez de una cabecera, para dejar libre la parte superior de cada transparencia. El pie de página incluye una vez más publicidad de decharlas.com
  • #40: Mejoras que intenta aportar: Es mejor utilizar un pie de página en vez de una cabecera, para dejar libre la parte superior de cada transparencia. El pie de página incluye una vez más publicidad de decharlas.com
  • #41: Mejoras que intenta aportar: Es mejor utilizar un pie de página en vez de una cabecera, para dejar libre la parte superior de cada transparencia. El pie de página incluye una vez más publicidad de decharlas.com
  • #42: Mejoras que intenta aportar: Es mejor utilizar un pie de página en vez de una cabecera, para dejar libre la parte superior de cada transparencia. El pie de página incluye una vez más publicidad de decharlas.com
  • #43: Mejoras que intenta aportar: Es mejor utilizar un pie de página en vez de una cabecera, para dejar libre la parte superior de cada transparencia. El pie de página incluye una vez más publicidad de decharlas.com
  • #44: Mejoras que intenta aportar: Es mejor utilizar un pie de página en vez de una cabecera, para dejar libre la parte superior de cada transparencia. El pie de página incluye una vez más publicidad de decharlas.com
  • #45: Mejoras que intenta aportar: Es mejor utilizar un pie de página en vez de una cabecera, para dejar libre la parte superior de cada transparencia. El pie de página incluye una vez más publicidad de decharlas.com
  • #46: Mejoras que intenta aportar: Es mejor utilizar un pie de página en vez de una cabecera, para dejar libre la parte superior de cada transparencia. El pie de página incluye una vez más publicidad de decharlas.com
  • #47: Mejoras que intenta aportar: Es mejor utilizar un pie de página en vez de una cabecera, para dejar libre la parte superior de cada transparencia. El pie de página incluye una vez más publicidad de decharlas.com
  • #48: Mejoras que intenta aportar: Es mejor utilizar un pie de página en vez de una cabecera, para dejar libre la parte superior de cada transparencia. El pie de página incluye una vez más publicidad de decharlas.com
  • #49: Mejoras que intenta aportar: Es mejor utilizar un pie de página en vez de una cabecera, para dejar libre la parte superior de cada transparencia. El pie de página incluye una vez más publicidad de decharlas.com
  • #50: Mejoras que intenta aportar: Es mejor utilizar un pie de página en vez de una cabecera, para dejar libre la parte superior de cada transparencia. El pie de página incluye una vez más publicidad de decharlas.com
  • #51: Mejoras que intenta aportar: Es mejor utilizar un pie de página en vez de una cabecera, para dejar libre la parte superior de cada transparencia. El pie de página incluye una vez más publicidad de decharlas.com
  • #52: Mejoras que intenta aportar: Es mejor utilizar un pie de página en vez de una cabecera, para dejar libre la parte superior de cada transparencia. El pie de página incluye una vez más publicidad de decharlas.com
  • #53: Mejoras que intenta aportar: Es mejor utilizar un pie de página en vez de una cabecera, para dejar libre la parte superior de cada transparencia. El pie de página incluye una vez más publicidad de decharlas.com
  • #54: Mejoras que intenta aportar: Es mejor utilizar un pie de página en vez de una cabecera, para dejar libre la parte superior de cada transparencia. El pie de página incluye una vez más publicidad de decharlas.com
  • #55: Mejoras que intenta aportar: Es mejor utilizar un pie de página en vez de una cabecera, para dejar libre la parte superior de cada transparencia. El pie de página incluye una vez más publicidad de decharlas.com
  • #56: Mejoras que intenta aportar: Es mejor utilizar un pie de página en vez de una cabecera, para dejar libre la parte superior de cada transparencia. El pie de página incluye una vez más publicidad de decharlas.com
  • #57: Mejoras que intenta aportar: Es mejor utilizar un pie de página en vez de una cabecera, para dejar libre la parte superior de cada transparencia. El pie de página incluye una vez más publicidad de decharlas.com
  • #58: Mejoras que intenta aportar: Es mejor utilizar un pie de página en vez de una cabecera, para dejar libre la parte superior de cada transparencia. El pie de página incluye una vez más publicidad de decharlas.com
  • #59: Mejoras que intenta aportar: Es mejor utilizar un pie de página en vez de una cabecera, para dejar libre la parte superior de cada transparencia. El pie de página incluye una vez más publicidad de decharlas.com
  • #60: Mejoras que intenta aportar: Es mejor utilizar un pie de página en vez de una cabecera, para dejar libre la parte superior de cada transparencia. El pie de página incluye una vez más publicidad de decharlas.com
  • #61: Mejoras que intenta aportar: Es mejor utilizar un pie de página en vez de una cabecera, para dejar libre la parte superior de cada transparencia. El pie de página incluye una vez más publicidad de decharlas.com
  • #62: Mejoras que intenta aportar: Es mejor utilizar un pie de página en vez de una cabecera, para dejar libre la parte superior de cada transparencia. El pie de página incluye una vez más publicidad de decharlas.com
  • #63: Mejoras que intenta aportar: Es mejor utilizar un pie de página en vez de una cabecera, para dejar libre la parte superior de cada transparencia. El pie de página incluye una vez más publicidad de decharlas.com
  • #64: Mejoras que intenta aportar: Es mejor utilizar un pie de página en vez de una cabecera, para dejar libre la parte superior de cada transparencia. El pie de página incluye una vez más publicidad de decharlas.com
  • #65: Mejoras que intenta aportar: Es mejor utilizar un pie de página en vez de una cabecera, para dejar libre la parte superior de cada transparencia. El pie de página incluye una vez más publicidad de decharlas.com
  • #66: Mejoras que intenta aportar: Es mejor utilizar un pie de página en vez de una cabecera, para dejar libre la parte superior de cada transparencia. El pie de página incluye una vez más publicidad de decharlas.com
  • #67: Mejoras que intenta aportar: Es mejor utilizar un pie de página en vez de una cabecera, para dejar libre la parte superior de cada transparencia. El pie de página incluye una vez más publicidad de decharlas.com
  • #68: Mejoras que intenta aportar: Es mejor utilizar un pie de página en vez de una cabecera, para dejar libre la parte superior de cada transparencia. El pie de página incluye una vez más publicidad de decharlas.com
  • #69: Mejoras que intenta aportar: Es mejor utilizar un pie de página en vez de una cabecera, para dejar libre la parte superior de cada transparencia. El pie de página incluye una vez más publicidad de decharlas.com
  • #70: Mejoras que intenta aportar: Es mejor utilizar un pie de página en vez de una cabecera, para dejar libre la parte superior de cada transparencia. El pie de página incluye una vez más publicidad de decharlas.com
  • #71: Mejoras que intenta aportar: Es mejor utilizar un pie de página en vez de una cabecera, para dejar libre la parte superior de cada transparencia. El pie de página incluye una vez más publicidad de decharlas.com
  • #72: Mejoras que intenta aportar: Es mejor utilizar un pie de página en vez de una cabecera, para dejar libre la parte superior de cada transparencia. El pie de página incluye una vez más publicidad de decharlas.com
  • #73: Mejoras que intenta aportar: Es mejor utilizar un pie de página en vez de una cabecera, para dejar libre la parte superior de cada transparencia. El pie de página incluye una vez más publicidad de decharlas.com
  • #74: Mejoras que intenta aportar: Es mejor utilizar un pie de página en vez de una cabecera, para dejar libre la parte superior de cada transparencia. El pie de página incluye una vez más publicidad de decharlas.com
  • #75: Mejoras que intenta aportar: Es mejor utilizar un pie de página en vez de una cabecera, para dejar libre la parte superior de cada transparencia. El pie de página incluye una vez más publicidad de decharlas.com
  • #76: Mejoras que intenta aportar: Es mejor utilizar un pie de página en vez de una cabecera, para dejar libre la parte superior de cada transparencia. El pie de página incluye una vez más publicidad de decharlas.com
  • #77: Mejoras que intenta aportar: Es mejor utilizar un pie de página en vez de una cabecera, para dejar libre la parte superior de cada transparencia. El pie de página incluye una vez más publicidad de decharlas.com
  • #78: Mejoras que intenta aportar: Es mejor utilizar un pie de página en vez de una cabecera, para dejar libre la parte superior de cada transparencia. El pie de página incluye una vez más publicidad de decharlas.com
  • #79: Mejoras que intenta aportar: Es mejor utilizar un pie de página en vez de una cabecera, para dejar libre la parte superior de cada transparencia. El pie de página incluye una vez más publicidad de decharlas.com
  • #80: Mejoras que intenta aportar: Es mejor utilizar un pie de página en vez de una cabecera, para dejar libre la parte superior de cada transparencia. El pie de página incluye una vez más publicidad de decharlas.com