Учебник по Showcase: Расширенная форма

Материал из Course Orchestra
Перейти к: навигация, поиск

Внимание! Изложенная здесь информация устарела! В качестве учебника следует использовать https://share.curs.ru/webhelp/ (work in progress).


Вернемся к дальнейшему рассмотрению элементов Showcase. Нас будет интересовать практическое использование изученных элементов xforms. Для начала немного отредактируем панель:

<?xml version="1.0" encoding="UTF-8"?>
<datapanel>
   <tab id="1" name="Сотрудники и оргструктура">
      <element id="30" type="grid" proc="orgGrid"/>		
      <element id="120" type="webtext" proc="employeesButtons" hideOnLoad="true">
         <related id="130"/>
      </element>	
      <element id="130" type="grid" proc="employeesGrid" hideOnLoad="true">
         <related id="30"/>		
      </element>
      <element id="140" type="xforms" template="employeesCard.xml" proc="employeesCard" neverShowInPanel="true">
         <related id="30"/>
         <related id="130"/>
         <proc id="proc1" name="employeesCardSave" type="SAVE"/>
      </element>
   </tab>	
</datapanel>

Процедура подгрузки xml с данными выглядит следующим образом:

ALTER PROCEDURE [dbo].[employeesCard]  
   @main_context varchar(512)='',  
   @add_context varchar(512)='',  
   @filterinfo xml='',  
   @session_context xml='',  
   @element_Id varchar(512)='',  
   @xformsdata xml output,  
   @xformssettings xml output  
as 
begin  

   SET NOCOUNT ON;  
   declare
      @id as uniqueidentifier
      ,@name as varchar(255)
      ,@post_id as uniqueidentifier
      ,@post_name as varchar(255)
      ,@date as varchar(255)
      ,@comment as varchar(255)
      ,@sex as varchar(255)
      ,@status as varchar(255)
      ,@currentuuid as uniqueidentifier
   
   set @currentuuid = @session_context.value('(/sessioncontext/related/gridContext[@id = 130]/
currentRecordId)[1]', 'uniqueidentifier')
	 
   set @id        =		 (select uid		from employees where uid = @currentuuid);
   set @name      =		 (select fio		from employees where uid = @currentuuid);
   set @post_id   =		 (select postId		from employees where uid = @currentuuid)
   set @post_name =		 (select name		from posts where uid = @post_id)
   set @date      =	coalesce((select convert(nvarchar(50),date,126) from employees where uid = @currentuuid),'')
   set @comment   =	coalesce((select comment	from employees where uid = @currentuuid)		,'')
   set @status    =	coalesce((select status		from employees where uid = @currentuuid)		,'')
   
   if @add_context = 'add' 
      set @xformsdata = '
         <schema xmlns="">
            <record 
                  id="'+CAST(NEWID() as nvarchar(50))+'" 
                  name="" 
                  postId="" 
                  post="" 
                  date="" 
                  comment="" 
                  status="">
            </record>
         </schema>'
   else
      set @xformsdata = '
         <schema xmlns="">
            <record 
                  id="'		+  CAST(@id as nvarchar(50))	  +'" 
                  name="'	+	@name			  +'" 
                  postId="'	+  CAST(@post_id as nvarchar(50)) +'" 
                  post="'	+	@post_name		  +'"
                  date="'	+	@date			  +'" 
                  comment="'	+	@comment	  	  +'" 
                  status="'	+	@status		 	  +'"
            />
         </schema>'

   set @xformssettings =
      '<properties>
         <event name="single_click" linkId="1">
            <action>
               <main_context>current</main_context>
               <datapanel type="current" tab="current">
                  <element id="130"/>
                  <element id="120"><add_context>hide</add_context></element>
               </datapanel>
            </action>
         </event>
      </properties>' 
end

Здесь при получении контекста add мы формируем пустой xml, а при любом другом контексте (в нашем случае мы передаем edit) происходит подтягивание данных о выделенном сотруднике (его id мы знаем благодаря related) и заполнению ими xml.

Сам же шаблон выглядит так:

<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet href="xsltforms/xsltforms.xsl" type="text/xsl"?>
<html xmlns="http://www.w3.org/1999/xhtml" xmlns:ev="http://www.w3.org/2001/xml-events"
    xmlns:xsd="http://www.w3.org/2001/XMLschema" xmlns:fs="http://www.curs.ru/ns/FormServer"
    xmlns:xf="http://www.w3.org/2002/xforms">
    <head>
        <style type="text/css">
            
            .control button {
                width: 30px;
            }
            .baseSelectorInput
            .xforms-value {
                width: 130px !important;
                border: 0px;
                padding: 2px 0px 2px 0px;
                background-color: #E5F2FF;
                margin: 2px 0px 0px 0px;
                min-height: 13px;
            }
            
            .aid-button,
            .aid-button
            button {
                width: 30px !important;
            }
            </style>
        <xf:model id="mainModel">
            <xf:instance id="mainInstance">
                <schema xmlns=""/>
            </xf:instance>

            <xf:bind>

                <xf:bind nodeset="/schema/record/@name" required="true()"/>
                <xf:bind nodeset="/schema/record/@post" required="true()" readonly="true()"/>
                <xf:bind nodeset="/schema/record/@date" type="date"/>
                
                <!--<xf:bind nodeset="/schema/record/@comment" type="int"/>-->
                
            </xf:bind>
            <!--<xf:action ev:event="xforms-ready">
                <xf:setvalue ref="/schema/record/@name" value="'Какое-то имя'"/>
            </xf:action>-->
            
        </xf:model>


    </head>
    <body>
        <!--<xf:output value="serialize(instance('mainInstance'))"/>-->
        <div class="control" style="width: 300px; padding: 2px;  float: left;clear:both;">
            <xf:input class="baseInput" ref="/schema/record/@name">
                <xf:label>Фамилия И.О. (обязательно для заполнения): </xf:label>
            </xf:input>
        </div>
        <div class="control" style="width: 360px; padding: 2px; float: left;clear:both; ">
            <div style="width: 300px; float: left; ">
                <xf:input class="baseSelectorInputBig" ref="/schema/record/@post">
                    <xf:label>Должность: </xf:label>
                </xf:input>
            </div>
            <div style="width: 30px; padding: 21px 0px 0px 0px; float: left; ">
                <xf:selector buttonLabel="..." procListAndCount="'postListAndCount'" 
                    generalFilters="''" currentValue="'XPath(/schema/record/@post)'"
                    windowCaption="'Выберите название'"
                    xpathMapping="{'XPath(/schema/record/@postId)' : 'id', 
                        'XPath(/schema/record/@post)' : 'name'}"
                />
            </div>
            <div style="width: 15px; padding: 21px 0px 0px 0px; float: left; ">
                <xf:trigger class="aid-button">
                    <xf:label>X</xf:label>
                    <xf:action ev:event="DOMActivate">
                        <xf:setvalue ref="/schema/record/@postId" value=""/>
                        <xf:setvalue ref="/schema/record/@post" value=""/>
                    </xf:action>
                </xf:trigger>
            </div>
        </div>
        <div class="control" style="width: 300px; padding: 2px;  float: left;clear:both;">
            <xf:input class="dateInput" ref="/schema/record/@date">
                <xf:label>Дата приема на работу: </xf:label>
            </xf:input>
        </div>
        <div class="control" style="width: 300px; padding: 2px;  float: left;clear:both;">
            <xf:select1 class="baseInput" ref="/schema/record/@status">
                <xf:label>Семейное положение: </xf:label>
                <xf:item>
                    <xf:label>Холост/Не замужем</xf:label>
                    <xf:value>0</xf:value>
                </xf:item>
                <xf:item>
                    <xf:label>Женат/Замужем</xf:label>
                    <xf:value>1</xf:value>
                </xf:item>
                <xf:action ev:event="xforms-value-changed">
                    <xf:message>Вы изменили значение в поле "Cемейное положение"</xf:message>
                </xf:action>
            </xf:select1>
        </div>
        <div class="control" style="width: 300px; padding: 2px;  float: left;clear:both;">
            <xf:textarea class="baseInput" ref="/schema/record/@comment">
                <xf:label>Краткая характеристика сотрудника: </xf:label>
            </xf:textarea>
        </div>
        <div class="control" style="width: 300px; padding: 2px;  float: left;clear:both;">
            <xf:output class="baseInput" ref="/schema/record/@comment">
                <xf:label>Вывод на экран краткой характеристики сотрудника: </xf:label>
            </xf:output>
        </div>


        <hr style="width: 500px;  float: left; clear: both;"/>

        <div style="float: left;  clear: both;">
            <xf:trigger>
                <xf:label>Сохранить и закрыть</xf:label>
                <xf:action ev:event="DOMActivate">
                    <xf:action if="is-valid(/schema) = false()">
                        <xf:message>Данные не были сохранены. Форма содержит ошибки.</xf:message>
                    </xf:action>
                    <xf:action if="is-valid(/schema) = true()">
                        <xf:load
                            resource="javascript:gwtXFormSave('xformId','1',  Writer.toString(
xforms.defaultModel.getInstanceDocument('mainInstance')))"/>
                        <xf:message>Данные сохранены</xf:message>
                    </xf:action>                    
                </xf:action>
            </xf:trigger>

            <xf:trigger>
                <xf:label>Закрыть</xf:label>
                <xf:action ev:event="DOMActivate">
                    <xf:load resource="javascript:gwtXFormUpdate('xformId','1', null)"/>
                </xf:action>
            </xf:trigger>
        </div>

    </body>
</html>

Он содержит все элементы, которые мы рассмотрели ранее, поэтому не будем на нем останавливаться.

Процедура сохранения также похожа на описанные выше. Единственное отличие в том, что из-за большего числа данных мы вставляем в таблицу больше значений.

ALTER PROCEDURE [dbo].[employeesCardSave]  
   @main_context nvarchar(512)='',  
   @add_context nvarchar(512)='',  
   @filterinfo xml='',  
   @session_context xml='',  
   @element_Id nvarchar(512)='',  
   @xformsdata xml='',  
   @error_mes nvarchar(512)='' output  
AS  
BEGIN  
  
   SET NOCOUNT ON;  

   declare 
      @currentOrgStructure as uniqueidentifier
      ,@currentEmployee as uniqueidentifier

   set @currentOrgStructure = @session_context.value('(/sessioncontext/related/
gridContext[@id = 30]/currentRecordId)[1]', 'uniqueidentifier')
   set @currentEmployee = coalesce(@session_context.value('(/sessioncontext/related/
gridContext[@id = 130]/currentRecordId)[1]', 'uniqueidentifier'),newid())

   if @currentEmployee not in (select uid From "employees") 
      begin
         insert into "employees" (uid, "fio","orgStructureId","postId","status","comment","date") 
            values 
               (
                  @xformsdata.value('(/schema/record/@id)[1]', 'uniqueidentifier')
                  ,@xformsdata.value('(/schema/record/@name)[1]', 'nvarchar(250)')
                  ,@currentOrgStructure
                  ,@xformsdata.value('(/schema/record/@postId)[1]', 'uniqueidentifier')
                  ,@xformsdata.value('(/schema/record/@status)[1]', 'int')
                  ,@xformsdata.value('(/schema/record/@comment)[1]', 'nvarchar(250)')
                  ,@xformsdata.value('(/schema/record/@date)[1]', 'date')
               )
      end
   else
      update "employees"
         SET 
            "fio"	= @xformsdata.value('(/schema/record/@name)[1]', 'nvarchar(250)')
            ,"postId"	= @xformsdata.value('(/schema/record/@postId)[1]', 'nvarchar(250)')
            ,"status"	= @xformsdata.value('(/schema/record/@status)[1]', 'nvarchar(250)')
            ,"comment"	= @xformsdata.value('(/schema/record/@comment)[1]', 'nvarchar(250)')
            ,"date"	= @xformsdata.value('(/schema/record/@date)[1]', 'nvarchar(250)')
         where @xformsdata.value('(/schema/record/@id)[1]', 'uniqueidentifier') = uid;		
  END