?

Log in

No account? Create an account
Идеологически правильно - куда? :) - Codeigniter [entries|archive|friends|userinfo]
Русское сообщество пользователей CodeIgniter

[ website | проект CodeIgniter ]
[ userinfo | livejournal userinfo ]
[ archive | journal archive ]

Links
[Links:| репозитарий проектов wiki ]

Идеологически правильно - куда? :) [Aug. 14th, 2009|10:10 pm]
Русское сообщество пользователей CodeIgniter

ru_codeigniter

[_bublik_]
Допустим имеется проект небольшого новостного сайта.

На заглавной странице, кроме самих новостей есть "Погода", "Курсы валют" и "Голосовалка".
На остальных страниц тоже хочется видеть эти части.

Откуда идеологически правильно будет их подключать?

Писать в каждый контроллер что-то типа:

load->model('weather_model');
		$this->load->model('money_model');
		$this->load->model('vote_model');
                .......
		$this->load->view('header',$data);
	}
	
	function index()
        {
               .....
	}
}

?>



мне кажется неправильно.
LinkReply

Comments:
[User Picture]From: _bublik_
2009-08-14 03:44 pm (UTC)
а как думаете - если это вынесли в отдельный helper?
(Reply) (Parent) (Thread)
[User Picture]From: sontar
2009-08-14 03:47 pm (UTC)
что?
(Reply) (Parent) (Thread)
[User Picture]From: _bublik_
2009-08-14 03:50 pm (UTC)
кусок кода с подключением дополнительных моделей и отдачей контента во вьюху
(Reply) (Parent) (Thread)
[User Picture]From: sontar
2009-08-14 03:53 pm (UTC)
Я не об этом, я знаю что такое хелпер. Я имел ввиду, что Вы недостаточно полно формулируете предложения. Кто-то вынес хелпер или Вы сделали опечатку - у меня нет желания догадываться.
(Reply) (Parent) (Thread)
[User Picture]From: _bublik_
2009-08-14 03:58 pm (UTC)
в чем его недостаточность?

спрашиваю мнение о решении проблемы, как вынести часть

$this->load->model('weather_model');
$this->load->model('money_model');
$this->load->model('vote_model');
...........

в хелпер, а в каждый контроллер подгружать этот хелпер.
(Reply) (Parent) (Thread)
[User Picture]From: drumrock
2009-08-14 04:04 pm (UTC)
Это можно сделать даже во view. :-)
(Reply) (Parent) (Thread)
[User Picture]From: _bublik_
2009-08-14 04:06 pm (UTC)
Это понятно, но как-то это "неправильно" )))
(Reply) (Parent) (Thread)
[User Picture]From: drumrock
2009-08-14 04:05 pm (UTC)
В смысле, можно подключать модели сразу во view, и не нужно посредника в виде хелпера.

Кстати, это добавляет некоторой отказоустойчивости - если модель не будет загружена во вью, подключаемом из основного вью, то накроется только часть страницы, а не вся (как в случае с подключением модели в контроллере).
(Reply) (Parent) (Thread)
[User Picture]From: sontar
2009-08-14 04:11 pm (UTC)
> В смысле, можно подключать модели сразу во view
"здравствуй, MVC"

не советуйте херни, ок

> если модель не будет загружена во вью
гг
(Reply) (Parent) (Thread)
[User Picture]From: drumrock
2009-08-14 04:17 pm (UTC)
Не грубите, ок? :-)

Подключать по 3 модели в каждом контроллере (и скорее всего раскидывать их данные по переменным) - это слишком много усилий.

Про "гг" - уточните, не могу прочитать вашу мысль.
(Reply) (Parent) (Thread)
[User Picture]From: _bublik_
2009-08-14 04:19 pm (UTC)
усилий это не много, это некрасиво, как минимум
(Reply) (Parent) (Thread)
[User Picture]From: sontar
2009-08-14 04:20 pm (UTC)
Да без проблем, можно хоть всё приложение во view реализовать ;)

> это слишком много усилий
это говорит лишь о том, что CI хреново организован, но не значит, что этой хреновой организации нужно следовать.

"гг" - если модель не загружена (например отсутствует файл), то это весьма серьёзная ошибка, и нужно брать пассатижи и ремонтировать.
(Reply) (Parent) (Thread)
[User Picture]From: drumrock
2009-08-14 04:25 pm (UTC)
HMVC в принципе предлагают схожий подход, и ничего.

Насчёт загрузки модели внутри вью я, кстати, ошибся - с какой-то другой ошибкой, менее серьёзной спутал. В случае отсутствующей модели всё-таки не отображается страница целиком.
(Reply) (Parent) (Thread)
[User Picture]From: drumrock
2009-08-14 04:28 pm (UTC)
Кстати, _bublik_, посмотрите - может, вам HMVC подойдёт.
(Reply) (Parent) (Thread)
[User Picture]From: sontar
2009-08-14 04:09 pm (UTC)
Уфф бля. детский сад.

"а как думаете - если это вынесли в отдельный helper?"

Предложение не содержит законченное утверждение или вопрос, в нём или пропущены члены или сделана ошибка или и то и другое. Оно может означать:
- Мы вынесли код в отдельный хелпер, что Вы по этому поводу думаете?
- Кто-то другой вынес код в отдельный хелпер, что Вы по этому поводу думаете?
- Мы собираемся вынести код в отдельный хелпер, что Вы по этому поводу думаете?
- Что Вы думаете о выносе кода в хелпер в принципе?
и т.д. к тому же какой именно код выносится?
Понятно, надеюсь. Т.е. читающему (т.е. мне) приходится постоянно пытаться прочесть выши мысли и понять что же Вы действительно имели ввиду.
Это как общаться фразами "пама, мы я крыжовник чокаво. ы?"

> как вынести часть
Понятно же, что вынести код с $this в хелпер не получится.
(Reply) (Parent) (Thread)
[User Picture]From: drumrock
2009-08-15 05:36 am (UTC)
С хелпером и $this можно провернуть следующий фокус.

Сделать хэлпер:
function doMultiload($controllerInstance) {
        $controllerInstance->load->model('multiloadmodel');
        $controllerInstance->load->model('multiloadmodel2');
        $controllerInstance->load->model('multiloadmodel3');
}



В контроллере написать что-нибудь вроде
        function multiload() {
                $this->load->helper('multiload');
                doMultiload($this);
                $data = $this->multiloadmodel->getData();
                print_r($data);
        }


То есть, передать экземпляр контроллера по ссылке в функцию хэлпера. Модель загружается и становится свойством нашего контроллера. Работает.

Как считаете, хорош ли такой вариант? Может, как-то удобнее можно сделать?
(Reply) (Parent) (Thread)
[User Picture]From: sontar
2009-08-15 06:46 am (UTC)
один хрен в контроллере придётся вызывать функцию для вызова хелпера. но главное то, что блок на странице представляет собой совокупность модели/метода и отображения, так что хелпером не обойдёшься. Причём этот метод должен иметь возможность получить данные из uri + произвольные дополнительные параметры.

Я представляю удобной такую схему:
Элементрная единица: модель/метод + отображение. Метод получает параметры и выдаёт данные (массив), эти данные совмещаются с отображением и получается на выходе HTML-документ или часть документа (строка). В этом документе может быть ссылка на такую же единицу - происходит вызов дочерней совокупности модели/метода + отображения, которая возвращает такую же часть HTML-документа (контейнерный блок с содержимым), и эта часть вставляется в родительский HTML-документ в соответствующем месте.
И так далее. Можно делать многоуровневый вызов, но на практике достаточно одного уровня.
Эта схема избавит нас от копания в контроллере. По сути контроллер будет только один, а вся задача программиста будет сводиться к написанию методов/отображений и подключение их в конфигурации.
(Reply) (Parent) (Thread)
[User Picture]From: drumrock
2009-08-15 07:26 am (UTC)
А такая элементарная единица откуда вызывается? Из контроллера?

Если в сгенерированной строке есь ссылка на такую же элементарную единицу, то получается по сути вставка "модель/метод + отображение" в отображение. Или я что-то упустил?
(Reply) (Parent) (Thread)
[User Picture]From: sontar
2009-08-15 08:08 am (UTC)
Корневая - из контроллера, остальные вызываются из корневой. Древовидная структура.

> получается по сути вставка "модель/метод + отображение" в отображение
Да, каждая комбинация "модель/метод + отображение" после обработки преобразуется в HTML-код, который может содержать или часть страницы (< div>...</div>) или страницу целиком (включая < html>< head>...). Получается вставка HTML-кода в HTML-код.
(Reply) (Parent) (Thread)