Создаем Базовый Контроллер

Комментарии: 14  Просмотры: 31 548

На прошлом уроке мы с вами создали «собственный» Контроллер Controller_Page и теперь у нас уже два Контроллера: Controller_Page и Controller_Welcome. С дальнейшим ростом приложения появляются другие Контроллеры и все они обычно имеют какую-то общую информацию. Это могут быть заголовки, описания и другие данные, которые необходимо прописывать в каждом Контроллере. Такие общие элементы обычно выносят в отдельный Контроллер, который является промежуточным между Контроллером шаблонов и нашими Контроллерами, т.е. он наследует Контроллер шаблонов, а другие Контроллеры в свою очередь наследуют его. По сути дела Контроллер шаблонов тоже является промежуточным, но уже между Контроллером Коханы и нашими Контроллерами и тоже применяется для каких-то общих действий (работы с шаблонами), т.е. облегчает нам разработку. Но давайте еще больше ее облегчим и создадим свой базовый Контроллер. Наших знаний на данный момент уже вполне достаточно, чтобы это реализовать.

Создайте в папке /application/classes/controller/ файл common.php и напишите в нем следующий код:

<?php defined('SYSPATH') or die('No direct script access.');
 
abstract class Controller_Common extends Controller_Template {
 
    public $template = 'main';
 
    public function before()
    {
        parent::before();
        View::set_global('title', 'Мой сайт');				
        View::set_global('description', 'Самый лучший сайт');
        $this->template->content = '';
        $this->template->styles = '';
        $this->template->scripts = '';
    }
 
} // End Common

Сразу поясню, что мы здесь понаписали. Сначала мы объявили класс как Абстрактный, так как напрямую мы работать с ним не будем и создан он только для того, чтобы наследоваться другими классами. Далее объявили основной шаблон по умолчанию — это нам уже знакомо. Теперь самое интересное — специальный метод before(). Этот метод не нужно вызывать. Он запускается автоматически самым первым при обращении к классу, в котором он прописан или к классам, которые наследуют этот класс. Следующая строка parent::before(); необходима, чтобы метод before() класса-родителя Controller_Template не перетирался (а он там есть, будьте уверены, как есть он и в классе Controller). Ну и далее вам тоже все должно быть знакомо. Объявляем глобальные переменные Вида $title и $description, и три переменных для шаблона в качестве заготовок: контент, стили и скрипты. Ими мы займемся в следующем уроке. Думаю с этим все понятно.

Теперь займемся нашим Контроллером из файла page.php:

<?php defined('SYSPATH') or die('No direct script access.');
 
class Controller_Page extends Controller_Common {
 
    public function action_about()
    {
        $content = View::factory('/pages/about');
        $this->template->title = 'О сайте';
        $this->template->description = 'Страница о сайте';
        $this->template->content = $content;
    }
 
    public function action_contacts()
    {
        $content = View::factory('/pages/contacts');
        $this->template->title = 'Мои контакты';
        $this->template->description = 'Страница для связи со мной';
        $this->template->content = $content;
    }	
 
} // End Page

Обратите внимание. Теперь мы наследуем не Controller_Template, а Controller_Common. Это первое изменение. И второе — мы убрали строку с объявлением базового шаблона. Теперь опробуйте ссылки http://kohana/page/about и http://kohana/page/contacts. Ничего как бы не поменялось. Но мы убрали определение базового шаблона, а ошибку нам не выдало. Это произошло потому, что это определение теперь берется из наследуемого класса Controller_Common. И чтобы вы в этом полностью убедились, сначала посмотрите какие title и description имеет страница сейчас, после чего приведите код в page.php к такому виду:

<?php defined('SYSPATH') or die('No direct script access.');
 
class Controller_Page extends Controller_Common {
 
    public function action_about()
    {
        $content = View::factory('/pages/about');
        $this->template->content = $content;
    }
 
    public function action_contacts()
    {
        $content = View::factory('/pages/contacts');
        $this->template->content = $content;
    }	
 
} // End Page

Обновите страницу и снова посмотрите на title и description. Вы увидите в них тот текст, что прописан в базовом Контроллере. Это бывает полезно, когда нужно определить какой-то общий title и общий description для всего сайта, а для некоторых страниц уже менять его индивидуально в Контроллерах. Ну и конечно же нам теперь не нужно прописывать базовый шаблон в каждом Контроллере.
В следующем уроке мы подключим к шаблону CSS и вообще сделаем эдакую простейшую заготовку для блога.

А пока домашнее задание вам будет — аналогично Controller_Page переработать Controller_Welcome.

<< Назад | Вперед >> | Обсудить на форуме


К записи оставлено 14 коммент.

View::set_global(‘title’, ‘Мой сайт’);
View::set_global(‘description’, ‘Самый лучший сайт’);

можно заменить на
View::set_global(array(
‘title’ => ‘Мой сайт’,
‘description’ => ‘Самый лучший сайт’,
));

нужно в базовом еще что-то такое писать для удобаства

public function after()
{
if ($this->auto_render)
{
$this->template->styles = array_merge(array (‘styles.css’), $this->template->styles);
}

parent::after();
}

а то задолбетесь в каждом контроллере указывать главный файл стилей, для скриптов тоже пишется, плюс в before блок инициализации всех переменых шаблона тоже всзять в if ($this->auto_render), и после parent::before(), добавить что то типа такого if (Request::$is_ajax) { $this->auto_render = FALSE; }
все эти переменные шаблона при ajax запросах не нужны

Не, ну это заготовка просто была, потом файл стиля мы в базовом естественно указываем (http://kohanaframework.su/starting/blog_p1)
За остальные пояснения спасибо.

да и кстати

View::set_global('title', 'Мой сайт');				
View::set_global('description', 'Самый лучший сайт');

нужно заменить на вызов из конфига, который мы писали вот тут: http://kohanaframework.su/starting/configuring_2
. не зря же мы его создавали ) да и в конфиге менять параметры всяко проще, чем бегать по контроллерам, особенно, если кодом занимается посторонний человек.

ну тогда так

View::set_global(Kohana::$config->load(‘mysite.title’)->as_array())

* Kohana::$config->load(‘mysite’)->as_array()

А зачем в массив? Не проще так:

parent::before();
$site_config = Kohana::$config->load(‘mysite’);
View::set_global(‘title’, $site_config->get(‘title’));
View::set_global(‘description’,$site_config->get(‘description’));

ну логично, что так )

А еще предлагаю прописать метод action_index, который выводит все страницы сайта в папке pages, чтобы при обращении к http://mysite.ru/pages/ ошибки не возникало да и для индексации и продвижения лучше )

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

Доброй ночи. с базовым контроллером разобрался, возникла другая проблема:
в контроллере имеем строку public $template = ‘main’;
возможно ли как то, до этой строки получить дефолтное значение из индекс.пхп с корня и поместить в массив? ну примерно так )):
public $template = ZNACHENIE.’/main’;

Не очень понимаю, что вы хотите. В индекс.пхп складывать какие-то свои переменные не желательно. Хотя константу, как вы написали, увидит.

в том то и дело что видит. может я и не правильно что то делаю, но в индекс.пхп определяю тип браузера. ну и от этого уже хочу показать шаблон main этот в папке. например wap/main или web/main. со стилем просто вышло, а вот с шаблоном никак что то.



Оставить комментарий или два

Пожалуйста, зарегистрируйтесь для комментирования.