2012-02-18 3 views
4

Я планирую использовать шаблоны Усы вместе с Kohana в моем следующем проекте. Так что я пытаюсь сделать, чтобы Kohana плавно использовал Mustache при визуализации представления. Например, я бы этот файл в моей папке views:Плавно используя систему шаблонов с Kohana?

myview.mustache

Тогда я могу сделать в моем приложении:

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

Так же, как я хотел бы сделать с обычной точки зрения. Кохана разрешает подобные вещи? Если нет, можно ли каким-либо образом реализовать его самостоятельно с помощью модуля? (Если это так, что бы быть лучшим подходом?)


PS: Я имел взгляд на Kostache но использует пользовательский синтаксис, который для меня является то же самое, используя Усы PHP напрямую. Я хочу сделать это, используя синтаксис Коханы.


Edit:

Для получения дополнительной информации, это, как я в конечном итоге делает это, основываясь на ответ @ erisco в.

Полный модуль теперь доступен на GitHub: Kohana-Mustache

В AppPath/классы/view.php:

<?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», вы можете эффективно переопределить функциональность основных классов. Это то же, что и Code Igniter, если вы знакомы.

В частности, это метод вида :: factory, на который вы ссылаетесь. Source.

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

Как вы можете видеть, это возвращает экземпляр View. Первоначально View не определен, поэтому PHP ищет его, используя автозагрузку. Это когда вы можете воспользоваться функцией каскадной файловой системы, указав свой собственный класс View, который должен находиться в файле APPPATH/View.php, где APPPATH - это константа, определенная в index.php. The specific rules are defined here.

Итак, поскольку мы можем определить наш собственный класс View, мы будем рады. В частности, нам нужно переопределить View::capture, который вызывается $view->render(), чтобы зафиксировать включение шаблона.

Посмотрите на 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

Спасибо большое, я закончил делать это несколько иначе, но ваш сценарий дал мне эту идею. Я все время впечатлен Коханой и как легко ее продлить. –

Смежные вопросы