Foros del Web » Programando para Internet » PHP » Frameworks y PHP orientado a objetos »

Mi Front Controller

Estas en el tema de Mi Front Controller en el foro de Frameworks y PHP orientado a objetos en Foros del Web. Hola, Les explico como estoy desarrollando las aplicaciones web con smarty+PEAR: Tengo un front controller; index.php por el que obligo a todas las páginas a ...
  #1 (permalink)  
Antiguo 30/01/2007, 09:38
 
Fecha de Ingreso: enero-2002
Ubicación: Bilbao, Vizcaya
Mensajes: 37
Antigüedad: 22 años, 3 meses
Puntos: 2
Mi Front Controller

Hola,

Les explico como estoy desarrollando las aplicaciones web con smarty+PEAR:

Tengo un front controller; index.php por el que obligo a todas las páginas a pasar, utilizando el mod_rewrite, algo así como:

Código:
RewriteEngine On
RewriteBase /

RewriteCond %{REQUEST_URI} !(index\.php|robots\.txt) [NC]
RewriteRule ^(.*)$ /index.php [L]
En este index.php cargo la BD, variables de sesión etc.

Luego, para evitar tener que repetir "headers y footers" por todos lados, hago una captura de la url, llamo al PHP correspondiente, si hubiere, y asigno el TPL a mostrar, asi:

Código:
$url = explode('/', $_SERVER['REDIRECT_URL']);
Si el usuario no indica ninguna página, se tomará "inicio" como predeterminada:

Código:
$_page = $url[1]?$url[1]:'inicio';
Si existe un PHP para esa página, donde se asignan variables específicas, se incluye así:

Código:
if (file_exists("$_page.php")) include_once "$_page.php";
Ahora incializo la variable $_template, si no existe, ocurre de manera similar a la pagina PHP, además para el caso de generación de formularios, se utilizaría la variable $_content. P. Ej, estoy utilizando el HTML_Quick_Form de PEAR, la declaración sería así:

Código:
$_content = $form->toHtml();
Código:
if (file_exists("$_page.tpl")) 
    $_template = "$_page.tpl"; 
else 
    $_template = '_default.tpl';
Ahora voy con las asignaciones de variables:

Código:
$smarty->assign('_template', $_template);
$smarty->assign('_content', $_content);
Y muestro la plantilla principal

Código:
$smarty->display("_layout.tpl");
De esta manera consigo tener todo un diseño en un solo TPL, y para cada pagina, un PHP si lo necesita y un TPL si lo necesita. El código de _layout.tpl sería mas o menos así:

Código:
<head>
<title>Layout</title>
</head>
<body>
<div class="header">Content for  class "header" Goes Here</div>
<div class="sidebar">Content for  class "sidebar" Goes Here</div>
<div class="content">{include file="$_template"}</div>
<div class="footer">Content for  class "footer" Goes Here</div>
</body>
</html>
En el caso que la página tenga un TPL de distinto nombre, DENTRO del PHP se asigna la variable $_template

Y por ultimo, lo que tenemos en _default.tpl es:

Código:
{$_content}
Ahora bien, la pregunta es: Como puedo utilizar esta estructura sin tener que deshabilitar el caché del smarty ? Esto sólo funciona con
Código:
$smarty->caching = false;
lo que implicaría estar usando el smarty por gusto. Cuando lo pongo a true, siempre se visualiza la misma página.

Gracias de antemano
  #2 (permalink)  
Antiguo 31/01/2007, 15:43
 
Fecha de Ingreso: septiembre-2005
Mensajes: 142
Antigüedad: 18 años, 7 meses
Puntos: 3
Re: Mi Front Controller

Bueno primero de todo felicitarte por el modelo que has construido, personalmente creo que es el más eficiente y llega a ahorrar cantidad de código el solo hecho de tener un front controller, el hecho de redirigir al index.php y procesar los controladores y las acciones desde alli es buena idea de hecho es la utilizada en Zend Framework. Bueno a lo que ibamos tienes problemas con Caching utilizando Smarty el problema es que Smarty es un producto es decir tienes problemas con las funciones propias de Smarty no un problema de diseño así que creo que tendrás más que suficiente con está dirección:

http://www.lacorona.com.mx/mario/smarty/smarty_manual_es/caching.html

espero que te sirva de ayuda.

Un consejo cuando estes en fase de desarrollo pon el
Código PHP:
$smarty->caching false
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 10:46.