kraaaaabZ 02 февраля 2014 0 1
Всем всем доброго дня.

Вопрос у меня такой. Я разработал собственный некий модуль с названием '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();


Подскажите, пожалуйста, в каком направлении мне стоит копать (хочу подключить таки свой класс)?
1 комментарий
Tramp13571
Tramp1357 03 февраля 2014г в 10:13 #
Я делаю так: создаю статичный шаблон (напр., 'AJAX'), файл шаблона указываю ajax.php. Далее создаю пустой НЕКЕШИРУЕМЫЙ документ и его шаблоном задаю 'AJAX'. При обращении к этому документу происходит инициализация и MODX, и modxsmarty, и всего остального. И в самом ajax.php остается только прописать нужный код, без инициализации самого MODX в этом файле. Все работает.
Fi1osof1
Fi1osof 03 февраля 2014г в 13:21 #
$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);


А вообще правильно — делать через коннекторы, и выполнять в процессоре. Например, как это сделано в корзине.
Авторизуйтесь или зарегистрируйтесь (можно через соцсети ), чтобы оставлять комментарии.