Всем всем доброго дня.
Вопрос у меня такой. Я разработал собственный некий модуль с названием 'managers', который, в свою очередь, работает с БД. В файле model\managers\managers.class.php написал следующее:
<?php class Managers { public $modx; public $config = array(); function __construct(modX &$modx, array $config = array() ) { $this->modx =& $modx; <a name="cut"></a> $name = 'managers'; $basePath = dirname($this->modx->getOption('core_path',$config,$this->modx->getOption('core_path'))).'/mods/'; $this->config = array_merge(array( 'basePath' => $basePath.$name.'/core/components/'.$name.'/', 'corePath' => $basePath.$name.'/core/components/'.$name.'/', 'modelPath' => $basePath.$name.'/core/components/'.$name.'/model/', 'processorsPath' => $basePath.$name.'/core/components/'.$name.'/processors/', 'chunksPath' => $basePath.$name.'/core/components/'.$name.'/elements/chunks/', 'jsUrl' => $basePath.$name.'/assets/components/'.$name.'/js/', 'cssUrl' => $basePath.$name.'/assets/components/'.$name.'/css/', 'assetsUrl' => $basePath.$name.'/assets/components/'.$name.'/', 'connectorUrl' => $basePath.$name.'/assets/components/'.$name.'/connector.php', ),$config); $this->modx->addPackage($name,$this->config['modelPath']); } }
Далее создал сниппет в котором реализован функционал модуля, но некоторые его части (например удаление записи из таблицы) хотел реализовать через ajax. Создаю файл ajax.php (где_угодно) к которому посылаю POST запрос (который приходит), но при обработке и попытке обращения к своему классу происходит вот такая вещь:
[2014-02-02 22:50:26] (ERROR @ Z:\home\modx\www\mods\managers\core\components\managers\model\managers\managers.class.php: 5) Recoverable error: Argument 2 passed to Managers::__construct() must be an array, null given, called in Z:\home\modx\www\core\xpdo\xpdo.class.php on line 1219 and defined [2014-02-02 22:50:26] (ERROR @ Z:\home\modx\www\mods\managers\core\components\managers\model\managers\managers.class.php: 22) PHP warning: array_merge() [function.array-merge]: Argument #2 is not an array [2014-02-02 22:50:26] (ERROR @ /mods/managers/ajax.php) Invalid path specified for package: managers; using default xpdo model path: Z:/home/modx/www/core/xpdo/om/ [2014-02-02 22:50:26] (WARN @ /mods/managers/ajax.php) Could not load package metadata for package managers. [2014-02-02 22:50:26] (ERROR @ /mods/managers/ajax.php) Could not load class: managersrecords from mysql.managersrecords. [2014-02-02 22:50:26] (ERROR @ /mods/managers/ajax.php) managersrecords::load() is not a valid static method. Fatal error: Call to a member function toArray() on a non-object in Z:\home\modx\www\mods\managers\ajax.php on line 22
при этом вот этот код:
$user = $modx->getObject('modUser',$uid);
выполняется на ура (следовательно modX подключился, насколько я понимаю).
Код ajax.php
<?php // Подключаемся define('MODX_API_MODE', true); require_once dirname(dirname(dirname(__FILE__))).'/index.php'; // Включаем обработку ошибок $modx->getService('error','error.modError'); $modx->setLogLevel(modX::LOG_LEVEL_INFO); $modx->setLogTarget(XPDO_CLI_MODE ? 'ECHO' : 'HTML'); $managers = $modx->getService('managers','Managers',dirname(__FILE__).'/core/components/managers/model/managers/',$scriptProperties); $obj = $modx->getObject('managersrecords', array('id:=' => 1)); $obj = $obj->toArray();
Подскажите, пожалуйста, в каком направлении мне стоит копать (хочу подключить таки свой класс)?
Я делаю так: создаю статичный шаблон (напр., 'AJAX'), файл шаблона указываю ajax.php. Далее создаю пустой НЕКЕШИРУЕМЫЙ документ и его шаблоном задаю 'AJAX'. При обращении к этому документу происходит инициализация и MODX, и modxsmarty, и всего остального. И в самом ajax.php остается только прописать нужный код, без инициализации самого MODX в этом файле. Все работает.
$managers = $modx->getService('managers','Managers',dirname(__FILE__).'/core/components/managers/model/managers/',$scriptProperties);
1. У вас несколькими строчками выше указано require_once dirname(dirname(dirname(__FILE__))).'/index.php';, то есть на две директории выше, а здесь в текущей директории. Думаю, что-то здесь не то. Да и ошибка у вас лезет, что не верная директория для пакета.
Invalid path specified for package: managers; using default xpdo model path: Z:/home/modx/www/core/xpdo/om/ [2014-02-02 22:50:26] (WARN @ /mods/managers/ajax.php)
Да и вообще у вас, по-моему, в корне все не правильно. Вряд ли у вас подключен extendedPackage, а значит первым делом надо подключить пакет.
$modx->addPackage('managers', MODX_CORE_PATH . 'components/modxsite/model/');
И только после этого подключать сервис (без указания пути).
$managers = $modx->getService('managers','Managers','',$scriptProperties);
А вообще правильно — делать через коннекторы, и выполнять в процессоре. Например, как это сделано в корзине.