2011-12-04 12 views
7

tengo la clase siguiente:¿Cómo hacer que las variables estén disponibles en la plantilla?

abstract class TheView 
{ 
    public $template = NULL; 
    public $variables = array(); 

    public function set($name, $value) 
    { 
    $this->variables[$name] = $value; 
    } 
    public function display() 
    { 
    include($this->template); 
    } 
} 

El archivo de plantilla es un archivo PHP simple:

<?php 
echo $Message; 
?> 

¿Cómo puedo hacer que todas las variables en TheView::$variables disponibles en la plantilla (la clave de cada artículo debería ser el nombre de la variable).

Ya he intentado agregar todas las variables a $GLOBALS pero eso no funcionó (y creo que es una mala idea).

Respuesta

5

siempre termino haciendo esto:

public function render($path, Array $data = array()){ 
    return call_user_func(function() use($data){ 
     extract($data, EXTR_SKIP); 
     ob_start(); 
     include func_get_arg(0); 
     return ob_get_clean(); 
    }, $path); 
} 

Nota la función anónima y func_get_arg() llamada; Los uso para evitar que $this y otras "contaminaciones" variables pasen a la plantilla. Usted puede desarmar $data antes de la inclusión también.

Si desea $this disponible, solo extract() y include() directamente desde el método.

para que pueda:

$data = array('message' => 'hello world'); 
$html = $view->render('path/to/view.php', $data); 

Con path/to/view.php:

<html> 
    <head></head> 
    <body> 
     <p><?php echo $message; ?></p> 
    </body> 
</html> 

Si desea que el objeto View pasó, pero no del alcance del método render(), altera la siguiente manera:

public function render($path, Array $data = array()){ 
    return call_user_func(function($view) use($data){ 
     extract($data, EXTR_SKIP); 
     ob_start(); 
     include func_get_arg(1); 
     return ob_get_clean(); 
    }, $this, $path); 
} 

$view será la instancia del objeto Ver. Estará disponible en la plantilla, pero expondrá solo a los miembros públicos, ya que está fuera del alcance del método render() (preservando el encapsulado de miembros privados/protegidos)

+0

¡Gracias, funciona bien! – user897029

+0

Veo un ** - 1 **; ¿Curioso de por qué? ¿Qué harías de manera diferente, misterio ** - 1 ** 'er? – Dan

+0

Hmmm No veo un -1, tal vez él/ella cambió su opinión;) – user897029

3

Puede utilizar extract():

public function display() 
{ 
    extract($this->variables); 
    include($this->template); 
} 
+0

Funciona también, ¡gracias! Pero creo que será más claro si solo incluyo las variables de vista que no son $ this. – user897029

0

Prueba esto:

foreach($variables as $key => $value){ 
    $$key = $value; 
} 
+1

Eso es lo mismo que 'extract ($ variables, EXTR_OVERWRITE);'. – user897029

+0

Ahh, está bien! Aún no conozco todas las pequeñas y agradables características de PHP. – ThatOtherPerson

+0

Escuché de 'extract()' pero no encontré la solución para (ahora resuelto) mi problema. Esa es la vida de los programadores, siempre aprendiendo haciendo;) – user897029

0

Puede utilizar la función extract para importar variables desde una matriz en la tabla de símbolos.

abstract class TheView 
{ 
    public $template = NULL; 
    public $variables = array(); 

    public function set($name, $value) 
    { 
    $this->variables[$name] = $value; 
    } 
    public function display() 
    { 
    extract($this->variables); 
    include($this->template); 
    } 
} 
Cuestiones relacionadas