В данной статье мы разберем следующие вопросы:
Одна из самых больших сложностей в переходе с Evolution на Revolution — это xPDO ИМХО. Ведь как раньше было просто: залез в мускул через phpMyAdmin, создал табличку, и работаешь с ней, отправляя чистые SQL-запросы через $modx->db.
Теперь же любые изменения в базе данных ни сколько не беспокоят $modx, кроме как полный drop таблиц и т.п. Как связаны между собой xPDO и MODx (а точнее $modx), я написал тут.
Считаю сложности в работе с пользовательскими таблицами в MODx Revolution — немалым препятствием для многих программистов.
Но на самом деле, все не так уж и сложно.
Весь рассматриваемый далее алгоритм в трех словах:
Итак, необходимый нам для генерации файлов код (Исходник тут):
Заливаем этот файл на сервер, прописываем ему правильно пути к конфигу MODx-а, и директории, где будут созданы сгенерированные файлы. Обращаемся к файлу через браузер. В результате в указанной папке должны быть созданы xml-файл, в котором будут описаны наши таблицы и php-файл.
Эти файлы, если очень надо, можно переместить в другую папку, где вы решите хранить свой новый Класс. В дальнейшем эти файлы всегда будут нужны для работы со своими таблицами.
Теперь вы можете работать со своими таблицами. Для того, чтобы лучше понимать механизм взаимодействия xPDO с XML-схемой, а так же понимать, что прописывается в файле-генераторе, и какие объекты получаете на выходе, привожу свою заметку по данному вопросу. Честно сказать, по началу без нее было просто никак…
Первое, что нужно сделать, это разобраться что вообще нужно для того, чтобы обратиться к схеме. Для этого изучим XML-файл.
Вот основной блок созданой нами схемы:
Самое основное, что нам тут понадобится, это:
1.
Рассмотрим внимательней параметры.
$package. Название пакета. В нашем случае как раз testtbl
$path. Путь к каталогу пакета (в котором есть XML-файл и папка по названию Объекта, в котором все PHP-файлы)
$prefix. Если при создании схемы указывался префикс, отличный от дефолтового, то обязательно нужно его указать.
Есть еще одна маленькая хитрость, как точно определить необходимый префикс.
Формула: $prefix = $fullTableName — $tableName;
Тут $fullTableName — это полное имя таблицы базы данных, к которой обращаемся,
$tableName — значение атребута table тега <object нашего файла XML
Выполняем запрос:
Вроде бы всё. Если что не ясно, спрашивайте.
- Создание пользовательских таблиц для MODx Revolution.
- Генерация XML-схемы и php-файлов-классов для xPDO.
- Работа с пользовательскими таблицами.
Одна из самых больших сложностей в переходе с Evolution на Revolution — это xPDO ИМХО. Ведь как раньше было просто: залез в мускул через phpMyAdmin, создал табличку, и работаешь с ней, отправляя чистые SQL-запросы через $modx->db.
Теперь же любые изменения в базе данных ни сколько не беспокоят $modx, кроме как полный drop таблиц и т.п. Как связаны между собой xPDO и MODx (а точнее $modx), я написал тут.
Считаю сложности в работе с пользовательскими таблицами в MODx Revolution — немалым препятствием для многих программистов.
Но на самом деле, все не так уж и сложно.
Весь рассматриваемый далее алгоритм в трех словах:
- Так же через phpMyAdmin (или другой удобный используемый инструмент) создаем нужные нам таблицы
- Используя прилагаемый ниже код генерируем необходимые для работы xPDO файлы
- Используя метод $modx->addPackage() подгружаем в нужном месте наш новый класс и уже работаем с нашими таблицами через методы $modx->getObject(), $modx->getCollection() и т.п.
Итак, необходимый нам для генерации файлов код (Исходник тут):
<?php
/*******************************************************/
/* Конфиги нашей схемы */
/*******************************************************/
// Имя Класса. Так будет потом называться Класс при вызове $modx->addPackage()
<br>
$obj = 'program';
/*
Префикс таблиц. Если префикс не отличается от системного, то можно вообще не указывать.
К сожалению, xPDO при генерации не позволяет перечислять имена конкретных таблиц,
которые нам нужны, а позволяет отсеять только по префиксу.
*/
<br>
$tablePrefix='modx_program_';
// Папка, где будет записана XML-схема и все файлы создаваемого объекта
// Путь к файлам класса вы будете потом прописывать в вызове метода $modx->addPackage();
<br>
$Path = dirname(__FILE__).'/model/';
// Файл-схема
<br>
$Schema = $Path.'/'.$obj.'.mysql.schema.xml';
/*******************************************************/
<br>
// Подгружаем основной файл-конфиг сайта или самим придется прописывать все основные настройки
<br>
require_once dirname(dirname(dirname(__FILE__))).'/core/config/config.inc.php';
// Подружаем основной класс MODx
<br>
include_once MODX_CORE_PATH . 'model/modx/modx.class.php';
// Инициализируем класс MODx
<br>
$modx= new modX();
// Инициализируем контекст, если принципиально
<br>
// $modx->initialize('mgr');
// Устанавливаем настройки логирования
// Не обязательно
<br>
$modx->setLogLevel(modX::LOG_LEVEL_INFO);
<br>
$modx->setLogTarget(XPDO_CLI_MODE ? 'ECHO' : 'HTML');
// !!! Обязательно!
<br>
// Подгружаем основной класс-пакер
<br>
$modx->addPackage('transport.modPackageBuilder', '', false, true);
// Указатель типа базы данных (MySQL / MsSQL и т.п.)
<br>
$manager = $modx->getManager();
// Класс-генератор схем
<br>
$generator = $manager->getGenerator();
// Генерируем файл-XML
<br>
// /xpdo/om/mysql/xpdogenerator.class.php
<br>
// public function writeSchema($schemaFile, $package= '', $baseClass= '', $tablePrefix= '', $restrictPrefix= false)
<br>
// $tablePrefix - указываем, если хотим только те таблицы, которые начинаются с этого префикса.
<br>
// $restrictPrefix - указывает true, если хотим получить таблицы только по префиксу
<br>
$xml= $generator->writeSchema($Schema, $obj, 'xPDOObject', $tablePrefix ,$restrictPrefix=true );
// Создает классы и мапы (php) по схеме xml
<br>
$generator->parseSchema($Schema, $Path);
<br>
<br>
print "<br /><br />Выполнено";
Заливаем этот файл на сервер, прописываем ему правильно пути к конфигу MODx-а, и директории, где будут созданы сгенерированные файлы. Обращаемся к файлу через браузер. В результате в указанной папке должны быть созданы xml-файл, в котором будут описаны наши таблицы и php-файл.
Эти файлы, если очень надо, можно переместить в другую папку, где вы решите хранить свой новый Класс. В дальнейшем эти файлы всегда будут нужны для работы со своими таблицами.
Теперь вы можете работать со своими таблицами. Для того, чтобы лучше понимать механизм взаимодействия xPDO с XML-схемой, а так же понимать, что прописывается в файле-генераторе, и какие объекты получаете на выходе, привожу свою заметку по данному вопросу. Честно сказать, по началу без нее было просто никак…
1. Подключение пакетов и выполнение запросов к схеме
1.1 Выборка записей из таблицы
Первое, что нужно сделать, это разобраться что вообще нужно для того, чтобы обратиться к схеме. Для этого изучим XML-файл.
Вот основной блок созданой нами схемы:
<model package="testtbl" baseClass="xPDOObject" platform="mysql" defaultEngine="MyISAM" version="1.1">
<object class="Tbl" table="tbl" extends="xPDOObject">
Самое основное, что нам тут понадобится, это:
1.
<model package="testtbl"
значение атрибута package нам нужно, чтобы знать какой пакет нам вообще нужно подгружать. В данном случае это testtbl. Вызывать пакет будем так:$modx->addPackage( $package, $path, $prefix);
// !!! Проверка в функции addPackage не канает, так как проверяется только присутствие названия пакета в принципе и чтобы указанный путь был директорией, и всё.
Рассмотрим внимательней параметры.
$package. Название пакета. В нашем случае как раз testtbl
$path. Путь к каталогу пакета (в котором есть XML-файл и папка по названию Объекта, в котором все PHP-файлы)
$prefix. Если при создании схемы указывался префикс, отличный от дефолтового, то обязательно нужно его указать.
Есть еще одна маленькая хитрость, как точно определить необходимый префикс.
Формула: $prefix = $fullTableName — $tableName;
Тут $fullTableName — это полное имя таблицы базы данных, к которой обращаемся,
$tableName — значение атребута table тега <object нашего файла XML
Выполняем запрос:
$result = $modx->getCollection('Tbl');
foreach($result as $row){
print “<br />Next:”. $row->get(‘columnName’);
}
1.2 Создание новой записи в таблице
private static function testCreateRows(){
$pkg = 'testtbl';
$modx->addPackage( 'testtbl', $Path , 'modx_kl_test')) ;
$row = $modx->newObject('Tbl');
$row->fromArray(array(
'id' => 5
));
$row->save();
return ;
}
Вроде бы всё. Если что не ясно, спрашивайте.