2013-02-14 4 views
5

Gibt es eine Möglichkeit, Partials basierend auf einem Array von Dateinamen Werte zu laden?PHP Moustache 2.1 Partial loading NICHT basierend auf dem Dateinamen

Derzeit, wenn ich dies schreibe {{> sidebar}} wird nach views/sidebar.mustache suchen. (basierend auf der Vorlagenladeklasse, in der ich angeben kann, wo nach den Vorlagen gesucht werden soll)

Idealerweise möchte ich, dass {{> sidebar}} ein Variablenname und kein Dateiname wäre.

Was ich will, erreichen, ist für die Sidebar sehen teilweise nicht auf den Dateinamen, wenn ich an den Lader übergeben: views/folder1/somefile.mustache:

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

die übersetzen würde.

Antwort

7

Sie können dies leicht tun, indem Sie eine neue Partial Loader-Implementierung hinzufügen. Sie könnten einen „alias loader“, machen die diese Vorlage Referenzen speichert:

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; 
    } 
} 

Dann Sie, dass als partials loader gesetzt würde:

$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, 
)); 

... oder Sie können die Aliase passieren zu der Laderkonstruktor, oder Sie könnten sie sogar später auf der Lade- oder Maschineninstanz setzen:

+0

Ich war AFK für die letzten paar Tage. Danke für deine Antwort, das ist was ich suche! – feketegy

Verwandte Themen