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

Все о фреймворке Kohana. Обсуждение уроков, документации.
Текущее время: 20 апр 2024, 02:31

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




Начать новую тему Ответить на тему  [ Сообщений: 7 ] 
Автор Сообщение
 Заголовок сообщения: Вопрос по HMVC
СообщениеДобавлено: 27 дек 2013, 18:56 
Не в сети
Зеленый

Зарегистрирован: 27 дек 2013, 18:24
Сообщения: 3
Всем привет!

Есть контроллер-список (родитель) со своим view и 3 вида контроллеров-элементов (дети) со своими view каждый.
В контроллере-списке вызывается создание контроллеров-элементов и потом вставляются в представление родителя.
Формирование списка идет на основе запроса к БД. Если делать запрос на уровне родителя, то тогда придется передавать как-то информацию контроллеру-ребенку (через route не проходит, из-за слишком длинной строки параметра- много данных). А если вызывать обращение к базе из контроллера элемента(что правильно для HMVC и объектного подхода), то будет слишком много обращений к базе данных, т.к. данные буду доставаться по одной записи, а не все за один select (что увеличит время формирования страницы и это не есть хорошо).

Таким образом вопрос в следующем, можно ли передавать данные между двумя контроллерами не используя route (для первого варианта)? или может кто-то может предложить свой вариант как это реализовано у вас?

Заранее спасибо.

Алекс


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Вопрос по HMVC
СообщениеДобавлено: 27 дек 2013, 19:04 
Не в сети
Администратор
Аватара пользователя

Зарегистрирован: 24 июл 2012, 18:00
Сообщения: 701
Откуда: Murom, Russia
А опишите реальный пример работы этого дела


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Вопрос по HMVC
СообщениеДобавлено: 27 дек 2013, 19:37 
Не в сети
Зеленый

Зарегистрирован: 27 дек 2013, 18:24
Сообщения: 3
Пример 1 (интернет магазин).
Контроллер-родитель НОВОСТЕЙ имеет возможность отображать список - скидок, акций, новостей, статьи. У каждой из этих видов информации свой view, Но запрос из базы выполняется один для получения последних n-новостей.

Алекс.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Вопрос по HMVC
СообщениеДобавлено: 27 дек 2013, 20:58 
Не в сети
Бывалый
Аватара пользователя

Зарегистрирован: 02 апр 2013, 16:26
Сообщения: 474
Откуда: Сергиев Посад
Основной контроллер(новости) вызывает подзапросом (Request, а не Route) контроллер акции и передает ему параметром или post\get кол-во требуемые новостей , в ответ получает от него список акций json массивом, ну а дальше по накатанным рельсам ... profit!

_________________
Майкл Джордан играет в баскетбол. Чарльз Мэнсон убивает людей. Я пишу код. У каждого свой талант.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Вопрос по HMVC
СообщениеДобавлено: 27 дек 2013, 21:14 
Не в сети
Администратор
Аватара пользователя

Зарегистрирован: 24 июл 2012, 18:00
Сообщения: 701
Откуда: Murom, Russia
Я немного не понял, почему вы не хотите создать одну базовую модель для всех типов материалов и одну таблицу для всех материалов любого типа. Например:

Код:
class Post extends ORM {
    protected $_table_columns = array(
        'id'       => array( 'type' => 'int' ),
        ...
        'type'     => array( 'type' => 'string' ),
        ...
    );

    protected $_post_type  = 'post';
    protected $_table_name = 'posts';
}
 


Каждый материал в табличке posts мог бы иметь поле type, в котором вы пишите например discount, promo, news, post и т.д. У каждой модели $_table_name всегда должен быть 'posts', а вот $_post_type свой, ну и соответственно все модели должны наследоваться от Post. Далее просто, в Post пишем:

Код:
    public function save(Validation $validation = NULL)
    {
        ...
        $this->type    = empty($this->type)     ? $this->_post_type : $this->type;
        ...
        parent::save($validation);
        ...
        Cache::instance($this->type)->delete($this->type.'-'.$this->id);

        return $this;
    } 


Остальные методы класса Post аналогично расширяются
Код:
    public function find($id = NULL)
    {
        $this->where($this->_object_name.'.type', '=', $this->_post_type);

        return parent::find($id);
    }

    public function find_all($id = NULL)
    {
        $this->where($this->_object_name.'.type', '=', $this->_post_type);

        return parent::find_all($id);
    }

    public function delete($id = NULL)
    {
        $this->where($this->_object_name.'.type', '=', $this->_post_type);

        return parent::delete($id);
    }

    public function count_all($id = NULL)
    {
        $this->where($this->_object_name.'.type', '=', $this->_post_type);

        return parent::count_all($id);
    }

    public function values(array $values, array $expected = NULL)
    {
        $this->type = $this->_post_type;

        return parent::values($values, $expected);
    } 


Расширяется на раз-два.
В общем то тут одна кописпаста, думать особо не надо


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Вопрос по HMVC
СообщениеДобавлено: 27 дек 2013, 23:11 
Не в сети
Зеленый

Зарегистрирован: 27 дек 2013, 18:24
Сообщения: 3
Да дело не в таблице и модели, это и так один класс с одной моделью на одну таблицу.
Дело в представлениях. Для каждого типа создан свой контроллер только из-за представлений!! Каждый тип новостей должен отображаться по своему. Городить сложный view мне не хотелось - один универсальный с case оператором. Поэтому и были созданы контроллеры для каждого типа, но обращаются они все к одной модели.
По поводу route я был неправ. Да идет вызов каждого типа через
Код:
Request::factory($this->name . '/' . $this->param)->execute();

Но вопрос-то не в этом.

Как можно оптимизировать код так, чтобы сделать один запрос к базе из родительского контроллера, а воспользоваться i-тым элементом из result-set модели в дочернем элементе?


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Вопрос по HMVC
СообщениеДобавлено: 29 дек 2013, 08:32 
Не в сети
Бывалый
Аватара пользователя

Зарегистрирован: 02 апр 2013, 16:26
Сообщения: 474
Откуда: Сергиев Посад
Цитата:
Для каждого типа создан свой контроллер только из-за представлений

А почему не используешь несколько представлений в базовом шаблоне?

Вообще сложно понять о чем ты, выкладывай хоть какие-то куски кода..

_________________
Майкл Джордан играет в баскетбол. Чарльз Мэнсон убивает людей. Я пишу код. У каждого свой талант.


Вернуться к началу
 Профиль  
 
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 7 ] 

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


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

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


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

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