2009-08-21 12 views
11

necesita su ayuda con plantillas de PHP. Soy nuevo en PHP (vengo de Perl + Embperl). De todos modos, mi problema es simple:¿Cómo pasar parámetros a la plantilla PHP procesada con 'incluir'?

  • Tengo una pequeña plantilla para representar un elemento, que sea una publicación de blog.
  • La única forma que conozco de utilizar esta plantilla es utilizar la directiva 'incluir'.
  • Quiero llamar a esta plantilla dentro de un bucle pasando por todas las publicaciones relevantes del blog.
  • Problema: Necesito pasar un parámetro (s) a esta plantilla; en este caso, referencia a una matriz que representa una publicación de blog.

Código ve algo como esto:

$rows = execute("select * from blogs where date='$date' order by date DESC"); 
foreach ($rows as $row){ 
    print render("/templates/blog_entry.php", $row); 
} 

function render($template, $param){ 
    ob_start(); 
    include($template);//How to pass $param to it? It needs that $row to render blog entry! 
    $ret = ob_get_contents(); 
    ob_end_clean(); 
    return $ret; 
} 

Alguna idea de cómo lograr esto? Estoy realmente perplejo :) ¿Hay alguna otra forma de renderizar una plantilla?

Respuesta

29

Considere incluir un archivo PHP como si estuviera copiando y pegando el código del include en la posición en la que se encuentra la instrucción include. Esto significa que hereda el alcance actual.

Entonces, en su caso, $ param ya está disponible en la plantilla dada.

+0

+1 la analogía de copiar y pegar es siempre la forma en que lo explico. –

+1

Para mayor diferencia, intente devolver un valor ('return 42;') de su inclusión y capturando ese valor: '$ result = include 'filethatreturns42.php';';) – NSSec

19

$ param ya debe estar disponible dentro de la plantilla. Cuando incluye() un archivo, debe tener el mismo alcance que el que estaba incluido.

de http://php.net/manual/en/function.include.php

Cuando se incluye un archivo, el código que contiene hereda el ámbito de variable de la línea en la que la incluyen ocurre. Cualquier variable disponible en esa línea en el archivo de llamada será disponible dentro del archivo llamado, desde que apuntan hacia adelante. Sin embargo, todas las funciones y clases definidas en el archivo incluido tienen el alcance global.

También podría hacer algo como:

print render("/templates/blog_entry.php", array('row'=>$row)); 

function render($template, $param){ 
    ob_start(); 
    //extract everything in param into the current scope 
    extract($param, EXTR_SKIP); 
    include($template); 
    //etc. 

Entonces $ fila estaría disponible, pero aún así llamada $ fila.

+0

¡Muy bien, gracias! Sí, prefiero usar hashes como parámetros para que la función sea fácilmente modificable en el futuro. –

+0

Así es como funcionan frameworks como CodeIgniter.Carga un archivo de plantilla y le pasa una matriz de valores que se extraen y utilizan en la plantilla. –

1

que utilice las siguientes funciones de ayuda cuando trabajo en los sitios web simples:

function function_get_output($fn) 
{ 
    $args = func_get_args();unset($args[0]); 
    ob_start(); 
    call_user_func_array($fn, $args); 
    $output = ob_get_contents(); 
    ob_end_clean(); 
    return $output; 
} 

function display($template, $params = array()) 
{ 
    extract($params); 
    include $template; 
} 

function render($template, $params = array()) 
{ 
    return function_get_output('display', $template, $params); 
} 

salida de la pantalla voluntad la plantilla a la pantalla directamente. render lo devolverá como una cadena. Hace uso de ob_get_contents para devolver la salida impresa de una función.

Cuestiones relacionadas