Pull to refresh

Пользовательские таблицы в MODx Revolution

Reading time 5 min
Views 24K
imageВ данной статье мы разберем следующие вопросы:
  1. Создание пользовательских таблиц для MODx Revolution.
  2. Генерация XML-схемы и php-файлов-классов для xPDO.
  3. Работа с пользовательскими таблицами.


Одна из самых больших сложностей в переходе с Evolution на Revolution — это xPDO ИМХО. Ведь как раньше было просто: залез в мускул через phpMyAdmin, создал табличку, и работаешь с ней, отправляя чистые SQL-запросы через $modx->db.
Теперь же любые изменения в базе данных ни сколько не беспокоят $modx, кроме как полный drop таблиц и т.п. Как связаны между собой xPDO и MODx (а точнее $modx), я написал тут.
Считаю сложности в работе с пользовательскими таблицами в MODx Revolution — немалым препятствием для многих программистов.
Но на самом деле, все не так уж и сложно.
Весь рассматриваемый далее алгоритм в трех словах:
  1. Так же через phpMyAdmin (или другой удобный используемый инструмент) создаем нужные нам таблицы
  2. Используя прилагаемый ниже код генерируем необходимые для работы xPDO файлы
  3. Используя метод $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 ;
}



Вроде бы всё. Если что не ясно, спрашивайте.
Tags:
Hubs:
If this publication inspired you and you want to support the author, do not hesitate to click on the button
+2
Comments 17
Comments Comments 17

Articles