5

有没有办法根据文件名值的数组加载部分?

目前,如果我写这个{{> sidebar}},它会寻找views/sidebar.mustache. (基于模板加载器类,我可以在其中指定查找模板的位置)

理想情况下,我希望它{{> sidebar}}是一个变量名而不是文件名。

如果我传递给加载程序,我想要实现的是不基于文件名查找侧边栏部分:

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

这将转化为:views/folder1/somefile.mustache

4

1 回答 1

7

您可以通过添加新的局部加载器实现轻松地做到这一点。您可以制作一个“别名加载器”,用于存储这些模板引用:

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);
于 2013-02-15T17:57:29.140 回答