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

Dudas, "Framework" Casero..

Estas en el tema de Dudas, "Framework" Casero.. en el foro de Frameworks y PHP orientado a objetos en Foros del Web. Buenas noches, antes que me digan cosas como Para que reinventar la rueda Usa Zend, CI, Cake, etc. ... Quería comentarles que no estoy intentando ...
  #1 (permalink)  
Antiguo 13/04/2012, 18:27
Avatar de McBlink  
Fecha de Ingreso: noviembre-2006
Ubicación: $ARG->LaPampa()
Mensajes: 1.694
Antigüedad: 17 años, 5 meses
Puntos: 23
Pregunta Dudas, "Framework" Casero..

Buenas noches,
antes que me digan cosas como

Para que reinventar la rueda
Usa Zend, CI, Cake, etc.
...

Quería comentarles que no estoy intentando desarrollas mi propio framework, sino que estoy haciendo un entorno de desarrollo que me permita realizar aplicaciones web sencillas de manera rápida y ordenada. Con sencilla, digo un par de páginas, con acceso a base de datos y no mucho mas.

Básicamente, lo que estoy haciendo es agrupar un conjunto de Funciones y Clases que me permitan realizar acciones fácilmente.

Por ejemplo, utilizo algunos componentes de Zend, como Zend_Db, Zend_Json etc..

La idea que tenia, era crear ademas de los modulos que puedo tomar de Zend, algunos mas, incluso propios y llamar al modulo que necesite cuando lo necesite.

Mi problema esta en la clase que maneja los templates, tengo un index.php que es el que se encarga de cargar los templates y las vistas y mostrar todo (al estilo de cualquier Framework)


index.php
Código PHP:
Ver original
  1. require_once 'Config.php';
  2. require_once 'Template.php';
  3. require_once 'Zend/Db.php';
  4.  
  5. $db = Zend_Db::factory( $db_config['adapter'], $db_config );
  6.  
  7.     $layout = new Template('templates/default.php');
  8.     $layout->set('title', 'Titulo de la Pagina' );
  9.     $layout->set('contenido', 'home' );
  10.     echo $layout->output();

Mi problema viene específicamente con los templates, en este código que acabo de escribir, creo un template indicando la ruta del archivo, y luego le asigno propiedades que luego son reemplazadas.
Si es un archivo, en el caso de "home" que refiere a "home.php" el Template lo parse con la siguiente funcion:

Código PHP:
        function parse($file
        {
            
ob_start();
            include(
$file);
            
$buffer ob_get_contents();
            
ob_end_clean();
            
//return $buffer;
        

El problema esta que si yo dentro del archivo "home.php" quiero acceder al Objeto Base de Datos $db creado en el index.php, no puedo por una cuestion del ambito de las variables, el parser hace el include dentro de la clase Template y no puedo acceder al objeto $db.

Para resumir, la idea que tenia es cargar componetes en el index.php:
Zend_db
Zend_Feed
Template
Thumb
etc..

y que luego, pueda utilizarlos individualmente en las vistas que cargo con la clase Template..

hay alguna forma de realizarlo o estoy perdiendo el tiemo?



Disculpas por la extension del post, pero queria explicarme un poco para que se entienda la idea que tengo en la cabeza, y que me esta costando traducirla a código!

Gracias!
  #2 (permalink)  
Antiguo 14/04/2012, 06:45
Avatar de masterpuppet
Software Craftsman
 
Fecha de Ingreso: enero-2008
Ubicación: Montevideo, Uruguay
Mensajes: 3.550
Antigüedad: 16 años, 3 meses
Puntos: 845
Respuesta: Dudas, "Framework" Casero..

Tengo miedo hasta de preguntar para que quieres el db en la vista :P, ahora en relación a lo que preguntas, talves me estoy perdiendo algo pero no seria simplemente asignar db al Template ?.
Y ten en cuenta que puedes utilizar Zend_View, Zend_Config o mejor aún construir tu herramienta sobre el fw directamente.

Saludos.
__________________
http://es.phptherightway.com/
thats us riders :)
  #3 (permalink)  
Antiguo 14/04/2012, 09:32
Avatar de McBlink  
Fecha de Ingreso: noviembre-2006
Ubicación: $ARG->LaPampa()
Mensajes: 1.694
Antigüedad: 17 años, 5 meses
Puntos: 23
Respuesta: Dudas, "Framework" Casero..

Gracias por "animarte" a responder masterpuppet. No lo había pensado, el tema es que si quiero ejecutar código dentro de una vista que es incluida en un template, de que forma le paso esa información?

En relacion a lo que me decis de usar Zend, estoy usando CodeIgniter y la verdad me gusto mucho, pero me parece que para algo simple, tiene una estructura muy compleja en si todo el proyecto.

Todos recomiendan Zend, asique quizás pueda pegarle una mirada.

La idea que tenia en la cabeza es poder tener un index.php sencillo, donde pueda cargar los componentes que necesito, y que me sirva como un "único controlador". Seria algo asi como una biblioteca de funciones y clases que me faciliten la escritura de código y sea re.usable.
Seria simple si yo no tuviera el manejador de templates, imaginate que por cada pagina tengo todo el codigo HTML del template mas el contenido propio de esa pagina. En ese caso, incluiria todos los componentes que necesito, los utilizo y muestro la pagina.
basicamente, seria hacer eso, pero utilizando una clase Template que me facilite las cosas.



Gracias!
  #4 (permalink)  
Antiguo 14/04/2012, 16:19
Avatar de GatorV
$this->role('moderador');
 
Fecha de Ingreso: mayo-2006
Ubicación: /home/ams/
Mensajes: 38.567
Antigüedad: 17 años, 10 meses
Puntos: 2135
Respuesta: Dudas, "Framework" Casero..

Puedes hacer lo que te dice @masterpuppet, o en dado caso usar un registro, así lo podrías ver dentro de la vista, aunque como dicen, tener el db dentro de la vista no es lo más recomendado, ya que rompes con la parte de MVC...

La idea es que todos los procesos los hagas en tu controlador, y luego asignes a la vista lo que necesites.

Saludos.
  #5 (permalink)  
Antiguo 14/04/2012, 17:45
Avatar de McBlink  
Fecha de Ingreso: noviembre-2006
Ubicación: $ARG->LaPampa()
Mensajes: 1.694
Antigüedad: 17 años, 5 meses
Puntos: 23
Respuesta: Dudas, "Framework" Casero..

Gracias por responder GatorV,
a que te refieres con utilizar un registro?

Con respecto a realizar los procesos en mi controlador, por ejemplo realizado una consulta que me devuelve un array de datos,

como le paso ese array a la clase template para que lo parsee la vista que es incluida dentro del template?

Gracias!
  #6 (permalink)  
Antiguo 15/04/2012, 06:38
Avatar de masterpuppet
Software Craftsman
 
Fecha de Ingreso: enero-2008
Ubicación: Montevideo, Uruguay
Mensajes: 3.550
Antigüedad: 16 años, 3 meses
Puntos: 845
Respuesta: Dudas, "Framework" Casero..

Es que sin ver la implementacion de Template es dificil decirte, pero la idea es algo así:

Código PHP:
Ver original
  1. $records = $service->getActiveRecords();
  2. $layout->set('records', $records);

y en la vista algo asi(suponiendo que vars es la propiedad que hace de container en Template):

Código HTML:
Ver original
  1. <?php foreach($this->vars['records'] as $record) : ?>
  2.     <?php echo $record['property']; ?>
  3. <?php endforeach; ?>
__________________
http://es.phptherightway.com/
thats us riders :)
  #7 (permalink)  
Antiguo 15/04/2012, 11:06
Avatar de McBlink  
Fecha de Ingreso: noviembre-2006
Ubicación: $ARG->LaPampa()
Mensajes: 1.694
Antigüedad: 17 años, 5 meses
Puntos: 23
Respuesta: Dudas, "Framework" Casero..

Gracias masterpuppet, a ver si entiendo.. creo que de esa forma que me acabas de decir, le estoy pasando la variable a mi archivo Template, pero no a la vista o el contenido que le voy a cargar al Template, o estoy equivocado?

Esta es mi clase:

Código PHP:
Ver original
  1. <?php
  2.     class Template {
  3.  
  4.         protected $file;
  5.         protected $values = array();
  6.        
  7.  
  8.         public function __construct($file)
  9.         {
  10.            
  11.             if ( file_exists($file) )
  12.             {
  13.                 $this->file = $file;
  14.             }
  15.             else
  16.             {
  17.                 throw new Exception("Template not found: $file");
  18.             }        
  19.         }
  20.  
  21.         public function set($key, $value)
  22.         {
  23.             $this->values[$key] = $value;
  24.         }
  25.  
  26.         public function output()
  27.         {
  28.             $output = file_get_contents($this->file);
  29.            
  30.             foreach ($this->values as $key => $value)
  31.             {
  32.                 $data = ( file_exists($value) ) ? $this->parse($value) : $data;
  33.                 $output = str_replace('{'.$key.'}', $data, $output);
  34.             }
  35.             return $output;
  36.         }
  37.        
  38.         function parse($file)
  39.         {
  40.             ob_start();
  41.             include($file);
  42.             $buffer = ob_get_contents();
  43.             ob_end_clean();
  44.             return $buffer;
  45.         }
  46.     }
  47.  
  48. ?>

Y la implemento de la siguiente forma:

Código PHP:
Ver original
  1. $layout = new Template('templates/default.php');
  2.     $layout->set('title', 'Titulo de la Pagina' );
  3.     $layout->set('contenido', 'home.php' );
  4.     echo $layout->output();

De como que al archivo default.php (mi plantilla) le paso parametros como el titulo y ademas le paso otro archivo, por ejemplo el home.php.

Bien, yo necesitaría en este caso poder hacer llegar hasta el home.php los registros o alguna variable tipo array() que contenga mas de un dato para ese archivo..

Gracias!
  #8 (permalink)  
Antiguo 15/04/2012, 14:52
Avatar de carlos_belisario
Colaborador
 
Fecha de Ingreso: abril-2010
Ubicación: Venezuela Maracay Aragua
Mensajes: 3.156
Antigüedad: 14 años
Puntos: 461
Respuesta: Dudas, "Framework" Casero..

y si le creas un atributo del tipo array $dataView al cual en tu parser luego puedas hacerle un extract y que puedas acceder directo con el nombre de la clave que creaste ejemplo

Código PHP:
Ver original
  1. /**
  2. *
  3. * @var Array $viewData
  4. */
  5. private $viewData;
  6. public function setViewData(array $viewData)
  7. {
  8.     $this->viewData = $viewData;
  9. }
  10. function parse($file)
  11.         {
  12.             ob_start();
  13.             @extract($this->viewData, EXTR_OVERWRITE );    
  14.             include($file);
  15.             $buffer = ob_get_contents();
  16.             ob_end_clean();
  17.             return $buffer;
  18.         }
y en tu controlador lo que hagas algo como esto
Código PHP:
Ver original
  1. public function indexAction()
  2. {
  3.    $layout->setViewData(array('nombre' => 'yo'));
  4.    
  5. }
de manera que en tu vista solo tengas que colocar
Código PHP:
Ver original
  1. echo $nombre;
espero te ayude
__________________
aprende d tus errores e incrementa tu conocimientos
it's not a bug, it's an undocumented feature By @David
php the right way
  #9 (permalink)  
Antiguo 15/04/2012, 15:37
Avatar de McBlink  
Fecha de Ingreso: noviembre-2006
Ubicación: $ARG->LaPampa()
Mensajes: 1.694
Antigüedad: 17 años, 5 meses
Puntos: 23
Respuesta: Dudas, "Framework" Casero..

Muchisimas Gracias carlos_belisario,
le hice un par de modificaciones, por si se da el caso de querer cargar mas de una vista dentro de un template, y cada una con sus datos..

Saludos y gracias nuevamente!
  #10 (permalink)  
Antiguo 15/04/2012, 17:03
Avatar de GatorV
$this->role('moderador');
 
Fecha de Ingreso: mayo-2006
Ubicación: /home/ams/
Mensajes: 38.567
Antigüedad: 17 años, 10 meses
Puntos: 2135
Respuesta: Dudas, "Framework" Casero..

Ahora dices que usas una parte de Zend, ¿porque no usas el Zend_View? lo puedes usar como componente por separado: http://framework.zend.com/manual/en/...roduction.html

Saludos.
  #11 (permalink)  
Antiguo 15/04/2012, 17:30
Avatar de McBlink  
Fecha de Ingreso: noviembre-2006
Ubicación: $ARG->LaPampa()
Mensajes: 1.694
Antigüedad: 17 años, 5 meses
Puntos: 23
Respuesta: Dudas, "Framework" Casero..

Por lo que estuve leyendo, el Zend_View me renderiza una vista con los datos que le pase como parametros, similar a lo que logre recien con la ayuda de uds en este post.

Ahora, si yo quiero renderizar esa vista dentro de un plantilla, como podría hacerlo?
  #12 (permalink)  
Antiguo 15/04/2012, 21:05
Avatar de GatorV
$this->role('moderador');
 
Fecha de Ingreso: mayo-2006
Ubicación: /home/ams/
Mensajes: 38.567
Antigüedad: 17 años, 10 meses
Puntos: 2135
Respuesta: Dudas, "Framework" Casero..

Puedes usar Zend_View usando otra plantilla, o usar Zend_Layout: http://framework.zend.com/manual/en/...art.standalone

Saludos.
  #13 (permalink)  
Antiguo 16/04/2012, 21:26
Avatar de McBlink  
Fecha de Ingreso: noviembre-2006
Ubicación: $ARG->LaPampa()
Mensajes: 1.694
Antigüedad: 17 años, 5 meses
Puntos: 23
Respuesta: Dudas, "Framework" Casero..

Buenas noches,
de nuevo por aqui.. si bien tengo funcionando mi propio clase que me permite admistrar y mostrar los templates y personalizar los contenidos, me gustaría darle una mirada mas a Zend_Layout y Zend_View.

Si bien estuve leyendo bastante, viene mucha informacion para usarlo como MVC.. Estoy intentando usar solo los componentes, y en base a link que me dejaste en tu ultimo post, escribi el ejemplo que allí plantean:
http://framework.zend.com/manual/en/...art.standalone

El problema esta en la estructura de directorios de Zend, que justamente es algo que quiero simplificar en este intento de "Framework Casero" o "Conjunto de Componentes"

Mi estructura es la siguiente:

Código HTML:
Ver original
  1. ./
  2. ./Zend
  3. ./templates
  4. ./templates/default.phtml
  5. ./views
  6. ./resource
  7. ./resource/images
  8. etc...

Ahora bien, al intentar setear el Layout Path:

Código PHP:
Ver original
  1. // Set a layout script path:
  2. $layout->setLayoutPath('/templates');
  3.  
  4. // set some variables:
  5. $layout->content = 'HOLAAAA';
  6.  
  7.  
  8. // choose a different layout script:
  9. $layout->setLayout('default');
  10.  
  11. // render final layout
  12. echo $layout->render();

Me sale el siguiente error:

Código PHP:
Ver original
  1. Fatal error: Uncaught exception 'Zend_View_Exception' with message 'script 'default.phtml' not found in path (/templates/;./views\scripts/)' in

No entiendo porque me genera ese Path para buscar mi archivo.. si estoy usando la funcion setLayoutPath()


Se puede usar de la manera que pretendo?

Saludos y Gracias
  #14 (permalink)  
Antiguo 16/04/2012, 22:04
Avatar de GatorV
$this->role('moderador');
 
Fecha de Ingreso: mayo-2006
Ubicación: /home/ams/
Mensajes: 38.567
Antigüedad: 17 años, 10 meses
Puntos: 2135
Respuesta: Dudas, "Framework" Casero..

El problema es este:
Código PHP:
Ver original
  1. $layout->setLayoutPath('/templates');

Tienes que pasarle el path correcto, ya que al usar / te mueves a la raíz del disco, por conveniencia es conveniente uses una constante que apunte al directorio de tu aplicación, y de ahí muevas los paths, por ejemplo:

Código PHP:
Ver original
  1. define('APP_PATH', 'C:/www/proyectos/app');
  2.  
  3. $layout->setLayoutPath(APP_PATH . '/templates');

Saludos.
  #15 (permalink)  
Antiguo 16/04/2012, 22:34
Avatar de McBlink  
Fecha de Ingreso: noviembre-2006
Ubicación: $ARG->LaPampa()
Mensajes: 1.694
Antigüedad: 17 años, 5 meses
Puntos: 23
Respuesta: Dudas, "Framework" Casero..

Sí, efectivamente era eso! Una ultima pregunta, espero no molestar más!

Como hago para hacer el mismo procedimiento sobre una vista? Es decir, no tengo ningun setViewPath() para decirle donde busque la vista que necesito cargar..

Yo puedo pasarle al Layout como atributo una View renderizada? Es correcto eso?

Código PHP:
Ver original
  1. $view = new Zend_View();
  2. // set some variables:
  3. $layout->content = $view->render('home');

Saludos
  #16 (permalink)  
Antiguo 16/04/2012, 23:04
Avatar de GatorV
$this->role('moderador');
 
Fecha de Ingreso: mayo-2006
Ubicación: /home/ams/
Mensajes: 38.567
Antigüedad: 17 años, 10 meses
Puntos: 2135
Respuesta: Dudas, "Framework" Casero..

Tienes que pasarle al menos el setScriptPath:
Código PHP:
Ver original
  1. $view = new Zend_View();
  2. $view->setScriptPath(APP_PATH . '/views/scripts');

Saludos.

Etiquetas: clase, dudas, framework, zend
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 03:01.