Кабинет
Как устроен пакет

#Свой пакет

Своё решение нужно, когда одно и то же надо ставить на много сайтов. Для одного сайта хватает справочника и модуля — заводить ради этого пакет незачем.

#Самое простое решение

Один файл. Справочник, модуль и его вёрстка:

{
  "name": "Врачи",
  "code": "vrachi",
  "version": "1.0.0",
  "description": "Карточки врачей: имя, специальность, стаж, фото",
  "author": "Студия",
  "core_version": ">=1.0.0",
  "dependencies": [],

  "dictionaries": [{
    "name": "vrachi",
    "title": "Врачи",
    "menu": true,
    "menu_sort": 40,
    "fields": [
      { "name": "fio",     "title": "ФИО",           "type": "text" },
      { "name": "spec",    "title": "Специальность", "type": "text" },
      { "name": "stazh",   "title": "Стаж, лет",     "type": "number" },
      { "name": "foto",    "title": "Фотография",    "type": "image" }
    ],
    "demo": [
      { "fio": "Иванова Анна Петровна", "spec": "Терапевт", "stazh": "12" }
    ]
  }],

  "modules": [{
    "name": "vrachi",
    "title": "Врачи",
    "type": "BFM",
    "dictionary": "vrachi",
    "box_layout": "<div class=\"docs\">{item}</div>",
    "item_layout": "<article class=\"doc\"><img src=\"{module.vrachi.foto}\" alt=\"\"><h3>{module.vrachi.fio}</h3><p>{module.vrachi.spec} · {module.vrachi.stazh} лет</p></article>"
  }],

  "routes": [], "permissions": [], "admin_menu": [],
  "listeners": {}, "assets": []
}

Этого достаточно: справочник появится в меню, модуль — в списке модулей, и на странице заработает {module.vrachi}.

#Каталог решения

packages/vrachi/
  manifest.json
  src/            только если нужна логика
  README.md

#Когда нужен код

Логика лежит в src/ и подключается по имени класса из манифеста:

"routes": [
  { "method": "POST", "pattern": "/vrachi/zapis/", "handler": "wVrachi::zapis" }
],
"listeners": {
  "form.submitted": "wVrachi::onForm"
}
class wVrachi
{
    public static function zapis()
    {
        // обработчик адреса
    }

    public static function onForm(array &$payload)
    {
        // отклик на событие
    }
}
Важно

Обработчик — строка Класс::метод, а не замыкание: слушателей нужно хранить в базе между запросами, а замыкание в базу не положишь.

#Порядок разработки

  1. Написать manifest.json и проверить его на тестовом сайте.
  2. Убедиться, что установка проходит и откат при ошибке работает.
  3. Проверить снятие: справочники должны уходить только с явного согласия.
  4. Поднять версию.
  5. Собрать архив и выложить в витрину.
Важно

Проверяйте на тестовом сайте, а не на клиентском. Неудачная установка откатывается, но данные, заведённые между попытками, откат не вернёт.

#Правила, которые проверяются

ЧтоПравило
codeлатиница, цифры, дефис; точка нельзя
versionровно три числа
core_versionограничение со знаком: ">=1.0.0"
имя справочникалатиница и подчёркивание
справочник модулядолжен быть объявлен выше
поле-выборкаобязательны select_by и select_show

#Обновление решения

Поднимите version и выложите новый архив. При установке поверх:

  • добавятся новые поля и модули;
  • не изменятся записи;
  • не изменится правленая владельцем вёрстка — она попадёт в «исходный код».
Важно

Отсюда следует, что вёрстку, которую владельцы наверняка будут править, надо продумывать сразу: выкладывать исправление вёрстки «поверх» бесполезно — его увидят только те, кто не правил.

#Совместимость

Решение, у которого есть зависимости, обязано их объявить: без этого оно поставится на сайт, где зависимости нет, и молча не заработает.

"dependencies": ["form", "crm"]

Снять решение, от которого зависит другое установленное, нельзя — сначала снимается зависящее.