#Свой пакет
Своё решение нужно, когда одно и то же надо ставить на много сайтов. Для одного сайта хватает справочника и модуля — заводить ради этого пакет незачем.
#Самое простое решение
Один файл. Справочник, модуль и его вёрстка:
{
"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)
{
// отклик на событие
}
}Обработчик — строка Класс::метод, а не замыкание: слушателей нужно
хранить в базе между запросами, а замыкание в базу не положишь.
#Порядок разработки
- Написать
manifest.jsonи проверить его на тестовом сайте. - Убедиться, что установка проходит и откат при ошибке работает.
- Проверить снятие: справочники должны уходить только с явного согласия.
- Поднять версию.
- Собрать архив и выложить в витрину.
Проверяйте на тестовом сайте, а не на клиентском. Неудачная установка откатывается, но данные, заведённые между попытками, откат не вернёт.
#Правила, которые проверяются
| Что | Правило |
|---|---|
code | латиница, цифры, дефис; точка нельзя |
version | ровно три числа |
core_version | ограничение со знаком: ">=1.0.0" |
| имя справочника | латиница и подчёркивание |
| справочник модуля | должен быть объявлен выше |
| поле-выборка | обязательны select_by и select_show |
#Обновление решения
Поднимите version и выложите новый архив. При установке поверх:
- добавятся новые поля и модули;
- не изменятся записи;
- не изменится правленая владельцем вёрстка — она попадёт в «исходный код».
Отсюда следует, что вёрстку, которую владельцы наверняка будут править, надо продумывать сразу: выкладывать исправление вёрстки «поверх» бесполезно — его увидят только те, кто не правил.
#Совместимость
Решение, у которого есть зависимости, обязано их объявить: без этого оно поставится на сайт, где зависимости нет, и молча не заработает.
"dependencies": ["form", "crm"]Снять решение, от которого зависит другое установленное, нельзя — сначала снимается зависящее.