Как правильно делать контроллер для главной страницы

Общие вопросы по использованию фреймворка. Если не знаете как что-то сделать и это про Yii, вам сюда.
Закрыто
ram0973
Сообщения: 54
Зарегистрирован: 2010.06.12, 22:18
Откуда: Набережные Челны
Контактная информация:

Как правильно делать контроллер для главной страницы

Сообщение ram0973 »

На главной странице сайта городского телевидения должны быть новости из двух категорий: новости города и новости компании (например по 5 последних).
Как это в принципе надо правильно делать в Yii? Можете подсказать хотя бы общую идею. Создать контроллер Index и в нем получать данные от 2 моделей?
Или это делается по-другому? Например через виджеты? Также надо выводить информационные блоки, например программа передач.
То есть в одном контроллере - главной страницы надо обращаться к куче моделей и результат передавать в массивы, все это вручную отображать где нужно на странице?
Или есть есть способ получше ? (желательно хотя немного кода :D )
Аватара пользователя
samdark
Администратор
Сообщения: 9489
Зарегистрирован: 2009.04.02, 13:46
Откуда: Воронеж
Контактная информация:

Re: Как правильно делать контроллер для главной страницы

Сообщение samdark »

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

Далее в контроллере просто выводим шаблон, в котором в необходимых местах вызываем виджеты.

То же с инфоблоками.
Аватара пользователя
timlar
Сообщения: 1382
Зарегистрирован: 2009.09.19, 17:49
Откуда: Украина, Днепропетровск
Контактная информация:

Re: Как правильно делать контроллер для главной страницы

Сообщение timlar »

Все зависит от самой структуры сайта. Новости можно выводить и с помощью виджетов. Модель в данном случае используется одна, для работы с таблицей новостей. В таблицу новостей добавляется поле, по которому будет идти определение типа новости (новость города или новость компании). Далее в контроллере получаем нужные новости и выводим через виждеты. В принципе, можно обойтись и без виджетов, просто выводить на странице. Это уже зависит от конкретной ситуации.
Twitter: @timlar_ua
ram0973
Сообщения: 54
Зарегистрирован: 2010.06.12, 22:18
Откуда: Набережные Челны
Контактная информация:

Re: Как правильно делать контроллер для главной страницы

Сообщение ram0973 »

Мне не ясно, где в виджетах модели :). Почему-то мне кажется виджеты сделаны для мелочей типа слайдеров картинок, которые не используют модели. :oops:
Ну там разве что что-нибудь простое типа вывода тегов.
Есть ведь ещё модули, или это уже перебор? Где бы посмотреть пример не блога, а новостного сайта на yii :(
Последний раз редактировалось ram0973 2010.08.22, 12:12, всего редактировалось 1 раз.
Аватара пользователя
timlar
Сообщения: 1382
Зарегистрирован: 2009.09.19, 17:49
Откуда: Украина, Днепропетровск
Контактная информация:

Re: Как правильно делать контроллер для главной страницы

Сообщение timlar »

Примера новостного сайта, к сожалению, нет. Но есть пример того же блога, который очень хорошо объясняет основы работы с контроллерами, моделями и представлениями. Рекомендую ознакомиться, многие вопросы отпадут.
Twitter: @timlar_ua
ram0973
Сообщения: 54
Зарегистрирован: 2010.06.12, 22:18
Откуда: Набережные Челны
Контактная информация:

Re: Как правильно делать контроллер для главной страницы

Сообщение ram0973 »

Ну, пример блога я очень хорошо изучил и не один раз :) И официального, и вот этого http://code.google.com/p/yii-blogdemo-enhanced
И ещё прочитал 3 книжки по Zend, очень похожих по идее на эти блоги, так что мне кажется, я не полный чайник :).
Просто хотел узнать как это делают опытные люди, и насчёт модулей и виджетов заодно уточнить.
Аватара пользователя
timlar
Сообщения: 1382
Зарегистрирован: 2009.09.19, 17:49
Откуда: Украина, Днепропетровск
Контактная информация:

Re: Как правильно делать контроллер для главной страницы

Сообщение timlar »

Зенд здесь абсолютно не при чем. Это совершенно другой фреймворк.

О том, что такое модуль можно почитать здесь: http://yiiframework.ru/doc/guide/ru/basics.module

Виджет, это некий блок, который можно размещать на странице. У виджета есть метод run(), в котором можно работать с любой моделью.
Twitter: @timlar_ua
Аватара пользователя
slavcodev
Сообщения: 3134
Зарегистрирован: 2009.04.02, 21:42
Откуда: Valencia
Контактная информация:

Re: Как правильно делать контроллер для главной страницы

Сообщение slavcodev »

Там же в доках есть и определение виджетов (http://yiiframework.ru/doc/guide/ru/basics.view)
Мне ближе в контролере работать с моделями, в виджет только данные для генерации блоков.
Жду Yii 3!
Аватара пользователя
omko
Сообщения: 5
Зарегистрирован: 2010.08.03, 11:17
Откуда: Київ
Контактная информация:

Re: Как правильно делать контроллер для главной страницы

Сообщение omko »

если просто на главной страницк выводить новости, то почему просто не сделать вот так?

Код: Выделить всё


//protected/controllers/SiteController.php
public function actionIndex()
    {
        // renders the view file 'protected/views/site/index.php'
        // using the default layout 'protected/views/layouts/main.php'
        $limit = 5;
        $dataProvider1=new CActiveDataProvider('News', array(
                                    'criteria'=>array(
                                       'condition'=>' city_company=1 ',
                                       'limit'=> $limit,
                                       'order'=>'RAND()', //ну или ASC/DESC
                                    ),
                                    'pagination'=>false,
                                ));
      $dataProvider2=new CActiveDataProvider('News', array(
                                    'criteria'=>array(
                                       'condition'=>' city_company=2 ',
                                       'limit'=> $limit,
                                       'order'=>'RAND()', //ну или ASC/DESC
                                    ),
                                    'pagination'=>false,
                                ));

        $this->render('index',
            array('dataProvider1'=>$dataProvider1,
                        'dataProvider2'=>$dataProvider2,
            )
        );
    }
----------------------------------------------------------------------------------------
//protected/views/site/index.php


<h1>Welcome to <i><?php echo CHtml::encode(Yii::app()->name); ?></i></h1>

<h4>City news</h4>

<?php $this->widget('zii.widgets.CListView', array(
    'dataProvider'=>$dataProvider1,
    'itemView'=>'_view',
    'ajaxUpdate'=> false,
    'enablePagination' => false,
)); ?>

<h4>Company news</h4>

<?php $this->widget('zii.widgets.CListView', array(
    'dataProvider'=>$dataProvider2,
    'itemView'=>'_view',
    'ajaxUpdate'=> false,
    'enablePagination' => false,
)); ?>


Аватара пользователя
kosenka
Сообщения: 677
Зарегистрирован: 2009.09.26, 12:41
Откуда: москва
Контактная информация:

Re: Как правильно делать контроллер для главной страницы

Сообщение kosenka »

omko писал(а):если просто на главной страницк выводить новости, то почему просто не сделать вот так?

Код: Выделить всё


//protected/controllers/SiteController.php
public function actionIndex()
    {
        // renders the view file 'protected/views/site/index.php'
        // using the default layout 'protected/views/layouts/main.php'
        $limit = 5;
        $dataProvider1=new CActiveDataProvider('News', array(
                                    'criteria'=>array(
                                       'condition'=>' city_company=1 ',
                                       'limit'=> $limit,
                                       'order'=>'RAND()', //ну или ASC/DESC
                                    ),
                                    'pagination'=>false,
                                ));
      $dataProvider2=new CActiveDataProvider('News', array(
                                    'criteria'=>array(
                                       'condition'=>' city_company=2 ',
                                       'limit'=> $limit,
                                       'order'=>'RAND()', //ну или ASC/DESC
                                    ),
                                    'pagination'=>false,
                                ));

        $this->render('index',
            array('dataProvider1'=>$dataProvider1,
                        'dataProvider2'=>$dataProvider2,
            )
        );
    }
----------------------------------------------------------------------------------------
//protected/views/site/index.php


<h1>Welcome to <i><?php echo CHtml::encode(Yii::app()->name); ?></i></h1>

<h4>City news</h4>

<?php $this->widget('zii.widgets.CListView', array(
    'dataProvider'=>$dataProvider1,
    'itemView'=>'_view',
    'ajaxUpdate'=> false,
    'enablePagination' => false,
)); ?>

<h4>Company news</h4>

<?php $this->widget('zii.widgets.CListView', array(
    'dataProvider'=>$dataProvider2,
    'itemView'=>'_view',
    'ajaxUpdate'=> false,
    'enablePagination' => false,
)); ?>


не, так не удобно. нужно помнить "что в этом контроллере вывожу новости" и т.д.
проще использовать виджеты, как написал Sam Dark (viewtopic.php?p=8430#p8430)
в виджете можно сделать какую угодно обработку данных и не захламлять код контроллера.
Аватара пользователя
kosenka
Сообщения: 677
Зарегистрирован: 2009.09.26, 12:41
Откуда: москва
Контактная информация:

Re: Как правильно делать контроллер для главной страницы

Сообщение kosenka »

Timlar писал(а):Примера новостного сайта, к сожалению, нет. Но есть пример того же блога, который очень хорошо объясняет основы работы с контроллерами, моделями и представлениями. Рекомендую ознакомиться, многие вопросы отпадут.
Есть пример интернет-магазина, где на главной странице выводят "популярные товары" через использования виджета.

Код контроллера, отвечаюйщий за вывод главной страницы уместился в две строчки:

Код: Выделить всё

    public function actionIndex()
    {
            $this->pageTitle=Yii::app()->params['siteIndexPageTitle'];
        $this->render('index');
    }
 
Шаблон index:

Код: Выделить всё

<!-- popular goods -->
<? $this->widget('application.components.cIndexShop'); ?>
И код виджета:

Код: Выделить всё

class cIndexShop extends CWidget
{
        public $params=array();
        
        public function init()
        {
                parent::init();
        }

        public function run()
        {
        $indexShop=Yii::app()->cache->get('indexShop'); // ищем в кеше "последние записи"
        if($indexShop===false) // в кеше их нет
        {
                        //выбираем все записи, которые относятся к...
                        $command=Yii::app()->db->createCommand...
                        $row=$command->queryRow();
                        if($row)
                        {
                                $criteria=new CDbCriteria;
                                $criteria->condition=...
                                $indexShop=Items::model()->with('idxCatalog','files')->together()->findAll($criteria);//работаем с моделью Items
                                Yii::app()->cache->set('indexShop',$indexShop,Yii::app()->params['indexShopCacheTime']);
                        }
                }
                $this->render('cvIndexShop',array('indexShop'=>$indexShop));
        }
}
 
p.s. Если надо убрать "популярные товары" с главной, то я просто закомментариваю вызов виджета в /views/site/index.php :)
Аватара пользователя
timlar
Сообщения: 1382
Зарегистрирован: 2009.09.19, 17:49
Откуда: Украина, Днепропетровск
Контактная информация:

Re: Как правильно делать контроллер для главной страницы

Сообщение timlar »

О том, как лучше - вопрос спорный. Если новости предполагается выводить в одном месте, то совершенно не нужно пихать все это в виджет. Лишняя обработка, ИМХО.

А на счет скрытия/отображения каких-то блоков, то лучше сделать соответствующий параметр в конфиге, который будет отвечать за отображение/скрытие блока. Не нужно будет лазить в код и комментировать.
Twitter: @timlar_ua
ram0973
Сообщения: 54
Зарегистрирован: 2010.06.12, 22:18
Откуда: Набережные Челны
Контактная информация:

Re: Как правильно делать контроллер для главной страницы

Сообщение ram0973 »

В общем, виджеты наше всё :). А модули тогда зачем, простите за глупый вопрос? А может например новости засунуть в модуль, и если надо, на другом сайте можно просто кинуть этот модуль в папку и готово? Не могу понять разницу между модулями и виджетами, причем модули как-то получше кажутся, в них даже лэйауты свои есть, и все файлы M-V-C отдельно. А в виджете, как в этом примере магазина всё как-то в кучу. Это тоже MVC ?
Аватара пользователя
timlar
Сообщения: 1382
Зарегистрирован: 2009.09.19, 17:49
Откуда: Украина, Днепропетровск
Контактная информация:

Re: Как правильно делать контроллер для главной страницы

Сообщение timlar »

Модуль, это "приложение в приложении". У модуля есть свои контроллеры, модели, вьюхи. Модуль и виджет - совершенно разные вещи.

ЗЫ. У виджета тоже есть свои представления.
Twitter: @timlar_ua
Аватара пользователя
Одиночка Айс
Сообщения: 267
Зарегистрирован: 2010.02.05, 10:26
Откуда: Алма-Ата, Казахстан
Контактная информация:

Re: Как правильно делать контроллер для главной страницы

Сообщение Одиночка Айс »

Зачем виждеты то? Запихайте выборку новостей в контроллер и передавайте во вью полученные данные, нафига огороды городить???
Ни любви, ни тоски, ни жалости...
Аватара пользователя
kosenka
Сообщения: 677
Зарегистрирован: 2009.09.26, 12:41
Откуда: москва
Контактная информация:

Re: Как правильно делать контроллер для главной страницы

Сообщение kosenka »

Одиночка Айс писал(а):Зачем виждеты то? Запихайте выборку новостей в контроллер и передавайте во вью полученные данные, нафига огороды городить???
Ага. А если надо новости выводить в другом месте, а не только в "контроллере на главной", ты что, будешь и в том месте "пихать выборку новостей" ?
Виджеты - самый простой и правильный путь.
Аватара пользователя
Одиночка Айс
Сообщения: 267
Зарегистрирован: 2010.02.05, 10:26
Откуда: Алма-Ата, Казахстан
Контактная информация:

Re: Как правильно делать контроллер для главной страницы

Сообщение Одиночка Айс »

Хм... Резонно )))
Ни любви, ни тоски, ни жалости...
Закрыто