Общие вопросы по использованию фреймворка. Если не знаете как что-то сделать и это про Yii, вам сюда.
bohdantheone
Сообщения: 135 Зарегистрирован: 2012.08.19, 14:31
Сообщение
bohdantheone » 2012.09.04, 14:15
Есть две функции:
Код: Выделить всё
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
Откуда: Киев
Сообщение
aser » 2012.09.04, 16:30
Создать свой виджет унаследовал от CMenu и переопределить метод renderMenuItem указав свой вариант.
bohdantheone
Сообщения: 135 Зарегистрирован: 2012.08.19, 14:31
Сообщение
bohdantheone » 2012.09.04, 19:40
Код: Выделить всё
<?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
Откуда: Санкт-Петербург
Сообщение
Ryadnov » 2012.09.05, 08:33
Код: Выделить всё
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(),
// ......
));