PHP Smarty - ¿Obtener una lista de todas las variables en una plantilla?
-
06-07-2019 - |
Pregunta
Estoy usando Smarty y PHP. Si tengo una plantilla (ya sea como un archivo o como una cadena), ¿hay alguna forma de que Smarty analice ese archivo / cadena y devuelva una matriz con todas las variables inteligentes en esa plantilla?
por ejemplo: quiero algo como esto:
$mystring = "Hello {$name}. How are you on this fine {$dayofweek} morning";
$vars = $smarty->magically_parse( $string );
// $vars should now be array( "name", "dayofweek" );
La razón por la que quiero hacer esto es porque quiero que los usuarios puedan ingresar plantillas ellos mismos y luego completarlas en una fecha posterior. Por lo tanto, necesito poder obtener una lista de las variables que están en estas plantillas.
Supongamos que solo estoy haciendo variables simples (por ejemplo: no " {$ object.method} " o " {$ varaible | function} "), y que no estoy incluyendo ninguna otra plantilla .
Solución 2
Parece que no hay una forma incorporada de hacer esto.
Otros consejos
Si necesita variables ocultas en cosas como {if $ var% 2}
iría con este tipo de código:
preg_match_all('`{[^\\$]*\\$([a-zA-Z0-9]+)[^\\}]*}`', $string, $result);
$vars = $result[1];
Si también quieres atrapar cosas como esa: {if $ var! = $ var2}
una mejor versión sigue
function getSmartyVars($string){
// regexp
$fullPattern = '`{[^\\$]*\\$([a-zA-Z0-9]+)[^\\}]*}`';
$separateVars = '`[^\\$]*\\$([a-zA-Z0-9]+)`';
$smartyVars = array();
// We start by extracting all the {} with var embedded
if(!preg_match_all($fullPattern, $string, $results)){
return $smartyVars;
}
// Then we extract all smarty variables
foreach($results[0] AS $result){
if(preg_match_all($separateVars, $result, $matches)){
$smartyVars = array_merge($smartyVars, $matches[1]);
}
}
return array_unique($smartyVars);
}
Normalmente estoy en contra de las expresiones regulares, pero esto me parece un caso válido. Puede usar preg_match_all ()
para hacer eso (si solo desea variables como $ {this}
):
preg_match_all('\{\$(.*?)\}', $string, $matches, PREG_PATTERN_ORDER);
$variableNames = $matches[1];
{debug}
Me doy cuenta de que este hilo es antiguo, pero esta es la solución integrada.
Creo que lo que está buscando es la consola de depuración .
Esta consola muestra todas las variables utilizadas dentro de las plantillas involucradas en su página web.