PHP Smarty - Bir şablondan tüm değişkenlerin bir listesini alın?

6 Cevap php

Ben Smarty ve PHP kullanıyorum. Ben bir şablon (bir dosya olarak veya bir dize olarak ya) varsa, o dosya / dizeyi ayrıştırmak ve bu şablonda tüm smarty değişkenleri içeren bir dizi dönmek için smarty almak için bir yol var mı?

örneğin: Ben böyle bir şey istiyorum:

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

Kullanıcıların şablonlan kendilerini girin ve ardından daha sonraki bir tarihte bunları doldurmak için mümkün olmak istiyorum, çünkü ben bunu yapmak istiyorum nedenidir. Dolayısıyla ben bu şablonları olan değişkenlerin bir listesini almak için gerekiyor.

Diyelim ki sadece basit değişkenleri (örneğin: hayır "{$ object.method}" veya "{$ varaible | işlevi}") yapıyorum varsayalım, ve herhangi bir diğer şablonları da dahil olmak üzere değilim ki.

6 Cevap

Bunu yapmak için bir dahili yol yok gibi görünüyor.

Eğer gibi şeyler gizli değişkenleri gerekiyorsa {if $var%2} Ben kodu bu tür gitmek istiyorum:

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

Ayrıca böyle şeyler yakalamak istiyorsanız: {if $var != $var2} daha iyi bir versiyonu aşağıda

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);
}

Normalde Düzenli ifadeler karşı değilim, ama bu benim için geçerli bir durum gibi görünüyor. Kullanmak preg_match_all() to do that (If you only want variables like ${this}) olabilir:

preg_match_all('\{\$(.*?)\}', $string, $matches, PREG_PATTERN_ORDER);
$variableNames = $matches[1];

Ben ne aradığınız debugging console olduğunu düşünüyorum.

Bu konsol size web sayfanızda yer şablonları içinde kullanılan tüm değişkenleri gösterir.

{debug}

Ben bu konu eski olduğunu biliyoruz, ama bu yerleşik bir çözümdür.