На этом этапе мы разработаем справочники 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.