Илья, привет! 1. Ты используешь базовый процессор
Илья, привет!
- Ты используешь базовый процессор
modObjectGetListProcessor. Переопределять в нем методgetDataнадо очень осторожно. Вот ты не очень удачно это сделал, так как ты из метода вынес очень полезные методы, такие какprepareQueryBeforeCountиprepareQueryAfterCount. Вот сравни:
public function getData() {
$data = array();
$limit = intval($this->getProperty('limit'));
$start = intval($this->getProperty('start'));
/* query for chunks */
$c = $this->modx->newQuery($this->classKey);
$c = $this->prepareQueryBeforeCount($c);
$data['total'] = $this->modx->getCount($this->classKey,$c);
$c = $this->prepareQueryAfterCount($c);
$sortClassKey = $this->getSortClassKey();
$sortKey = $this->modx->getSelectColumns($sortClassKey,
$this->getProperty('sortAlias',$sortClassKey),'',array($this->getProperty('sort')));
if (empty($sortKey)) $sortKey = $this->getProperty('sort');
$c->sortby($sortKey,$this->getProperty('dir'));
if ($limit > 0) {
$c->limit($limit,$start);
}
$data['results'] = $this->modx->getCollection($this->classKey,$c);
return $data;
}
Так вот как раз на уровне этих методов и происходит вклинивание в формирование запроса. То есть в расширяющем процессоре ты пишешь примерно следующее:
public function prepareQueryBeforeCount(xPDOQuery $c) {
$c = parent::prepareQueryBeforeCount($c);
// Добавляешь условия к запросу
return $c;
}
Это тебе позволит не лезть в общую логику.
- По поводу самой логики: я сам чаще всего использую только два метода:
а) Расширение классов (переопределяя методы типа
prepareQueryBeforeCount) б) Передачей параметров. К примеру вот часть кода процессора:
class ....{
public function initialize(){
$this->setDefaultProperties(array(
'hot' => false, // Флаг, что делать только выборку новинок
));
return parent::initialize();
}
public function prepareQueryBeforeCount(xPDOQuery $c) {
$c = parent::prepareQueryBeforeCount($c);
// Если указано, что нужны только новинки
if($this->getProperty('hot')){
// Добавляем условие только новинок
}
return $c;
}
}
И вот уже при вызове этого процессора ты просто передаешь параметр 'hot' => true и все. По умолчаниюу тебя стоит 'hot' => false.