Русскоязычный форум, посвященный фреймворку Kohana

Все о фреймворке Kohana. Обсуждение уроков, документации.
Текущее время: 05 июл 2025, 15:23

Часовой пояс: UTC + 4 часа [ Летнее время ]




Начать новую тему Ответить на тему  [ Сообщений: 16 ]  На страницу 1, 2  След.
Автор Сообщение
СообщениеДобавлено: 03 июл 2012, 16:55 
Не в сети
Зеленый

Зарегистрирован: 03 июл 2012, 16:27
Сообщения: 7
Всем доброго дня!

Есть следующий вопрос.

Я хочу сделать так, что бы страница собиралась как конструктор из нескольких элементов (например: меню, левый блок, правый блок, центральная часть).
Для каждого такого элемента логично было бы написать свой контроллер и при формировании страницы подключать требуемые контроллеры.
То есть есть страница http://mysite/page/index. Она формируется контроллером Page, функцией action_index(). Хочу сделать так, чтобы внутри action_index() вызывались (подключались) другие контроллеры, отвечающие за формирование элементов страницы. Как-то так:

    class Controller_Page extends Controller_Common {

    public function action_index()
    {

    вызов контроллера меню;
    вызов контроллера левого блока;
    вызов контроллера центральной части;
    вызов контроллера правого блока;

    }

Как правильно реализовать вызов контроллеров?

Какие есть способы обращения из контроллера к другому контроллеру?

В моем случае через «роуты» наверное не получиться, так как контроллеры элементов страницы не имеют самостоятельного адреса в URL. Адрес URL у страницы один: http://mysite/page/index.


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: 03 июл 2012, 18:49 
Не в сети
Бывалый

Зарегистрирован: 16 апр 2012, 19:44
Сообщения: 113
Внутреннее обращение
Код:
Request::factory('uri')->execute()->body();


т.е. для вашего случая будет что то типа

Код:
$menu = Request::factory('menu')->execute()->body();
$sidebar = Request::factory('sidebar')->execute()->body();
$content = Request::factory('uri')->execute()->body();

$this->template->body = View::factory('index')->set('menu',$menu)->set('sidebar',$sidebar)->set('content',$content);


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: 03 июл 2012, 20:00 
Не в сети
Зеленый

Зарегистрирован: 03 июл 2012, 16:27
Сообщения: 7
mamahtehok писал(а):
Внутреннее обращение
Код:
Request::factory('uri')->execute()->body();



А роут надо писать? Разве Request::factory('uri') работает не с URL?

И еще вопросы.
Где должны быть расположены файлы 'menu', 'uri', 'sidebar'? В [url]application\classes\controller\[/url]?
Как должны называться внутри файлов 'menu', 'uri', 'sidebar' функции (методы) ?


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: 04 июл 2012, 00:35 
Не в сети
Зеленый

Зарегистрирован: 03 июл 2012, 16:27
Сообщения: 7
Цитата:
Внутреннее обращение
Код:
Request::factory('uri')->execute()->body();


Спасибо "mamahtehok", работает!
Только я не понял как оно работает без роута :o .
И где все же должны быть расположены файлы 'menu', 'uri', 'sidebar'? В application\classes\controller\? Или kohana их найдет и в другой папке, нпример: application\classes\controller\page\?

И как можно обращаться к функциям (методам) внутри файлов 'menu', 'uri', 'sidebar' ?
У меня сейчас работает с единственным методом:
    public function action_index()

А как вызывать другие функции (методы)?


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: 04 июл 2012, 09:05 
Не в сети
Новичок

Зарегистрирован: 03 июл 2012, 14:46
Сообщения: 17
если вызываемый контроллер лежит в application\classes\controller\page\ то и подключаешь как

$menu = Request::factory('page/menu')->execute()->body();


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: 04 июл 2012, 13:07 
Не в сети
Зеленый

Зарегистрирован: 03 июл 2012, 16:27
Сообщения: 7
Wapruks писал(а):
если вызываемый контроллер лежит в application\classes\controller\page\ то и подключаешь как

$menu = Request::factory('page/menu')->execute()->body();


Пробовал - не работает.

Работает если только 'menu' лежит в application\classes\controller\

Или надо еще роут писать?

И как подключать другие методы?


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: 04 июл 2012, 13:27 
Не в сети
Бывалый

Зарегистрирован: 16 апр 2012, 19:44
Сообщения: 113
Requests работает с uri т.е. для него необходимы роуты. Если вас это не устраивает то можно использовать стандартный способ для пхп

Код:
$class = new Controller_My();
$class->method();


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: 04 июл 2012, 14:14 
Не в сети
Зеленый

Зарегистрирован: 03 июл 2012, 16:27
Сообщения: 7
mamahtehok писал(а):
Requests работает с uri т.е. для него необходимы роуты. Если вас это не устраивает то можно использовать стандартный способ для пхп

Код:
$class = new Controller_My();
$class->method();


Спасибо, "mamahtehok" за ответ! Все четко и ясно!

Лично я нашел несколько способов подключения необходимых контроллеров (классов) внутри другого контроллера:
1. Стандартный способ для пхп
Код:
$class = new Controller_My();
$class->method();


2. Подключение необходимого контроллера (класса) как хелпера
Достаточно расположить файл необходимого класса в application\classes\ и сразу использовать
Код:
Controller_My::method();

kohana сама его найдет и подключит.

3. Подключение необходимого контроллера (класса) как модели (очень похоже на Стандартный способ для пхп)
Код:
$class = new Model_My();
$class->method();


Ну и последний способ, как вы предлагали через Requests. Этот способ у меня то же сработал даже без роутов :o
Наверное по тому, что файл контроллера лежал в application\classes\controller\ и имел единственный метод index.

После всего у меня возникли еще вопросы.
1. Как все же идеологически правильно подключать необходимые контроллеры (классы) внутри другого контроллера?
2. Обязательно в названии класса должно присутствовать слово Controller?
3. В чем разница между просто классом, контроллером, хелпером и модулем (если писать свой модуль)? Разъясните, пожалуйста, в чем тут нюанс?


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: 05 июл 2012, 13:51 
Не в сети
Бывалый

Зарегистрирован: 16 апр 2012, 19:44
Сообщения: 113
1. Идеологически правильно все же через хелперы или внутренние реквесты.
2. Controller должно присутствовать обязательно в классе который реализует контролер, так же как в класе реализующем модель дложно присутствовать Model_
3. класс базовая единица ООП (подробно можно причитать в учебнике по php), контроллер это класс, в соответствии с парадигмой mvc обеспечивающий коммуникации между пользователем моделью и представлением, хелпер класс предоставляющие функции для решения каких то задач например хелпер arr собирает функции для работы с массивами. модуль это приложение реализующее коакой-то конкретный функционал например антентификации пользователя или работы с БД. Как-то так.


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: 05 июл 2012, 14:59 
Не в сети
Зеленый

Зарегистрирован: 03 июл 2012, 16:27
Сообщения: 7
Спасибо, "mamahtehok" за Ваш ответ!

Ситуация проясняется :D

В моем случае контроллеры, отвечающие за формирование элементов страницы не имеют самостоятельных адресов URL, поэтому, как я понял, они должны быть оформлены в виде хелперов. То есть как обычные классы для пхп, и лежать они должны кучей в application\classes\.

Скажите, а где можно настроить, чтобы хелперы kohana искала не только в application\classes\, а например и в application\classes\page\?
Такое можно сделать?


Вернуться к началу
 Профиль  
 
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 16 ]  На страницу 1, 2  След.

Часовой пояс: UTC + 4 часа [ Летнее время ]


Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 3


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Перейти:  
Все о фреймворке Kohana  | 
Powered by phpBB® Forum Software © phpBB Group