Илья, привет! 1. Ты используешь базовый процессор

Илья, привет!

  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;
}

Это тебе позволит не лезть в общую логику.

  1. По поводу самой логики: я сам чаще всего использую только два метода: а) Расширение классов (переопределяя методы типа 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.