PHP Smarty - получить список всех переменных в шаблоне? - PullRequest
2 голосов
/ 27 октября 2009

Я использую Smarty и PHP. Если у меня есть шаблон (либо в виде файла, либо в виде строки), есть ли какой-нибудь способ получить smarty для анализа этого файла / строки и возврата массива со всеми переменными smarty в этом шаблоне?

например: я хочу что-то вроде этого:

$mystring = "Hello {$name}. How are you on this fine {$dayofweek} morning";
$vars = $smarty->magically_parse( $string );
// $vars should now be array( "name", "dayofweek" );

Причина, по которой я хочу это сделать, заключается в том, что я хочу, чтобы пользователи могли сами вводить шаблоны, а затем заполнять их позже. Следовательно, мне нужно иметь возможность получить список переменных, которые есть в этих шаблонах.

Давайте предположим, что я делаю только простые переменные (например, нет "{$ object.method}" или "{$ varaible | function}") и что я не включаю никакие другие шаблоны.

Ответы [ 5 ]

4 голосов
/ 08 декабря 2009

Если вам нужны переменные, скрытые в таких вещах, как {if $var%2}, я бы пошел с таким кодом:

preg_match_all('`{[^\\$]*\\$([a-zA-Z0-9]+)[^\\}]*}`', $string, $result);
$vars = $result[1];

Если вы также хотите поймать такие вещи: {if $var != $var2} следует лучшая версия

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);
}
3 голосов
/ 15 декабря 2009

Похоже, что нет встроенного способа сделать это.

2 голосов
/ 27 октября 2009

Обычно я против регулярных выражений, но для меня это выглядит как верный случай. Для этого вы можете использовать preg_match_all() (если вам нужны только переменные типа ${this}):

preg_match_all('\{\$(.*?)\}', $string, $matches, PREG_PATTERN_ORDER);
$variableNames = $matches[1];
1 голос
/ 14 декабря 2013
{debug}

Я понимаю, что этот поток старый, но это встроенное решение.

0 голосов
/ 08 декабря 2009

Думаю, вам нужна консоль отладки .

В этой консоли отображаются все переменные, используемые в шаблонах, используемых на вашей веб-странице.

...