MVC en Zend Framework

MVC es un acrónimo para Model-View-Controller (Modelo-Vista-Controlador); esta es un patrón de arquitectura de software.

Básicamente este patrón divide una aplicación (en nuestro caso una aplicación web) en tres partes:

  • Modelo
    Es la parte que se entenderá con la base de datos, una manera elegante y clara de separar esto, es que para cada tabla generar una clase que será su Modelo, aunque en realidad podría ser que un Modelo controle varias tablas que tengan mucho en común, por ejemplo para las relaciones muchos-a-muchos.
  • Controlador
    Se encarga de procesar la entrada del usuario, en nuestro caso de recoger los datos de formularios, la URL, etc. Procesarlos (utilizando los otros componentes ya que esta parte debería ser la única que se comunica con los demás y las otras partes deben estar aisladas) y producir un resultado.
  • Vista
    Es la parte que maneja la parte que el usuario verá, el caso más común es tener una página en HTML, pero las posibilidades son que podemos tener incluso páginas en WAP (contenido móbil) o representaciones de texto. El controlador procesará todo lo necesario y enviará sus resultados a la vista (en el caso de Zend Framework mediante asignación de variables). La vista procesará todos los datos de una manera que sean claros para el usuario (aunque una vez más, esto podría ser incluso tener como salida por ejemplo XML para una API para comunicación entre librerías)

En este tutorial veremos de manera introductoria como funciona el patrón de MVC con Zend Framework. Antes de ver el código, mostraremos como funciona básicamente Zend Framework con MVC mediante el siguiente esquema:

Proceso de MVC en Zend Framework

En el esquema el primer paso es cuando accedemos a una dirección, por ejemplo http://www.danguer.com/ajax/resultado

La configuración de Zend Framework mediante Apache utilizando Mod_Rewrite hace que la mayoría de ligas (con algunas excepciones por ejemplo extensiones de hojas de estilo, javascript, etc) las procese el archivo index.php que contiene el código básico para inicializar el MVC que veremos más adelante.

Este archivo index.php tiene un código básico para inicializar toda la aplicación web, lo cual es ya de entrada interesante. Para la estructura de directorios será de la siguiente manera:

Estructura de Directorios de Zend Framework MVC

Tendremos la carpeta principal app/ que será donde irá todo el código de PHP, dentro de esta carpeta tenemos varias carpetas pero las principales son:

  • controllers, donde estará el código de los controladores
  • models, donde estará el código de los modelos (no lo utilizaremos)
  • layout, las plantillas para el sitio (parte de las vistas)
  • views, las vistas junto con “ayudantes” (helpers)

La carpeta adicional langs, es una carpeta opcional y personal que he dejado del ejemplo de tutorial con Zend_Form, solo para ilustrar que se pueden crear carpetas adicionales sin problemas.

Como nota personal a mi me gusta dejar código que es necesario dentro de la carpeta /app, en el ejemplo se puede ver el archivo: Danguer_Controller_Action.php que después veremos a detalle. Esto es totalmente preferencia personal de como estructurar el archivo.

Después de la carpeta /app, hay una carpeta styles/ que contiene archivos CSS, en realidad la carpeta no será visible para el usuario ya que http://sitio/styles intentará interpretarlo como código PHP mediante controladores como veremos más adelante.

Hay sugerencias de seguridad de como estructurar estas carpetas, pero en lo personal para mis desarrollos utilizo la estructura mostrada para no separar por completo el código y tenerlo todo en un solo lugar.

El archivo realmente importante es index.php y por supuesto .htaccess, el primero tiene el código de manejo para el MVC de Zend Framework y el segundo es un archivo para que Apache redireccione todas las peticiones al archivo index.php

Contenido del archivo index.php y .htaccess

El archivo .htaccess es muy simple, debido a que solamente habilita Mod_Rewrite y redirecciona todas las peticiones al archivo index.php:

RewriteEngine on

RewriteRule !\.(js|ico|gif|jpg|png|css|swf)$ index.php

La primera linea habilita Mod_Rewrite, la otra linea indica que salvo las ligas que contengan las extensiones js, ico, gif, jpg, png, css y swf deben procesarse con el archivo index.php, aqui se puede hacer que por ejemplo se habiliten algunos directorios para no ser procesador por el archivo index.php (por ejemplo un directorio de imagenes), pero esto debe ser tratado con cada caso en particular.

El archivo index.php contiene más lineas, pero son muy sencillas:

require_once 'Zend/Controller/Front.php';
require_once 'Zend/Layout.php';

require_once './app/Danguer_Controller_Action.php';

// Configurar controlador
$controller = Zend_Controller_Front::getInstance();
$controller->setControllerDirectory('./app/controllers');
$controller->throwExceptions(true); 

// asignar MVC
Zend_Layout::startMvc(array(
    'layoutPath' => './app/layouts',
    'layout' => 'principal'
	));

// ejecutar!
$controller->dispatch();

Las primeras lineas llaman las librerías necesarias que son el “despachador” de los controladores (Zend/Controller/Front.php) y la plantilla (Zend/Layout.php) la otra línea requiriendo un archivo en php (./app/Danguer_Controller_Action.php) será discutido más adelante, pero en esta parte podemos incluir todas los archivos/librerías que necesitemos, tanto de Zend como propios.

La siguiente línea de código genera el despachador, básicamente genera una instancia de este despachador (es única para toda la aplicación, por eso utilizamos de manera estática sin construirlo), asignamos el directorio de los controladores (./app/controllers) y por último permitimos que muestre excepciones por ser código en desarrollo (en producción se sugiere no utilizarlo para no dejar ver código importante a los usuarios).

La siguiente parte tiene como misión inicializar el sistema MVC de la parte de la plantilla. Anteriormente Zend Framework no manejaba plantillas en sus vistas, algo odioso porque se necesitaba crear un código propio (aunque había buenos ejemplos en la red). Actualmente con esa línea podemos definir la plantilla que utilizarán las vistas. Más adelante veremos como está hecha la plantilla.
Con ese código hemos definido que el sistema debe buscar en el directorio ./app/layouts las plantillas, y que la plantilla por defecto es ‘principal’ que el archivo debe llamarse: ./app/layouts/principal.phtml

Con esto el sistema llamará a los controladores de la manera que veremos en la siguiente sección.

Proceso del MVC

Zend Framework una vez que tenga la liga (en este caso /ajax/resultado) procederá a “enrutarla”, es decir a convertir la liga en el controlador y acción deseada. Si no modificamos nada, por defecto el enrutamiento funciona de la siguiente manera:

http://sitio/controlador/accion

Así en nuestro ejemplo, el controlador es “ajax” y la acción es “resultado“. Por supuesto se pueden definir rutas alternativas, por ejemplo se puede decir que http://sitio/blog/2008 sea el controlador “blog“, la acción “archivos” y pasarle a la acción un parámetro de nombre “annio” con el valor 2008. Esto podría ser un alias de: http://sitio/blog/archivos?annio=2008 que funciona bajo la configuración estándar

El ruteador puede ser tan personalizado que podemos pasar nuestro propio ruteador siempre y cuando se extienda de la interfaz: Zend_Controller_Router_Interface, o en su defecto que extienda la clase Zend_Controller_Router_Abstract, pero esto son temas avanzados que podemos discutir en otro tutorial =).

Una vez que el sistema sabe que controlador y acción es, procederá a llamar al controlador y a la acción. El controlador debe ser especificado de la siguiente forma:

<?php
require_once 'Zend/Controller/Action.php';

class ControladorController extends Zend_Controller_Action {
    public function accionAction() {
         //codigo del controlador
    }
}

En donde el nombre de la clase debe ser el nombre del controlador iniciando con mayúscula y seguido por ‘Controller‘ (sin espacios) y cada nombre de función debe ser el nombre de la acción seguido por ‘Action‘ (sin espacios). El nombre del archivo debe ser igual que el nombre de la clase y se almacena dentro de la carpeta /app/controllers.

En el caso anterior para la liga /ajax/resultado nuestro archivo sería el siguiente:

<?php
require_once 'Zend/Controller/Action.php';

class AjaxController extends Zend_Controller_Action {
    public function resultadoAction() {
         //codigo del controlador
    }
}

Cuando entremos a la liga mencionada, el sistema procesará todo el código en la función de la acción. Como vemos nuestra clase extiende de Zend_Controller_Action, esta clase contendrá básicamente:

  • una petición (que contiene información de variables de entrada o del sistema)
  • una respuesta (que puede ser para redireccionar la página a otra por ejemplo)
  • la vista

Por defecto el sistema crea una vista, crea las variables de la petición y la respuesta, llama a la función de la acción; y por último llama a un “ayudante” para que la vista sea generada y la salida se envia al navegador. Es por esto que dentro del controlador no llamaremos a la función render ya que la clase principal lo hace automáticamente.

Para obtener información de entrada, como un parámetro que se especificó mediante /controlador/accion?variable=valor utilizamos la variable de la petición de la siguiente manera:

$peticion = $this->getRequest();
$valor = $peticion->getParam('variable');

También existe una función $peticion->getParams(); que regresa un arreglo asociativo con todas las variables y sus valores.

Para pasar una variable a la vista existe una variable $this->view dentro del controlador a la que podemos pasar valores de la siguiente forma:

$variable = 'Hola mundo';
$this->view->assign('variable', $variable);
//la vista ahora tendrá una variable que puede ser accesada como $this->variable

Más adelante veremos algunas opciones útiles para inicializar valores en la vista o cambiar el ciclo de renderizado de la vista.

Vistas

Las vistas deben ser guardadas en el directorio apps/views/scripts/controlador/ con el nombre de archivo: accion.phtml, así por ejemplo para nuestro ejemplo de /ajax/resultado debemos crear el siguiente archivo: apps/views/scripts/ajax/resultado.phtml

La vista contendrá archivo principalmente HTML, pero podemos procesar código PHP de forma normal entre <?php y ?>, Zend también permite que las vistas utilicen cualquier otro sistema de plantillas que esté escrito en PHP, por ejemplo Smarty.

Dentro llamamos a las variables que hemos asignado de la siguiente manera:

<?=$this->variable?>

Dentro de las vistas podemos alterar un poco la plantilla, para iniciar podemos cambiar el título de la siguiente manera:

<?php
$this->headTitle('Ventana emergente');
?>

Eso hará que el título de la página sea “Ventana Emergente”, pero también podemos agregar un archivo de hoja de estilo de la siguiente manera:

<?php
$this->headLink()->appendStylesheet($this->baseUrl.'/styles/archivo.css', 'screen');
?>

O incluir un archivo de javascript:

<?php
$this->headScript()->appendFile($this->baseUrl.'/scripts/archivo.js');
?>

El sistema de plantillas tiene algunas opciones extra que por brevedad no revisaremos, pero incluyen la posibilidad de incluir código en javascript/css que manejará de manera adecuada mediante una cadena.

La variable de $this->baseUrl, no es estándar de las vistas y es algo que yo he agregado y que veremos más adelante como se logra.

Plantillas

Las plantillas son muy simples, tienen el siguiente modelo:

<?php
/* con esto establecemos un documento XHTML */
echo '<?xml version="1.0" encoding="UTF-8" ?>';
/* esto generará las cabeceras de XHTML,
   también podemos definir otras como HTML 4 */
echo $this->doctype()
?>

<html>

	<head>
		<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
		<!-- es bueno definir algunas etiquetas "globales" aunque pueden hacerse sobreescribiendo el Danguer_Action_Controller  -->
		<link type="text/css" href="<?=$this->baseUrl?>/styles/main.css" rel="stylesheet" />		

		<?php
			/* Con esto nos aseguramos que el título siempre tenga un nombre al inicio */
			$this->headTitle('Ejemplo de MVC, danguer.com | ',Zend_View_Helper_Placeholder_Container_Abstract::PREPEND);

			echo $this->headTitle();
		    echo $this->headScript();
		    echo $this->headStyle();
	    ?>
	</head>

	<body>
		<!--  solo contenido, esto puede ser usado para un popup -->
		<?php echo $this->layout()->content ?>
	</body>

</html>

Como vemos definimos básicamente la plantilla del documento y definimos una parte que será donde irá el contenido con: <?php echo $this->layout()->content ?>, esta parte es reemplazada por la vista en cuestión.
La otra parte dinámica es:

<?php
			/* Con esto nos aseguramos que el título siempre tenga un nombre al inicio */
			$this->headTitle('Ejemplo de MVC, danguer.com | ',Zend_View_Helper_Placeholder_Container_Abstract::PREPEND);

			echo $this->headTitle();
		    echo $this->headScript();
		    echo $this->headStyle();
	    ?>

Que se reemplazará como vimos anteriormente por el título de la página, los archivos de scripts y las hojas de estilo.

Una plantilla también puede tener zonas de contenido, donde desde la vista podemos llenarlas, por ejemplo podemos tener una zona que indique un mensaje y no tendremos que alterar la plantilla segmentándola en diferentes archivos como se suele hacer. Eso se verá en otro tutorial =)

Controlador Base

En lo particular me gusta crear un controlador base que contiene código de utilidad para mis aplicaciones, casi siempre utilizo uno. En el código de ejemplo tiene nombre: app/Danguer_Controller_Action.php

Lo que hace este controlador base es lo siguiente:

  • Asigna variables a la vista (por ejemplo baseUrl que es el directorio base de ligas relativas, muy útil para subdirectorios)
  • Permite deshabilitar el renderizado automático (ya que al finalizar la función intentará buscar el archivo de vista que puede no existir por ejemplo para resultados de AJAX)
  • Tiene funciones de utilidad, en el ejemplo tiene una función para enviar datos en formato JSON con el simple llamado de una función, pero puede incluir código que se compartan entre todos (o la mayoría) de controladores

El código del controlador base es el siguiente:

<?php
require_once 'Zend/Controller/Action.php';

class Danguer_Controller_Action extends Zend_Controller_Action {
	protected $autoRender = true;

    public function initView()
    {
    	parent::initView();

	    $this->view->assign('baseUrl', $this->getRequest()->getBaseUrl());
		$this->view->assign('fullUrl', $this->getFullURL());
    	return $this->view;
    }

    public function init() {
    	$this->initView();
    }

    public function disableAutoRender() {
    	$this->autoRender = false;
    	$args = $this->getInvokeArgs();   	

    	$args['noViewRenderer'] = true;
    	$this->_setInvokeArgs($args);

    	$this->_helper->resetHelpers();
    }

    protected function getFullURL() {
    	$protocol = 'http://';
    	$host = $_SERVER['HTTP_HOST'];
    	$port = $_SERVER['SERVER_PORT'];

    	if ($port != '80')
    		$port = ":{$port}";
    	else
   			$port = '';

    	return "{$protocol}{$host}{$port}".$this->getRequest()->getBaseUrl();
    }

	protected function writeJSON($data) {
		require_once 'Zend/Json.php';

		$this->disableAutoRender();
		header('Content-Type: text/javascript');

		print Zend_Json::encode($data);
	}
}

La función init (similar al constructor de clases) forza a iniciar la vista, en esa función (initView) se llama al padre para que genere el objeto de vista y le asignemos variables predefinidas. Aqui podemos incluir todas las variables que necesitemos.

Las otras dos funciones extras son:

  • disableAutoRender
    Permite deshabilitar el auto-renderizado para que la aplicación no busque el archivo de la acción.
  • writeJSON
    Codifica una variable en formato JSON (apropiado para AJAX), también automáticamente deshabilita el auto-renderizado

Estas funciones son ejemplo de lo que se puede lograr personalizando el sistema MVC.

Por último si se necesita modificar la plantilla, es muy sencillo; en el código del controlador simplemente necesitamos hacer los siguientes pasos:

$mvc = Zend_Layout::getMvcInstance();
$mvc->setLayout('simple'); //utilizar la plantilla app/layouts/simple.phtml

Esto es la base para entender el modelo MVC de Zend Framework, más adelante explicaré más a detalle cosas como los ayudantes, modelos y Ruteadores.

Código fuente: DanguerArticle_Zend_MVC.tar.gz

Ver sitio demo

Temas similares

  • pollux

    Sr. siempre es un placer leer contenido suyo , gracias por la aclaración

  • Magui

    Muchas gracias fue de muchísima utilidad!!!!

  • Alvaro

    Hola, tengo un problema. Necesito proteger las llamadas directas al archivo index.php, porque cuando esto ocurre el sitio no carga bien los estilos y pierde la referencia del BaseUrl. Por Ejemplo cuando se llama al url misitio.com/ no hay problema, pero cuando se llama a la url misitio.com/index.php tengo problemas. Alguna vez vi un sitio donde comentaban de este asunto pero ahora no lo encuentro.

    Muchas gracias.

  • MimeMadness

    Hola, esta muy interesante el articulo, veo por tu perfil que eres certificados ZEND lo cual es genial, ahora bien queria preguntarte si tienes un ejemplo de como usar ajax con ZEND pero si lo pudieras explicar tan sencillo como este articulo seria genial.

  • fernando

    Me podes explicar como llamas desde los otros controladores al controlador base y tambien queria preguntarte si lo que tenes en el controlador base porque no lo colocas en helpers, cual es la ventaja. Saludos
    PD: como se habran dado cuenta estoy en mis primeros pasos con ZF.

  • Daniel

    Amigo Alvaro yo hice lo siguiente con respecto a tu problema cree varios helpers en /views/helpers/
    uno llamado BaseUrl.php con el siguiente código

    class Zend_View_Helper_BaseUrl
    {

    function baseUrl()
    {
    $fc = Zend_Controller_Front::getInstance();
    $request = $fc->getRequest();
    return dirname($request->getBaseUrl());
    }

    }

    y para mi caso los otro sfuenro ImgUrl, JsUrl, CssUrl
    donde solo cambio los nombres respectivos ejemplo:
    el (Zend_View_Helper_DirectorioUrl), el ( function directorioUrl()), y coloqué en el
    return dirname($request->getBaseUrl()).’/directorio a enlistar/’;

    Espero que te sirva y si existe algún error o fallo avisame por favor!!

  • Daniel

    Corrijo mi propio código, el problema es que cuando colocas index.php el baseUrl devuelve algo como /dir/index.php y esto no es un directorio valido para los css js u otros archivos, así pues que si mi comentario anterior es publicado aca muestro los cambio que realizé

    al /views/helpers/BaseUrl.php
    class Zend_View_Helper_BaseUrl
    {

    function baseUrl()
    {
    $fc = Zend_Controller_Front::getInstance();
    $request = $fc->getRequest();
    return str_replace(‘index.php’,”,$request->getBaseUrl());
    }
    }

    y a los otros archivos para obtener img, css, js este es el cambio para img
    class Zend_View_Helper_ImgUrl extends Zend_View_Helper_BaseUrl
    {
    function imgUrl()
    {
    return $this->BaseUrl().’/img/’;
    }
    }
    y los otros solo hay que cambiar el nombre de la clase y la function y el directorio por /img/; /css/; /js/

  • Guillermo

    Hola, gracias por tu aporte! Sabes que estoy teniendo problemas en crear controladores, sigo todos los pasos y cuando quiero entrar a un por medio de la direccion controlador/accion me dice error 404 , la pagina no la encontro. Probe el ejemplo que hiciste y tampoco funciono, cuando quiero ir a otra pagina que no sea el index me tira el mismo error. Sera algo de la configuracion??? Ya hice varios tutoriales y en ninguno pudo hacer funcionar otro controlador que no sea el index.
    Graicas!

  • http://www.danguer.com admin

    Hola Guillermo,

    Puede deberse a dos cosas, una que no tengas el archivo .htaccess en la raiz de tu aplicación con Zend Framework la cual debe contener:
    RewriteEngine on
    RewriteRule !\.(js|ico|gif|jpg|png|css|swf)$ index.php

    Si tienes este archivo con algo similar, entonces muy probablemente tu sistema no tenga configurado ModRewrite para apache (o no lo tenga habilitado para tu cuenta, esto sucede en algunos hostings).
    Para saber si apache lo está tomando en cuenta es muy fácil, en ese archivo .htaccess escribe un comando raro como “pruebaerror” al inicio, si al acceder al archivo index.php o la raíz el sistema no te marca ningún error (debe ser un error 500 de error de configuración del sistema) entonces tu sistema no tiene habilitado ModRewrite

    Saludos,

  • Guillermo

    Gracias! era eso, no tenia habilitado el mod_rewrite.

    Slds!

  • Esteban

    Hola. He dedicado 2 días para tratar de hacer funcionar tu ejemplo que descargué y NADA!!!
    Cabe mencionar que estoy recién partiendo con Framworks en PHP y sobretodo con Zend Studio.
    En principio al ingresar a mi sitio virtual donde tengo alojado tu ejemplo, solo muestra PAGINA EN BLANCO!!! lo único que logré fue colocar un error en index.php y eso imprimió el código de la pagina en pantalla.
    También coloqué un error en htacces y nada… todo igual…
    I NEED YOUR HELP PLEASE!!!
    Muchas gracias.
    Esteban.

  • http://www.danguer.com admin

    Hola, en primer lugar el Zend Studio 6.1 ya tiene implementado un Zend Framework Project que te crea las plantillas necesario; eso si yo he notado que te vuelve muy, pero muy lento el Studio (tal vez me pase solo a mi) por lo que hago es crear el proyecto y copiar todo el contenido a uno nuevo de PHP “simple” y agregarle las dependencias de Zend Framework =)

    Por lo que mencionas el último caso de que no pasa nada agregándole un error en .htaccess es porque seguramente no tienes habilitado el mod_rewrite (por eso apache lo toma como un archivo más y no lo lee).
    Del primer error seguramente tienes deshabilitado el error_reporting, intenta con:
    error_reporting(E_ALL); como primera línea del index.php a ver si así te da más información; la pantalla en blanco es seguramente por un FATAL ERROR que no se ve por la configuración (posiblemente un error de encontrar las librerías Zend)
    También puedes checar tu error_log de apache para ver si ahi aparece un error.

  • poloche

    Hola tengo un problema en ubunto no logro hacer andar nada tengo habilitado el mod rewrite pero no me redirecciona nada podrias porfis darme una mano tengo estos directorios
    -app controladores y todo lo demas
    -public
    –images
    –styles
    –scripts
    –.htacces
    –index.php
    la direccion es var/www/quantum/
    dentro esto tengo un .htaccess con
    RewriteEngine on
    RewriteBase /
    RewriteRule *$ quantum/public/index.php

    y el que esta en public contiene esto

    RewriteEngine on
    RewriteRule .(js|ico|gif|jpg|png|css)$ /public/$
    RewriteRule !\.(js|ico|gif|jpg|png|css)$ quantum/public/index.php

    el problema es que no encuentra ni las images ni los css ni los js y ademas cuando entro a quantum me muestra el contenido del directorio sin hacer caso al htaccess que le pongo.
    muchas gracias

  • http://www.flickr.com/photos/odiaz/ Odiaz

    Para Guillermo o cualquier otro que haya tenido el mismo error de el archivo index le trabaje bien, pero que al querer acceder a algun modulo (misitio.com/prueba/) le marcar el error 404 de apache. Lo solucione con la siguiente configuracion al crear el servidor virtutal, aunque lo que importa realmente es lo que esta dentro de

    DocumentRoot “/var/www/apps/quickstart/public”

    allow from all
    Options +Indexes
    Options FollowSymlinks
    AllowOverride all

    Saludos!!!
    Y al creador del post Don admin gracias por la info esta excelente.

  • Chrisitan

    Gracias, me salvaste no sabes cuanto he buscado una ayuda como esta ya los que conocen no lo explican tan bien como tu, felicidades eres lo maxmo 10 ptos

  • Emmanuel Pacheco

    Gracias Por tu Gran labor Excelente Tutorial
    Saludos

  • CyberMauher

    Excelente, mejor explicado imposible!!!

  • CyberMauher

    Hola no puedo asignar una variable al objeto $view dentro de IndexController, osea no es que no pueda sino que no la asigna. Lo raro es que si lo hago desde Bootstrap.php, ahí si me asigna el contenido y luego puedo accederla desde el layout.
    Cual puede ser el problema?

    NOTA. Ya probé de todo:
    $view->var = contenido;
    $view->assign(‘var’, ‘contenido’);
    $this->view->assign(‘var’, ‘contenido’);

  • http://www.danguer.com Daniel Guerrero

    Hola; el flujo de Zend es crear una vista, pasarla al controlador y esta se va pasando a otras instancias; como el layout; si no ves la variable es posible que tengas dos vistas diferentes (por ejemplo el Zend_View_Helper_Partial hace una copia de la vista y elimina las variables actuales) por lo que puedes checar si la vista tiene la misma referencia; para eso utiliza var_dump para saber el ID de tu resource; por ejemplo en tu controlador:
    var_dump($this->view); //->object(Zend_View) #1
    en tu vista:
    var_dump($this); //object(Zend_View) #2
    y en tu layout y bootstrap.

    Deben tener el mismo ID (a menos que estés ocupando algo como una vista parcial).

    Saludos,

  • CyberMauher

    Estas en lo cierto, le hice los retoques necesarios anduvo de maravilla.

  • CyberMauher

    Hola, necesito saber porque no renderiza el layout y si el script, en el controlador no tengo nada raro. Lo que si es raro que el index si funciona perfecto pero cualquier otro controlador no renderiza.
    Hice var_dump($this->view), en el controlador, y el objeto llega bien pero por algún motivo hace este trabajo.

    Dejo el controlador para que vean que no hay nada raro:
    class ContactoController extends Zend_Controller_Action
    {
    public function init()
    {
    $this->view->headTitle(‘Contacto’);
    $this->view->headTitle()->setSeparator(‘ / ‘);
    }

    public function indexAction()
    {
    }
    }

    Daniel, cual puede ser el problema? Sino como hago para renderizar manualmente el layout?

  • chabal

    Hola descargué el código, pero no pude poner a funcionar los links, la paguina de inicio si funciona, ya revise el mod_rewrite. en el http.conf y aparece bien, reviso los logs y aparece

    [error] [client 127.0.0.1] File does not exist: …./DanguerArticle_Zend_MVC/prueba, referer: http://localhost/DanguerArticle_Zend_MVC/ ,

    cual es el problema , muchas gracias por su ayuda.

  • http://www.danguer.com Daniel Guerrero

    Hola chabal, por el File does not exists y que si funciona la pagina de inicio es porque no está funcionando tu mod_rewrite, checa que tengas en tu http.conf (o en otro archivo que tu configuración esté leyendo si utilizas por ejemplo debian):
    LoadModule rewrite_module /usr/lib/apache2/modules/mod_rewrite.so
    (checa por supuesto el path a mod_rewrite.so, ya que el anterior es para debian)

    Y también que en tu directorio estés permitiendo hacer uso del mod_rewrite:

    AllowOverride All
    #codigo anterior si ya estaba definido

    El /var/www puede ser el directorio donde está el código del MVC o también un subdirectorio padre (puede ser tu DocumentRoot). lo importante es el AllowOverride All

  • http://www.danguer.com Daniel Guerrero

    Hola CyberMauher, es posible que no veas el contenido porque el flujo del Zend Framework en el Zend_Controller_Action es que hasta que pasa a la función render no se inicializa la vista; por eso en mi código de ejemplo en mi init() pongo una llamada a $this->initView() para forzarlo, te recomiendo que tu init pongas lo mismo y veas si ayuda

    Aunque lo extraño es que no te marque un error porque el $view es nulo; qué version de Zend Framework tienes?

    Saludos,

  • chabal

    Hola de nuevo, ya revise el mod_rewrite y aparece sin # es en windows esa parte estaba bien , solo faltaba agregar la ruta al final así:

    AllowOverride All
    #codigo anterior si ya estaba definido

    Agradezco tu rápida ayuda.

  • chabal

    Hola, tengo un problema cuando trato de ejecutar una aplicación hecha en zend ya montada en un servidor linux y aparece:

    An error occurred
    Page not found
    Exception information:

    Message: Invalid controller specified (notificacionAdjunto)
    Stack trace:

    …library/Zend/Controller/Front.php(954): Zend_Controller_Dispatcher_Standard->dispatch(Object(Zend_Controller_Request_Http), Object(Zend_Controller_Response_Http))
    …/library/Zend/Application/Bootstrap/Bootstrap.php(97): Zend_Controller_Front->dispatch()
    …/library/Zend/Application.php(366): Zend_Application_Bootstrap_Bootstrap->run()
    …/public/index.php(26): Zend_Application->run()
    #4 {main}

    Y no se que puede ser.
    De antemano gracias.

  • http://jcampanog.wordpress.com/2011/09/18/informacion-de-zend-framework/ Información de Zend Framework « Tecnologías de la Información
  • Eduardo7070

    Desesperado con Zend Framework. He creado el controller About pero cuando llamo a web.com/about me da el error 404. He probado todo lo que he visto (mod_rewrite, AllowOverride All, etc) y no consigo que funcione. Al poner web.com me sale
    Index of /inmoaid.comParent Directory
    .zfproject.xml
    application/
    docs/
    library/
    public/
    tests/En lugar de sailrme la pantallista azul de Zend.

    ¿Que esta mal?
    He intentado crear un virtualhost pero ni de coña tras perder un monton de tiempo.
    Gracias.

  • Mike

    a que le llamas ligas???