как управлять несколькими шаблонами и активами шаблонов

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

Я пытаюсь реализовать эту структуру в одном из своих приложений, и теперь я застрял в управлении несколькими шаблонами и их активами.

В основном мое приложение будет иметь папки шаблонов, такие как template1, template2 .... и все изображения, css, js, связанные с конкретным шаблоном, должны содержаться в папке шаблона.

Так возможны ли такие реализации? Если да, то как я могу загрузить определенные ресурсы шаблона в файлы родительского шаблона?


person Prakash    schedule 16.11.2011    source источник


Ответы (2)


Короче Да

Я сам использую шаблоны на сайте, который я сделал с помощью Kohana 3.0. Я попытаюсь объяснить его базовую настройку; чтобы использовать шаблоны, ваши контроллеры должны расширять Controller_Template, а переменная $template внутри указывает, какую страницу шаблона загружать в вашу папку представлений, поэтому я создал свой собственный класс главного контроллера, который расширяет класс controller_template для управления загрузкой шаблона; ниже вы увидите, что имя моего шаблона по умолчанию — просто шаблон, поэтому он будет загружать template.php из папки моих представлений, если он не указан на моих контроллерах.

У меня есть мастер-контроллер master.php с определением класса (упрощенное)

abstract class Controller_Master extends Controller_Template
{
    public $template = 'template'; // Default template

    public function before()
    {
        // Set a local template variable to what template the controller wants to use, by default 'template'
        $template = $this->template; 

        // This is important and for abstraction, since we're extending a class and its functions we need to make sure we still execute its before(); function
        // This will load the view you need from /views/template.php or /views/template2.php depending on what your controller specifies into $this->template
        parent::before();

        // Check which template our code/controller needs to use
        if ($template == 'template') 
        {
            $this->template->header = View::factory('template/head');  // Loads default header file from our views folder /views/template/head.php
            $this->template->content = View::factory('template/index');  // Loads default index file from our views folder /views/template/index.php
            $this->template->footer = View::factory('template/footer');  // Loads default footer file from our views folder /views/template/footer.php

            return;
        } elseif ($template == 'template2') 
        {
            $this->template->header = View::factory('template2/head');  // Loads default header file from our views folder /views/template2/head.php
            $this->template->sidebar = View::factory('template2/sidebar');  // Loads default sidebar file from our views folder /views/template2/sidebar.php
            $this->template->content = View::factory('template2/index');  // Loads default index file from our views folder /views/template2/index.php
            $this->template->footer = View::factory('template2/footer');  // Loads default footer file from our views folder /views/template2/footer.php

            return;
        }
    }
}

У меня есть пользовательский контроллер user.php с определением класса

// This is important, make sure your controllers extend your master controller class
class Controller_User extends Controller_Master
{
    // In this example this user controller just needs to use the default controller 
    // so nothing needs to be changed on it besides extending our Controller_Master

    // Example action inside the user class on how to load different content into your template instead of the default index page.
    function action_login()
    {
        // Load the login view page from /views/template/forms/login.php
        $this->template->content = View::factory('template/forms/login');
    }
}

Теперь предположим, что у нас есть контроллер, которому нужно использовать другой шаблон. Допустим, у вас есть фотоконтроллер photo.php с определением класса

// This is important, make sure your controllers extend your master controller class
class Controller_Photo extends Controller_Master
{
    // Since this controller needs to use a different template we extend the before() function
    // to override the $template variable we created in master to use 'template2'
    function before() 
    {
        $this->template = 'template2';
    }
}

/views/template.php содержит что-то вроде

    <body>
        <div id="header">
            <?= $header; ?>
        </div>
        <div id="content">
            <?= $content; ?>
        </div>
        <div id="footer">
            <?= $footer; ?>
        </div>        
    </body>

/views/templat2e.php содержит другой макет, например

    <body>
        <div id="header">
            <?= $header; ?>
        </div>
        <div id="sidebar">
            <?= $sidebar; ?>
        </div>
        <div id="content">
            <?= $content; ?>
        </div>
        <div id="footer">
            <?= $footer; ?>
        </div>        
    </body>

Где $header, $sidebar, $content и $footer устанавливаются в главном контроллере или перезаписываются кодом в вашем контроллере на $this->template->header и так далее.

Надеюсь, это достаточно объясняет, как работать с шаблонами в Kohana.

person Jeff Wilbert    schedule 18.11.2011
comment
Почему вы вводите локальную переменную $template в свой контроллер master.php? Кажется ненужным. // Set a local template variable to what template the controller wants to use, by default 'template' $template = $this->template; - person Leo Gerber; 27.07.2012

Я бы не советовал структурировать ваши активы таким образом, потому что вы не будете использовать фреймворк по назначению.

CSS, JavaScript и изображения действительно должны храниться вне основного каталога application.

e.g.

application/
modules/
system/
assets/
  template1/
    css/
      styles.css
    js/
      script.js
    img/
      thing.jpg
  template2/
    css/
      styles.css
    js/
      script.js
    img/
      another-thing.jpg

В противном случае каждый запрос ресурсов будет проходить через фреймворк, что повлияет на скорость отклика вашего приложения.

Если вы все еще хотите пойти по этому пути, взгляните на метод action_media в /modules/userguide/classes/controller/userguide.php, чтобы увидеть, как CSS, JavaScript и изображения загружаются модулем пользовательского руководства.

В качестве альтернативы вы можете изменить свои правила .htaccess, чтобы разрешить доступ к файлам активов в каталоге приложения.

person MrP    schedule 23.11.2011