Похоже, удалось окончательно решить вопрос, путем расширения стандартного CActiveDataProvider:
Код: Выделить всё
<?php
/**
* TaggableActiveDataProvider
*
* Класс, расширяющий CActiveDataProvider для корректной работы с моделями,
* содержащими Taggable Behaviour
* http://www.yiiframework.com/extension/taggable/
*
* @author Duke
*/
class TaggableActiveDataProvider extends CActiveDataProvider {
/**
* Теги
* если тегов несколько, можно перечислить их через запятую
* @var string
*/
public $tags = '';
/**
* Выбираем данные
* @return array список элементов данных
*/
protected function fetchData() {
$criteria = clone $this->getCriteria();
if (($pagination = $this->getPagination()) !== false) {
$pagination->setItemCount($this->getTotalItemCount());
$pagination->applyLimit($criteria);
}
$baseCriteria = $this->model->getDbCriteria(false);
if (($sort = $this->getSort()) !== false) {
// set model criteria so that CSort can use its table alias setting
if ($baseCriteria !== null) {
$c = clone $baseCriteria;
$c->mergeWith($criteria);
$this->model->setDbCriteria($c);
}
else
$this->model->setDbCriteria($criteria);
$sort->applyOrder($criteria);
}
$this->model->setDbCriteria($baseCriteria !== null ? clone $baseCriteria : null);
if ($this->tags != '') {
$data = $this->model->taggedWith($this->tags)->findAll($criteria);
} else {
$data = $this->model->findAll($criteria);
}
$this->model->setDbCriteria($baseCriteria); // restore original criteria
return $data;
}
/**
* Вычисляем общее количество элементов данных
* @return integer общее количество элементов данных
*/
protected function calculateTotalItemCount() {
$baseCriteria = $this->model->getDbCriteria(false);
if ($baseCriteria !== null) {
$baseCriteria = clone $baseCriteria;
}
if ($this->tags != '') {
$count = $this->model->taggedWith($this->tags)->count($this->getCriteria());
} else {
$count = $this->model->count($this->getCriteria());
}
$this->model->setDbCriteria($baseCriteria);
return $count;
}
}
Использовать его можно так:
Код: Выделить всё
$dataProvider = new TaggableActiveDataProvider('PortfolioProject', array(
'pagination' => array(
'pageSize' => Yii::app()->controller->module->projectPerPage,
),
'criteria' => $criteria,
'tags' => $tag,
));
А дальше работа аналогична CActiveDataProvider. Методов Taggable Behavior самостоятельно вызывать не нужно, это происходит само внутри TaggableActiveDataProvider, при непустом значении прараметра tags.