Не могу создать и ссылаться на модель в Modx
Я создал действительно простой пример кода. Это не было добавлено в качестве NameSpace в Modx. Начните с пустой установки Modx.
Создать файл схемы:
<?xml version="1.0" encoding="UTF-8"?>
<model package="fwhisky" baseClass="xPDOObject" platform="mysql" defaultEngine="MyISAM">
<object class="FWhiskyBrand" table="fwhisky_brand" extends="xPDOSimpleObject">
<field key="title" dbtype="varchar" precision="255" phptype="string" null="false" default=""/>
</object>
<object class="FWhiskyExpression" table="fwhisky_expression" extends="xPDOSimpleObject">
<field key="title" dbtype="varchar" precision="255" phptype="string" null="false" default=""/>
</object>
</model>
Запустить генератор:
<?php
require_once dirname(__FILE__).'/build.config.php';
include_once MODX_CORE_PATH . 'model/modx/modx.class.php';
$modx= new modX();
$modx->initialize('mgr');
$modx->loadClass('transport.modPackageBuilder','',false, true);
$modx->setLogLevel(modX::LOG_LEVEL_INFO);
$modx->setLogTarget(XPDO_CLI_MODE ? 'ECHO' : 'HTML');
$basePath = $modx->getOption('fwhisky.core_path',null,$modx->getOption('core_path').'components/fwhisky/');
$sources = array(
'model' => $basePath.'model/',
'schema_file' => $basePath.'model/schema/fwhisky.mysql.schema.xml'
);
$manager= $modx->getManager();
$generator= $manager->getGenerator();
if (!is_dir($sources['model'])) { $modx->log(modX::LOG_LEVEL_ERROR,'Model directory not found!'); die(); }
if (!file_exists($sources['schema_file'])) { $modx->log(modX::LOG_LEVEL_ERROR,'Schema file not found!'); die(); }
$generator->parseSchema($sources['schema_file'],$sources['model']);
$modx->addPackage('fwhisky', $sources['model']); // add package to make all models available
$manager->createObjectContainer('FWhiskyBrand'); // created the database table
$manager->createObjectContainer('FWhiskyExpression'); // created the database table
$modx->log(modX::LOG_LEVEL_INFO, 'Done!');
Это создает файлы модели:
<?php
class FWhiskyBrand extends xPDOSimpleObject {}
,
<?php
$xpdo_meta_map = array (
'xPDOSimpleObject' =>
array (
0 => 'FWhiskyBrand',
1 => 'FWhiskyExpression',
),
);
,
<?php
require_once (dirname(dirname(__FILE__)) . '/fwhiskybrand.class.php');
class FWhiskyBrand_mysql extends FWhiskyBrand {}
,
<?php
$xpdo_meta_map['FWhiskyBrand']= array (
'package' => 'fwhisky',
'version' => NULL,
'table' => 'fwhisky_brand',
'extends' => 'xPDOSimpleObject',
'fields' =>
array (
'title' => '',
),
'fieldMeta' =>
array (
'title' =>
array (
'dbtype' => 'varchar',
'precision' => '255',
'phptype' => 'string',
'null' => false,
'default' => '',
),
),
);
,
<?php
require_once (dirname(dirname(__FILE__)) . '/fwhiskyexpression.class.php');
class FWhiskyExpression_mysql extends FWhiskyExpression {}
,
<?php
$xpdo_meta_map['FWhiskyExpression']= array (
'package' => 'fwhisky',
'version' => NULL,
'table' => 'fwhisky_expression',
'extends' => 'xPDOSimpleObject',
'fields' =>
array (
'title' => '',
),
'fieldMeta' =>
array (
'title' =>
array (
'dbtype' => 'varchar',
'precision' => '255',
'phptype' => 'string',
'null' => false,
'default' => '',
),
),
);
,
core/components/fwhisky/
core/components/fwhisky/model
core/components/fwhisky/model/fwhisky
core/components/fwhisky/model/fwhisky/mysql
core/components/fwhisky/model/fwhisky/mysql/fwhiskyexpression.class.php
core/components/fwhisky/model/fwhisky/mysql/fwhiskyexpression.map.inc.php
core/components/fwhisky/model/fwhisky/mysql/fwhiskybrand.map.inc.php
core/components/fwhisky/model/fwhisky/mysql/fwhiskybrand.class.php
core/components/fwhisky/model/fwhisky/fwhiskyexpression.class.php
core/components/fwhisky/model/fwhisky/metadata.mysql.php
core/components/fwhisky/model/fwhisky/fwhiskybrand.class.php
core/components/fwhisky/model/schema
core/components/fwhisky/model/schema/fwhisky.mysql.schema.xml
Просто чтобы быть параноиком, я проверил, что все вышеупомянутые файлы доступны для чтения всем!
Затем давайте создадим простую тестовую страницу:
<?php
require_once dirname(dirname(dirname(dirname(__FILE__)))).'/config.core.php';
require_once MODX_CORE_PATH.'config/'.MODX_CONFIG_KEY.'.inc.php';
require_once MODX_CONNECTORS_PATH.'index.php';
$corePath = $modx->getOption('fwhisky.core_path',null,$modx->getOption('core_path').'components/fwhisky/');
if (!$modx->addPackage('fwhisky', $corePath."model") ) {
print "CANT ADD";
die("CANT ADD");
}
print "Path: ".$corePath."model"."<p>";
$class = "FWhiskyBrand";
$c = $modx->newQuery($class);
$brands = $modx->getCollection($class,$c);
print "End";
Когда мы запускаем его, мы получаем
Path: /home/james/modx/core/components/fwhisky/model
End
Я проверил этот путь...
james@debian:~/modx$ ls -al /home/james/modx/core/components/fwhisky/model
total 16
drwxr-xr-x 4 james james 4096 Nov 8 10:04 .
drwxr-xr-x 3 james james 4096 Nov 8 10:21 ..
drwxr-xr-x 3 james james 4096 Nov 8 10:04 fwhisky
drwxr-xr-x 2 james james 4096 Nov 8 09:28 schema
Но теперь мы проверяем журнал ошибок:
[2013-11-08 10:32:31] (ERROR @ /assets/components/fwhisky/connector.php) Could not load class: FWhiskyBrand from mysql.fwhiskybrand.
[2013-11-08 10:32:31] (ERROR @ /assets/components/fwhisky/connector.php) Could not load class: FWhiskyBrand from mysql.fwhiskybrand.
[2013-11-08 10:32:31] (ERROR @ /assets/components/fwhisky/connector.php) FWhiskyBrand::loadCollection() is not a valid static method.
Так что, по сути, я не могу заставить Modx видеть какие-либо модели, которые я создаю. Совсем.
Благодарим за любую идею! Спасибо,
3 ответа
В Modx/xPDO есть огромная вещь, заключающаяся в косые черты на путях... Вы пытались добавить косую черту в свои.../path/to/model/?
Это "дизайнерское решение" поймало меня много раз
Есть ли в базе данных таблицы после createObjectContainer? Если они верны, а файлы верны, я могу только представить, что вы добавляете модель неправильно.
Активы / компоненты / пакет предназначены для фронтальных аспектов сайта. core / компоненты / пакет предназначены для серверных сценариев и пакетов.
Пакет может иметь обе структуры каталогов или только одну из них.
Вам просто нужно создать фрагмент, вызывающий класс, запустить инициализацию и все готово.
При желании вы можете создать плагин для включения класса в службы MODX и настроить его на запуск по событию onWebPageInit.
http://www.shawnwilkerson.com/xpdo/2014/11/28/sample-class-for-use-with-xpdo/