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

Комментарии: 25  Просмотры: 34 098

Пришла пора нам уйти от использования Контроллера, который шел в качестве образца в Кохане — Контроллера Welcome. Давайте попробуем сделать наш первый «собственный» Контроллер. Создайте внутри application/classes/controller/ файл с названием page.php и вставьте следующий код:

<?php defined('SYSPATH') or die('No direct script access.');
 
class Controller_Page extends Controller_Template {
 
    // Определяем шаблон по умолчанию
    public $template = 'main';
 
    public function action_about()
    {
        $content = View::factory('/pages/about');
        $this->template->title = 'О сайте';
        $this->template->description = 'Страница о сайте';
        $this->template->content = $content;
    }
 
} // End Page

Думаю тут все понятно. Поскольку файл Контроллера имеет название page.php и находится в папке Controller, то сам класс будет называться Controller_Page. Наследовать мы будем Controller_Template. Так как наш главный шаблон имеет название не template.php, а main.php, то мы сразу прописываем это. Далее мы создаем метод, но обратите внимание, что не action_index, а action_about. В методе задаем шаблон контента, а также заголовок и описание основного шаблона.

Теперь нужно создать папку pages (думаю понятно почему) и поместить туда шаблон about.php. В нем будет следующий текст:

Здесь будет информация о сайте

Шаблон main.php оставьте без изменений. А теперь напишите в браузере http://kohana/page/about. Вы получите страницу с текстом «Здесь будет информация о сайте», а также нами прописанные title и description (это видно, если посмотреть html-код страницы). Думаю вы поняли, что произошло. Поскольку метод в классе имеет префикс action_, то мы смогли обратиться к нему через уже знакомую нам схему http://адрес сайта/контроллер/метод.

Для закрепления создайте еще один метод в этом же классе:

    public function action_contacts()
    {
        $content = View::factory('/pages/contacts');
        $this->template->title = 'Мои контакты';
        $this->template->description = 'Страница для связи со мной';
        $this->template->content = $content;
    }

Теперь создайте еще один шаблон, как вы думаю догадались, с названием contacts.php и текстом:

Здесь будут мои контакты

и поместите его рядышком с шаблоном about.php. Запускаем http://kohana/page/contacts, получаем страницу контактов. Все элементарно и просто. Но немного смущает повторяемость некоторых участков кода. Например, при создании нового Контроллера нам прийдется опять же прописать для него базовый шаблон. А если таких Контроллеров много ? И если мы потом захотим переименовать базовый шаблон, нам прийдется прыгать по всем Контроллерам и исправлять ? На самом деле нет. Для этого создается Базовый Контроллер, в который помещается код, одинаковый для всех страниц, которые его используют. Но об этом уже в следующем уроке.

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


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

Разберитесь с page и pages. Помему нужно создавать папку «page» и писать
$content = View::factory(‘/page/about’);

удалите оба коммента, я разобрался, что можно и так и так.

Да пусть будут, или вам принципиально ? Тогда я удалю :)
Тут дело логики. В адресе понятно, что
http://kohana/page/contacts — это страница контактов. Одна страница, поэтому page в единственном числе. А папка pages в шаблонах-в ней лежат много шаблонов, поэтому pages.
Хотя действительно называть можно как угодно и работать будет в любом случае. page в адресе никак не связан с pages -которая является папкой для шаблонов.

Неприцнипиально))
Запутали одинаковые имена класса контрорллера и папки где они лежат.

угу. для обучения наверное не стоит так делать :)

Да тоже ошибся при создании папки. Назвал page, глянул в комментарии и поправил на pages. Все заработало.

Однако я даже не заметил, хитро =)

где надо создать папку «page»?

В Видах. Только у меня не page, а pages.
Можно и не создавать, кидать там в корень. Тогда вместо
$content = View::factory(‘/pages/about’);
будет
$content = View::factory(‘about’);

Переименовал контроллер в mainpage.php, прописал
class Controller_Mainpage, выдает ошибку. Что я делаю не так?

какой контроллер переименовали? как к нему обращаетесь? какую ошибку выдает ?
тут телепатов нету )

Из примера:

/var/www/html/application/classes/controller/mainpage.php

template->title = ‘О сайте’;
$this->template->description = ‘Страница о сайте’;
$this->template->content = $content;
}

} // End Page

HTTP_Exception_404 [ 404 ]: The requested URL page/about was not found on this server.

SYSPATH/classes/kohana/request/client/internal.php [ 87 ]

83 try
84 {
85 if ( ! class_exists($prefix.$controller))
86 {
87 throw new HTTP_Exception_404(‘The requested URL :uri was not found on this server.’,
88 array(‘:uri’ => $request->uri()));
89 }
90
91 // Load the controller using reflection
92 $class = new ReflectionClass($prefix.$controller);

page поменяли на mainpage, а в ссылке, как я понял, пишете по старому.
теперь пишете
http://kohana/mainpage/about
вместо
http://kohana/page/about
либо роут надо менять. в файле бутстрап.

вот этот:
template->title = ‘О сайте’;
$this->template->description = ‘Страница о сайте’;
$this->template->content = $content;
}

} // End Page

а это тут при чем. ошибка
The requested URL page/about was not found on this server
означает, что у вас не может найти контроллер page (т.к. вы его и переименовали по всей видимости в mainpage), следовательно в адресной строке так и надо указать.
такие вопросы с кодом лучше обсуждать на форуме.

да спасибо разобрался, логику не сразу понял правильно

А как быть, если мне надо иметь ссылку вида: http://kohana.ru/метод ? Т.е. я хочу, чтобы, например, страница contacts была доступна по адресу http://kohana.ru/contacts, а не по http://kohana.ru/page/contacts

Можно настроить и через htaccess

Ребат, оказывается имя файла контроллера должно начинаться с заглавной буквы (Page.php)!

Если class Controller_Page , то файл контроллера должен называться Page.php , а не page.php. Поправьте , если не прав. ПО крайней мере у меня контроллер заработал только после этого.

У меня все прекрасно работает с маленькой буквы.

да, файл класса теперь должен называться с большой буквы, как минимум для версии 3.3.
либо в bootstrap.php нужно включить загрузчик auto_load_lowercase, однако разработчики так делать не рекомендуют.
естественно это актуально для linux, в винде это не играет роли.

Если я не ошибаюсь в 3.3 имя контроллера с большой букви нужно писать

В чем может быть проблема? после запуска ничего не найдено , error 404



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

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