Что такое CMPGenerator?
CMPGenerator предназначен для использования PHP-разработчиками, которые хотят создавать настраиваемые табличные базы данных, которые будут использоваться через сниппет, плагин или CMP. CMPGenerator представляет собой GUI (графический интерфейс), создает схемные xpdo-файлы и xpdo-классы для пользовательских таблиц баз данных всего лишь одним нажатием кнопки. Это позволяет быстро начать использовать xpdo в пользовательских проектах.
Необходимые знания разработчиков
• Базы данных - MySQL
• PHP
• И тогда вы можете начать использовать XPDO
• стандарты кодирования MODX
История
CMPGenerator был написан Джошем Галледжем (Josh Gulledge), чтобы предоставить возможность простого создания и добавления пользовательских таблиц в CMP, сниппет или плагин. CMPGenerator написан в июле 2011 года, а первый публичный релиз состоялся в начале 2012 года.
Установка
Установить CMPGenerator можно в рамках менеджера MODx Revolution с помощью менеджера пакетов.
Как использовать
1. Создайте таблицы баз данных методом, которому Вы отдаете предпочтение - PhpMyAdmin, SQLyog, и т.д.
Обратите внимание, Ваш автоматический инкрементный первичный ключ должен быть назван ID
2. Теперь создайте новый пакет
- Выберите уникальное имя, это пригодится для создания префикса для ваших пакетов.
Например, Вы можете использовать ваши инициалы по схеме First Middle Last: fmlMyCustomPackage
Также убедитесь, что вы используете только буквы и значения
- Объедините новосозданные таблицы в список, разделенный запятыми
- Укажите префикс для таблицы, если такой имеется. Рекомендуется использовать тот же префикс, который указан для установки MODX.
- Выберите, если вы хотите построить схему. Если Вы не сделаете этого, не можете использовать таблицы.
- Выберите создание пакета, где будут генерироваться все необходимые файлы.
3. После создания файлов, если Вы используете таблицы со связями, которые могут понадобиться, вручную добавьте этот код в файл: core/components/YOUR-CMP/model/YOUR-CMP/YOUR-CMP.mysql.custom.schema.xml.
После обновления этого файла, чтобы показать связи, Вы можете регенерировать пакет. Отметьте в Build Scheme “No”, Build Package – “Yes” и сохраните.
BuildScheme – создает или воссоздает XML-файл. Убедитесь, что вы установили в этой опции “No”, если Вы вносили какие-либо изменения в файл.
BuildPackage – создает или воссоздает файлы xpdo-класса, запрашиваемые пакетом.
При создании нового CMP, CMPGenerator создает все папки для CMP как в assets/components/MYCMP, так и в core/components/MYCMP.
Выполните следующие действия после установки CMPGenerator.
1. Создайте таблицу modx_test с любимым SQL GUI или командной строкой:
CREATE TABLE `modx_test` (
`id` INT(11) NOT NULL AUTO_INCREMENT,
`name` VARCHAR(64) NOT NULL,
`description` VARCHAR(64) NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=INNODB AUTO_INCREMENT=4 DEFAULT CHARSET=utf8
2. Далее откройте Manager CMPGenerator и нажмите на кнопку Create Package
Заполните информацию в таблице, которую мы только что создали и выберите имя пакета:
3. Вы нажимаете сохранить все файлы, созданные в /your MODX/core/components/mytest/
4. Теперь проверяете, получилось ли и создаете простой сниппет, чтобы проверить нашу вновь созданную таблицу.
Называете сниппет mytest и вставляете следующий код:
mytest Snippet Code
<code><!--?php
/**
* mytest table
*/
= '';// это то, что возвращает сниппет
// добавьте пакет, чтобы можно было использовать xpdo:
= --->getOption('core_path').'components/mytest/model/';
// посмотрите на файл-схему и элемент xml модели и Вы увидите атрибутивный пакет, который должен соответствовать:
$modx->addPackage('mytest', $package_path);
// давайте добавим данные!
// посмотрите на файл-схему и элемент объекта xml и Вы увидите атрибутивный класс, который должен соответствовать:
$myRow = $modx->newObject('Test');
$data = array(
'name' => 'MODX Revolution',
'description' => 'A great CMS product...'
);
$myRow->fromArray($data);
if ( !$myRow->save() ) {
$output .= '</code>
Could not create row
<code>';
} else {
$output .= '</code>
Created row successfully
<code>';
}
// теперь давайте покажем данные в быстрой таблице:
$output .= '
';
// Запомните: для всех HTML нужно использовать чанки: http://rtfm.modx.com/display/revolution20/Chunks#Chunks-ProcessingChunkviatheAPI
/* build query */
$query = $modx->newQuery('Test');
$rows = $modx->getIterator('Test', $query);
/* iterate */
$list = array();
foreach ($rows as $row) {
// для объекта к упорядочиванию можно сделать $row->get('name');
$row_array = $row->toArray();
$output .= '
';
}
$output .= '</code>
| ID | Name | Description |
|---|---|---|
| '.$row_array['id'].' | '.$row_array['name'].' | '.$row_array['description'].' |
<code>'; return $output;</code>
5.Теперь вводите сниппет в ресурс и запускаете несколько раз.
<code></code>
Вы должны увидеть что-то вроде этого (помните, на странице my test есть CSS, заданный к таблицам)
Использование внешних баз данных
Добавлено в 1.1
Внешняя база данных означает базу данных второй или третьей стороны. Пример, который должен быть Вам знаком – база данных modx в качестве Вашей MODX db и, возможно, у Вас есть crm для Вашей CRM db. crm в этом случае – внешняя база данных. Начиная с версии 1.1 для создания файла Ваша внешняя база данных должна быть на той же машине, что и Ваша MODX DB и MySQL. Пользователь базы данных, использующий MODX, также должен иметь разрешение на доступ к внешней базе данных.
При запуске CMPGenerator заносит в базу данных имя и, при необходимости, префикс таблицы. Теперь, когда Вы создаете сниппет, Вам нужно будет создать новый образец xPDO, а затем вы можете вводить код как обычно (с помощью ссылки на Вашу $foreignDB вместо $MODx, конечно). См. пример кода ниже.
Базовый пример фрагмента кода
<?php
require_once $modx->getOption('core_path').'config/foreigndb_config.php';
$output = '';// this is what the snippet will return
$foreignDB = new xPDO('mysql:host=' . $foreign_database_host.';dbname='.$foreign_database_name/*.';charset='.$foreign_database_charset*/,
$foreign_database_username,
$foreign_database_password );
$package_path = $modx->getOption('core_path').'components/foreigndb/model/';
// see the scheme file and the xml model element and you will see the attribute package and that must match here
// make sure you set the prefix as empty if you don't use it
if ( !$foreignDB->addPackage('foreigndb', $package_path, '') ) {
return 'Can not load package';
}
// lets add some data!
// see the scheme file and the xml object element and you will see the attribute class and that must match here
$myRow = $foreignDB->newObject('EventName');
$data = array(
'name' => 'MODX Revolution',
'description' => 'A great CMS product...'
);
$myRow->fromArray($data);
if ( !$myRow->save() ) {
$output .= '<p>Could not create row</p>';
} else {
$output .= '<p>Created row successfully</p>';
}
// now lets show the data in a quick and dirty table:
$output .= '
<table>
<tr>
<th>ID</th>
<th>Name</th>
<th>Description</th>
</tr>';
// Note for all HTML you should be using Chunks see: http://rtfm.modx.com/display/revolution20/Chunks#Chunks-ProcessingChunkviatheAPI
/* build query */
$query = $foreignDB->newQuery('EventName');
$rows = $foreignDB->getIterator('EventName', $query);
/* iterate */
$list = array();
foreach ($rows as $row) {
// from object to array you can also do $row->get('name');
$row_array = $row->toArray();
$output .= '
<tr>
<td>'.$row_array['id'].'</td>
<td>'.$row_array['name'].'</td>
<td>'.$row_array['description'].'</td>
</tr>';
}
$output .= '
</table>';
return $output;









