2013-02-14 33 views
5

有沒有辦法根據文件名值的數組加載partials?PHP鬍子2.1部分加載不基於文件名

目前如果我寫這個{{> sidebar}}它會尋找views/sidebar.mustache。 (基於模板加載器類,我可以指定在哪裏尋找模板)

理想情況下,我希望{{> sidebar}}將是一個變量名稱,而不是文件名。

我想實現的是尋找側邊欄部分不是基於文件名,如果我傳遞給裝載機:

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

這將轉化爲:views/folder1/somefile.mustache

回答

7

您可以通過添加新的partials loader實現輕鬆完成此操作。你可以做一個「別名加載器」,它存儲這些模板的引用:

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); 
+0

我在過去的幾天裏是AFK。感謝您的回答,這就是我正在尋找的! – feketegy 2013-02-20 13:38:54