Содержание

Этап разработки справочников LSS проекта

lss

Введение

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