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 に答える