Страница 1 из 1

Новости в сайдбаре через виджет

СообщениеДобавлено: 20 авг 2013, 12:50
idencial
Добрый день!

Предположим, что у сайта есть сайдбар (справа или слева от main-content)
Подскажите, пожалуйста, как грамотнее вывести новости в сайдбаре через виджет.

Понимаю, что нужно сделать выборку по критерию, а потом пройтись через foreach, но есть неясности.

Например, я создал шаблон widgetNews_slist.php по аналогии с widgetNews_list.php, изменив формат вывода и дизайн (предполагается что будет 5 новостей списком без анонса).

потом добавить в модель функцию вывода новостей по критерию, например, getNewsWithLimit()

Далее, вероятно нужно создать компонент под этот виджет по аналогии с NewsWidget.php и в нем в методе run использовать созданный getNewsWithLimit()?

А потом в нужном месте сайдбара подключать

Yii::import('application.modules.News.components.*');
$this->widget('NewsSidebar');

так? или я путаюсь?

P.S.
и еще один вопрос.
Если я сайдбар добавил в шаблон inner.php, то какое условие нужно использовать чтобы показывать его не во всех разделах, а только в некоторых.
Например, в разделе "Новости" или "Поиск по карте" не показывать

Re: Новости в сайдбаре через виджет

СообщениеДобавлено: 20 авг 2013, 13:11
Xpycm
Добрый день.

1) Да, что-то типа такого, как Вы описали.

Так-то у нас уже есть виджет новостей (protected\modules\news\components\NewsWidget.php).
Вызывается на инфо-страницах (protected\modules\menumanager\views\view.php), если он указан при добавлении страницы:
Код: Выделить всё
if ($model->widget){
    echo '<div class="clear">';
    Yii::import('application.modules.'.$model->widget.'.components.*');
    $this->widget(ucfirst($model->widget).'Widget');
    echo '</div>';
}
 


2) Как вариант добавить в верху файла protected\components\Controller.php
Код: Выделить всё
public $showNewsWidget = false; 


В файле inner.php отображение виджета обернуть в условие:
Код: Выделить всё
if ($this->showNewsWidget) {
    # здесь вызов виджета
} 


Ну и в нужных контроллерах модулей в требуемый экшен или метод init() выставлять:
Код: Выделить всё
$this->showNewsWidget = true; 


Т.е если нужно в разделе "Новости", то в контроллер protected\modules\news\controllers\MainController.php добавляете:
Код: Выделить всё
public function init() {
   $this->showNewsWidget = true;
   parent::init();
}
 


Либо для определённого экшена, например: actionIndex().
Было:
Код: Выделить всё
public function actionIndex(){
    $model = new $this->modelName;
    $result = $model->getAllWithPagination();

    $this->render('index', array(
        'items' => $result['items'],
        'pages' => $result['pages'],
    ));
}
 


Станет:
Код: Выделить всё
public function actionIndex(){
        $this->showNewsWidget = true;
     $model = new $this->modelName;
    $result = $model->getAllWithPagination();

    $this->render('index', array(
        'items' => $result['items'],
        'pages' => $result['pages'],
    ));
}
 



Для раздела "Поиск на карте" actionView() в файле protected\modules\menumanager\controllers\MainController.php. Только по ID нужно ещё проверку добавить. Насколько я помню ID страницы "Поиск на карте" равен 12.
Т.е будет условие:
Код: Выделить всё
if ($id == 12)
   $this->showNewsWidget = true; 

Re: Новости в сайдбаре через виджет

СообщениеДобавлено: 20 авг 2013, 13:36
idencial
Спасибо большое за ответ!