Всем всем доброго дня. Вопрос у меня такой. Я разработал собственный некий модуль с названием '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); А вообще правильно — делать через коннекторы, и выполнять в процессоре. Например, как это сделано в корзине.