Модуль за 5 минут
В прошлой статье, посвящённой созданию модулей в SugarCRM, я упоминал о том, что в скором времени у нас появится новый инструмент.
Новый генератор написан на основе замечательного компонента Symfony Console и управляется из командной строки:
>php anvil/forge help scaffold
Usage:
scaffold [-r|—root[="..."]] [-b|—bundles[="..."]] schema
Для генерации метаданных нужно составить схему модулей в формате yaml.
Для начала создадим новый модуль «Заказы»:
Orders:
label: Заказы
Теперь можно запускать генератор:
>php anvil/forge scaffold scheme.yaml
Module initialized: Orders
Properties created
Labels created
Options created
Vardefs created
Relationships created
Searchfields created
Searchdefs created
Subpanels created
Detailviewdefs created
Editviewdefs created
Listviewdefs created
Popups created
Посмотрим, какие файлы были созданы:
├─custom
│ ├─application
│ │ └─Ext
│ │ └─Include
│ │ modules.ext.php
│ ├─Extension
│ │ └─application
│ │ └─Ext
│ │ ├─Include
│ │ │ Orders.php
│ │ └─Language
│ │ en_us.Orders.php
│ │ ru_ru.Orders.php
│ ├─modules
│ │ └─Orders
│ │ └─metadata
│ │ listviewdefs.php
│ │ popupdefs.php
│ │ searchdefs.php
│ └─themes
│ └─default
│ └─images
│ CreateOrders.png
│ Orders.png
└─modules
└─Orders
│ Forms.php
│ Menu.php
│ Order.php
│ vardefs.php
├─language
│ en_us.lang.php
│ ru_ru.lang.php
└─metadata
│ detailviewdefs.php
│ editviewdefs.php
│ listviewdefs.php
│ popupdefs.php
│ searchdefs.php
│ SearchFields.php
│ subpaneldefs.php
└─subpanels
default.php
Из двух строчек схемы мы получили 23 файла и 453 строки кода. Неплохо.
Добавим нашим заказам пару полей: номер и статус. Номер сделаем обычным текстовым полем, а статус — списком. Заодно определим набор статусов:
fields:
name:
label: Номер
status:
label: Статус
type: enum
options:
new: Новый
in_progress: Обрабатывается
closed: Закрыт
rejected: Отменён
Одно из самых утомительных занятий при создании модулей вручную — определение связей. Добавим связь типа один‑ко‑многим с модулем «Контрагенты»:
account:
label: Контрагент
type: relate
Не так уж и сложно, да? Генератор сам позаботится о полях и субпанелях.
Поля настроены, осталось только навести лоск. Скроем поле «Статус» со страницы редактирования — оно у нас будет изменяться автоматически.
editview:
- name
- account_name
Так же мы можем задать поля для формы просмотра, списка, поиска и субпанели.
Составление схемы заняло от силы минуты две. Оставшиеся три минуты можно потратить на выбор иконок из чудесного набора Yusuke Kamiyamane.
icons:
list: cheque
create: cheque--plus
Посмотрим на получившуюся в итоге схему:
Orders:
label: Заказ
icons:
list: cheque
create: cheque--plus
fields:
name:
label: Номер
status:
label: Статус
type: enum
options:
new: Новый
in_progress: Обрабатывается
closed: Закрыт
rejected: Отменён
account:
label: Контрагент
type: relate
editview:
- name
- account_name
22 строки, которые генератор разворачивает в 744.
Помимо выигрыша в скорости, мы также получили повышение качества кода за счёт отсутствия опечаток (куда же без них) и гарантии того, что все необходимые метаданные будут объявлены.
Вот так выглядит созданный нами модуль: