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

Добавить виджет

СообщениеДобавлено: 03 окт 2017, 20:26
REM
Появилась необходимость отображать виджет на разных страницах по разному.
Для понимания.
На главной странице есть два блока, пусть новости.
В одном блоке нужно вывести два блока новостей (последних), во втором блоке необходимо вывести шесть блоков.
При переходе на вкладку НОВОСИ, т.е. main/news/index получить шесть блоков.
Понимаю, что для этой цели в проекте исользован CPagination.
Что нам говорит документация:
CPagination представляет информацию, относящуюся к разбивке на страницы. Когда данные должны отображаться на нескольких страницах, мы можем использовать CPagination для представления информации, такой как общее количество элементов, размер страницы, текущая страница и т. Д. Эти данные могут передаваться пейджерам для отображения кнопок или ссылок страниц.

Я рассуждал так, поправьте меня если я не прав, Добавляем в News.php function в которой создаем новое правило :
Код: Выделить всё
public function getPageSize($inCriteria = null){
        if ($inCriteria === null){
            $criteria  = new CDbCriteria;
            $criteria -> addCondition('active = 1');
            $criteria -> order = 'date_created DESC';
        } else {
            $criteria = $inCriteria;
        }
        $page = new CPagination($this->count($criteria));
        $page -> pageSize = param('modele_news_itemsPage',10);
        $page -> applyLimit($criteria);
        $item = $this->findAll($criteria);
        return array(
            'item' => $item,
            'page' => $page,
        );
    }

В базе данных в таблице configuration создаем новую переменную modele_news_itemsPage задаем ему значение оличное от переменной modele_news_itemsPerPage.
В папке news/components создаем файл виджета, предположим NewsNewWidget.
С содержимым:
Код: Выделить всё
class NewsNewWidget extends CWidget
 
{

    public $usePagination = 1;

    public function getViewPath($checkTheme=false){
        return Yii::getPathOfAlias('application.modules.news.views');
    }

    public function run() {
        $news = new News;

        $criteria = new CDbCriteria;
        $criteria->addCondition('active = 1');
        $criteria->order = 'date_created DESC';

        $result = $news->getPageSize($criteria);

        $this->render('widgetNews_table', array(
            'news' => $result['item'],
            'page' => $result['page'],
        ));
    }
}

Соответственно раз мы рендерим файл widgetNews_table, создаем в папке views файл widgetNews_table.
С нужным нам контентом.
Ну и как результат выводим в site/index:
Код: Выделить всё
<div class="col-6 col-lg-6 col-xs-12">
        <!-- Catalog два предыдущие -->
            <?php Yii::import('application.modules.news.components.*');
            $this->widget('NewsWidget');
            ?>
        </div>....
<hr>
<div class="container">
    <?php Yii::import('application.modules.news.components.*');
    $this->widget('NewsNewWidget');
    ?>
</div>
<hr>

По моему замыслу мы должны получит два разных представления, но результат получается по последнему правилу, первое опускается.
И в обоих блоках я получаю одинаковый результат ( вижу 6 блоков, а нужно в первом 2, во втором 6).
Подскажите если не трудно.
Если я что то неправильно понимаю, подскажите, в какую сторону копать?

Re: Добавить виджет

СообщениеДобавлено: 03 окт 2017, 20:46
Xpycm
tl;dr

Исходя из первых предложений я бы поступил проще.

Файл protected\modules\infopages\views\view.php
Вместо:
Код: Выделить всё
else {
    
$this->widget(ucfirst($model->widget).'Widget');

Нужно:
Код: Выделить всё
elseif($model->widget == 'news'){
    
$this->widget(ucfirst($model->widget).'Widget', array('perPage' => 2));
}
else {
    
$this->widget(ucfirst($model->widget).'Widget');


Файл protected\modules\news\components\NewsWidget.php

Добавить:
Код: Выделить всё
public $perPage

Вместо:
Код: Выделить всё
$result $news->getAllWithPagination($criteria); 

Вставить:
Код: Выделить всё
$result $news->getAllWithPagination($criteria$this->perPage); 


Файл protected\modules\news\models\News.php

Вместо:
Код: Выделить всё
public function getAllWithPagination($inCriteria null

Вставить:
Код: Выделить всё
public function getAllWithPagination($inCriteria null$perPage null


И вместо:
Код: Выделить всё
$pages->pageSize param('module_news_itemsPerPage'10); 


Вставить:
Код: Выделить всё
$pages->pageSize = (empty($perPage)) ? param('module_news_itemsPerPage'10) : $perPage


И по аналогии где надо кол-во, отличное от заданного в панели администратора, выводить:
Код: Выделить всё
Yii::import('application.modules.news.components.*');
$this->widget('NewsWidget', array('perPage' => 2)); 


Где вместо perPage своё кол-во новостей

Re: Добавить виджет

СообщениеДобавлено: 04 окт 2017, 06:32
REM
Ход мысли понятен, попробую получить результат.

Re: Добавить виджет

СообщениеДобавлено: 06 окт 2017, 05:36
REM
Спасибо все получилось. Есть только один нюанс. Мы продолжаем работать с одним и тем же представлением. А это немного не соответствует моей задумке. Вид блоков одинаковый . Я хотел изменить не только их количество но и вид.
Насколько я понимаю здесь мы вызываем сам вид:
NewsWidget.php
Код: Выделить всё
$this->render
        
('widgetNews_list', array(
            
'news' => $result['items'],
            
'pages' => $result['pages'],
        )); 

Если применимо к странице НОВОСТИ то мы можем изменить вид, так как контроллер рендерит views/index.
Но остается не решена проблема вывода на одной странице в двух разных местах одного виджета с разным оформлением. Количество блоков мы отрегулировали.
Решения пока не нашел.

Re: Добавить виджет

СообщениеДобавлено: 06 окт 2017, 09:08
Xpycm
Делайте по аналогии со свойством perPage;

В protected\modules\news\components\NewsWidget.php добавьте, например:
Код: Выделить всё
public $typeView 'classic'

Ниже по коду во вьюшку (где $this->render) передавайте это значение.

При вызове виджета передавайте значение.
Например:
Код: Выделить всё
Yii::import('application.modules.news.components.*');
$this->widget('NewsWidget', array('perPage' => 2, ''typeView' => 'classic'));

или
Код: Выделить всё
$this->widget('NewsWidget', array('perPage' => 2, ''typeView' => 'col-2'));

или
Код: Выделить всё
$this->widget('NewsWidget', array('perPage' => 2, ''typeView' => 'col-3'));


И в самой вьюшке widgetNews_list добавьте условие
Код: Выделить всё
if ($typeView == 'col-2') { такие-то классы применяются к элементам или вообще другой блок вывода }
elseif (
$typeView == 'col-3') { такие-то классы применяются к элементам или вообще другой блок вывода }
else {
тут стандартный выводкак для typeView == 'classic'

Re: Добавить виджет

СообщениеДобавлено: 06 окт 2017, 12:12
REM
Xpycm писал(а):Ниже по коду во вьюшку (где $this->render) передавайте это значение.

Не понял как я могу передать значение?
Код: Выделить всё
$this->render('widgetCatalog_list', array('catalog' => $result['items'], 'pages' => $result['pages'],
                
'categories' => $categories'categoryName' => $categoryName
            
)); 

В приведённом коде метод render() преобразует второй параметр — массив — в переменные. Как результат, внутри представления будут доступны локальные переменные.

Re: Добавить виджет

СообщениеДобавлено: 06 окт 2017, 16:42
Xpycm
REM писал(а):Не понял как я могу передать значение?


Вы сами же ответили на свой вопрос:
REM писал(а):метод render() преобразует второй параметр — массив — в переменные. Как результат, внутри представления будут доступны локальные переменные.


Итог:
Код: Выделить всё
$this->render('widgetCatalog_list', array('catalog' => $result['items'], 'pages' => $result['pages'],
                
'categories' => $categories'categoryName' => $categoryName'typeView' => $this->typeView
            
));  

Re: Добавить виджет

СообщениеДобавлено: 07 окт 2017, 14:53
REM
Не знаю что пошло не так. Виджет с разным количеством блоков в разных местах работает.
Но когда открываешь news/main/imdex пропадает пагинация. И не работает правило
Код: Выделить всё
param('module_news_itemsPerPage'10
. При добавлении новостей они тупо добавляются на одну страницу.

Re: Добавить виджет

СообщениеДобавлено: 09 окт 2017, 18:39
Foton
Скорее всего у вас не передаётся количество страниц в виджет, вы же его модифицировали