Загрузка базовых пакетов в 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