Загрузка базовых пакетов в xPDO

Однажды я потратил более часа на реверс-инжиниринг конструктора xPDO, чтобы выяснить, как загружать базовые пакеты при создании экземпляра.

К сожалению, я потерял этот маленький фрагмент кода! И я остался с этим.

$this->database = new xPDO(
    "mysql:host=" . $this->config->item('hostname', XPDO) . 
    ";dbname="  . $this->config->item('database', XPDO), 
    $this->config->item('username', XPDO), 
    $this->config->item('password', XPDO), 
    $this->config->item('dbprefix', XPDO)
);

// This is line I would like to pass to the constructor.
$this->database->addPackage('packageName', $this->config->item('core_path') . "components/package/model/", '_packagePrefix');

Я не могу найти это нигде в документации.

РЕДАКТИРОВАТЬ В xPDO вы должны специально добавлять пакеты, которые не загружены по умолчанию. И по умолчанию xPDO не загружает никаких пакетов при создании экземпляра.

Однако однажды я потратил значительное количество времени, разбирая конструктор xPDO, и обнаружил, что существует необязательный параметр, который позволяет вам определять массив пакетов, которые будут загружаться при создании экземпляра.

Моя проблема в том, что я не могу вспомнить, как это сделать.

2 ответа

Решение

Вы можете загружать базовые пакеты, передавая нужные параметры конструктору xPDO. Это определение конструктора:

$xpdo= new xPDO($dsn, $username= '', $password= '', $options= array(), $driverOptions= null) 

Массив параметров поддерживает множество различных конфигураций, одна из которых вам нужна: xPDO:: OPT_BASE_PACKAGES:

xPDO:: OPT_BASE_PACKAGES - Разделенная запятыми строка имен / путей пакетов (разделенных двоеточием) для загрузки при создании экземпляра.

По сути, вы можете делать то, что вы хотите, изменяя свой код следующим образом:

$this->database = new xPDO(
    "mysql:host=" . $this->config->item('hostname', XPDO) . 
    ";dbname="  . $this->config->item('database', XPDO), 
    $this->config->item('username', XPDO), 
    $this->config->item('password', XPDO), 
    array(xPDO::OPT_BASE_PACKAGES => "package1:path1;prefix, package2:path2, ...")
);

Вот ссылка на документацию, где вы можете найти более подробную информацию о массиве параметров: http://rtfm.modx.com/xpdo/2.x/getting-started/fundamentals/xpdo,-the-class/the-xpdo-constructor

РЕДАКТИРОВАТЬ

Формат строки следующий:

"Package_name:absolute_path; префикс"

префикс необязательный. Я обновил код выше с этой строкой формата.

Хотя я не совсем уверен, о чем вы спрашиваете, я подозреваю, что вы спрашиваете, существует ли какой-то известный способ передачи массива имен пакетов для пакетов с одинаковым путем. Предполагая, что это правильно, у меня есть следующее возможное решение (и если это не так, пожалуйста, scragar, что вы спрашиваете):

Посмотрев @ файл xpdo.class.php в классе xPDO & метод addPackage(), я вижу, что он специально проверяет, что имя пакета является строкой, и выдает ошибку, если это не так. Поэтому этот метод addPackage() определенно НЕ позволяет передавать массив в него.

Тем не менее, я подозреваю, что вы, возможно, помните, что если вы используете addPackage() в каталоге package / extra, содержащем несколько классов xPDO, файлы сопоставления и схему..., что ВСЕ из представленных таблиц базы данных смогут быть созданы & используется для выполнения операций CRUD на.

В качестве примера у меня есть два пакета (из отдельных дополнений), которые имеют следующие пути core / components / [packageName] / (где в скобках указывается фактическое имя конкретного пакета). Кроме того, файлы моделей находятся в core / components / [packageName] / model / [packageName] /, а также в подкаталоге / mysql. В ОБА случаях, когда я добавляю пакет [packageName], все классы доступны для создания экземпляров, так как я не включил / не потребовал ни одного из файлов, тогда addPackage(), кажется, включает их и, следовательно, делает их доступными для использования в качестве объектов xPDO используя метод modx newQuery ()

(так в коде вот так:

$modx->newQuery(nameOfxPDOClassToBeInstantiated);

)

(ПРИМЕЧАНИЕ: все необходимые классы для моих двух пакетов были сгенерированы из пользовательских таблиц БД с использованием очень удобного инструмента, предоставленного здесь Бобом Рэем и объясненного им в простом учебнике здесь).

Надеюсь, это поможет.

Напомним, что вот документация xPDO для addPackage: http://rtfm.modx.com/xpdo/2.x/class-reference/xpdo/xpdo.addpackage А вот документация по использованию объектов... http://rtfm.modx.com/xpdo/2.x/getting-started/using-your-xpdo-model/retrieving-objects

Другие вопросы по тегам