symfony: domesticando las vistas
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
organizan patrocinan
colaboran
Jornadas Symfony 5 y 6 de julio 2010Universitat Jaume I, Castellón
http://decharlas.uji.es/symfony
tr
Jornadas Symfony http://decharlas.uji.es/symfonyJornadas Symfony http://decharlas.uji.es/symfony
hacemos Webs!
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
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
Jornadas Symfony http://decharlas.uji.es/symfony
PresentaciónProyectos con Symfony
Jornadas Symfony http://decharlas.uji.es/symfony
Jornadas Symfony http://decharlas.uji.es/symfony
PresentaciónProyectos con Symfony
Jornadas Symfony http://decharlas.uji.es/symfony
Jornadas Symfony http://decharlas.uji.es/symfonyJornadas Symfony http://decharlas.uji.es/symfony
Domesticando las Vistas Contenido
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
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
Jornadas Symfony http://decharlas.uji.es/symfonyJornadas Symfony http://decharlas.uji.es/symfony
Los Templates
Jornadas Symfony http://decharlas.uji.es/symfonyJornadas Symfony http://decharlas.uji.es/symfony
Como empezó todoPues con un MVC
Jornadas Symfony http://decharlas.uji.es/symfonyJornadas Symfony http://decharlas.uji.es/symfony
MVC
Request Controller Response
Model Views
Jornadas Symfony http://decharlas.uji.es/symfonyJornadas Symfony http://decharlas.uji.es/symfony
Templates
apps/frontend/modules/moduleName/templates/archivos.php
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>
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") ?>
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}")
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 ) ?>
Jornadas Symfony http://decharlas.uji.es/symfonyJornadas Symfony http://decharlas.uji.es/symfony
Layout
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>
Jornadas Symfony http://decharlas.uji.es/symfonyJornadas Symfony http://decharlas.uji.es/symfony
Variables del Template
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
Jornadas Symfony http://decharlas.uji.es/symfonyJornadas Symfony http://decharlas.uji.es/symfony
Fragmentos de códigos
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.
Jornadas Symfony http://decharlas.uji.es/symfonyJornadas Symfony http://decharlas.uji.es/symfony
Partials
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>
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
Jornadas Symfony http://decharlas.uji.es/symfonyJornadas Symfony http://decharlas.uji.es/symfony
Components
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
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
Jornadas Symfony http://decharlas.uji.es/symfonyJornadas Symfony http://decharlas.uji.es/symfony
Slots
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>
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>
Jornadas Symfony http://decharlas.uji.es/symfonyJornadas Symfony http://decharlas.uji.es/symfony
Configuración del Layout
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
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
Jornadas Symfony http://decharlas.uji.es/symfonyJornadas Symfony http://decharlas.uji.es/symfony
Acceso al objeto Response
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');
}
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',)
Jornadas Symfony http://decharlas.uji.es/symfonyJornadas Symfony http://decharlas.uji.es/symfony
Conversión de variables de vista
Escaping Output
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
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>
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
Jornadas Symfony http://decharlas.uji.es/symfonyJornadas Symfony http://decharlas.uji.es/symfony
Respuestas del Action
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/');
}
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
Jornadas Symfony http://decharlas.uji.es/symfonyJornadas Symfony http://decharlas.uji.es/symfony
Procesando las Vistas
Jornadas Symfony http://decharlas.uji.es/symfonyJornadas Symfony http://decharlas.uji.es/symfony
Cadena de Ejecución
Request Controller Response
Jornadas Symfony http://decharlas.uji.es/symfony
Model Views
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
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
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
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
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
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
Jornadas Symfony http://decharlas.uji.es/symfonyJornadas Symfony http://decharlas.uji.es/symfony
¿Y esto porque es importante?
Jornadas Symfony http://decharlas.uji.es/symfonyJornadas Symfony http://decharlas.uji.es/symfony
Pues para extender su funcionamiento
Jornadas Symfony http://decharlas.uji.es/symfonyJornadas Symfony http://decharlas.uji.es/symfony
Cambiando la clase de Vista
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
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
Jornadas Symfony http://decharlas.uji.es/symfonyJornadas Symfony http://decharlas.uji.es/symfony
Las Clases
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
Jornadas Symfony http://decharlas.uji.es/symfonyJornadas Symfony http://decharlas.uji.es/symfony
Inspeccionemos sfPHPView
lib/vendor/symfony/lib/view/sfPHPView.class.php
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; }}
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; }}
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; }}
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; }}
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; }}
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; }}
Jornadas Symfony http://decharlas.uji.es/symfonyJornadas Symfony http://decharlas.uji.es/symfony
Muchas GraciasCTO José Antonio Pio Gil
Jornadas Symfony http://decharlas.uji.es/symfonyJornadas Symfony http://decharlas.uji.es/symfony
http://twitter.com/josetonyp