2012-02-18 2 views
4

次のプロジェクトでKohanaと一緒にMustacheテンプレートを使用する予定です。だから、私がやっているのは、KohanaをビューをレンダリングするときにシームレスにMustacheを使うようにすることです。例えば、私は私のviewsフォルダにこのファイルを持っているでしょう:Kohanaでテンプレートシステムをシームレスに使用していますか?

myview.mustache

その後、私は自分のアプリケーションで行うことができます。

$view = View::factory('myview'); 
echo $view->render(); 

ちょうど私が通常のビューで行うだろうように。コナナはこのようなことを許していますか?そうでない場合は、モジュールを使用して自分で実装できる方法はありますか? (もしそうなら、何が最善のアプローチだろうか?)


PS:私はKostacheを見ていたが、それは私のために直接口ひげPHPを使用するのと同じであるカスタム構文を使用します。私はKohanaの構文を使用してそれを行うために探しています。


編集:について

、これは私がする@ eriscoの回答に基づいて、それをやってしまった方法です。

フルモジュールは、GitHubの上で利用可能になりました:APPPATH /クラス/ view.phpKohana-Mustache

<?php defined('SYSPATH') or die('No direct script access.'); 

class View extends Kohana_View { 

    public function set_filename($file) { 
     $mustacheFile = Kohana::find_file('views', $file, 'mustache'); 
     // If there's no mustache file by that name, do the default: 
     if ($mustacheFile === false) return Kohana_View::set_filename($file); 

     $this->_file = $mustacheFile; 

     return $this; 
    } 


    protected static function capture($kohana_view_filename, array $kohana_view_data) { 
     $extension = pathinfo($kohana_view_filename, PATHINFO_EXTENSION); 
     // If it's not a mustache file, do the default: 
     if ($extension != 'mustache') return Kohana_View::capture($kohana_view_filename, $kohana_view_data); 

     $m = new Mustache; 
     $fileContent = file_get_contents($kohana_view_filename); 
     return $m->render($fileContent, Arr::merge(View::$_global_data, $kohana_view_data)); 
    } 

} 
+0

独自の工場を使用するKostacheとの唯一の違いはありませんか?私には問題のようには見えません。 –

答えて

5

はい、できます。 Kohanaはオートローディングで細かいことをしているので、「Cascading Filesystem」と呼ばれるものを使うと、コアクラスの機能を効果的に再定義できます。あなたがよく知っているなら、これはコードイグナイターも同様です。

特に、これはあなたが参照しているView :: factoryメソッドです。 Source

public static function factory($file = NULL, array $data = NULL) 
{ 
    return new View($file, $data); 
} 

ご覧のとおり、これはViewのインスタンスを返します。最初はViewが定義されていないので、PHPは自動ロードを使用してそれを探しています。これは、独自のViewクラスを定義してカスケードファイルシステムの機能を利用できるときです。ファイルはAPPPATH/View.phpである必要があります。APPPATHindex.phpで定義された定数です。 。

私たち自身のViewクラスを定義できるので、私たちは行かなくてはなりません。具体的には、$view->render()と呼ばれるView::captureをオーバーライドして、テンプレートを取り込む必要があります。

the default implementationを見て、何をすればいいのか、何ができるかを知ることができます。私は一般的な考え方を概説しました。

class View 
{ 
    /** 
    * Captures the output that is generated when a view is included. 
    * The view data will be extracted to make local variables. This method 
    * is static to prevent object scope resolution. 
    * 
    *  $output = View::capture($file, $data); 
    * 
    * @param string filename 
    * @param array variables 
    * @return string 
    */ 
    protected static function capture($kohana_view_filename, array $kohana_view_data) 
    { 
      // there 
      $basename = $kohana_view_filename; 

      // assuming this is a mustache file, construct the full file path 
      $mustachePath = $some_prefix . $basename . ".mustache"; 

      if (is_file($mustachePath)) 
      { 
       // the template is a mustache template, so use whatever our custom 
       // rendering technique is 
      } 
      else 
      { 
       // it is some other template, use the default 
       parent::capture($basename, $kohana_view_data); 
      } 

     } 
} 
+1

ありがとう、私はやや違ったやり方でやりましたが、あなたのスクリプトは私にそのアイデアを与えました。私はKohanaに感銘を受け続け、それをどの程度簡単に拡張することができます。 –

関連する問題