duke1999
(Duke1999)
March 31, 2009, 6:36am
1
в модели Items объявляю relations:
public function relations()
{
return array(
'category'=>array(self::MANY_MANY, 'Category', 'ItemCategory(itemid, categoryid)'),
);
}
в контроллере делаю выборку:
$criteria=new CDbCriteria;
$criteria->order='item.createTime DESC';
$itemList=Item::model()->with(array('category'=>array(
'select'=>'id, name'
),
))->together()->findAll($criteria);
в просмотре (view) перебираю $itemList :
<?php foreach($itemList as $n=>$model): ?>
<?php echo CHtml::encode($model->id); ?>
...
<?php endforeach; ?>
не соображу как мне во view вывести category->name
duke1999
(Duke1999)
March 31, 2009, 6:54am
3
Quote
почему-то нет
ничего не выводит, хотя print_r ($model->category) выводит информацию об объекте Category и там есть
[_attributes:private] => Array
(
[id] => 2
[name] => Категория 1
)
скорее всего косяк в том, что $model->category является масивом (поскольку у тебя many to many), попробуй $model->category[0]->name.
или же делай цикл
duke1999
(Duke1999)
March 31, 2009, 11:01am
6
Quote
скорее всего косяк в том, что $model->category является масивом (поскольку у тебя many to many), попробуй $model->category[0]->name.
или же делай цикл
точно! возвращает массив, который надо перебрать для вывода всех категорий.
спасибо!
Лучше всего в модели Items сделай чего-нить типа такого
public function getPostCategories()
{
$links = array();
$cats = $this->categoryCache ? unserialize($this->categoryCache) : $this->category;
foreach($cats as $cat)
$links[] = CHtml::link(CHtml::encode($cat->name),array('news/category','category'=>$cat->altname));
return implode(', ',$links);
}
duke1999
(Duke1999)
March 31, 2009, 12:40pm
8
Ага, спасибо.
Нужно только имена категорий сделал по аналогии:
public function getItemCategoryNames()
{
$_categories = array();
foreach($this->category as $cat)
$_categories[] = $cat->name;
return implode(', ',$_categories);
}
duke1999
(Duke1999)
April 2, 2009, 1:50pm
9
Вдогонку вопрос:
А как в форме сделать редактирование этого самого мультивыбора?
<?php echo CHtml::activeLabelEx($item,Item::model()->attributeLabels['category']); ?>
<?php echo CHtml::activeDropDownList($item->category, 'id', CHtml::listData( Category::model()->findAll(), 'id', 'name' ), array('multiple'=>'multiple')); ?>
вывод ошибки, что $item->category не модель, но это понятно, там массив…
$item->category[0] или $item->category[1] selected в дропдоунлисте ставится по одному значению соответственно, а как сделать, чтобы все значения выставлялись?
duke1999
(Duke1999)
April 3, 2009, 9:22am
10
Отвечу сам себе, основываясь на этом ответе:
http://www.yiiframew…36.html#msg5636
в загрузке loadItem прописал
$this->_item=Item::model()->with('category')->findbyPk($id!==null ? $id : $_GET['id']);
$_categories = array();
foreach ($this->_item->categories as $i=>$cat) {
$_categories[] = $cat['id'];
}
$this->_item->category = $_categories;
в форме:
$htmlOptions['multiple'] = true;
$htmlOptions['name'] = get_class($item).'[category]'.'[]';
echo CHtml::activeDropDownList($item, "category", CHtml::listData( Category::model()->findAll(), 'id', 'name' ), $htmlOptions);