TigerZF
🌐Español

78.2. Scripts de controlador

El controlador es donde se instancia y configura Zend_View. Después se asignan variables a la vista y se indica a la vista que renderice la salida utilizando un script en particular.

78.2.1. Asignación de variables

El script del controlador debe asignar las variables necesarias a la vista antes de entregar el control al script de la vista. Normalmente, puede realizar las asignaciones una a una asignando a los nombres de propiedad de la instancia de la vista:

$view = new Zend_View();
$view->a = "Hay";
$view->b = "Bee";
$view->c = "Sea";

Sin embargo, esto puede resultar tedioso cuando ya ha recopilado los valores que se van a asignar en un array u objeto.

El método assign() le permite asignar desde un array u objeto "en bloque". Los siguientes ejemplos tienen el mismo efecto que las asignaciones de propiedades una a una anteriores.

$view = new Zend_View();

// assign an array of key-value pairs, where the
// key is the variable name, and the value is
// the assigned value.
$array = array(
    'a' => "Hay",
    'b' => "Bee",
    'c' => "Sea",
);
$view->assign($array);

// do the same with an object's public properties;
// note how we cast it to an array when assigning.
$obj = new StdClass;
$obj->a = "Hay";
$obj->b = "Bee";
$obj->c = "Sea";
$view->assign((array) $obj);

Alternativamente, puede usar el método assign para asignar una a una pasando un nombre de variable como cadena, y después el valor de la variable.

$view = new Zend_View();
$view->assign('a', "Hay");
$view->assign('b', "Bee");
$view->assign('c', "Sea");

78.2.2. Renderizado de un script de vista

Una vez que ha asignado todas las variables necesarias, el controlador debe indicar a Zend_View que renderice un script de vista en particular. Hágalo llamando al método render(). Tenga en cuenta que el método devolverá la vista renderizada, no la imprimirá, por lo que deberá imprimirla o mostrarla usted mismo en el momento apropiado.

$view = new Zend_View();
$view->a = "Hay";
$view->b = "Bee";
$view->c = "Sea";
echo $view->render('someView.php');

78.2.3. Rutas de scripts de vista

Por defecto, Zend_View espera que sus scripts de vista sean relativos al script que los llama. Por ejemplo, si su script de controlador se encuentra en "/path/to/app/controllers" y llama a $view->render('someView.php'), Zend_View buscará "/path/to/app/controllers/someView.php".

Obviamente, sus scripts de vista probablemente estén ubicados en otro lugar. Para indicar a Zend_View dónde debe buscar los scripts de vista, utilice el método setScriptPath().

$view = new Zend_View();
$view->setScriptPath('/path/to/app/views');

Ahora, cuando llame a $view->render('someView.php'), buscará "/path/to/app/views/someView.php".

De hecho, puede "apilar" rutas usando el método addScriptPath(). A medida que agrega rutas a la pila, Zend_View buscará en la ruta añadida más recientemente el script de vista solicitado. Esto le permite sobrescribir vistas predeterminadas con vistas personalizadas, de modo que pueda crear "temas" o "skins" personalizados para algunas vistas, dejando otras intactas.

$view = new Zend_View();
$view->addScriptPath('/path/to/app/views');
$view->addScriptPath('/path/to/custom/');

// now when you call $view->render('booklist.php'), Zend_View will
// look first for "/path/to/custom/booklist.php", then for
// "/path/to/app/views/booklist.php", and finally in the current
// directory for "booklist.php".
[Note] Nunca use la entrada del usuario para establecer rutas de scripts

Zend_View utiliza rutas de scripts para buscar y renderizar scripts de vista. Como tal, estos directorios deben conocerse de antemano, y estar bajo su control. Nunca establezca las rutas de scripts de vista basándose en la entrada del usuario, ya que puede exponerse potencialmente a una vulnerabilidad de inclusión local de archivos si la ruta especificada incluye desplazamientos de directorio superior. Por ejemplo, la siguiente entrada podría desencadenar el problema:

// $_GET['foo'] == '../../../etc'
$view->addScriptPath($_GET['foo']);
$view->render('passwd');

Aunque este ejemplo es artificial, muestra claramente el problema potencial. Si debe depender de la entrada del usuario para establecer la ruta de su script, filtre correctamente la entrada y compruebe que existe bajo rutas controladas por su aplicación.