Я хочу вызвать в смарти свой процессор, чтобы дергать данные из своих таблиц не через package + newQuery. Был поставлен modExtra, переименован, написаны схемы баз, созданы классы — поднята CMP, которая дергает классы из процессора через контроллер, ну все как обычно в общем. Далее я создаю в процессорах папку web, копирую туда обычный наследующий modObjectGetListProcessor процессор
class ComponentWebClassGetListProcessor extends modObjectGetListProcessor { public $objectType = 'ClassName'; public $classKey = 'ClassName'; public $defaultSortField = 'id'; public $defaultSortDirection = 'DESC'; //public $permission = 'list'; return 'ComponentWebClassGetListProcessor';
Теперь вызываю это дело в консоли вот это
// $modx->addPackage('component', MODX_BASE_PATH.'Component/core/components/component/model/'); // $d= $modx->getObject('ClassName',1); // print_r($d->toArray()); print '<pre>'; ini_set('display_errors', 1); $modx->switchContext('web'); $action = 'web/rooms/getlist'; $ns = 'myNamespace'; $params = array( // "limit" => 6, ); //echo $modx->getObject('modNamespace', $ns)->getCorePath(); if(!$response = $modx->runProcessor($action, $params , array( 'processors_path' => $modx->getObject('modNamespace', $ns)->getCorePath().'processors/', ) )){ print "Не удалось выполнить процессор"; return; } print_r($response->getResponse());
На выходе Could not get table class for class и {«success»:true,«total»:«0»,«results»:[]}
Схожая картина во фронте, когда вставляю в шаблон {processor}
Расскомментирую $modx->addPackage('component', MODX_BASE_PATH.'Component/core/components/component/model/'); — все начинает работать.
Собственно, вопрос что прописать в процессоре, чтобы не нужно писать можно было не вызывать addPackage
extension_packages в консоли спасает — во фронте не хочет.
public function initialize(){ $this->modx->addPackage('component', MODX_CORE_PATH.'components/component/model/'); return parent::initialize(); }
Не?
Фигасе! Как я сам не сообразил..
Еще public function process() нужно переопределить, чтобы массив возвращал, а не джейсон — и красота.
Это уже на вкус и цвет. Она ж больше нигде не вызывается кроме process. Так что зачем?
return array( 'success'=>true, 'total' => $data['total'], 'results' =>$list ); // return $this->outputArray($list,$data['total']);
Что значит на вкус и цвет??? process() возвращает объект||массив||строку, при этом как положительный ответ, так и отрицательный (success()|failure()), а outputArray() конкретно обрабатывает полученный массив данных. Спорит еще…
Моя не спорит. Моя говорит, как сам сделал.
Вся цепочка наследуемех классов находится в файле modprocessor.class.php При чем функция $this->outputArray используется только в одном месте github.com/modxcms/revolution/blob/8efb61f5d1bb30c5df2ed9eba803aa5b4e805774/core/model/modx/modprocessor.class.php#L472-L480
Исходя из этого, что страшного может случиться, если в этом месте вместо переопределенной функции outputArray мы прямо отдадим массив с данными?
Ты рушишь интерфейс своего кастомного процессора. Это чревато всякими багами. На выходе будешь ждать метод outputArray, а у тебя там ничего нет.
Верю. Не буду рушить.
Спасибо.
Серега, пусть Антон делает как ему больше нравится. Когда-нибудь сам поймет, может быть.
Ну почему. Просто я в упор не вижу проблему. Вот и уточнил, что она есть. Но если мне сказали про грабли, я не пойду где они лежат. Другое дело, что что-то и правда нужно почувствовать самому. А то не будешь же за каждую строку консультироваться.