Часть 2. Разбор структуры и генерация схемы БД.

08.10.2020
139

Сегодня мы с вами разберем структуру компонента: что значат те или иные каталоги и файлы в нашей заготовке 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 и вы увидите следующую картину:

Разбор структуры и генерация схемы БД.

А в БД у вас должна создаться таблица вашего компонента.

Разбор структуры и генерация схемы БД.

На этом мы закончим вторую часть разработки нашего компонента.

Часть 2. Разбор структуры и генерация схемы БД.

0 Число голосов: 1
5
5
1
1

Комментарии ()

Ваш комментарий будет первым!

Наши клиенты

Многие компании уже доверяют нам. Будьте в их числе!

Хотите реализовать проект?

Контакты

Напишите нам - мы расскажем вам много интересного!


Пермь, ул. Крупской 34, офис 510