symfony: domesticando las vistas

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

Upload: jose-antonio-pio

Post on 16-Jan-2015

6.118 views

Category:

Technology


0 download

DESCRIPTION

Domesticando las Vistas es una introducción y explicación a la capa de abstracción de Vistas del framework Symfony en PHP.

TRANSCRIPT

Page 1: Symfony: Domesticando las Vistas

organizan patrocinan

colaboran

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

http://decharlas.uji.es/symfony

Page 2: Symfony: Domesticando las Vistas

tr

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

hacemos Webs!

Page 3: Symfony: Domesticando las Vistas

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

http://decharlas.uji.es/symfony

Domesticando las vistas de symfonyJose Antonio Pio Acilia.es

Page 4: Symfony: Domesticando las Vistas

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

PresentaciónCTO Acilia Internet Madrid

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

Background

+ Estudie Ingeniería Electrónica

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

+ PHP y Ruby

+ CakePHP, Rails, CodeIgniter y Symfony 1.2 - 1.4

Page 5: Symfony: Domesticando las Vistas

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

PresentaciónProyectos con Symfony

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

Page 6: Symfony: Domesticando las Vistas

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

PresentaciónProyectos con Symfony

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

Page 7: Symfony: Domesticando las Vistas

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

Domesticando las Vistas Contenido

Page 8: Symfony: Domesticando las Vistas

Jornadas Symfony http://decharlas.uji.es/symfonyJornadas 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

Page 9: Symfony: Domesticando las Vistas

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

Contenido

Procesando las Vistas

+ Cadena de Ejecución

+ Cambiando la clase de Vista

+ Las Clases

+ sfPHPView Class

Page 10: Symfony: Domesticando las Vistas

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

Los Templates

Page 11: Symfony: Domesticando las Vistas

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

Como empezó todoPues con un MVC

Page 12: Symfony: Domesticando las Vistas

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

MVC

Request Controller Response

Model Views

Page 13: Symfony: Domesticando las Vistas

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

Templates

apps/frontend/modules/moduleName/templates/archivos.php

Page 14: Symfony: Domesticando las Vistas

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

Templates

<?php use_helper('I18N', 'Date') ?><?php include_partial('attribute/assets') ?>

<div id="sf_admin_container" class="tab_sf_admin_container_attributes" ><h1><?php echo __('Attribute List', array(), 'messages') ?></h1><ul><li><a href="#sf_admin_content_list">

<?php echo __("Categories") ?></a></li></ul>

<div id="sf_admin_content_list"> <?php include_partial('attribute/flashes') ?>

</div>

</div>

<script type="text/javascript">//Algo de Javascript</script>

Page 15: Symfony: Domesticando las Vistas

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

TemplatesHelpers

<?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("attribute/list?parent_id=0&page=1") ?>

Page 16: Symfony: Domesticando las Vistas

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

TemplatesHelpers 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( __("Signout"), url_for('@sf_guard_signout') )url_for("@attribute_attribute_new?parent_id={$parent_id}")

Page 17: Symfony: Domesticando las Vistas

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

TemplatesHelpers Propios

apps/frontend/lib/helper/NombreHelper.php

<?php

function previewObject($object){

}

<?php use_helper('Nombre') ?>

...

<?php echo previewObject( $object ) ?>

Page 18: Symfony: Domesticando las Vistas

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

Layout

Page 19: Symfony: Domesticando las Vistas

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

Layout

apps/frontend/templates/layout.php

Layout

Template

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"><html xmlns="http://www.w3.org/1999/xhtml"><head><meta http-equiv="content-type" content="text/html; charset=utf-8" />

<?php include_http_metas() ?> <?php include_metas() ?> <?php include_title() ?> <link rel="shortcut icon" href="/favicon.ico" /> <?php include_stylesheets() ?> <?php include_javascripts() ?></head><body>

<div id="wrapper"><?php echo $sf_content ?>

</div></body></html>

Page 20: Symfony: Domesticando las Vistas

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

Variables del Template

Page 21: Symfony: Domesticando las Vistas

Jornadas Symfony http://decharlas.uji.es/symfonyJornadas 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

Page 22: Symfony: Domesticando las Vistas

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

Fragmentos de códigos

Page 23: Symfony: Domesticando las Vistas

Jornadas Symfony http://decharlas.uji.es/symfonyJornadas 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.

Page 24: Symfony: Domesticando las Vistas

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

Partials

Page 25: Symfony: Domesticando las Vistas

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

Fragmentos de códigosParcial

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="sf_admin_content"> <?php include_partial('moduleName/myPartial', array('variable' => $variable) ) ?></div>

Page 26: Symfony: Domesticando las Vistas

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

Fragmentos de códigosParcial

<div id="sf_admin_container"> <h1><?php echo $variable ?></h1>

</div>

apps/frontend/modules/moduleName/templates/_myPartial.php

Page 27: Symfony: Domesticando las Vistas

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

Components

Page 28: Symfony: Domesticando las Vistas

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

Fragmentos de códigosComponents

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="rss_box" >

<div class="rss_title"> <?php echo $rss->title ?></div></div>

<?php endforeach; ?>

apps/frontend/modules/moduleName/actions/components.class.php

apps/frontend/modules/moduleName/templates/_topRSS.php

Page 29: Symfony: Domesticando las Vistas

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

<?php use_helper('I18N', 'Date') ?><?php include_partial('attribute/assets') ?>

<div id="sf_admin_container" class="tab_sf_admin_container_attributes" ><h1><?php echo __('Attribute List', array(), 'messages') ?></h1><ul><li><a href="#sf_admin_content_list">

<?php echo __("Categories") ?></a></li></ul>

<div id="sf_admin_content_list"> <?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

Page 30: Symfony: Domesticando las Vistas

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

Slots

Page 31: Symfony: Domesticando las Vistas

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

Fragmentos de códigosSlots

apps/frontend/templates/layout.php

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN""http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

<html xmlns="http://www.w3.org/1999/xhtml"><head></head>

<body><div id="content">

<div class="header"><div class="logo"><?php echo link_to( image_tag("/images/logo.png"),

"/" ) ?></div><?php if (has_slot('virtual_logo')): ?><div class="logo_virtual"><?php include_slot('virtual_logo') ?></div><?php else: ?>

</div><?php echo $sf_content ?>

</div></body></html>

Page 32: Symfony: Domesticando las Vistas

Jornadas Symfony http://decharlas.uji.es/symfonyJornadas 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="company"><?php if ($company->hasLogo() ): ?>

<?php slot('virtual_logo') ?><?php echo $company->renderLogo() ?>

<?php end_slot() ?><?php endif; ?>

</div>

Page 33: Symfony: Domesticando las Vistas

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

Configuración del Layout

Page 34: Symfony: Domesticando las Vistas

Jornadas Symfony http://decharlas.uji.es/symfonyJornadas 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

Page 35: Symfony: Domesticando las Vistas

Jornadas Symfony http://decharlas.uji.es/symfonyJornadas 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

Page 36: Symfony: Domesticando las Vistas

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

Acceso al objeto Response

Page 37: Symfony: Domesticando las Vistas

Jornadas Symfony http://decharlas.uji.es/symfonyJornadas 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("sub_title") );if ($this->article->html_meta_title){

$response->setTitle(trim($this->article->html_meta_title)." | {$domain->name}");

}else{$response->setTitle(trim($this->article->getTitle())." | {$domain-

>name}");}$response->addStyleSheet('article');$response->addJavaScript('article.js');

}

Page 38: Symfony: Domesticando las Vistas

Jornadas Symfony http://decharlas.uji.es/symfonyJornadas 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',)

Page 39: Symfony: Domesticando las Vistas

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

Conversión de variables de vista

Escaping Output

Page 40: Symfony: Domesticando las Vistas

Jornadas Symfony http://decharlas.uji.es/symfonyJornadas 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

Page 41: Symfony: Domesticando las Vistas

Jornadas Symfony http://decharlas.uji.es/symfonyJornadas 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>

Page 42: Symfony: Domesticando las Vistas

Jornadas Symfony http://decharlas.uji.es/symfonyJornadas 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

Page 43: Symfony: Domesticando las Vistas

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

Respuestas del Action

Page 44: Symfony: Domesticando las Vistas

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

Respuestas del Action

public function executeIndex(){

return sfView::SUCCESS; // Corresponde indexSuccess.phpreturn sfView::ERROR; // Corresponde indexError.php

return 'MyResult';return $this->renderText("<html><body>Hello,

World!</body></html>");

$this->getResponse()->setContent("<html><body>Hello, World!</body></html>");

return sfView::NONE;

$output = '<"title","My basic letter"],["name","Mr Brown">';$this->getResponse()->setHttpHeader("X-JSON", '('.$output.')');

return sfView::HEADER_ONLY;

$this->setTemplate('myCustomTemplate');

$this->forward('otherModule', 'index');$this->redirect('otherModule/index');$this->redirect('http://www.google.com/');

}

Page 45: Symfony: Domesticando las Vistas

Jornadas Symfony http://decharlas.uji.es/symfonyJornadas 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

Page 46: Symfony: Domesticando las Vistas

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

Procesando las Vistas

Page 47: Symfony: Domesticando las Vistas

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

Cadena de Ejecución

Page 48: Symfony: Domesticando las Vistas

Request Controller Response

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

Model Views

Page 49: Symfony: Domesticando las Vistas

Jornadas Symfony http://decharlas.uji.es/symfonyJornadas 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

Page 50: Symfony: Domesticando las Vistas

Jornadas Symfony http://decharlas.uji.es/symfonyJornadas 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

Page 51: Symfony: Domesticando las Vistas

Jornadas Symfony http://decharlas.uji.es/symfonyJornadas 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

Page 52: Symfony: Domesticando las Vistas

Jornadas Symfony http://decharlas.uji.es/symfonyJornadas 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

Page 53: Symfony: Domesticando las Vistas

Jornadas Symfony http://decharlas.uji.es/symfonyJornadas 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

Page 54: Symfony: Domesticando las Vistas

Jornadas Symfony http://decharlas.uji.es/symfonyJornadas 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

Page 55: Symfony: Domesticando las Vistas

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

¿Y esto porque es importante?

Page 56: Symfony: Domesticando las Vistas

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

Pues para extender su funcionamiento

Page 57: Symfony: Domesticando las Vistas

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

Cambiando la clase de Vista

Page 58: Symfony: Domesticando las Vistas

Jornadas Symfony http://decharlas.uji.es/symfonyJornadas 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

Page 59: Symfony: Domesticando las Vistas

Jornadas Symfony http://decharlas.uji.es/symfonyJornadas 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

Page 60: Symfony: Domesticando las Vistas

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

Las Clases

Page 61: Symfony: Domesticando las Vistas

Jornadas Symfony http://decharlas.uji.es/symfonyJornadas 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

Page 62: Symfony: Domesticando las Vistas

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

Inspeccionemos sfPHPView

lib/vendor/symfony/lib/view/sfPHPView.class.php

Page 63: Symfony: Domesticando las Vistas

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

sfPHPView Classextends 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; }}

Page 64: Symfony: Domesticando las Vistas

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

sfPHPView Classextends 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; }}

Page 65: Symfony: Domesticando las Vistas

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

sfPHPView Classextends 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; }}

Page 66: Symfony: Domesticando las Vistas

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

sfPHPView Classextends 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; }}

Page 67: Symfony: Domesticando las Vistas

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

sfPHPView Classextends 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; }}

Page 68: Symfony: Domesticando las Vistas

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

sfPHPView Classextends 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; }}

Page 69: Symfony: Domesticando las Vistas

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

Muchas GraciasCTO José Antonio Pio Gil

Page 70: Symfony: Domesticando las Vistas

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

[email protected]

http://twitter.com/josetonyp