Привет, %юзернейм%.
В данный момент я только что закончил писать хитрую софтину, которая управляет впн-подключениями в нашей организации. И так как пользоваться этим придётся не только мне — то решили, что к этому делу нужен некий гуй, а именно — веб-интерфейс.
Дело в общем-то не бог весть какое сложное — 50<N<100 концентраторов, с каждого из них в центр аналитики по двум каналам капает SNMP-статистика, по факту анализа статистики осуществляется полуавтоматический переход на другую конфигурацию маршрутизации. Из ручных штук здесь требуется лишь аппрув дежурного администратора, чтоб в случае появления чего-нибудь ужасного можно было быстро всё вернуть на место.
Соотвественно, для толкового управления этим делом нужно две формы представления информации — сводная статистика (замечательно показывается zabbix-ом), и просмотр некоего набора конкретных параметров с возможностью их редактирования (в том числе — группового).
На деле это реализуется через связку codeigniter+bootstrap, табличкой со списком концентраторов, формочками c параметрами и кнопкой «внести изменения». И написание кода, который всем этим управляет, вгоняет меня в откровенную тоску, ведь для этого нужно:
- Сверстать форму управления
- Подгрузить её аджаксом
- Проверить, не возникло ли ошибок при подгрузке формы
- Запросить данные из интерфейса управления
- Дождаться этих данных и проверить их на валидность
- Конвертировать их в JSON и раскидать по форме
- Дождаться, пока юзер не нажмет кнопку
- валидировать данные на клиенте
- валидировать данные в веб-сервисе
- дождаться обработки интерфейсом управления
- вывести юзеру ошибку, если таковая произошла
- Не забыть при этом про то, что бывают разные там XSS
- И надо бы его аутентифицировать как-нибудь
И это если я сейчас ещё ничего не забыл.
Самое обидное, что почти весь этот код каждый раз для каждой формы приходится писать заново. А ведь есть ещё функции отключения\удаления\блокировки концентраторов (который на уровне Management Interface вообще реализуется одной строчкой!), а гуй к нему нужно писать полноценный, с окошками «а вы действительно хотите?» и т.д.
В итоге от безысходности я придумал следующий велосипед.
Текущее состояние однотипных объектов у нас описывается одинаковыми наборами полей. Иными словами, это вполне типичная таблица, как в любой СУБД, разве что без индексов и прочего. Изменения состояния имеют привязку по коду к определенным событиям — получаем типичную связь один-ко-многим. Т.е. итоговая выдача MI начинает напоминать результат обычного селекта с парой лефт джойнов к каким-то таблицам.
А теперь, собственно, сам велосипед.
Для каждого поля в таблице привязываем юзерфрендли-имя и тип юзер-редактора (типы использовать нельзя — допустим, для поля с датой это календарь, а вот поле с интом может быть как просто интом, так и ссылкой на некий ID, где придётся мутить какой-то custom-select).
Дальше некое подобие ActiveRecord — класс, описывающий построение запроса на селект. Соответственно, мы сразу видим, какие таблицы и в каких ролях у нас участвуют (главная-подчиненная), и можем на основе этого автоматически создавать хтмл-форму.
На очереди у нас валидация. Правила валидации могут устанавливаться как для класса целиком (в момент создания класса-запроса), так и для отдельных полей, участвующих в запросе (в момент описания класса-таблицы). Вдобавок, обязательна валидация по типу поля.
Собственно, после этого разработка очередной формы сведется к трем вещам:
1) описание таблиц и отношений между ними
2) ввод метаданных (имена полей, правила валидации, итд)
3) запуск некоей функции, инициирующей жизненный цикл окна редактирования\создания, и имеющей единственный параметр — имя класса, описывающего конкретный запрос
На самом деле всё это чудовищно напоминает обычный Microsoft Access и его мастер создания форм. Есть лишь одно отличие — это должно работать в браузере.
Искренне хочется верить, что всё вышеописанное уже кто-то реализовал. Существуют ли средства автоматизации управления html-формами c подобным функционалом?