SlideShare una empresa de Scribd 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 las vistas de symfony 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 las Vistas  Contenido
Jornadas Symfony  http://decharlas.uji.es/symfony Jornadas Symfony  http://decharlas.uji.es/symfony Contenido Los Templates +  MVC +  Templates +  Layout +  Variables del Template +  Fragmentos de código (Partials, Components, Slots) +  Configuración del Layout  +  Accesso al Objeto Response +  Conversión de Variables de vista +  Respuestas del Action
Jornadas Symfony  http://decharlas.uji.es/symfony Jornadas Symfony  http://decharlas.uji.es/symfony Contenido Procesando las Vistas +  Cadena de Ejecución +  Cambiando la clase de Vista +  Las Clases +  sfPHPView Class
Jornadas Symfony  http://decharlas.uji.es/symfony Jornadas Symfony  http://decharlas.uji.es/symfony Los Templates
Jornadas Symfony  http://decharlas.uji.es/symfony Jornadas Symfony  http://decharlas.uji.es/symfony Como empezó todo Pues con un MVC
Jornadas Symfony  http://decharlas.uji.es/symfony Jornadas Symfony  http://decharlas.uji.es/symfony MVC Request Controller Response Model Views
Jornadas Symfony  http://decharlas.uji.es/symfony Jornadas Symfony  http://decharlas.uji.es/symfony Templates apps/frontend/modules/ moduleName / templates /archivos.php
Jornadas Symfony  http://decharlas.uji.es/symfony Jornadas Symfony  http://decharlas.uji.es/symfony Templates <?php  use_helper( 'I18N' ,  'Date' )  ?> <?php  include_partial( 'attribute/assets' )  ?> < div   id = &quot;sf_admin_container&quot;   class = &quot;tab_sf_admin_container_attributes&quot;   > < h1 > <?php   echo  __( 'Attribute List' ,  array (),  'messages' )  ?> </ h1 > < ul > < li >< a   href = &quot;#sf_admin_content_list&quot; > <?php   echo  __( &quot;Categories&quot; )  ?> </ a ></ li > </ ul > < div   id = &quot;sf_admin_content_list&quot; > <?php  include_partial( 'attribute/flashes' )  ?> </ div > </ div > < script   type = &quot;text/javascript&quot; > //Algo de Javascript </ script >
Jornadas Symfony  http://decharlas.uji.es/symfony Jornadas Symfony  http://decharlas.uji.es/symfony Templates Helpers <?php  use_helper( 'I18N' ,  'Date' )  ?> <?php  use_helper( 'HelperName' )  ?> <?php  use_helper( 'HelperName1' ,  'HelperName2' ,  'HelperName3' )  ?> <?php   echo  __( 'Attribute List' ,  array (),  'messages' )  ?> <?php  include_partial( 'attribute/flashes' )  ?> <?php   echo  url_for( &quot;attribute/list?parent_id=0&page=1&quot; )  ?>
Jornadas Symfony  http://decharlas.uji.es/symfony Jornadas Symfony  http://decharlas.uji.es/symfony Templates Helpers de Symfony AssetHelper CacheHelper DateHelper EscapingHelper HelperHelper I18NHelper JavascriptBaseHelper NumberHelper PartialHelper TagHelper TextHelper UrlHelper http://www.symfony-project.org/api/1_4/helper use_helper(  $date  ) include_http_metas() include_metas() include_title() include_stylesheets() include_javascripts() include_partial ( $templateName ,  $vars ) format_date( $date ,  $format ,  $culture ,  $charset ) link_to( __( &quot;Signout&quot; ), url_for( '@sf_guard_signout' ) ) url_for( &quot;@attribute_attribute_new?parent_id= { $parent_id } &quot; )
Jornadas Symfony  http://decharlas.uji.es/symfony Jornadas Symfony  http://decharlas.uji.es/symfony Templates Helpers Propios apps/frontend/lib/helper/NombreHelper.php <?php function  previewObject( $object ) { } <?php  use_helper( 'Nombre' )  ?> ... <?php   echo  previewObject(   $object   )  ?>
Jornadas Symfony  http://decharlas.uji.es/symfony Jornadas Symfony  http://decharlas.uji.es/symfony Layout
Jornadas Symfony  http://decharlas.uji.es/symfony Jornadas Symfony  http://decharlas.uji.es/symfony Layout apps/frontend/ templates /layout.php Layout Template <! DOCTYPE   html   PUBLIC   &quot;-//W3C//DTD XHTML 1.0 Transitional//EN&quot;   &quot;http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd&quot; > < html   xmlns = &quot;http://www.w3.org/1999/xhtml&quot; > < head > < meta   http-equiv = &quot;content-type&quot;   content = &quot;text/html; charset=utf-8&quot;   /> <?php  include_http_metas()  ?> <?php  include_metas()  ?> <?php  include_title()  ?> < link   rel = &quot;shortcut icon&quot;   href = &quot;/favicon.ico&quot;   /> <?php  include_stylesheets()  ?> <?php  include_javascripts()  ?> </ head > < body > < div   id = &quot;wrapper&quot; > <?php   echo  $sf_content  ?> </ div > </ body > </ html >
Jornadas Symfony  http://decharlas.uji.es/symfony Jornadas Symfony  http://decharlas.uji.es/symfony Variables del Template
Jornadas Symfony  http://decharlas.uji.es/symfony Jornadas Symfony  http://decharlas.uji.es/symfony Variables del Template array ( 0 => 'sf_data', 1 => 'sf_type', 2 => 'sf_context', 3 => 'sf_request', 4 => 'sf_params', 5 => 'sf_response', 6 => 'sf_user', ) +  $sf_data: Variables de la acción  (Escapadas) +  $sf_type: Tipo de Template que se está procesando  (action, partial, layout) +  $sf_context: la instancia de sfContext +  $sf_request: El objeto Request  (sfWebRequest) +  $sf_params : Los parámetros pasados al objeto Request +  $sf_response: El objeto Response  (sfWebResponse) +  $sf_user : El usuario actual
Jornadas Symfony  http://decharlas.uji.es/symfony Jornadas Symfony  http://decharlas.uji.es/symfony Fragmentos de códigos
Jornadas Symfony  http://decharlas.uji.es/symfony Jornadas Symfony  http://decharlas.uji.es/symfony Fragmentos de códigos Parcial +  Inserta contenido con las variables especificadas en la llamada al helper. +  Se usa extensivamente en el admin generator. +  Tiene acceso limitado a las variables de la vista. (se puede hackear) Components +  Contienen lógica de acción. Extiende la clase sfComponents. +  Separa la lógica de presentación en partes. +  Se pueden incluir en cualquier nivel de la definición de la vista: Layout, Templates, Components, Partials. Slots +  Se usan para rellenar espacios con contenido dinámico. +  Tiene acceso a las variables del template. +  Se incluye despues de que se construye la vista.
Jornadas Symfony  http://decharlas.uji.es/symfony Jornadas Symfony  http://decharlas.uji.es/symfony Partials
Jornadas Symfony  http://decharlas.uji.es/symfony Jornadas Symfony  http://decharlas.uji.es/symfony Fragmentos de códigos Parcial public function  executeIndex(sfWebRequest  $request ){ $this ->variable = “Hola Mundo”; } apps/frontend/modules/moduleName/actions/ actions.class.php apps/frontend/modules/moduleName/templates/ indexSuccess.php < div   id = &quot;sf_admin_content&quot; > <?php  include_partial( 'moduleName/myPartial' ,  array ( 'variable'  =>  $variable ) )  ?> </ div >
Jornadas Symfony  http://decharlas.uji.es/symfony Jornadas Symfony  http://decharlas.uji.es/symfony Fragmentos de códigos Parcial < div   id = &quot;sf_admin_container&quot; > < h1 > <?php   echo  $variable  ?> </ h1 > </ div > apps/frontend/modules/moduleName/templates/ _myPartial.php
Jornadas Symfony  http://decharlas.uji.es/symfony Jornadas Symfony  http://decharlas.uji.es/symfony Components
Jornadas Symfony  http://decharlas.uji.es/symfony Jornadas Symfony  http://decharlas.uji.es/symfony Fragmentos de códigos Components class  muduleNameComponents  extends  sfComponents{ public function  executeTopRSS(sfWebRequest  $request ){ $this ->external_RSS =  new  RSSConnect::fetch (  $date  ); } } < h1 > Top RSS </ h1 > <?php   foreach  (  $external_RSS  as  $rss  ):  ?> < div   class = &quot;rss_box&quot;   > < div   class = &quot;rss_title&quot; >   <?php   echo  $rss ->title  ?> </ div > </ div > <?php   endforeach ;  ?> apps/frontend/modules/moduleName/actions/ components.class.php apps/frontend/modules/moduleName/templates/ _topRSS.php
Jornadas Symfony  http://decharlas.uji.es/symfony Jornadas Symfony  http://decharlas.uji.es/symfony <?php  use_helper( 'I18N' ,  'Date' )  ?> <?php  include_partial( 'attribute/assets' )  ?> < div   id = &quot;sf_admin_container&quot;   class = &quot;tab_sf_admin_container_attributes&quot;   > < h1 > <?php   echo  __( 'Attribute List' ,  array (),  'messages' )  ?> </ h1 > < ul > < li >< a   href = &quot;#sf_admin_content_list&quot; > <?php   echo  __( &quot;Categories&quot; )  ?> </ a ></ li > </ ul > < div   id = &quot;sf_admin_content_list&quot; > <?php  include_partial( 'attribute/flashes' )  ?> <?php  include_component( 'moduleName' ,  'topRSS' ,  array ( 'rssCount'  =>  $external_RSS ->count() ) )  ?> </ div > </ div > Components Fragmentos de códigos apps/frontend/modules/ otherModuleName /templates/ indexSuccess.php
Jornadas Symfony  http://decharlas.uji.es/symfony Jornadas Symfony  http://decharlas.uji.es/symfony Slots
Jornadas Symfony  http://decharlas.uji.es/symfony Jornadas Symfony  http://decharlas.uji.es/symfony Fragmentos de códigos Slots apps/frontend/templates/ layout.php <! DOCTYPE   html   PUBLIC   &quot;-//W3C//DTD XHTML 1.0 Transitional//EN&quot; &quot;http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd&quot; > < html   xmlns = &quot;http://www.w3.org/1999/xhtml&quot; > < head ></ head > < body > < div   id = &quot;content&quot; > < div   class = &quot;header&quot; > < div   class = &quot;logo&quot; > <?php   echo  link_to( image_tag( &quot;/images/logo.png&quot; ),  &quot;/&quot;  )  ?> </ div > <?php   if  (has_slot( 'virtual_logo' )):  ?> < div   class = &quot;logo_virtual&quot; > <?php  include_slot( 'virtual_logo' )  ?> </ div > <?php   else :  ?> </ div > <?php   echo  $sf_content  ?> </ div > </ body > </ html >
Jornadas Symfony  http://decharlas.uji.es/symfony Jornadas Symfony  http://decharlas.uji.es/symfony Fragmentos de códigos class  companyActions  extends  sfActions{ public function  executeShow(sfWebRequest  $request ){ ... $this ->company = Doctrine::getTable(“Company”)->find( $id );  } } apps/frontend/modules/ company /actions/ actions.class.php apps/frontend/modules/ company /templates/ showSuccess.php Slots < div   class = &quot;company&quot; > <?php   if  ( $company ->hasLogo() ):  ?> <?php  slot( 'virtual_logo' )  ?> <?php   echo  $company ->renderLogo()  ?> <?php  end_slot()  ?> <?php   endif ;  ?> </ div >
Jornadas Symfony  http://decharlas.uji.es/symfony Jornadas Symfony  http://decharlas.uji.es/symfony Configuración del Layout
Jornadas Symfony  http://decharlas.uji.es/symfony Jornadas Symfony  http://decharlas.uji.es/symfony default : http_metas : content-type : text/html metas : title :  My Project Title description :  My project Description keywords :  Keywords, Project, Etc language :  en robots :  index, follow stylesheets :  [/stylesheets/style.css] javascripts :  [ /javascripts/jquery-1.3.min.js, ... ] has_layout :  on layout :  layout apps/frontend/config/ view.yml Configuración del Layout
Jornadas Symfony  http://decharlas.uji.es/symfony Jornadas Symfony  http://decharlas.uji.es/symfony all : … showSuccess : metas : title :  Company Show description :  Company Show keywords :  Companies, Company Show language :  en robots :  index, follow stylesheets :  [/stylesheets/style.css,  /css/company.css  ] javascripts :  [ /javascripts/jquery-1.3.min.js, ... ] has_layout :  on layout :  company apps/frontend/modules/ company /config/ view.yml Configuración del Layout
Jornadas Symfony  http://decharlas.uji.es/symfony Jornadas Symfony  http://decharlas.uji.es/symfony Acceso al objeto Response
Jornadas Symfony  http://decharlas.uji.es/symfony Jornadas Symfony  http://decharlas.uji.es/symfony Acceso al objeto Response public function  executeShow(sfWebRequest  $request ) { . .. $response  =  $this ->getResponse(); // Metas and page headers $response  =  $this ->getResponse(); if  (! $this ->article->isMainDomain( $domain )){ $response ->addMeta( 'robots' ,  'noindex, nofollow' ); } $response ->addMeta( 'keywords' ,  $this ->article->getMetaKeywords() ); $response ->addMeta( 'description' ,  $this ->article- >getMetaDescription( &quot;sub_title&quot; ) ); if  ( $this ->article->html_meta_title){ $response ->setTitle(trim( $this ->article->html_meta_title). &quot; |  { $domain ->name} &quot; ); } else { $response ->setTitle(trim( $this ->article->getTitle()). &quot; |  { $domain ->name} &quot; ); } $response ->addStyleSheet( 'article' ); $response ->addJavaScript( 'article.js' ); }
Jornadas Symfony  http://decharlas.uji.es/symfony Jornadas Symfony  http://decharlas.uji.es/symfony Acceso al objeto Response array ( 0 => '__call', 1 => '__construct', 2 => 'addCacheControlHttpHeader', 3 => 'addHttpMeta', 4 => 'addJavascript', 5 => 'addMeta', 6 => 'addStylesheet', 7 => 'addVaryHttpHeader', 8 => 'clearHttpHeaders', 9 => 'copyProperties', 10 => 'getCharset', 11 => 'getContent', 12 => 'getContentType', 13 => 'getCookies', 14 => 'getDate', 15 => 'getHttpHeader', 16 => 'getHttpHeaders', 17 => 'getHttpMetas', 18 => 'getJavascripts', 19 => 'getMetas', 20 => 'getOptions', 21 => 'getPositions', 22 => 'getSlots', 23 => 'getStatusCode', 24 => 'getStatusText', 25 => 'getStylesheets', 26 => 'getTitle', 27 => 'hasHttpHeader', 28 => 'initialize', 29 => 'isHeaderOnly', 30 => 'merge', 31 => 'removeJavascript', 32 => 'removeStylesheet', 33 => 'send', 34 => 'sendContent', 35 => 'sendHttpHeaders', 36 => 'serialize', 37 => 'setContent', 38 => 'setContentType', 39 => 'setCookie', 40 => 'setEventDispatcher', 41 => 'setHeaderOnly', 42 => 'setHttpHeader', 43 => 'setSlot', 44 => 'setStatusCode', 45 => 'setTitle', 46 => 'unserialize', )
Jornadas Symfony  http://decharlas.uji.es/symfony Jornadas Symfony  http://decharlas.uji.es/symfony Conversión de variables de vista Escaping Output
Jornadas Symfony  http://decharlas.uji.es/symfony Jornadas Symfony  http://decharlas.uji.es/symfony Escaping Output Conversión de variables de vista all : .settings : # Output escaping settings escaping_strategy :  true escaping_method :  ESC_SPECIALCHARS ## ESC_RAW, ESC_ENTITIES, ESC_JS, ESC_JS_NO_ENTITIES, and ESC_SPECIALCHARS. apps/frontend/config/settings.yml <?php   echo  $sf_data ->getRaw( 'image' )->tag( 320 ,  480 );  ?> <?php   echo  $image ->getRawValue()->tag( 320 ,  480 ) ;  ?> <?php   echo  $sf_data ->get( 'image' )->name;  ?> <?php   echo  $image ->name ;  ?> apps/frontend/modules/moduleName/templates/algunTemplate.php
Jornadas Symfony  http://decharlas.uji.es/symfony Jornadas Symfony  http://decharlas.uji.es/symfony Escaping Output Conversión de variables de vista <?php   echo  get_class( $test_array )  ?> < span >  sfOutputEscaperArrayDecorator  </ span > <?php   echo  get_class( $test_object )  ?> < span >  sfOutputEscaperObjectDecorator  </ span >
Jornadas Symfony  http://decharlas.uji.es/symfony Jornadas Symfony  http://decharlas.uji.es/symfony Escaping Output Conversión de variables de vista array ( 0 => '__call', 1 => '__construct', 2 => '__get', 3 => '__toString', 4 => 'count', 5 => 'current', 6 => 'escape', 7 => 'get', 8 => 'getRaw', 9 => 'getRawValue', 10 => 'isClassMarkedAsSafe', 11 => 'key', 12 => 'markClassAsSafe', 13 => 'markClassesAsSafe', 14 => 'next', 15 => 'offsetExists', 16 => 'offsetGet', 17 => 'offsetSet', 18 => 'offsetUnset', 19 => 'rewind', 20 => 'unescape', 21 => 'valid', ) array ( 0 => '__construct', 1 => '__get', 2 => 'count', 3 => 'current', 4 => 'escape', 5 => 'get', 6 => 'getRaw', 7 => 'getRawValue', 8 => 'isClassMarkedAsSafe', 9 => 'key', 10 => 'markClassAsSafe', 11 => 'markClassesAsSafe', 12 => 'next', 13 => 'offsetExists', 14 => 'offsetGet', 15 => 'offsetSet', 16 => 'offsetUnset', 17 => 'rewind', 18 => 'unescape', 19 => 'valid', ) sfOutputEscaperObjectDecorator sfOutputEscaperArrayDecorator
Jornadas Symfony  http://decharlas.uji.es/symfony Jornadas Symfony  http://decharlas.uji.es/symfony Respuestas del Action
Jornadas Symfony  http://decharlas.uji.es/symfony Jornadas Symfony  http://decharlas.uji.es/symfony Respuestas del Action public function  executeIndex() { return  sfView::SUCCESS; // Corresponde indexSuccess.php return  sfView::ERROR;  // Corresponde indexError.php return  'MyResult' ; return  $this ->renderText( &quot;<html><body>Hello, World!</body></html>&quot; ); $this ->getResponse()->setContent( &quot;<html><body>Hello, World!</body></html>&quot; ); return  sfView::NONE; $output  =  '<&quot;title&quot;,&quot;My basic letter&quot;],[&quot;name&quot;,&quot;Mr Brown&quot;>' ; $this ->getResponse()->setHttpHeader( &quot;X-JSON&quot; ,  '(' . $output . ')' ); return  sfView::HEADER_ONLY; $this ->setTemplate( 'myCustomTemplate' ); $this ->forward( 'otherModule' ,  'index' ); $this ->redirect( 'otherModule/index' ); $this ->redirect( 'http://www.google.com/' ); }
Jornadas Symfony  http://decharlas.uji.es/symfony Jornadas Symfony  http://decharlas.uji.es/symfony Contenido Los Templates +  MVC +  Templates +  Layout +  Variables del Template +  Fragmentos de código (Partials, Components, Slots) +  Configuración del Layout  +  Accesso al Objeto Response +  Conversión de Variables de vista +  Respuestas del Action
Jornadas Symfony  http://decharlas.uji.es/symfony Jornadas Symfony  http://decharlas.uji.es/symfony Procesando las Vistas
Jornadas Symfony  http://decharlas.uji.es/symfony Jornadas Symfony  http://decharlas.uji.es/symfony Cadena de Ejecución 36px
Request Controller Response Jornadas Symfony  http://decharlas.uji.es/symfony Model Views
Jornadas Symfony  http://decharlas.uji.es/symfony Jornadas Symfony  http://decharlas.uji.es/symfony Cadena de Ejecución <?php require_once (dirname(__FILE__). '/../config/ProjectConfiguration.class.php' ); $configuration  = ProjectConfiguration::getApplicationConfiguration( 'frontend' ,  'prod' ,  false ); sfContext::createInstance( $configuration )->dispatch(); web/ index.php
Jornadas Symfony  http://decharlas.uji.es/symfony Jornadas Symfony  http://decharlas.uji.es/symfony sfContex instance Symfony Internals sfFrontWebController::dispatch() More symfony internals Filter Chain Filters Execution Filter sfExecutionFilter::handleAction() sfExecutionFilter::executeAction() sfExecutionFilter::handleView() sfExecutionFilter::executeView() Execution Filter Way Back sfWebResponse::send() Cadena de Ejecución
Jornadas Symfony  http://decharlas.uji.es/symfony Jornadas Symfony  http://decharlas.uji.es/symfony class sfExecutionFilter extends sfFilter {.... protected function  executeAction( $actionInstance ) { // execute the action $actionInstance ->preExecute(); $viewName  =  $actionInstance ->execute( $this ->context->getRequest()); $actionInstance ->postExecute(); return  null ===  $viewName  ? sfView::SUCCESS :  $viewName ; } .... } sfExecutionFilter::executeAction() lib/vendor/symfony/lib/filter/sfExecutionFilter.class.php Cadena de Ejecución
Jornadas Symfony  http://decharlas.uji.es/symfony Jornadas Symfony  http://decharlas.uji.es/symfony sfContex instance Symfony Internals sfFrontWebController::dispatch() More symfony internals Filter Chain Filters Execution Filter sfExecutionFilter::handleAction() sfExecutionFilter::executeAction() sfExecutionFilter::handleView() sfExecutionFilter::executeView() Execution Filter Way Back sfWebResponse::send() Cadena de Ejecución
Jornadas Symfony  http://decharlas.uji.es/symfony Jornadas Symfony  http://decharlas.uji.es/symfony sfExecutionFilter::executeView() protected function  executeView( $moduleName ,  $actionName ,  $viewName ,  $viewAttributes ) { // get the view instance $view  =  $controller ->getView( $moduleName ,  $actionName ,  $viewName ); // execute the view $view ->execute(); // Select render Mode and render ... case  sfView::RENDER_CLIENT: $viewData  =  $view ->render(); $this ->context->getResponse()->setContent( $viewData ); break ; ... } Cadena de Ejecución
Jornadas Symfony  http://decharlas.uji.es/symfony Jornadas Symfony  http://decharlas.uji.es/symfony sfController::getView() abstract class sfController { public function  getView( $moduleName ,  $actionName ,  $viewName ) { // user view exists? $file  = sfConfig::get( 'sf_app_module_dir' ). '/' . $moduleName . '/view/' . $actionName . $viewName . 'View.class.php' ; // Pregunta si existe la clase y si existe una clase espcial del módulo y devuelve las instancia de la clase. } } lib/vendor/symfony/lib/controller/sfController.class.php Cadena de Ejecución
Jornadas Symfony  http://decharlas.uji.es/symfony Jornadas Symfony  http://decharlas.uji.es/symfony ¿Y esto porque es importante?
Jornadas Symfony  http://decharlas.uji.es/symfony Jornadas Symfony  http://decharlas.uji.es/symfony Pues para extender su funcionamiento
Jornadas Symfony  http://decharlas.uji.es/symfony Jornadas Symfony  http://decharlas.uji.es/symfony Cambiando la clase de Vista
Jornadas Symfony  http://decharlas.uji.es/symfony Jornadas Symfony  http://decharlas.uji.es/symfony Cambiando la clase de Vista apps/frontend/moduleName/templates/indexSuccess.php apps/frontend/moduleName/view/indexSuccessView.php <?php class  indexSuccessView  extends  sfPHPView { // Personalizamos algunos métodos } para una acción
Jornadas Symfony  http://decharlas.uji.es/symfony Jornadas Symfony  http://decharlas.uji.es/symfony Cambiando la clase de Vista apps/frontend/config/module.yml para todas las acciones all :  # For all environments enabled :  true is_internal : false view_class :  myPersonalView
Jornadas Symfony  http://decharlas.uji.es/symfony Jornadas Symfony  http://decharlas.uji.es/symfony Las Clases
Jornadas Symfony  http://decharlas.uji.es/symfony Jornadas Symfony  http://decharlas.uji.es/symfony sfView, sfPHPView, sfPartialView Las Clases lib/vendor/symfony/lib/view/ sfView.class.php lib/vendor/symfony/lib/view/ sfPHPView.class.php lib/vendor/symfony/lib/view/ sfPartialView.class.php sfView sfPHPView sfPartialView myPHPView
Jornadas Symfony  http://decharlas.uji.es/symfony Jornadas Symfony  http://decharlas.uji.es/symfony Inspeccionemos sfPHPView lib/vendor/symfony/lib/view/ sfPHPView.class.php
Jornadas Symfony  http://decharlas.uji.es/symfony Jornadas Symfony  http://decharlas.uji.es/symfony sfPHPView Class extends abstract sfView  class  sfPHPView  extends  sfView { public function  execute(){} protected function  renderFile( $_sfFile ){ // render ob_start(); ob_implicit_flush( 0 ); require ( $_sfFile ); return  ob_get_clean(); } protected function  decorate( $content ) { // Decora con el Layout } public function  render() { // Procesa toda la vista para obtener su contenido return  $content ; } }
Jornadas Symfony  http://decharlas.uji.es/symfony Jornadas Symfony  http://decharlas.uji.es/symfony sfPHPView Class extends abstract sfView  class sfPHPView extends sfView { public function  execute(){} protected function renderFile($_sfFile){ // render ob_start(); ob_implicit_flush(0); require($_sfFile); return ob_get_clean(); } protected function decorate($content) { // Decora con el Layout } public function render() { // Procesa toda la vista para obtener su contenido return $content; } }
Jornadas Symfony  http://decharlas.uji.es/symfony Jornadas Symfony  http://decharlas.uji.es/symfony sfPHPView Class extends abstract sfView  class sfPHPView extends sfView { public function execute(){} protected function renderFile($_sfFile){ // render ob_start(); ob_implicit_flush(0); require($_sfFile); return ob_get_clean(); } protected function decorate($content) { // Decora con el Layout } public function  render() { // Procesa toda la vista para obtener su contenido return $content; } }
Jornadas Symfony  http://decharlas.uji.es/symfony Jornadas Symfony  http://decharlas.uji.es/symfony sfPHPView Class extends abstract sfView  class sfPHPView extends sfView { public function execute(){} protected function  renderFile( $_sfFile ){ // render ob_start(); ob_implicit_flush( 0 ); require ( $_sfFile ); return  ob_get_clean(); } protected function decorate($content) { // Decora con el Layout } public function render() { // Procesa toda la vista para obtener su contenido return $content; } }
Jornadas Symfony  http://decharlas.uji.es/symfony Jornadas Symfony  http://decharlas.uji.es/symfony sfPHPView Class extends abstract sfView  class sfPHPView extends sfView { public function execute(){} protected function renderFile($_sfFile){ // render ob_start(); ob_implicit_flush(0); require($_sfFile); return ob_get_clean(); } protected function  decorate( $content ) { // Decora con el Layout } public function render() { // Procesa toda la vista para obtener su contenido return $content; } }
Jornadas Symfony  http://decharlas.uji.es/symfony Jornadas Symfony  http://decharlas.uji.es/symfony sfPHPView Class extends abstract sfView  class sfPHPView extends sfView { public function execute(){} protected function renderFile($_sfFile){ // render ob_start(); ob_implicit_flush(0); require($_sfFile); return ob_get_clean(); } protected function decorate($content) { // Decora con el Layout } public function render() { // Procesa toda la vista para obtener su contenido return  $content ; } }
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

Más contenido relacionado

ODP
Symfony y Admin Generator
PDF
Desymfony 2011 - Tutorial #1: Instalacion y primeros pasos
PPT
Especialista Web J9 Php
PDF
Compilador (divisor de cantidades )
PPT
Php Basico
PDF
Taller de Pilas Engine, un motor de juegos en Python - PyConES 2014
PDF
Taller de PHP Básico
Symfony y Admin Generator
Desymfony 2011 - Tutorial #1: Instalacion y primeros pasos
Especialista Web J9 Php
Compilador (divisor de cantidades )
Php Basico
Taller de Pilas Engine, un motor de juegos en Python - PyConES 2014
Taller de PHP Básico

Destacado (9)

PDF
Clase 4 routing
PPTX
Symfony 1, mi viejo amigo
PPT
Symfony: Domesticando los Formularios
PPT
Symfony2 and AngularJS
ODP
Desarrollo Web Ágil con Symfony, Bootstrap y Angular
PDF
The Buyer's Journey - by Chris Lema
PDF
Classroom Management Tips for Kids and Adolescents
PDF
The Presentation Come-Back Kid
PDF
Succession “Losers”: What Happens to Executives Passed Over for the CEO Job?
Clase 4 routing
Symfony 1, mi viejo amigo
Symfony: Domesticando los Formularios
Symfony2 and AngularJS
Desarrollo Web Ágil con Symfony, Bootstrap y Angular
The Buyer's Journey - by Chris Lema
Classroom Management Tips for Kids and Adolescents
The Presentation Come-Back Kid
Succession “Losers”: What Happens to Executives Passed Over for the CEO Job?
Publicidad

Similar a Symfony: Domesticando las Vistas (20)

ODP
symfony admin generator - decharlas
PDF
Symfony
ODP
Tutorial3 Desymfony - La Vista. Twig
PDF
Clase 3 instalación y primeros pasos
PDF
Mis primeros pasos con Symfony 2
PDF
Introducción al framework Symfony
PPT
Introducción a symfony - decharlas
PPT
Plantillajornadasversion2 100708010347-phpapp01
PPT
Introduccion a symfony
ODP
Presentacion
PDF
deSymfony 2017: Symfony 4, Symfony Flex y el futuro de Symfony
PDF
Desarrollo de Aplicaciones Web con Symfony 5/10/2011
PDF
Symfony2, Jornadas Symfony
PDF
Symfony 2 - decharlas 2010
ODP
Taller introduccion symfony2
PDF
Symfony 1 y 2
PDF
Symfony 4, renovarse o morir
PDF
Introducción a Silex. Aprendiendo a hacer las cosas bien en PHP
KEY
Symfony plugins - No reinventes la rueda PLUGINS - Jornadas Castellón
symfony admin generator - decharlas
Symfony
Tutorial3 Desymfony - La Vista. Twig
Clase 3 instalación y primeros pasos
Mis primeros pasos con Symfony 2
Introducción al framework Symfony
Introducción a symfony - decharlas
Plantillajornadasversion2 100708010347-phpapp01
Introduccion a symfony
Presentacion
deSymfony 2017: Symfony 4, Symfony Flex y el futuro de Symfony
Desarrollo de Aplicaciones Web con Symfony 5/10/2011
Symfony2, Jornadas Symfony
Symfony 2 - decharlas 2010
Taller introduccion symfony2
Symfony 1 y 2
Symfony 4, renovarse o morir
Introducción a Silex. Aprendiendo a hacer las cosas bien en PHP
Symfony plugins - No reinventes la rueda PLUGINS - Jornadas Castellón
Publicidad

Último (20)

PDF
SAP Transportation Management para LSP, TM140 Col18
PDF
CyberOps Associate - Cisco Networking Academy
PPTX
historia_web de la creacion de un navegador_presentacion.pptx
PPTX
Presentación PASANTIAS AuditorioOO..pptx
PPT
Que son las redes de computadores y sus partes
PDF
MÓDULO DE CALOR DE GRADO DE MEDIO DE FORMACIÓN PROFESIONAL
PPTX
Sesion 1 de microsoft power point - Clase 1
PPT
introduccion a las_web en el 2025_mejoras.ppt
PPTX
ANCASH-CRITERIOS DE EVALUACIÓN-FORMA-10-10 (2).pptx
PDF
programa-de-estudios-2011-guc3ada-para-el-maestro-secundarias-tecnicas-tecnol...
PPT
El-Gobierno-Electrónico-En-El-Estado-Bolivia
PDF
Estrategia de apoyo tecnología grado 9-3
PDF
Influencia-del-uso-de-redes-sociales.pdf
PDF
MANUAL TECNOLOGÍA SER MINISTERIO EDUCACIÓN
PDF
clase auditoria informatica 2025.........
DOCX
Zarate Quispe Alex aldayir aplicaciones de internet .docx
PPTX
Power Point Nicolás Carrasco (disertación Roblox).pptx
PDF
Instrucciones simples, respuestas poderosas. La fórmula del prompt perfecto.
PPTX
RAP02 - TECNICO SISTEMAS TELEINFORMATICOS.pptx
PPTX
RAP01 - TECNICO SISTEMAS TELEINFORMATICOS.pptx
SAP Transportation Management para LSP, TM140 Col18
CyberOps Associate - Cisco Networking Academy
historia_web de la creacion de un navegador_presentacion.pptx
Presentación PASANTIAS AuditorioOO..pptx
Que son las redes de computadores y sus partes
MÓDULO DE CALOR DE GRADO DE MEDIO DE FORMACIÓN PROFESIONAL
Sesion 1 de microsoft power point - Clase 1
introduccion a las_web en el 2025_mejoras.ppt
ANCASH-CRITERIOS DE EVALUACIÓN-FORMA-10-10 (2).pptx
programa-de-estudios-2011-guc3ada-para-el-maestro-secundarias-tecnicas-tecnol...
El-Gobierno-Electrónico-En-El-Estado-Bolivia
Estrategia de apoyo tecnología grado 9-3
Influencia-del-uso-de-redes-sociales.pdf
MANUAL TECNOLOGÍA SER MINISTERIO EDUCACIÓN
clase auditoria informatica 2025.........
Zarate Quispe Alex aldayir aplicaciones de internet .docx
Power Point Nicolás Carrasco (disertación Roblox).pptx
Instrucciones simples, respuestas poderosas. La fórmula del prompt perfecto.
RAP02 - TECNICO SISTEMAS TELEINFORMATICOS.pptx
RAP01 - TECNICO SISTEMAS TELEINFORMATICOS.pptx

Symfony: Domesticando las Vistas

  • 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 las vistas de symfony 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 las Vistas Contenido
  • 8. Jornadas Symfony http://decharlas.uji.es/symfony Jornadas Symfony http://decharlas.uji.es/symfony Contenido Los Templates + MVC + Templates + Layout + Variables del Template + Fragmentos de código (Partials, Components, Slots) + Configuración del Layout + Accesso al Objeto Response + Conversión de Variables de vista + Respuestas del Action
  • 9. Jornadas Symfony http://decharlas.uji.es/symfony Jornadas Symfony http://decharlas.uji.es/symfony Contenido Procesando las Vistas + Cadena de Ejecución + Cambiando la clase de Vista + Las Clases + sfPHPView Class
  • 10. Jornadas Symfony http://decharlas.uji.es/symfony Jornadas Symfony http://decharlas.uji.es/symfony Los Templates
  • 11. Jornadas Symfony http://decharlas.uji.es/symfony Jornadas Symfony http://decharlas.uji.es/symfony Como empezó todo Pues con un MVC
  • 12. Jornadas Symfony http://decharlas.uji.es/symfony Jornadas Symfony http://decharlas.uji.es/symfony MVC Request Controller Response Model Views
  • 13. Jornadas Symfony http://decharlas.uji.es/symfony Jornadas Symfony http://decharlas.uji.es/symfony Templates apps/frontend/modules/ moduleName / templates /archivos.php
  • 14. Jornadas Symfony http://decharlas.uji.es/symfony Jornadas Symfony http://decharlas.uji.es/symfony Templates <?php use_helper( 'I18N' , 'Date' ) ?> <?php include_partial( 'attribute/assets' ) ?> < div id = &quot;sf_admin_container&quot; class = &quot;tab_sf_admin_container_attributes&quot; > < h1 > <?php echo __( 'Attribute List' , array (), 'messages' ) ?> </ h1 > < ul > < li >< a href = &quot;#sf_admin_content_list&quot; > <?php echo __( &quot;Categories&quot; ) ?> </ a ></ li > </ ul > < div id = &quot;sf_admin_content_list&quot; > <?php include_partial( 'attribute/flashes' ) ?> </ div > </ div > < script type = &quot;text/javascript&quot; > //Algo de Javascript </ script >
  • 15. Jornadas Symfony http://decharlas.uji.es/symfony Jornadas Symfony http://decharlas.uji.es/symfony Templates Helpers <?php use_helper( 'I18N' , 'Date' ) ?> <?php use_helper( 'HelperName' ) ?> <?php use_helper( 'HelperName1' , 'HelperName2' , 'HelperName3' ) ?> <?php echo __( 'Attribute List' , array (), 'messages' ) ?> <?php include_partial( 'attribute/flashes' ) ?> <?php echo url_for( &quot;attribute/list?parent_id=0&page=1&quot; ) ?>
  • 16. Jornadas Symfony http://decharlas.uji.es/symfony Jornadas Symfony http://decharlas.uji.es/symfony Templates Helpers de Symfony AssetHelper CacheHelper DateHelper EscapingHelper HelperHelper I18NHelper JavascriptBaseHelper NumberHelper PartialHelper TagHelper TextHelper UrlHelper http://www.symfony-project.org/api/1_4/helper use_helper( $date ) include_http_metas() include_metas() include_title() include_stylesheets() include_javascripts() include_partial ( $templateName , $vars ) format_date( $date , $format , $culture , $charset ) link_to( __( &quot;Signout&quot; ), url_for( '@sf_guard_signout' ) ) url_for( &quot;@attribute_attribute_new?parent_id= { $parent_id } &quot; )
  • 17. Jornadas Symfony http://decharlas.uji.es/symfony Jornadas Symfony http://decharlas.uji.es/symfony Templates Helpers Propios apps/frontend/lib/helper/NombreHelper.php <?php function previewObject( $object ) { } <?php use_helper( 'Nombre' ) ?> ... <?php echo previewObject( $object ) ?>
  • 18. Jornadas Symfony http://decharlas.uji.es/symfony Jornadas Symfony http://decharlas.uji.es/symfony Layout
  • 19. Jornadas Symfony http://decharlas.uji.es/symfony Jornadas Symfony http://decharlas.uji.es/symfony Layout apps/frontend/ templates /layout.php Layout Template <! DOCTYPE html PUBLIC &quot;-//W3C//DTD XHTML 1.0 Transitional//EN&quot; &quot;http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd&quot; > < html xmlns = &quot;http://www.w3.org/1999/xhtml&quot; > < head > < meta http-equiv = &quot;content-type&quot; content = &quot;text/html; charset=utf-8&quot; /> <?php include_http_metas() ?> <?php include_metas() ?> <?php include_title() ?> < link rel = &quot;shortcut icon&quot; href = &quot;/favicon.ico&quot; /> <?php include_stylesheets() ?> <?php include_javascripts() ?> </ head > < body > < div id = &quot;wrapper&quot; > <?php echo $sf_content ?> </ div > </ body > </ html >
  • 20. Jornadas Symfony http://decharlas.uji.es/symfony Jornadas Symfony http://decharlas.uji.es/symfony Variables del Template
  • 21. Jornadas Symfony http://decharlas.uji.es/symfony Jornadas Symfony http://decharlas.uji.es/symfony Variables del Template array ( 0 => 'sf_data', 1 => 'sf_type', 2 => 'sf_context', 3 => 'sf_request', 4 => 'sf_params', 5 => 'sf_response', 6 => 'sf_user', ) + $sf_data: Variables de la acción (Escapadas) + $sf_type: Tipo de Template que se está procesando (action, partial, layout) + $sf_context: la instancia de sfContext + $sf_request: El objeto Request (sfWebRequest) + $sf_params : Los parámetros pasados al objeto Request + $sf_response: El objeto Response (sfWebResponse) + $sf_user : El usuario actual
  • 22. Jornadas Symfony http://decharlas.uji.es/symfony Jornadas Symfony http://decharlas.uji.es/symfony Fragmentos de códigos
  • 23. Jornadas Symfony http://decharlas.uji.es/symfony Jornadas Symfony http://decharlas.uji.es/symfony Fragmentos de códigos Parcial + Inserta contenido con las variables especificadas en la llamada al helper. + Se usa extensivamente en el admin generator. + Tiene acceso limitado a las variables de la vista. (se puede hackear) Components + Contienen lógica de acción. Extiende la clase sfComponents. + Separa la lógica de presentación en partes. + Se pueden incluir en cualquier nivel de la definición de la vista: Layout, Templates, Components, Partials. Slots + Se usan para rellenar espacios con contenido dinámico. + Tiene acceso a las variables del template. + Se incluye despues de que se construye la vista.
  • 24. Jornadas Symfony http://decharlas.uji.es/symfony Jornadas Symfony http://decharlas.uji.es/symfony Partials
  • 25. Jornadas Symfony http://decharlas.uji.es/symfony Jornadas Symfony http://decharlas.uji.es/symfony Fragmentos de códigos Parcial public function executeIndex(sfWebRequest $request ){ $this ->variable = “Hola Mundo”; } apps/frontend/modules/moduleName/actions/ actions.class.php apps/frontend/modules/moduleName/templates/ indexSuccess.php < div id = &quot;sf_admin_content&quot; > <?php include_partial( 'moduleName/myPartial' , array ( 'variable' => $variable ) ) ?> </ div >
  • 26. Jornadas Symfony http://decharlas.uji.es/symfony Jornadas Symfony http://decharlas.uji.es/symfony Fragmentos de códigos Parcial < div id = &quot;sf_admin_container&quot; > < h1 > <?php echo $variable ?> </ h1 > </ div > apps/frontend/modules/moduleName/templates/ _myPartial.php
  • 27. Jornadas Symfony http://decharlas.uji.es/symfony Jornadas Symfony http://decharlas.uji.es/symfony Components
  • 28. Jornadas Symfony http://decharlas.uji.es/symfony Jornadas Symfony http://decharlas.uji.es/symfony Fragmentos de códigos Components class muduleNameComponents extends sfComponents{ public function executeTopRSS(sfWebRequest $request ){ $this ->external_RSS = new RSSConnect::fetch ( $date ); } } < h1 > Top RSS </ h1 > <?php foreach ( $external_RSS as $rss ): ?> < div class = &quot;rss_box&quot; > < div class = &quot;rss_title&quot; > <?php echo $rss ->title ?> </ div > </ div > <?php endforeach ; ?> apps/frontend/modules/moduleName/actions/ components.class.php apps/frontend/modules/moduleName/templates/ _topRSS.php
  • 29. Jornadas Symfony http://decharlas.uji.es/symfony Jornadas Symfony http://decharlas.uji.es/symfony <?php use_helper( 'I18N' , 'Date' ) ?> <?php include_partial( 'attribute/assets' ) ?> < div id = &quot;sf_admin_container&quot; class = &quot;tab_sf_admin_container_attributes&quot; > < h1 > <?php echo __( 'Attribute List' , array (), 'messages' ) ?> </ h1 > < ul > < li >< a href = &quot;#sf_admin_content_list&quot; > <?php echo __( &quot;Categories&quot; ) ?> </ a ></ li > </ ul > < div id = &quot;sf_admin_content_list&quot; > <?php include_partial( 'attribute/flashes' ) ?> <?php include_component( 'moduleName' , 'topRSS' , array ( 'rssCount' => $external_RSS ->count() ) ) ?> </ div > </ div > Components Fragmentos de códigos apps/frontend/modules/ otherModuleName /templates/ indexSuccess.php
  • 30. Jornadas Symfony http://decharlas.uji.es/symfony Jornadas Symfony http://decharlas.uji.es/symfony Slots
  • 31. Jornadas Symfony http://decharlas.uji.es/symfony Jornadas Symfony http://decharlas.uji.es/symfony Fragmentos de códigos Slots apps/frontend/templates/ layout.php <! DOCTYPE html PUBLIC &quot;-//W3C//DTD XHTML 1.0 Transitional//EN&quot; &quot;http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd&quot; > < html xmlns = &quot;http://www.w3.org/1999/xhtml&quot; > < head ></ head > < body > < div id = &quot;content&quot; > < div class = &quot;header&quot; > < div class = &quot;logo&quot; > <?php echo link_to( image_tag( &quot;/images/logo.png&quot; ), &quot;/&quot; ) ?> </ div > <?php if (has_slot( 'virtual_logo' )): ?> < div class = &quot;logo_virtual&quot; > <?php include_slot( 'virtual_logo' ) ?> </ div > <?php else : ?> </ div > <?php echo $sf_content ?> </ div > </ body > </ html >
  • 32. Jornadas Symfony http://decharlas.uji.es/symfony Jornadas Symfony http://decharlas.uji.es/symfony Fragmentos de códigos class companyActions extends sfActions{ public function executeShow(sfWebRequest $request ){ ... $this ->company = Doctrine::getTable(“Company”)->find( $id ); } } apps/frontend/modules/ company /actions/ actions.class.php apps/frontend/modules/ company /templates/ showSuccess.php Slots < div class = &quot;company&quot; > <?php if ( $company ->hasLogo() ): ?> <?php slot( 'virtual_logo' ) ?> <?php echo $company ->renderLogo() ?> <?php end_slot() ?> <?php endif ; ?> </ div >
  • 33. Jornadas Symfony http://decharlas.uji.es/symfony Jornadas Symfony http://decharlas.uji.es/symfony Configuración del Layout
  • 34. Jornadas Symfony http://decharlas.uji.es/symfony Jornadas Symfony http://decharlas.uji.es/symfony default : http_metas : content-type : text/html metas : title : My Project Title description : My project Description keywords : Keywords, Project, Etc language : en robots : index, follow stylesheets : [/stylesheets/style.css] javascripts : [ /javascripts/jquery-1.3.min.js, ... ] has_layout : on layout : layout apps/frontend/config/ view.yml Configuración del Layout
  • 35. Jornadas Symfony http://decharlas.uji.es/symfony Jornadas Symfony http://decharlas.uji.es/symfony all : … showSuccess : metas : title : Company Show description : Company Show keywords : Companies, Company Show language : en robots : index, follow stylesheets : [/stylesheets/style.css, /css/company.css ] javascripts : [ /javascripts/jquery-1.3.min.js, ... ] has_layout : on layout : company apps/frontend/modules/ company /config/ view.yml Configuración del Layout
  • 36. Jornadas Symfony http://decharlas.uji.es/symfony Jornadas Symfony http://decharlas.uji.es/symfony Acceso al objeto Response
  • 37. Jornadas Symfony http://decharlas.uji.es/symfony Jornadas Symfony http://decharlas.uji.es/symfony Acceso al objeto Response public function executeShow(sfWebRequest $request ) { . .. $response = $this ->getResponse(); // Metas and page headers $response = $this ->getResponse(); if (! $this ->article->isMainDomain( $domain )){ $response ->addMeta( 'robots' , 'noindex, nofollow' ); } $response ->addMeta( 'keywords' , $this ->article->getMetaKeywords() ); $response ->addMeta( 'description' , $this ->article- >getMetaDescription( &quot;sub_title&quot; ) ); if ( $this ->article->html_meta_title){ $response ->setTitle(trim( $this ->article->html_meta_title). &quot; | { $domain ->name} &quot; ); } else { $response ->setTitle(trim( $this ->article->getTitle()). &quot; | { $domain ->name} &quot; ); } $response ->addStyleSheet( 'article' ); $response ->addJavaScript( 'article.js' ); }
  • 38. Jornadas Symfony http://decharlas.uji.es/symfony Jornadas Symfony http://decharlas.uji.es/symfony Acceso al objeto Response array ( 0 => '__call', 1 => '__construct', 2 => 'addCacheControlHttpHeader', 3 => 'addHttpMeta', 4 => 'addJavascript', 5 => 'addMeta', 6 => 'addStylesheet', 7 => 'addVaryHttpHeader', 8 => 'clearHttpHeaders', 9 => 'copyProperties', 10 => 'getCharset', 11 => 'getContent', 12 => 'getContentType', 13 => 'getCookies', 14 => 'getDate', 15 => 'getHttpHeader', 16 => 'getHttpHeaders', 17 => 'getHttpMetas', 18 => 'getJavascripts', 19 => 'getMetas', 20 => 'getOptions', 21 => 'getPositions', 22 => 'getSlots', 23 => 'getStatusCode', 24 => 'getStatusText', 25 => 'getStylesheets', 26 => 'getTitle', 27 => 'hasHttpHeader', 28 => 'initialize', 29 => 'isHeaderOnly', 30 => 'merge', 31 => 'removeJavascript', 32 => 'removeStylesheet', 33 => 'send', 34 => 'sendContent', 35 => 'sendHttpHeaders', 36 => 'serialize', 37 => 'setContent', 38 => 'setContentType', 39 => 'setCookie', 40 => 'setEventDispatcher', 41 => 'setHeaderOnly', 42 => 'setHttpHeader', 43 => 'setSlot', 44 => 'setStatusCode', 45 => 'setTitle', 46 => 'unserialize', )
  • 39. Jornadas Symfony http://decharlas.uji.es/symfony Jornadas Symfony http://decharlas.uji.es/symfony Conversión de variables de vista Escaping Output
  • 40. Jornadas Symfony http://decharlas.uji.es/symfony Jornadas Symfony http://decharlas.uji.es/symfony Escaping Output Conversión de variables de vista all : .settings : # Output escaping settings escaping_strategy : true escaping_method : ESC_SPECIALCHARS ## ESC_RAW, ESC_ENTITIES, ESC_JS, ESC_JS_NO_ENTITIES, and ESC_SPECIALCHARS. apps/frontend/config/settings.yml <?php echo $sf_data ->getRaw( 'image' )->tag( 320 , 480 ); ?> <?php echo $image ->getRawValue()->tag( 320 , 480 ) ; ?> <?php echo $sf_data ->get( 'image' )->name; ?> <?php echo $image ->name ; ?> apps/frontend/modules/moduleName/templates/algunTemplate.php
  • 41. Jornadas Symfony http://decharlas.uji.es/symfony Jornadas Symfony http://decharlas.uji.es/symfony Escaping Output Conversión de variables de vista <?php echo get_class( $test_array ) ?> < span > sfOutputEscaperArrayDecorator </ span > <?php echo get_class( $test_object ) ?> < span > sfOutputEscaperObjectDecorator </ span >
  • 42. Jornadas Symfony http://decharlas.uji.es/symfony Jornadas Symfony http://decharlas.uji.es/symfony Escaping Output Conversión de variables de vista array ( 0 => '__call', 1 => '__construct', 2 => '__get', 3 => '__toString', 4 => 'count', 5 => 'current', 6 => 'escape', 7 => 'get', 8 => 'getRaw', 9 => 'getRawValue', 10 => 'isClassMarkedAsSafe', 11 => 'key', 12 => 'markClassAsSafe', 13 => 'markClassesAsSafe', 14 => 'next', 15 => 'offsetExists', 16 => 'offsetGet', 17 => 'offsetSet', 18 => 'offsetUnset', 19 => 'rewind', 20 => 'unescape', 21 => 'valid', ) array ( 0 => '__construct', 1 => '__get', 2 => 'count', 3 => 'current', 4 => 'escape', 5 => 'get', 6 => 'getRaw', 7 => 'getRawValue', 8 => 'isClassMarkedAsSafe', 9 => 'key', 10 => 'markClassAsSafe', 11 => 'markClassesAsSafe', 12 => 'next', 13 => 'offsetExists', 14 => 'offsetGet', 15 => 'offsetSet', 16 => 'offsetUnset', 17 => 'rewind', 18 => 'unescape', 19 => 'valid', ) sfOutputEscaperObjectDecorator sfOutputEscaperArrayDecorator
  • 43. Jornadas Symfony http://decharlas.uji.es/symfony Jornadas Symfony http://decharlas.uji.es/symfony Respuestas del Action
  • 44. Jornadas Symfony http://decharlas.uji.es/symfony Jornadas Symfony http://decharlas.uji.es/symfony Respuestas del Action public function executeIndex() { return sfView::SUCCESS; // Corresponde indexSuccess.php return sfView::ERROR; // Corresponde indexError.php return 'MyResult' ; return $this ->renderText( &quot;<html><body>Hello, World!</body></html>&quot; ); $this ->getResponse()->setContent( &quot;<html><body>Hello, World!</body></html>&quot; ); return sfView::NONE; $output = '<&quot;title&quot;,&quot;My basic letter&quot;],[&quot;name&quot;,&quot;Mr Brown&quot;>' ; $this ->getResponse()->setHttpHeader( &quot;X-JSON&quot; , '(' . $output . ')' ); return sfView::HEADER_ONLY; $this ->setTemplate( 'myCustomTemplate' ); $this ->forward( 'otherModule' , 'index' ); $this ->redirect( 'otherModule/index' ); $this ->redirect( 'http://www.google.com/' ); }
  • 45. Jornadas Symfony http://decharlas.uji.es/symfony Jornadas Symfony http://decharlas.uji.es/symfony Contenido Los Templates + MVC + Templates + Layout + Variables del Template + Fragmentos de código (Partials, Components, Slots) + Configuración del Layout + Accesso al Objeto Response + Conversión de Variables de vista + Respuestas del Action
  • 46. Jornadas Symfony http://decharlas.uji.es/symfony Jornadas Symfony http://decharlas.uji.es/symfony Procesando las Vistas
  • 47. Jornadas Symfony http://decharlas.uji.es/symfony Jornadas Symfony http://decharlas.uji.es/symfony Cadena de Ejecución 36px
  • 48. Request Controller Response Jornadas Symfony http://decharlas.uji.es/symfony Model Views
  • 49. Jornadas Symfony http://decharlas.uji.es/symfony Jornadas Symfony http://decharlas.uji.es/symfony Cadena de Ejecución <?php require_once (dirname(__FILE__). '/../config/ProjectConfiguration.class.php' ); $configuration = ProjectConfiguration::getApplicationConfiguration( 'frontend' , 'prod' , false ); sfContext::createInstance( $configuration )->dispatch(); web/ index.php
  • 50. Jornadas Symfony http://decharlas.uji.es/symfony Jornadas Symfony http://decharlas.uji.es/symfony sfContex instance Symfony Internals sfFrontWebController::dispatch() More symfony internals Filter Chain Filters Execution Filter sfExecutionFilter::handleAction() sfExecutionFilter::executeAction() sfExecutionFilter::handleView() sfExecutionFilter::executeView() Execution Filter Way Back sfWebResponse::send() Cadena de Ejecución
  • 51. Jornadas Symfony http://decharlas.uji.es/symfony Jornadas Symfony http://decharlas.uji.es/symfony class sfExecutionFilter extends sfFilter {.... protected function executeAction( $actionInstance ) { // execute the action $actionInstance ->preExecute(); $viewName = $actionInstance ->execute( $this ->context->getRequest()); $actionInstance ->postExecute(); return null === $viewName ? sfView::SUCCESS : $viewName ; } .... } sfExecutionFilter::executeAction() lib/vendor/symfony/lib/filter/sfExecutionFilter.class.php Cadena de Ejecución
  • 52. Jornadas Symfony http://decharlas.uji.es/symfony Jornadas Symfony http://decharlas.uji.es/symfony sfContex instance Symfony Internals sfFrontWebController::dispatch() More symfony internals Filter Chain Filters Execution Filter sfExecutionFilter::handleAction() sfExecutionFilter::executeAction() sfExecutionFilter::handleView() sfExecutionFilter::executeView() Execution Filter Way Back sfWebResponse::send() Cadena de Ejecución
  • 53. Jornadas Symfony http://decharlas.uji.es/symfony Jornadas Symfony http://decharlas.uji.es/symfony sfExecutionFilter::executeView() protected function executeView( $moduleName , $actionName , $viewName , $viewAttributes ) { // get the view instance $view = $controller ->getView( $moduleName , $actionName , $viewName ); // execute the view $view ->execute(); // Select render Mode and render ... case sfView::RENDER_CLIENT: $viewData = $view ->render(); $this ->context->getResponse()->setContent( $viewData ); break ; ... } Cadena de Ejecución
  • 54. Jornadas Symfony http://decharlas.uji.es/symfony Jornadas Symfony http://decharlas.uji.es/symfony sfController::getView() abstract class sfController { public function getView( $moduleName , $actionName , $viewName ) { // user view exists? $file = sfConfig::get( 'sf_app_module_dir' ). '/' . $moduleName . '/view/' . $actionName . $viewName . 'View.class.php' ; // Pregunta si existe la clase y si existe una clase espcial del módulo y devuelve las instancia de la clase. } } lib/vendor/symfony/lib/controller/sfController.class.php Cadena de Ejecución
  • 55. Jornadas Symfony http://decharlas.uji.es/symfony Jornadas Symfony http://decharlas.uji.es/symfony ¿Y esto porque es importante?
  • 56. Jornadas Symfony http://decharlas.uji.es/symfony Jornadas Symfony http://decharlas.uji.es/symfony Pues para extender su funcionamiento
  • 57. Jornadas Symfony http://decharlas.uji.es/symfony Jornadas Symfony http://decharlas.uji.es/symfony Cambiando la clase de Vista
  • 58. Jornadas Symfony http://decharlas.uji.es/symfony Jornadas Symfony http://decharlas.uji.es/symfony Cambiando la clase de Vista apps/frontend/moduleName/templates/indexSuccess.php apps/frontend/moduleName/view/indexSuccessView.php <?php class indexSuccessView extends sfPHPView { // Personalizamos algunos métodos } para una acción
  • 59. Jornadas Symfony http://decharlas.uji.es/symfony Jornadas Symfony http://decharlas.uji.es/symfony Cambiando la clase de Vista apps/frontend/config/module.yml para todas las acciones all : # For all environments enabled : true is_internal : false view_class : myPersonalView
  • 60. Jornadas Symfony http://decharlas.uji.es/symfony Jornadas Symfony http://decharlas.uji.es/symfony Las Clases
  • 61. Jornadas Symfony http://decharlas.uji.es/symfony Jornadas Symfony http://decharlas.uji.es/symfony sfView, sfPHPView, sfPartialView Las Clases lib/vendor/symfony/lib/view/ sfView.class.php lib/vendor/symfony/lib/view/ sfPHPView.class.php lib/vendor/symfony/lib/view/ sfPartialView.class.php sfView sfPHPView sfPartialView myPHPView
  • 62. Jornadas Symfony http://decharlas.uji.es/symfony Jornadas Symfony http://decharlas.uji.es/symfony Inspeccionemos sfPHPView lib/vendor/symfony/lib/view/ sfPHPView.class.php
  • 63. Jornadas Symfony http://decharlas.uji.es/symfony Jornadas Symfony http://decharlas.uji.es/symfony sfPHPView Class extends abstract sfView class sfPHPView extends sfView { public function execute(){} protected function renderFile( $_sfFile ){ // render ob_start(); ob_implicit_flush( 0 ); require ( $_sfFile ); return ob_get_clean(); } protected function decorate( $content ) { // Decora con el Layout } public function render() { // Procesa toda la vista para obtener su contenido return $content ; } }
  • 64. Jornadas Symfony http://decharlas.uji.es/symfony Jornadas Symfony http://decharlas.uji.es/symfony sfPHPView Class extends abstract sfView class sfPHPView extends sfView { public function execute(){} protected function renderFile($_sfFile){ // render ob_start(); ob_implicit_flush(0); require($_sfFile); return ob_get_clean(); } protected function decorate($content) { // Decora con el Layout } public function render() { // Procesa toda la vista para obtener su contenido return $content; } }
  • 65. Jornadas Symfony http://decharlas.uji.es/symfony Jornadas Symfony http://decharlas.uji.es/symfony sfPHPView Class extends abstract sfView class sfPHPView extends sfView { public function execute(){} protected function renderFile($_sfFile){ // render ob_start(); ob_implicit_flush(0); require($_sfFile); return ob_get_clean(); } protected function decorate($content) { // Decora con el Layout } public function render() { // Procesa toda la vista para obtener su contenido return $content; } }
  • 66. Jornadas Symfony http://decharlas.uji.es/symfony Jornadas Symfony http://decharlas.uji.es/symfony sfPHPView Class extends abstract sfView class sfPHPView extends sfView { public function execute(){} protected function renderFile( $_sfFile ){ // render ob_start(); ob_implicit_flush( 0 ); require ( $_sfFile ); return ob_get_clean(); } protected function decorate($content) { // Decora con el Layout } public function render() { // Procesa toda la vista para obtener su contenido return $content; } }
  • 67. Jornadas Symfony http://decharlas.uji.es/symfony Jornadas Symfony http://decharlas.uji.es/symfony sfPHPView Class extends abstract sfView class sfPHPView extends sfView { public function execute(){} protected function renderFile($_sfFile){ // render ob_start(); ob_implicit_flush(0); require($_sfFile); return ob_get_clean(); } protected function decorate( $content ) { // Decora con el Layout } public function render() { // Procesa toda la vista para obtener su contenido return $content; } }
  • 68. Jornadas Symfony http://decharlas.uji.es/symfony Jornadas Symfony http://decharlas.uji.es/symfony sfPHPView Class extends abstract sfView class sfPHPView extends sfView { public function execute(){} protected function renderFile($_sfFile){ // render ob_start(); ob_implicit_flush(0); require($_sfFile); return ob_get_clean(); } protected function decorate($content) { // Decora con el Layout } public function render() { // Procesa toda la vista para obtener su contenido return $content ; } }
  • 69. Jornadas Symfony http://decharlas.uji.es/symfony Jornadas Symfony http://decharlas.uji.es/symfony Muchas Gracias CTO José Antonio Pio Gil
  • 70. Jornadas Symfony http://decharlas.uji.es/symfony Jornadas Symfony http://decharlas.uji.es/symfony [email_address] http://twitter.com/josetonyp

Notas del editor

  • #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