PHP: loadTemplate()
Sin apenas tiempo a postear me gustaría reflejar una fase de cambios y adaptaciones importantes en mi carrera profesional.
Nada mejor que hacerlo adentrándonos en el sinuoso mundo de la programación -MySQL+PHP- para sitios con gran volumen de visitas con una simple función:
function loadTemplate($tpl, $vars=null)
{
$tpl = implode("", file($tpl));
ob_start();
if(!empty($vars)) extract($vars);
eval("?>".$tpl."<?");
$eval_buffer = ob_get_contents();
ob_end_clean();
return $eval_buffer;
}
Se trata de parsear un archivo de templates con las variables pasadas como argumento ($vars). Una forma simple de separar la vista del controlador sin tener que cargar tu aplicación con un pesado framework.
// Llamando a la función
$datos['ganador'] = 'Rodolfo Chikilicuatre';
$datos['concurso'] = 'Eurovisión';
echo $loadTemplate('saluda.tpl', $datos);
// saluda.tpl
<html><body>
<center>Premonición: El ganador de <?=$concurso;?>
será... <?=$ganador;?></center>
</body></html>
Como siempre, gracias a MarcosBL por sus sabios consejos en la materia.
será... <?=$nombre;?></center>
$nombre ? $ganador, no? o me pierdo demasiado...
Estoy con akae (para que veas que leemos lo que escribes :D).
Ahora... lo que molaría es que nos implementaras un pequeño caché, ¿no? :D
Podrías calcular una huella para $datos y asociarla a una copia en disco de saludo.tpl con los cambios hechos... y mientras no cambie la huella, devuelves la plantilla procesada desde disco.
¿Lo ves viable?
Corregtisimo, reidrac, creo que justo esa es la idea del ob_start() y el return en vez de un simple echo, poder guardar el resultado parseado en un .html estático, en una bd, usarlo como caché, etc.. :D
@akae: Correcto, ya lo he corregido. Esto pasa cuando tienes dos ejemplos en la cabeza, cambias al vuelo y son casi las 2:00 am. Sorry por el fallo.
@reidrac: Seguro es viable, incluso hasta puedes guardar el código que devuelve loadTemplate() en disco (o base de datos...) y mirar la frecuencia con la que cambia. Voy a estudiarlo ;).
Vaya @MarcosBL, comentamos casi lo mismo a la vez... :P


