На этом этапе мы разработаем справочники LSS проекта - контроллеры источников данных DataSource, экранные формы, пункты меню для вызова экранных форм. Для наглядности заполним содержимое справочников тестовыми значениями.
Описатели экранных форм справочников размещены в папке php/forms/ref. Имя подпапки ref следует воспринимать как пространство имен.
Экранные формы справочников просты, для них используется стандартный контроллер FormController, размещенный в php/lss-server/lib/form-controller.php. Соответственно, описание экранных форм задается одним только XML шаблоном.
Подробнее о XML описании экранной формы можно посмотреть в соответствующем разделе описания LSS протокола.
Рассмотрим, например, XML шаблон экранной формы formRepair - виды ремонта:
<form name="%form%" caption="Виды ремонта"> <rowsets> <rowset name="repair"/> </rowsets> <panels> <panel> <panel type="grid" rowset="repair"> <toolbar menu="1"> <request rowset="#this" name="undo"/> <request rowset="#this" name="save"/> <request rowset="#this" name="refresh"/> <separator/> <request rowset="#this" name="append"/> <request rowset="#this" name="delete"/> </toolbar> <fields> <field name="name"/> </fields> </panel> </panel> </panels> </form>
где:
Шаблон экранной формы formDepartment чуть сложнее:
<form name="%form%" caption="Структура предприятия"> <rowsets> <rowset name="department"> <rowset name="sector"> <param name="filter.departmentid" js_value="get('department.id')"/> </rowset> </rowset> </rowsets> <panels> <panel> <panel type="grid" rowset="department" align="top" height="50%" splitter="1"> <toolbar menu="1"> <request rowset="#this" name="undo"/> <request rowset="#this" name="save"/> <request rowset="#this" name="refresh"/> <separator/> <request rowset="#this" name="append"/> <request rowset="#this" name="delete"/> </toolbar> <fields> <field name="name"/> </fields> </panel> <panel type="grid" rowset="sector"> <toolbar menu="1"> <request rowset="#this" name="undo"/> <request rowset="#this" name="save"/> <request rowset="#this" name="refresh"/> <separator/> <request rowset="#this" name="append"/> <request rowset="#this" name="delete"/> </toolbar> <fields> <field name="name"/> </fields> </panel> </panel> </panels> </form>
где:
Контроллеры источников данных DataSource размещаются в папке php/datasources. В подпапке autogen размещаются контроллеры, автоматически сформированные по описанию структуры данных, см Этап создания структуры базы данных LSS проекта. Для автоматического формирования этих контроллеров следует использовать экранную форму Разработка/Структура базы, вызвав в ней пункт меню Пересчет/Генератор классов DataSource.
В корне папки php/datasources можно размещать контроллеры, унаследованные от автоматически сформированных, переопределяя заданные там методы и свойства. Для примера, возьмем контроллер для таблицы типов ремонтов repair. Реализуем в нем проверку на уникальность содержимого поля name. Эта проверка и так есть - за счет уникального индекса на сервере PostgreSQL, см файл sql/tables.sql:
alter table "repair" add unique("name") deferrable initially deferred;
Эта проверка на уникальность происходит при завершении транзакции, но текст сообщения об ошибке выдается SQL сервером автоматически и может быть непонятен пользователю.
Добавим проверку на уникальность, цель которой - выдать наглядное сообщение при возникновении ошибки. Вот содержимое файла контроллера источника данных для таблицы repair, файл php/datasources/repair.php:
<?php class DataSource_Repair_Ext extends DataSource_Repair { /// переопределяем проверку после правки строки protected function onRowValid(&$row) { { // проверка значения поля name на уникальность - для более понятного пользователю сообщения об ошибке $sql_name=$this->str2Sql($row['name']); $sql_id=$this->str2Sql($row['id']); $sql=<<<SQL select count(*) as n from "repair" where "repair".name='{$sql_name}' and "repair".id<>'{$sql_id}' SQL; $rec=$this->pdoFetch($sql); if ($rec['n']) throw new Exception("Вид ремонта '{$row['name']}' уже есть"); } } } return new DataSource_Repair_Ext();
Обратите внимание:
Сравните, в справочнике Типы оборудования проверка на уникальность поля name выполняется только средствами SQL сервера, а в справочнике Виды ремонта - перед завершением транзакции выполняется реализованная в DataSource проверка, и сообщение об ошибке оказывается более понятным.
Главное меню проекта описывается в XML файле php/config/appmenu.xml. Скорректируем его описателями для вызова экранных форм справочников:
<node name="Справочники" icon="reffolder"> <node name="Структура предприятия" icon="ref" form="ref.formDepartment"/> <node name="Виды ремонта" icon="ref" form="ref.formRepair"/> <node name="Типы оборудования" icon="ref" form="ref.formMachineType"/> <node name="Состояния оборудования" icon="ref" form="ref.formMachineStatus"/> </node>
где:
Работу главного меню системы обеспечивает источник данных systreexmlmenu расположенный в файле php/lss-server/datasources/systreexmlmenu.php. Этот источник задействован в главной экранной форме приложения, расположенной в папке php/forms/formMain.
Демонстрационные примеры доступны в режиме «только чтение». Для входа используйте логин root, пароль 1.