Foros del Web » Programando para Internet » PHP » Zend »

Zend, ¿cómo capturar la salida de un render?

Estas en el tema de Zend, ¿cómo capturar la salida de un render? en el foro de Zend en Foros del Web. Hola. estoy queriendo hacer como pequeñas templates para armar mails. Se me ocurre entonces, un controller que obtenga todos los datos, y luego crear distintos ...
  #1 (permalink)  
Antiguo 04/07/2010, 21:02
 
Fecha de Ingreso: noviembre-2008
Mensajes: 288
Antigüedad: 16 años
Puntos: 2
Zend, ¿cómo capturar la salida de un render?

Hola.
estoy queriendo hacer como pequeñas templates para armar mails.
Se me ocurre entonces, un controller que obtenga todos los datos, y luego crear distintos scripts para obtener distintos modelos de lo que serían los mails.
Pero no quiero correr el render del script, solo quiero obtener el html resultante. Para luego hacer todo el procesamiento y enviar el mail.

¿cómo puedo hacer eso? alguien sabe?
  #2 (permalink)  
Antiguo 04/07/2010, 22:38
Avatar de GatorV
$this->role('moderador');
 
Fecha de Ingreso: mayo-2006
Ubicación: /home/ams/
Mensajes: 38.567
Antigüedad: 18 años, 5 meses
Puntos: 2135
Respuesta: Zend, ¿cómo capturar la salida de un render?

Pues puedes instanciar un Zend_View y pasarle los datos que quieras, esa es la idea de ese componente .

Por ejemplo:
Código PHP:
Ver original
  1. $template = new Zend_View();
  2. $view->foo = 'bar';
  3. $message = $view->render('template.php');

Dentro de template:
Código PHP:
Ver original
  1. <?php echo $this->foo; ?>

Saludos.
  #3 (permalink)  
Antiguo 05/07/2010, 00:38
 
Fecha de Ingreso: noviembre-2008
Mensajes: 288
Antigüedad: 16 años
Puntos: 2
Respuesta: Zend, ¿cómo capturar la salida de un render?

Hola Gator! estaba viendo tu post, donde detallas un poco más esta respuesta, http://www.forosdelweb.com/f68/metod...ulario-690712/ ,
pero no consigo hacerlo andar.
El error es:
Fatal error: Uncaught exception 'Zend_View_Exception' with message 'no view script directory set; unable to determine location for view script' in C:\xampp\htdocs\Zend\library\Zend\View\Abstract.ph p:912 Stack trace: #0 C:\xampp\htdocs\Zend\library\Zend\View\Abstract.ph p(829): Zend_View_Abstract->_script('modelo1.php') #1 C:\xampp\htdocs\cines\application\modules\cines\co ntrollers\MailingController.php(288): Zend_View_Abstract->render('modelo1.php') #2 C:\xampp\htdocs\cines\application\modules\cines\co ntrollers\MailingController.php(41): Cines_MailingController->_componerMailSuscripciones() #3 C:\xampp\htdocs\Zend\library\Zend\Controller\Actio n.php(513): Cines_MailingController->indexAction() #4 C:\xampp\htdocs\Zend\library\Zend\Controller\Dispa tcher\Standard.php(289): Zend_Controller_Action->dispatch('indexAction') #5 C:\xampp\htdocs\Zend\library\Zend\Controller\Front .php(946): Zend_Controller_Dispatcher_Standard->dispatch(Object(Zend_Controller_Request_Http), Object(Zend_Controller_Response_Http)) #6 C:\xampp\htdocs\Zend in C:\xampp\htdocs\Zend\library\Zend\View\Abstract.ph p on line 912

El código que tengo:
$template = new Zend_View();
$template->nombre = 'bar';
$message = $template->render('modelo1.php');

echo $message;

¿qué es lo que falta? ¿dónde debe estar el php?
  #4 (permalink)  
Antiguo 05/07/2010, 01:06
 
Fecha de Ingreso: noviembre-2008
Mensajes: 288
Antigüedad: 16 años
Puntos: 2
Respuesta: Zend, ¿cómo capturar la salida de un render?

Encontre la línea que faltaba:

$template->setBasePath(dirname(__FILE__) . '/../views/');



No se porque Zend agrega siempre al final de ese path, 'scripts' . Con lo que el PHP debe quedar en views/scripts
  #5 (permalink)  
Antiguo 07/07/2010, 21:55
 
Fecha de Ingreso: noviembre-2008
Mensajes: 288
Antigüedad: 16 años
Puntos: 2
Respuesta: Zend, ¿cómo capturar la salida de un render?

uhh.. tengo otro problema con esto.
Resulta que tengo definido un Helper. Y al utilizar Zend_View no lo encuentra. Viendo los paths definidos, debería hacerlo. Pero no. No entiendo el por qué.

estoy trabajando dentro de un modulo que llame "cines".
$template = new Zend_View();
$template->setBasePath(dirname(__FILE__) . '/../');
$template->addBasePath(APPLICATION_PATH . '/modules/cines/views/');
$template->addBasePath(APPLICATION_PATH . '/modules/cines/views/helpers/'); //aqui tengo el helper que no encuentra.

despues de definir el BasePath, agregue 2 paths mas. Sin embargo, el mensaje de error me dice que apunta a esas carpetas, pero no encuentra el helper:

Fatal error: Uncaught exception 'Zend_Loader_PluginLoader_Exception' with message 'Plugin by name 'RecuadroPromo' was not found in the registry; used paths: Zend_View_Helper_: Zend/View/Helper/;C:\xampp\htdocs\cines\application\modules\cines\c ontrollers/..\helpers/;C:\xampp\htdocs\cines\application/modules/cines/views\helpers/;C:\xampp\htdocs\cines\application/modules/cines/views/helpers\helpers/' in C:\xampp\htdocs\Zend\library\Zend\Loader\PluginLoa der.php:401 Stack trace: #0 C:\xampp\htdocs\Zend\library\Zend\View\Abstract.ph p(1118): Zend_Loader_PluginLoader->load('RecuadroPromo') #1 C:\xampp\htdocs\Zend\library\Zend\View\Abstract.ph p(569): Zend_View_Abstract->_getPlugin('helper', 'RecuadroPromo') #2 C:\xampp\htdocs\Zend\library\Zend\View\Abstract.ph p(336): Zend_View_Abstract->getHelper('RecuadroPromo') #3 [internal function]: Zend_View_Abstract->__call('RecuadroPromo', Array) #4 C:\xampp\htdocs\cines\application\modules\cines\vi ews\scripts\mailing_modelo1.phtml(55): Zend_View->RecuadroPromo(NULL, '') #5 C:\xampp\htdocs\ in C:\xampp\htdocs\Zend\library\Zend\Loader\PluginLoa der.php on line 401

alguna idea? gracias!!!
  #6 (permalink)  
Antiguo 07/07/2010, 22:05
Avatar de GatorV
$this->role('moderador');
 
Fecha de Ingreso: mayo-2006
Ubicación: /home/ams/
Mensajes: 38.567
Antigüedad: 18 años, 5 meses
Puntos: 2135
Respuesta: Zend, ¿cómo capturar la salida de un render?

Tienes que usar addHelperPath para agregar los paths a los helpers.

Saludos.
  #7 (permalink)  
Antiguo 07/07/2010, 22:29
 
Fecha de Ingreso: noviembre-2008
Mensajes: 288
Antigüedad: 16 años
Puntos: 2
Respuesta: Zend, ¿cómo capturar la salida de un render?

gracias Gator!!
lo he probado pero sigue sin funcionar.

hago un echo var_dump($miView->getHelperPaths() ) y debería estar todo bien, pero no anda!

array(1) { ["Zend_View_Helper_"]=> array(6) { [0]=> string(17) "Zend/View/Helper/" [1]=> string(71) "C:\xampp\htdocs\cines\application\modules\cines\c ontrollers/..\helpers/" [2]=> string(62) "C:\xampp\htdocs\cines\application/modules/cines/views\helpers/" [3]=> string(48) "C:\xampp\htdocs\cines\application/modules/cines/" [4]=> string(54) "C:\xampp\htdocs\cines\application/modules/cines/views/" [5]=> string(62) "C:\xampp\htdocs\cines\application/modules/cines/views/helpers/" } }

y el error sigue igual, no encuentra el helper.
  #8 (permalink)  
Antiguo 07/07/2010, 22:30
Avatar de GatorV
$this->role('moderador');
 
Fecha de Ingreso: mayo-2006
Ubicación: /home/ams/
Mensajes: 38.567
Antigüedad: 18 años, 5 meses
Puntos: 2135
Respuesta: Zend, ¿cómo capturar la salida de un render?

Como usas el addHelperPath?

Saludos.
  #9 (permalink)  
Antiguo 07/07/2010, 22:36
 
Fecha de Ingreso: noviembre-2008
Mensajes: 288
Antigüedad: 16 años
Puntos: 2
Respuesta: Zend, ¿cómo capturar la salida de un render?

le agregue varias paths, con toda la ruta, por las dudas.... para que tome alguno.. pero... sigue el problema

$template = new Zend_View();

$template->setBasePath(dirname(__FILE__) . '/../');
$template->addBasePath(APPLICATION_PATH . '/modules/cines/views/');

$template->addHelperPath(APPLICATION_PATH . '/modules/cines/');
$template->addHelperPath(APPLICATION_PATH . '/modules/cines/views/');
$template->addHelperPath(APPLICATION_PATH . '/modules/cines/views/helpers/');

gracias...
  #10 (permalink)  
Antiguo 07/07/2010, 23:58
 
Fecha de Ingreso: noviembre-2008
Mensajes: 288
Antigüedad: 16 años
Puntos: 2
Respuesta: Zend, ¿cómo capturar la salida de un render?

le sigo dando vueltas y copie el helper fuera de /helpers/, es decir, bajo /views/ y ahi pareciera que anda, pero me sale el error de que logicamente no puedo redeclarar el helper, es decir ve los 2!!!:

Fatal error: Cannot redeclare class Cines_View_Helper_RecuadroPromo in C:\xampp\htdocs\cines\application\modules\cines\vi ews\helpers\RecuadroPromo.php on line 7

Pero, aqui lo raro, cualquiera de los dos que quite, me vuelve a tirar el error de que no encuentra el plugin helper.
  #11 (permalink)  
Antiguo 08/07/2010, 08:44
Avatar de GatorV
$this->role('moderador');
 
Fecha de Ingreso: mayo-2006
Ubicación: /home/ams/
Mensajes: 38.567
Antigüedad: 18 años, 5 meses
Puntos: 2135
Respuesta: Zend, ¿cómo capturar la salida de un render?

Para usar el addHelperPath si ves la documentación tienes que agregar dos cosas, el prefix y el path:
Código PHP:
Ver original
  1. $view->addHelperPath('My_View_Helper', '/my/view/helpers');

Checa la documentación.

Saludos.
  #12 (permalink)  
Antiguo 08/07/2010, 12:13
 
Fecha de Ingreso: noviembre-2008
Mensajes: 288
Antigüedad: 16 años
Puntos: 2
Respuesta: Zend, ¿cómo capturar la salida de un render?

... y no. aun no doy con la respuesta.
Use lo que decis, mire la documentacion ( que por cierto, está todo marcado en rojo http://zendframework.com/manual/en/z...w.helpers.html ).

Esto me ha frustrado un poco. Me gustaria que la propia gente de Zend pusiese un proyecto completo online donde uno pueda ver en claro ejemplo como se hacen las cosas.

Gator, ¿sabes de algun libro sensillo, simple, casi para tontos como yo y no para expertos, que explique en detalle Zend? en papel, digital , pago, no pago, lo que sea.
  #13 (permalink)  
Antiguo 08/07/2010, 13:20
Avatar de GatorV
$this->role('moderador');
 
Fecha de Ingreso: mayo-2006
Ubicación: /home/ams/
Mensajes: 38.567
Antigüedad: 18 años, 5 meses
Puntos: 2135
Respuesta: Zend, ¿cómo capturar la salida de un render?

Perdon de hecho es al revez, primero el path y luego el prefix, cual es la clase de tu helper y que path tiene?.

Saludos.
  #14 (permalink)  
Antiguo 08/07/2010, 15:00
 
Fecha de Ingreso: noviembre-2008
Mensajes: 288
Antigüedad: 16 años
Puntos: 2
Respuesta: Zend, ¿cómo capturar la salida de un render?

no te preocupes Gator, ví que era al reves.

la clase helper, actualmente la utilizo en los scripts phtml del proyecto en forma normal sin inconvenientes.
el problema es al querer utilizarla dentro de esta Zend_View .

el path absoluto es:
C:\xampp\htdocs\cines\application\modules\cines\vi ews\helpers\RecuadroPromo.php .

La clase se llama: Cines_View_Helper_RecuadroPromo

Haciendo una reseña:

Dentro del controller, coloco esto:
$template = new Zend_View();

$template->setBasePath(dirname(__FILE__) . '/../');
$template->addBasePath(APPLICATION_PATH . '/modules/cines/views/');

$template->addHelperPath( APPLICATION_PATH . '/modules/cines/views/helpers/',
'Cines_View_Helper_RecuadroPromo');

luego le asigno algunas variables en esta forma:
$template->miVariable = 'un valor cualquiera';
y luego la invoco:
$message = $template->render('modelo1.phtml');

luego es que me sale el error de que no encuentra el plugin.

pero si en medio chequeo los paths con Zend_Debug::dump($template->getHelperPaths()) obtengo esto (lo que creo indica que todo está bien):

array(2) {
["Zend_View_Helper_"] => array(3) {
[0] => string(17) "Zend/View/Helper/"
[1] => string(71) "C:\xampp\htdocs\cines\application\modules\cines\c ontrollers/..\helpers/"
[2] => string(62) "C:\xampp\htdocs\cines\application/modules/cines/views\helpers/"
}
["Cines_View_Helper_RecuadroPromo_"] => array(1) {
[0] => string(62) "C:\xampp\htdocs\cines\application/modules/cines/views/helpers/"
}
}

bueno... igual gracias por tu predisposición. Si no encuentro la forma, optaré por buscar otra alternativa para esto.
  #15 (permalink)  
Antiguo 08/07/2010, 15:43
Avatar de GatorV
$this->role('moderador');
 
Fecha de Ingreso: mayo-2006
Ubicación: /home/ams/
Mensajes: 38.567
Antigüedad: 18 años, 5 meses
Puntos: 2135
Respuesta: Zend, ¿cómo capturar la salida de un render?

Lo correcto es:
Código PHP:
Ver original
  1. $template->addHelperPath( APPLICATION_PATH . '/modules/cines/views/helpers/',
  2. 'Cines_View_Helper');

Tienes que pasarle el prefix, no el nombre del helper como tal.

Saludos.
  #16 (permalink)  
Antiguo 08/07/2010, 16:11
 
Fecha de Ingreso: noviembre-2008
Mensajes: 288
Antigüedad: 16 años
Puntos: 2
Respuesta: Zend, ¿cómo capturar la salida de un render?

AAAAAAHH!!! si !!!! ahora si !!!
sabía que tenía que ser algun error pequeñito colado por algun lado.

GRACIAS GATOR!!

hey...Cristofer, de verdad, muchas gracias por toda la ayuda que nos brindas siempre. No se bien como es el tema del foro, si ganan dinero ustedes o no, los moderadores, si reciben alguna compensación o mero gusto por todo esto, pero si hubiese alguna cuenta o algo, no me molestaría colaborar aunque no sea mucho, pero creo que vuestro tiempo, al igual que el mío vale. Y tu, y los otros moderadores, nos ayudan a comprender todas estas cosas y a resolver estos pequeños y grandes problemas que tanto tiempo nos quitan tantas veces.

de todo corazón: muchas gracias!
  #17 (permalink)  
Antiguo 08/07/2010, 21:24
Avatar de GatorV
$this->role('moderador');
 
Fecha de Ingreso: mayo-2006
Ubicación: /home/ams/
Mensajes: 38.567
Antigüedad: 18 años, 5 meses
Puntos: 2135
Respuesta: Zend, ¿cómo capturar la salida de un render?

No hay de que, para eso estamos en apoyar lo que se pueda.

Saludos.
  #18 (permalink)  
Antiguo 14/07/2010, 03:39
 
Fecha de Ingreso: noviembre-2008
Mensajes: 288
Antigüedad: 16 años
Puntos: 2
Respuesta: Zend, ¿cómo capturar la salida de un render?

Hola otra vez Gator.
Todo me andaba bien, pero ahora no se que ha pasado, que en cuanto hago un render de la Zend_View, toda la salida posterior se redirige a un archivo temporal de internet.

para probar resumi todo en un simple controller que lo único que hace es crear y mostrar una view.
class Admins_PruebaController extends Zend_Controller_Action
{
public function indexAction()
{
$cssView = new Zend_View();
$cssView->setBasePath(APPLICATION_PATH . '/modules/admins/views/');

$miVar = $cssView->render('estilos/generales.phtml');
die('fin');
}
}

Normalmente, la salida de eso, debería ser solo la palabra "fin".
El tema es que esa salida, se genera dentro de un archivo temporal llamado 'prueba[1].css', y como tengo los css asociados a DreamWeaver, automáticamente se me abre el DW, mostrando claro, solo el texto 'fin'. y el explorador internet, no muestra salida alguna, es decir, la salida se redirige a ese archivo temporal.

¿Tienes alguna idea de porque pasa esto?
  #19 (permalink)  
Antiguo 14/07/2010, 08:06
Avatar de GatorV
$this->role('moderador');
 
Fecha de Ingreso: mayo-2006
Ubicación: /home/ams/
Mensajes: 38.567
Antigüedad: 18 años, 5 meses
Puntos: 2135
Respuesta: Zend, ¿cómo capturar la salida de un render?

Es muy raro eso que planteas, en mi sistema uso ese método para generar plantillas de correo y nunca me ha dado ningún problema en re-dirigir la salida, que versión de Zend/PHP/Apache manejas?

Saludos.
  #20 (permalink)  
Antiguo 14/07/2010, 10:31
 
Fecha de Ingreso: noviembre-2008
Mensajes: 288
Antigüedad: 16 años
Puntos: 2
Respuesta: Zend, ¿cómo capturar la salida de un render?

Bueno, en parte me deja tranquilo de que el error no es normal, y no hay error aparente en mi código.
Lo más extraño es que venía andando bien. No se que ha pasado. Estoy usando Xampp y Zend 1.9.6 . Bueno, voy a resetear toda la pc y quizas hacer una aplicacion zend que solo cree una zend_view y nada más. Luego te cuento. Gracias Gator.
  #21 (permalink)  
Antiguo 14/07/2010, 12:51
 
Fecha de Ingreso: noviembre-2008
Mensajes: 288
Antigüedad: 16 años
Puntos: 2
Respuesta: Zend, ¿cómo capturar la salida de un render?

Estoy viendo que:

El archivo del cual quiero crear una View (generales.phtml) contiene estilos Css, y en la primera línea he colocado:
<?php header("Content-type: text/css; charset: UTF-8"); ?>

Si, comento esa línea, anda bien. El tema es que no la puedo quitar, sino voy a tener problemas por otro lado.
  #22 (permalink)  
Antiguo 14/07/2010, 13:29
Avatar de GatorV
$this->role('moderador');
 
Fecha de Ingreso: mayo-2006
Ubicación: /home/ams/
Mensajes: 38.567
Antigüedad: 18 años, 5 meses
Puntos: 2135
Respuesta: Zend, ¿cómo capturar la salida de un render?

Porque no usas el helper para eso?
Código PHP:
Ver original
  1. $view->headMeta()->appendName('Content-type', 'text/html; charset=utf-8');
  2. $view->headMeta()->appendHttpEquiv('Content-Type', 'text/html; charset=utf-8');

Para el CSS puedes usar
Código CSS:
Ver original
  1. @CHARSET "UTF-8";

Saludos.
  #23 (permalink)  
Antiguo 14/07/2010, 14:42
 
Fecha de Ingreso: noviembre-2008
Mensajes: 288
Antigüedad: 16 años
Puntos: 2
Respuesta: Zend, ¿cómo capturar la salida de un render?

mmm...

el tema es que ese file "generales.phtml" actualmente lo estoy utilizando desde un controller para generar el codigo css en el layout main.phtml.
ej en main.phtml:
<link rel="stylesheet" type="text/css" media="all" href="<?php echo $this->baseUrl; ?>/cines/generarcss/general" media="screen" />

modulo:cines, controller: generarcss, action:general

y ahora además estoy tratando de utilizar el mismo generales.phtml en las Zend_View.


Cuando reemplazo la línea que me has comentado, en IE lo veo bien, pero en Firefox y Chrome se ve mal. Es decir, no lee correctamente que se trata de estilos css.

No debería, pero creo que para terminar con este problema, voy a usar 2 juegos iguales de .phtml y quitarles a los de las view el encabezado problematico y hacerlo como dices.
  #24 (permalink)  
Antiguo 14/07/2010, 15:18
Avatar de GatorV
$this->role('moderador');
 
Fecha de Ingreso: mayo-2006
Ubicación: /home/ams/
Mensajes: 38.567
Antigüedad: 18 años, 5 meses
Puntos: 2135
Respuesta: Zend, ¿cómo capturar la salida de un render?

Porque no pones la cabecera header() dentro del controller, así evitas que al renderear mande llamar a la cabecera y te haga ese prolema.

Saludos.
  #25 (permalink)  
Antiguo 14/07/2010, 15:31
 
Fecha de Ingreso: noviembre-2008
Mensajes: 288
Antigüedad: 16 años
Puntos: 2
Respuesta: Zend, ¿cómo capturar la salida de un render?

eso suena muy bien . ¿cómo lo hago?
  #26 (permalink)  
Antiguo 14/07/2010, 15:34
Avatar de GatorV
$this->role('moderador');
 
Fecha de Ingreso: mayo-2006
Ubicación: /home/ams/
Mensajes: 38.567
Antigüedad: 18 años, 5 meses
Puntos: 2135
Respuesta: Zend, ¿cómo capturar la salida de un render?

Código PHP:
Ver original
  1. $this->getResponse()->setHeader('Content-type', 'text/css; charset: utf-8');

Saludos.
  #27 (permalink)  
Antiguo 14/07/2010, 15:54
 
Fecha de Ingreso: noviembre-2008
Mensajes: 288
Antigüedad: 16 años
Puntos: 2
Respuesta: Zend, ¿cómo capturar la salida de un render?

jajajjJAJAJAJAJAJjajajajajajajajajJAJAJAJAJAJAJAAA AAAAAAA SI !!! SI !!!! SI !

GRACIAS GATOR!!

como diría un político nuestro (argentino) muy culto y leído, frente a un discuro en TV: "..... en dos palabras IM PRESIONANTE ! " jajajaaa
  #28 (permalink)  
Antiguo 14/07/2010, 16:19
Avatar de GatorV
$this->role('moderador');
 
Fecha de Ingreso: mayo-2006
Ubicación: /home/ams/
Mensajes: 38.567
Antigüedad: 18 años, 5 meses
Puntos: 2135
Respuesta: Zend, ¿cómo capturar la salida de un render?

Me agrada saber que funciona, como regla recuerda poner toda la parte de la funcionalidad en el controller, y la vista solo dejarla limpia para eso, render de información
  #29 (permalink)  
Antiguo 14/07/2010, 16:22
 
Fecha de Ingreso: noviembre-2008
Mensajes: 288
Antigüedad: 16 años
Puntos: 2
Respuesta: Zend, ¿cómo capturar la salida de un render?

bien! perfecto. (me dió dolores de cabeza todo este tema pero creo que servirá a otros también). Gracias Gator!

Etiquetas: php, render, salida
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 14:37.