Как использовать обёртку функций в mustache.php?

Я начинаю работать с Mustache на PHP и у меня не получается заставить функции-обертки работать как долг.

у меня есть этот шаблон

{{#skill_level}}
  <span class="stars">
    {{#stars}}
      {{skill_level}} 
    {{/stars}}                        
  </span>
{{/skill_level}}

И у меня есть эти данные

$data = new StdClass;
$data->skill_level = 3;
$data->stars = function($level) {
  $aux = "";
  $l = intVal($level);
  for ($i = 0; $i < $l; $i++) {
    $aux .= "+";
  }
  for ($i = $l; $i < 5; $i++) {
    $aux .= ".";
  }
  return $aux;
};

Я визуализирую m.render($tenplate, $data); и хочу получить что-то вроде:

<span class="stars">
    +++..                        
</span>

Но это не работает.

я получил

<span class="stars">
    .....                        
</span>

Потому что Mustache передает в мою функцию "{{skill_level}}" вместо значения 3.

Кроме того, если я изменю шаблон, поставлю пробелы в метках усов:

{{ #skill_level }}
  <span class="stars">
    {{ #stars }}
      {{ skill_level }} 
    {{ /stars }}                        
  </span>
{{ /skill_level }}

Затем обрабатывается {{ skill_level }}, но не отправляется на {{ #starts }}, полученный рендер

<span class="stars">
    3                        
</span>

Итак, кто-нибудь знает, что я делаю неправильно? Как мне написать шаблон, чтобы он работал? Любые советы или опыт приветствуются. Спасибо.


person Antonio Sánchez-Padial    schedule 19.06.2013    source источник


Ответы (1)


Я нашел ответ в вики проекта

Переданный текст представляет собой неотрендеренный блок литерала.

Но он предоставляет Mustache_LambdaHelper, который можно использовать для рендеринга переданного текста.

Поэтому я должен добавить это в свою функцию лямбда:

$data->stars = function($label, Mustache_LambdaHelper $helper) {     
  $aux = "";
  $level = $helper->render($label);
  $l = intVal($level);
  for ($i = 0; $i < $l; $i++) {
    $aux .= "+";
  }
  for ($i = $l; $i < 5; $i++) {
    $aux .= ".";
  }
  return $aux;
};

И это все, что нужно для работы. Спасибо всем читателям!

person Antonio Sánchez-Padial    schedule 19.06.2013
comment
Я бы закодировал вашу лямбду примерно так: gist.github.com/bobthecow/19f09ebf4395ee9f87d9 - person bobthecow; 19.06.2013