====== Этап разработки справочников LSS проекта ====== [[start:|lss]] ===== Введение ===== На этом этапе мы разработаем справочники **LSS проекта** - контроллеры источников данных **DataSource**, экранные формы, пункты меню для вызова экранных форм. Для наглядности заполним содержимое справочников тестовыми значениями. ===== Развертывание этапа на площадке ===== * Скачаем архив **LSS проекта** для текущего этапа. * Обновим проект из архива. Надо быть осторожным с конфигурационным файлом площадки **php/config/config-place.php**, он содержит текущие параметры соединения с базой данных, его обновлять не надо. * Выполним с помощью утилиты **pgAdmin** скрипт заполнения содержимого таблиц первоначальными значениями, файл **export-import/backup/backup.sql**. ===== Описания ===== ==== Создание экранных форм справочников ==== Описатели экранных форм справочников размещены в папке **php/forms/ref**. Имя подпапки **ref** следует воспринимать как пространство имен. Экранные формы справочников просты, для них используется стандартный контроллер **FormController**, размещенный в **php/lss-server/lib/form-controller.php**. Соответственно, описание экранных форм задается одним только XML шаблоном. Подробнее о XML описании экранной формы можно посмотреть в [[form-definition|соответствующем разделе описания LSS протокола]]. Рассмотрим, например, XML шаблон экранной формы **formRepair** - виды ремонта:
где: * секция **rowsets** описывает подключение единственного источника данных - **repair**. * секция **panels** содержит единственную панель табличного редактора **grid** с единственным полем **name**. Шаблон экранной формы **formDepartment** чуть сложнее:
где: * секция **rowsets** описывает подключение двух связанных источников данных данных - **department** и **sector**. При смене текущей строки в родительском источнике данных **department**, дочерний источник данных **sector** автоматически перечитывается. Параметр **filter.departmentid** задает условие фильтрации для источника данных **sector** * секция **panels** содержит 2 панели табличных редакторов **grid**, одну для **department**, другую для **sector**. ==== Создание контроллеров источников данных ==== Контроллеры источников данных **DataSource** размещаются в папке **php/datasources**. В подпапке **autogen** размещаются контроллеры, автоматически сформированные по описанию структуры данных, см [[lssexampl-02-datastru]]. Для автоматического формирования этих контроллеров следует использовать экранную форму **Разработка/Структура базы**, вызвав в ней пункт меню **Пересчет/Генератор классов DataSource**. В корне папки **php/datasources** можно размещать контроллеры, унаследованные от автоматически сформированных, переопределяя заданные там методы и свойства. Для примера, возьмем контроллер для таблицы типов ремонтов **repair**. Реализуем в нем проверку на уникальность содержимого поля **name**. Эта проверка и так есть - за счет уникального индекса на сервере PostgreSQL, см файл **sql/tables.sql**: alter table "repair" add unique("name") deferrable initially deferred; Эта проверка на уникальность происходит при завершении транзакции, но текст сообщения об ошибке выдается SQL сервером автоматически и может быть непонятен пользователю. Добавим проверку на уникальность, цель которой - выдать наглядное сообщение при возникновении ошибки. Вот содержимое файла контроллера источника данных для таблицы **repair**, файл **php/datasources/repair.php**: str2Sql($row['name']); $sql_id=$this->str2Sql($row['id']); $sql=<<'{$sql_id}' SQL; $rec=$this->pdoFetch($sql); if ($rec['n']) throw new Exception("Вид ремонта '{$row['name']}' уже есть"); } } } return new DataSource_Repair_Ext(); Обратите внимание: * класс унаследован от автоматически сформированного контроллера **DataSource_Repair** * в конце программного кода создается и возвращается экземпляр описанного в файле контроллера **DataSource_Repair_Ext** Сравните, в справочнике **Типы оборудования** проверка на уникальность поля **name** выполняется только средствами SQL сервера, а в справочнике **Виды ремонта** - перед завершением транзакции выполняется реализованная в **DataSource** проверка, и сообщение об ошибке оказывается более понятным. ==== Создание пунктов меню, для вызова экранных форм справочников ==== Главное меню проекта описывается в XML файле **php/config/appmenu.xml**. Скорректируем его описателями для вызова экранных форм справочников: где: * **name** - наименование пункта меню. * **icon** - имя иконки. Имена и внешний вид доступных в проекте иконок можно увидеть с помощью экранной формы **Разработка/Иконки**. Подключение дополнительных иконок было разобрано в [[lssexampl-01-custom]]. * **form** - имя экранной формы и место размещения ее описателя (в подпапке **php/forms**). * описатели, имеющие отношение к системе прав, разберем позже, на соответствующем этапе. Работу главного меню системы обеспечивает источник данных **systreexmlmenu** расположенный в файле **php/lss-server/datasources/systreexmlmenu.php**. Этот источник задействован в главной экранной форме приложения, расположенной в папке **php/forms/formMain**. ===== Демонстрационные примеры и ссылки ===== Демонстрационные примеры доступны в режиме "**только чтение**". Для входа используйте логин **root**, пароль **1**. * демонстрация работы **тестового примера** "Материальные активы" у нас на сайте: [[https://lss.m-cti.ru/storage/example/lss-exampl]]