Пришла пора нам уйти от использования Контроллера, который шел в качестве образца в Кохане — Контроллера 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, получаем страницу контактов. Все элементарно и просто. Но немного смущает повторяемость некоторых участков кода. Например, при создании нового Контроллера нам прийдется опять же прописать для него базовый шаблон. А если таких Контроллеров много ? И если мы потом захотим переименовать базовый шаблон, нам прийдется прыгать по всем Контроллерам и исправлять ? На самом деле нет. Для этого создается Базовый Контроллер, в который помещается код, одинаковый для всех страниц, которые его используют. Но об этом уже в следующем уроке.
<< Назад | Вперед >> |
Пожалуйста, зарегистрируйтесь для комментирования.
Разберитесь с 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
Вам сюда (самый низ)
http://kohanaframework.su/advanced/route_p1
и сюда (самый верх)
http://kohanaframework.su/advanced/route_p2
Можно настроить и через htaccess
Ребат, оказывается имя файла контроллера должно начинаться с заглавной буквы (Page.php)!
Если class Controller_Page , то файл контроллера должен называться Page.php , а не page.php. Поправьте , если не прав. ПО крайней мере у меня контроллер заработал только после этого.
У меня все прекрасно работает с маленькой буквы.
да, файл класса теперь должен называться с большой буквы, как минимум для версии 3.3.
либо в bootstrap.php нужно включить загрузчик auto_load_lowercase, однако разработчики так делать не рекомендуют.
естественно это актуально для linux, в винде это не играет роли.
Если я не ошибаюсь в 3.3 имя контроллера с большой букви нужно писать
В чем может быть проблема? после запуска ничего не найдено , error 404