Легко ли использовать систему шаблонов с Kohana? - PullRequest
4 голосов
/ 18 февраля 2012

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

myview.mustache

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

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

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


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


Редактировать:

Для информации, вот как я закончил делать это, основываясь на @ erisco'sответ.

Полный модуль теперь доступен на GitHub: Усы Кохана

В APPPATH / classes / 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));
    }

}

1 Ответ

5 голосов
/ 18 февраля 2012

Да, вы можете.Поскольку Kohana проделывает некоторую хитрость с автозагрузкой, которую они называют «Каскадная файловая система», вы можете эффективно переопределить функциональность основных классов.Это то, что Code Igniter также делает, если вы знакомы.

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

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

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

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

Взгляните на реализацию по умолчанию , чтобы понять, чтоделать и что доступно.Я изложил общую идею.

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

        }
}
...