Сегодня мы с вами разберем структуру компонента: что значат те или иные каталоги и файлы в нашей заготовке modExtra. Начнем с основных директорий любых компонентов: в каталоге /assets/components/DARTSocials/ у нас будут хранится файлы, которые должны быть публично доступны из сети Интернет, как правило, это JS-скрипты, CSS файлы, коннекторы для обработки AJAX запросов; каталог /core/components/DARTSocials/ содержит ядро нашего компонента и требует детального рассмотрения. В каталоге /core/components/DARTSocials/ у нас есть следующие папки:
- Controllers – в данном каталоге содержатся файлы для подготовки страниц панели администратора, или, как их еще называют, CMP – Custom Manager Pages.
- Docs – папка с описанием компонента, история изменений, лицензия, инструкция.
- Elements – здесь будут лежать чанки, сниппеты, плагины и т.д. При установке компонента они будут загружаться в базу данных.
- Lexicon – файлы локализации i18n.
- Model – все PHP-классы компонента, XML-схема таблиц БД.
- Processors – тут будут лежать файлы обрабочики запросов из панели администратора. Обычно они выполняют какую-либо одну функцию, например, добавление в БД, удаление из БД и т.д.
Два перечисленных выше каталога содержатся в любом компоненте MODX Revo и структура их одинакова. Теперь предлагаю рассмотреть папку /_build/, которая необходима для сборки нашего компонента в пакет (специальный сжатый файл с определенной структурой, позволяющий устанавливать компоненты, используя установщик):
- Elements – файлы со списком элементов компонента: чанков, сниппетов и т.д.
- Resolvers – скрипты, которые будут запускаться при установке пакета.
- Build.php – скрипт сборки компонента в пакет.
- Config.inc.php – файл конфигурации.
Собственно, для начала, думаю, что структура компонентов вам понятна. Теперь предлагаю перейти к генерации схемы базы данных для нашего компонента. Данная процедура сводится просто к формированию XML-файла. Я обычно это делаю вручную, но есть и автоматические генераторы данных схем. Я же предлагаю вам вместе со мной создать ее вручную и разобраться во всех тонкостях. Таблица у нас с вами будет одна, так как компонент совсем простенький. Схема получилась следующая:
<?xml version="1.0" encoding="UTF-8"?> <model package="dartsocials" baseClass="xPDOObject" platform="mysql" defaultEngine="InnoDB" phpdoc-package="dartsocials" version="1.1"> <object class="DARTSocialsItems" table="dartsocials_items" extends="xPDOSimpleObject"> <field key="name" dbtype="varchar" precision="100" phptype="string" null="false" default=""/> <field key="icon" dbtype="varchar" precision="100" phptype="string" null="true" default=""/> <field key="link" dbtype="varchar" precision="100" phptype="string" null="true" default=""/> <field key="share_link" dbtype="varchar" precision="100" phptype="string" null="true" default=""/> <field key="description" dbtype="text" phptype="string" null="true" default=""/> <field key="createdon" dbtype="datetime" phptype="datetime" null="true"/> <field key="createdby" dbtype="int" precision="10" attributes="unsigned" phptype="integer" null="false" default="0" /> <field key="editedon" dbtype="datetime" phptype="datetime" null="true"/> <field key="editedby" dbtype="int" precision="10" attributes="unsigned" phptype="integer" null="false" default="0" /> <field key="active" dbtype="tinyint" precision="1" phptype="boolean" null="true" default="1"/> <index alias="name" name="name" primary="false" unique="false" type="BTREE"> <column key="name" length="" collation="A" null="false"/> </index> <index alias="active" name="active" primary="false" unique="false" type="BTREE"> <column key="active" length="" collation="A" null="false"/> </index> <aggregate alias="CreatedBy" class="modUser" local="createdby" foreign="id" cardinality="one" owner="foreign"/> <aggregate alias="EditedBy" class="modUser" local="editedby" foreign="id" cardinality="one" owner="foreign"/> </object> </model>
Давайте же разберем, что здесь к чему. Первая строка:
<model package="dartsocials" baseClass="xPDOObject" platform="mysql" defaultEngine="InnoDB" phpdoc-package="dartsocials" version="1.1">
Она содержит наименование нашего компонента, говорит, что базовый класс будет “xPDOObject”, система хранения MySQL у нас будет InnoDB по умолчанию.
Теперь перейдем к самому интересному. Строкой:
<object class="DARTSocialsItems" table="dartsocials_items" extends="xPDOSimpleObject">
У нас объявляется объект, который будет обязательно расширять стандартный класс xPDOSimpleObject, в данном классе мы унаследуем колонку id, как первичный ключ, следовательно, указывать его нигде не нужно. Разберем атрибуты:
- Class – это наименование вашего класса, здесь вы можете писать что вам угодно. Потом вы можете использовать конструкции типа $modx->getObject(“Наименование класса”)
- Table – наименование таблицы в БД. Обратите внимание, что она задается без префикса.
- Extends –это говорит о том, что мы расширяем класс xPDOSimpleObject, о чем я писал ранее.
В строках field мы будем указывать столбцы таблицы БД. В данном случае, у нас используются следующие столбцы:
- Name – наименование нашей социальной сети.
- Icon – иконка, изображение.
- Link – ссылка на аккаунт.
- Share_link – ссылка на чат.
- Description – описание на всякий случай.
- Createdon – когда создана, дата.
- Createdby – кем создана, id пользователя.
- Editedon – когда отредактирована, дата.
- Editedby – кем отредактирована, id пользователя.
- Active – активно или нет.
Давайте разберем какие у нас есть атрибуты у поля field:
- Key – ключ
- Dbtype – тип поля в БД
- Precision – точность или размер поля.
- Phptype – тип в PHP
- Null – может ли поле быть пустым
- Default – значение по умолчанию
- Attributes – дополнительные свойства для передачи в БД
После части с описанием полей в нашей таблице идет описание индексов, чтобы выборки из таблицы работали быстрее. В данном случае, у нас всего два индекса по полям name и active. Из атрибутов, на которые стоит обратить внимание – это:
- Primary – первичный ли индекс. Обычно эту роль выполняет ID.
- Unique – является ли индекс уникальным. Обычно эту роль выполняет ID.
Ну, и последнее, это связи полей нашего класса с остальными. Связей бывает два вида:
- Composite – объект является главным по отношению к другому. При удалении такого объекта будут удалены все объекты, связанные с ним.
- Aggregate – объект подчинен другому. При удалении ничего не будет.
Давайте также разберем атрибуты наших связей:
- Alias – псевдоним связи. Вы можете использовать его так: $object->getOne(“alias”)
- Class – наименование класса, с которым связывается текущий объект.
- Local – наименование столбца в текущем классе.
- Foreign – поле объекта по которому связываемся, обычно это ID
- Cardinality – тип связи. Один к одному или один к нескольким.
В нашей же таблице мы задали связь только с пользователем для полей createdby и editedby. Отлично! Теперь пришло время впервые сгенерировать нашу схему и запаковать наш компонент в пакет. Для этого нужно перейти по URL: http://ваш.сайт/extras/DARTSocials/_build/build.php и вы увидите следующую картину:
А в БД у вас должна создаться таблица вашего компонента.
На этом мы закончим вторую часть разработки нашего компонента.