MisterN 08 апреля 2015 1 12
Я хочу вызвать в смарти свой процессор, чтобы дергать данные из своих таблиц не через 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 в консоли спасает — во фронте не хочет.
12 комментариев
Fi1osof1
Fi1osof 08 апреля 2015г в 11:33 #
public function initialize(){
    $this->modx->addPackage('component', MODX_CORE_PATH.'components/component/model/');
    return parent::initialize();
}

Не?
M
MisterN 08 апреля 2015г в 12:17 #
Спасиб.
M
MisterN 08 апреля 2015г в 12:16 #
Фигасе! Как я сам не сообразил..
Еще public function process() нужно переопределить, чтобы массив возвращал, а не джейсон — и красота.
Fi1osof1
Fi1osof 08 апреля 2015г в 12:43 #
Вообще-то не process(), а outputArray().
M
MisterN 08 апреля 2015г в 13:32 #
Это уже на вкус и цвет. Она ж больше нигде не вызывается кроме process. Так что зачем?

        return array(
            'success'=>true,
            'total' => $data['total'],
            'results' =>$list
        );
//        return $this->outputArray($list,$data['total']);
Fi1osof1
Fi1osof 08 апреля 2015г в 13:50 #
Что значит на вкус и цвет??? process() возвращает объект||массив||строку, при этом как положительный ответ, так и отрицательный (success()|failure()), а outputArray() конкретно обрабатывает полученный массив данных. Спорит еще…
M
MisterN 08 апреля 2015г в 14:15 #
Моя не спорит. Моя говорит, как сам сделал.
Вся цепочка наследуемех классов находится в файле modprocessor.class.php При чем функция $this->outputArray используется только в одном месте github.com/modxcms/revolution/blob/8efb61f5d1bb30c5df2ed9eba803aa5b4e805774/core/model/modx/modprocessor.class.php#L472-L480
Исходя из этого, что страшного может случиться, если в этом месте вместо переопределенной функции outputArray мы прямо отдадим массив с данными?
proxyfabio1
proxyfabio 08 апреля 2015г в 14:17 #
Ты рушишь интерфейс своего кастомного процессора. Это чревато всякими багами. На выходе будешь ждать метод outputArray, а у тебя там ничего нет.
M
MisterN 08 апреля 2015г в 14:22 #
Верю. Не буду рушить.
M
MisterN 08 апреля 2015г в 14:22 #
Спасибо.
Fi1osof1
Fi1osof 08 апреля 2015г в 14:23 #
Серега, пусть Антон делает как ему больше нравится. Когда-нибудь сам поймет, может быть.
M
MisterN 08 апреля 2015г в 14:35 #
Ну почему. Просто я в упор не вижу проблему. Вот и уточнил, что она есть. Но если мне сказали про грабли, я не пойду где они лежат. Другое дело, что что-то и правда нужно почувствовать самому. А то не будешь же за каждую строку консультироваться.
Авторизуйтесь или зарегистрируйтесь (можно через соцсети ), чтобы оставлять комментарии.