Модуль за 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.

Помимо выигрыша в скорости, мы также получили повышение качества кода за счёт отсутствия опечаток (куда же без них) и гарантии того, что все необходимые метаданные будут объявлены.

Вот так выглядит созданный нами модуль:

Страница редактирования модуля

© 2013 Ведисофт
Москва: +7 (499) 703-04-23
Екатеринбург: +7 (343) 236-60-96
Почта: info_at_vedisoft_dot_info