Foros del Web » Programando para Internet » PHP »

PHP OO Aporte: Class para el uso de plantillas

Estas en el tema de Aporte: Class para el uso de plantillas en el foro de PHP en Foros del Web. En realidad no recuerdo a quien le habia prometido publicar la forma en la que trabajo las plantillas en php. y como no lo recuerdo ...
  #1 (permalink)  
Antiguo 27/05/2011, 11:58
Colaborador
 
Fecha de Ingreso: octubre-2009
Ubicación: Tokyo - Japan !
Mensajes: 3.867
Antigüedad: 15 años, 1 mes
Puntos: 334
Aporte: Class para el uso de plantillas

En realidad no recuerdo a quien le habia prometido publicar la forma en la que trabajo las plantillas en php.
y como no lo recuerdo decidí crear un nuevo tema, asi da para que lo critiquen y esas cosas...


Código PHP:
<?php
/**
 * Khaus Framework
 *
 * LICENSE
 *
 * This source file is subject to the Public license Creative Commons LPCC
 * with this package in the file LICENSE.txt.
 * It is also available through the world-wide-web at this URL:
 * http://creativecommons.org/licenses/by-nc/2.0/cl/
 * If you did not receive a copy of the license and are unable to
 * obtain it through the world-wide-web, please send an email
 * to [email protected] so we can send you a copy immediately.
 *
 * @category    Khaus
 * @package     Khaus_View
 * @copyright   Copyright (c) 2010 - 2011, Khaus Corp. Chile [[email protected]]
 * @license     Atribucion-Licenciar Igual 2.0 Chile. CC BY-NC 2.0
 * @version     8:20110527
 */

/**
 * Template Class
 *
 * Otorga el uso de plantillas dentro de la aplicacion.
 * Se debe especificar la ruta del archivo template
 * este puede ser de cualquier extension compatible con php.
 * los datos se asignan a travez de la propiedad publica $view
 * y desde la plantilla se llaman de la misma forma
 *
 * @example plantilla.phtml
 * <div><?php echo $this->variable; ?></div>
 *
 * @example index.php
 * $template = new Khaus_View_Template('plantilla.phtml');
 * $template->view->variable = 'datos';
 * echo $template->render();
 */
class Khaus_View_Template
{

    public 
$view;
    
    private 
$_filename;
    
    
/**
     * Metodo constructor
     *
     * Genera la instancia de $this->view para guardar
     * los parametros que se entregaran a la vista y asigna
     * la ruta del template a utilizar
     *
     * @throws si la ruta es incorrecta
     * @param string $filename[optional] ruta del template
     */
    
public function __construct($filename)
    {
        
// IF: La ruta del template es incorrecta
        
if (!is_file($filename)) {
            
$message sprintf('Template no encontrado (%s)'$filename);
            throw new 
Exception($message);
        }
        
$this->view = new stdClass();
        
$this->_filename $filename;
    }

    
/**
     * Retorna las peticiones de variables de la plantilla
     *
     * Si desde el template se llama directamente a la variable
     * con el metodo magico __get se captura la peticion y se envia
     * el valor correspondiente a lo almacenado dentro del objecto view
     * por lo tanto desde la plantilla se pueden traer los datos de dos formas
     * @example :
     *
     *      <?php echo $this->view->dato; ?>
     *      <?php echo $this->dato; ?>
     *
     * @param   string $name nombre del parametro
     * @throws  en caso de no existir el parametro
     * @return  string
     */
    
public function __get($name)
    {
        
// IF: el nombre del atributo no existe dentro del objeto view
        
if (!isset($this->view->$name)) {
            
$message sprintf('Parametro no existente (%s)'$name);
            throw new 
Exception($message);
        }
        return 
$this->view->$name;
    }

    
/**
     * Entrega el template procesado
     *
     * Mediante control de flujos captura la plantilla
     * por lo tanto se asignan las variables solicitadas
     * al objeto mediante $this
     *
     * @throws si la plantilla no a sido asignada
     * @return string template procesado
     */
    
public function render()
    {
        
ob_start();
        include 
$this->_filename;
        
$template ob_get_contents();
        
ob_end_clean();
        return 
$template;
    }

    
/**
     * Imprimir template
     *
     * Si se requiere imprimir o usar directamente el objeto como string
     * utiliza el metodo render para devolver el template procesado
     *
     * @access public
     */
    
public function __toString()
    {
        return 
$this->render();
    }
}
si tienen alguna duda.. comenten!


PD: los tildes han sido omitidos intencionalmente de los comentarios por razones que ni yo mismo entiendo
PD2: olvide poner las etiquetas del post :C
__________________
More about me...
~ @rhyudek1
~ Github

Última edición por Hidek1; 27/05/2011 a las 16:27 Razón: cambios sugeridos por masterpuppet
  #2 (permalink)  
Antiguo 27/05/2011, 13:01
Avatar de pateketrueke
Modernizr
 
Fecha de Ingreso: abril-2008
Ubicación: Mexihco-Tenochtitlan
Mensajes: 26.399
Antigüedad: 16 años, 7 meses
Puntos: 2534
Respuesta: Aporte: Class para el uso de plantillas

Me agrada, simple y bien escrito.

Ejemplo:
Código PHP:
$data = array(
    array(
        
'author' => 'Hernando de Soto',
        
'title' => 'The Mystery of Capitalism'
    
),
    array(
        
'author' => 'Henry Hazlitt',
        
'title' => 'Economics in One Lesson'
    
),
    array(
        
'author' => 'Milton Friedman',
        
'title' => 'Free to Choose'
    
)
);

$tpl = new Khaus_View_Template('books.phtml');
$tpl->view->books $data;

echo 
$tpl->render(); 
books.phtml
Código PHP:
    <?php    if ($this->books) { ?>
     
        <table>
            <tr>
                <th>Autor</th>
                <th>Titulo</th>
            </tr>
     
            <?php foreach ($this->books as $key => $val) { ?>
            <tr>
                <td><?php echo htmlentities($val['author']) ?></td>
                <td><?php echo htmlentities($val['title']) ?></td>
            </tr>
            <?php ?>
     
        </table>
     
    <?php } else { ?>
     
        <p>No hay libros que mostrar.</p>
     
    <?php ?>
__________________
Y U NO RTFM? щ(ºдºщ)

No atiendo por MP nada que no sea personal.

Última edición por pateketrueke; 27/05/2011 a las 13:16 Razón: ejemplo
  #3 (permalink)  
Antiguo 27/05/2011, 14:28
Avatar de masterpuppet
Software Craftsman
 
Fecha de Ingreso: enero-2008
Ubicación: Montevideo, Uruguay
Mensajes: 3.550
Antigüedad: 16 años, 10 meses
Puntos: 845
Respuesta: Aporte: Class para el uso de plantillas

Que tal Hidek,

Primero, gracias por compartir, y segundo te dejo un par de sugerencias

- No deberías lanzar una excepcion en el render, deberías controlarlo en el __construct, ya que es obligatorio para la clase un template y no se debería poder instanciar sin este, luego podrías implementar __toString y en el hacer la llamada a render, de esta forma podrías hacer el echo sobre el objeto directamente.

- La excepción debería pertenecer al componente, Khaus_View_Template_Exception.

Y tienes if/else que me parece que no son necesarios, un ejemplo:

Código PHP:
Ver original
  1. public function templatePath($filename)
  2. {
  3.     // IF: La ruta del template es correcta
  4.     if (is_file($filename)) {
  5.         $this->_filename = $filename;
  6.     } else {
  7.         $message = sprintf('Template no encontrado (%s)', $filename);
  8.         throw new Exception($message);
  9.     }
  10. }

podria ser:

Código PHP:
Ver original
  1. public function templatePath($filename)
  2. {
  3.     if (!is_file($filename)) {
  4.         throw new Khaus_View_Template_Exception(
  5.             sprintf('Template no encontrado (%s)', $filename));    
  6.     }
  7.     $this->_filename = $filename;
  8. }
me parece que queda mas legible.

Saludos.
__________________
http://es.phptherightway.com/
thats us riders :)
  #4 (permalink)  
Antiguo 27/05/2011, 14:53
Colaborador
 
Fecha de Ingreso: octubre-2009
Ubicación: Tokyo - Japan !
Mensajes: 3.867
Antigüedad: 15 años, 1 mes
Puntos: 334
Respuesta: Aporte: Class para el uso de plantillas

Gracias @masterpuppet por las sugerencias...
te comento..

Antes tenia así como dices el sistema.. con el requerimiento del archivo en el constructor .. pero por razones de mi fw en el controlador de los módulos me vi en la necesidad de modificarlo y dejarlo de esa forma !.

ya que dentro de la acción se le asignaba un template automáticamente y quería poder tener la opción de cambiarlo ^^

revisare y tomare en cuenta los demás puntos y veré q puedo hacer, y lo del controlador de excepción pues yo lo tengo con Khaus_View_Exception pero como lo quería compartir .. no quería que alguien lo usara y le arrojara el error de clase no encontrada :3


saludos!!!
__________________
More about me...
~ @rhyudek1
~ Github
  #5 (permalink)  
Antiguo 27/05/2011, 15:35
 
Fecha de Ingreso: enero-2011
Ubicación: DF
Mensajes: 898
Antigüedad: 13 años, 9 meses
Puntos: 155
Respuesta: Aporte: Class para el uso de plantillas

Fui yo el de la recomendacion Hidek1 muy buena clase , muy practica
__________________
No me interesan ni las gracias ni los karmas , pero si que se genere conocimiento, si se dio con la respuesta por favor confirmalo
  #6 (permalink)  
Antiguo 27/05/2011, 16:29
Colaborador
 
Fecha de Ingreso: octubre-2009
Ubicación: Tokyo - Japan !
Mensajes: 3.867
Antigüedad: 15 años, 1 mes
Puntos: 334
Respuesta: Aporte: Class para el uso de plantillas

@mogurbon gracias ^^ .. espero sea de utilidad !

@masterpuppet modifique la class siguiendo tus consejos.. los cambios están hechos en el primer post.. gracias !
__________________
More about me...
~ @rhyudek1
~ Github

Etiquetas: class, plantillas
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

SíEste tema le ha gustado a 5 personas




La zona horaria es GMT -6. Ahora son las 09:50.