Что такое 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;