Помогите настроить CMenu

Общие вопросы по использованию фреймворка. Если не знаете как что-то сделать и это про Yii, вам сюда.
Ответить
bohdantheone
Сообщения: 135
Зарегистрирован: 2012.08.19, 14:31

Помогите настроить CMenu

Сообщение bohdantheone »

Есть две функции:

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

public static function All_shown()
    {
             
        $models = Category::model()->findAll(
        array('order' => 'name',
    
        )    
    );
        foreach($models as $val)
        {
        $r[] =   array('label'=>$val->name, 
        'url'=>array('/images/index','category'=>$val->id,),
        'linkOptions' => array('class' =>'cat_link'));
        }
        //Возвращаю массив с элементами меню 
        return $r;
    }
    public static function countPerCat()
    {
        $models = Category::model()->findAll(
        array('order' => 'name',
        )    
    );
        foreach($models as $val)
        {
        $ci[] =   array('label'=>$val->imagesCount 
        );
        }
        //количество в категории 
        return $ci;
    }
Можно ли в виджет меню в items передать две этих функции, чтобы в результате вид меню был таковым:

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

<li>Категория1</li><div>Количество1</div>
<li>Категория2</li><div>Количество2</div>
<li>Категория3</li><div>Количество3</div> 
Делал вот так:

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

$r[] =   array('label'=>$val->name." [".$val->imagesCount."]"
Но тогда количество в категории попадает под ссылку, чего я не хочу.
Или в этом случае лучше просто перебирать массив и выводить значения категорий и количества?
Аватара пользователя
aser
Сообщения: 167
Зарегистрирован: 2009.04.02, 14:25
Откуда: Киев

Re: Помогите настроить CMenu

Сообщение aser »

Создать свой виджет унаследовал от CMenu и переопределить метод renderMenuItem указав свой вариант.
bohdantheone
Сообщения: 135
Зарегистрирован: 2012.08.19, 14:31

Re: Помогите настроить CMenu

Сообщение bohdantheone »

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

<?php
        Yii :: import('zii.widgets.CMenu');
        class CatMenu extends CMenu {
        // must set this to allow  parameter changes in CMenu widget call
            public $activateItemsOuter = true;
            public $catCount=array();
            public function run() {
                $this->renderMenu($this->items);
            }
 
            protected function renderMenuRecursive($items) {
                $count = 0;
                $n = count($items);
                foreach ($items as $item) {
                    $count++;
                    $options = isset ($item['itemOptions']) ? $item['itemOptions'] : array();
                    $class = array();
                    if ($item['active'] && $this->activeCssClass != '') {
                        if ($this->activateItemsOuter) {
                            $class [] = $this->activeCssClass;
                        }
                        else {
                            if (isset ($item['linkOptions'])) {
                                $item['linkOptions'] = array('class' => $item['linkOptions']['class'] . ' ' . $this->activeCssClass);
 
                            }
                            else {
                                $item['linkOptions'] = array('class' => $this->activeCssClass);
                            }
                        }
                    }
                    if ($count === 1 && $this->firstItemCssClass != '')
                        $class [] = $this->firstItemCssClass;
                    if ($count === $n && $this->lastItemCssClass != '')
                        $class [] = $this->lastItemCssClass;
                    if ($class !== array()) {
                        if (empty ($options['class']))
                            $options['class'] = implode(' ', $class);
                        else
                            $options['class'] .= ' ' . implode(' ', $class);
                    }
                    echo CHtml :: openTag('li', $options);
                    if (isset ($item['url'])) {
                        $label = $this->linkLabelWrapper === null ? $item['label'] : '<' . $this->linkLabelWrapper . '>' . $item['label'] . '</' . $this->linkLabelWrapper . '>';
                       
                        $count_cat = '<span>['. $this->catCount .']</span>';
                        $menu = CHtml :: link($label, $item['url'], isset ($item['linkOptions']) ? $item['linkOptions'] : array()).' '.$count_cat;
                        
                    }
                    else
                        $menu = CHtml :: tag('span', isset ($item['linkOptions']) ? $item['linkOptions'] : array(), $item['label']);
                    if (isset ($this->itemTemplate) || isset ($item['template'])) {
                        $template = isset ($item['template']) ? $item['template'] : $this->itemTemplate;
                        echo strtr($template, array('{menu}' => $menu));
                    }
                    else
                        echo $menu;
                    if (isset ($item['items']) && count($item['items'])) {
                        echo "\n" . CHtml :: openTag('ul', $this->submenuHtmlOptions) . "\n";
                        $this->renderMenuRecursive($item['items']);
                        echo CHtml :: closeTag('ul') . "\n";
                    }
                    echo CHtml :: closeTag('li') . "\n";
                    
                    
                    
                }
            }
        }
    ?>
Вывожу вот так:

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

$this->widget('application.components.CatMenu', array(
        'activateItemsOuter'=>false,
        'linkLabelWrapper' => 'span',
        'activateItems' => true,
        'id' => 'search-type',
        'items' => Category::All_shown(),
        'catCount' => Category::countPerCat(),
        'htmlOptions'=>array('class'=>'cat_block' ),
)); 
Предопределил метод но, выводит не правильно:

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

Игры [Array]
Минимализм [Array]
Музыка [Array]
Природа [Array] 
Аватара пользователя
Ryadnov
Сообщения: 456
Зарегистрирован: 2010.06.20, 00:38
Откуда: Санкт-Петербург

Re: Помогите настроить CMenu

Сообщение Ryadnov »

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

    public static function All_shown() {
        $r = array();
        $models = Category::model()->findAll(array(
            'order' => 'name',
            'with' => 'imagesCount', // ???
        ));
        foreach ($models as $val) {
            $r[] = array(
                'label'       => $val->name,
                'url'         => array('/images/index', 'category' => $val->id),
                'linkOptions' => array('class' => 'cat_link'),
                'template' => '{menu} <span>['. $val->catCount .']</span>',

            );
        }
        return $r;
    }
 

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

        $this->widget('zii.widgets.CMenu', array(
            'items' => Category::All_shown(),
            // ......
        ));
 
bohdantheone
Сообщения: 135
Зарегистрирован: 2012.08.19, 14:31

Re: Помогите настроить CMenu

Сообщение bohdantheone »

Спасибо, заработало=)))

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

'template' => '{menu} <span>['. $val->imagesCount .']</span>', 
Ответить