Частичная загрузка PHP Mustache 2.1 НЕ на основе имени файла

Есть ли способ загрузить частичные значения на основе массива значений имени файла?

В настоящее время, если я напишу это {{> sidebar}}, он будет искать views/sidebar.mustache. (на основе класса загрузчика шаблонов, где я могу указать, где искать шаблоны)

В идеале я хочу, чтобы {{> sidebar}} было именем переменной, а не именем файла.

Чего я хочу добиться, так это найти частичную боковую панель, не основанную на имени файла, если я перейду к загрузчику:

$partials = array(
    'sidebar' => 'folder1/somefile'
);

что переводится как: views/folder1/somefile.mustache.


person feketegy    schedule 14.02.2013    source источник


Ответы (1)


Вы можете легко сделать это, добавив новую реализацию частичного загрузчика. Вы можете создать «загрузчик псевдонимов», в котором хранятся эти ссылки на шаблоны:

class FilesystemAliasLoader extends Mustache_Loader_FilesystemLoader implements Mustache_Loader_MutableLoader
{
    private $aliases = array();

    public function __construct($baseDir, array $aliases = array())
    {
        parent::__construct($baseDir);
        $this->setTemplates($aliases);
    }

    public function load($name)
    {
        if (!isset($this->aliases[$name])) {
            throw new Mustache_Exception_UnknownTemplateException($name);
        }

        return parent::load($this->aliases[$name]);
    }

    public function setTemplates(array $templates)
    {
        $this->aliases = $templates;
    }

    public function setTemplate($name, $template)
    {
        $this->aliases[$name] = $template;
    }
}

Затем вы должны установить это как частичный загрузчик:

$partials = array(
    'sidebar' => 'folder1/somefile'
);

$mustache = new Mustache_Engine(array(
    'loader'          => new Mustache_Loader_FilesystemLoader('path/to/templates'),
    'partials_loader' => new FilesystemAliasLoader('path/to/partials'),
    'partials'        => $partials,
));

... или вы можете передать псевдонимы конструктору загрузчика, или вы даже можете установить их позже в экземпляре загрузчика или движка:

$loader = new FilesystemAliasLoader('path/to/partials', $partials);
$loader->setTemplates($partials);
$mustache->setPartials($partials);
person bobthecow    schedule 15.02.2013
comment
Я был AFK в течение последних нескольких дней. Спасибо за ваш ответ, это то, что я ищу! - person feketegy; 20.02.2013
comment
@bobthecow У меня это не работает. Почему-то не загружается партиал - person Kevin Wiggins; 15.06.2018
comment
@KevinWiggins Можете ли вы вставить куда-нибудь код? Без подробностей сложно помочь :) - person bobthecow; 18.06.2018