Учебник по Showcase: Зависимость элемента от формы

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

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


При большом количестве записей в гриде необходима возможность фильтрации записей. Сделать это можно с помощью механизма зависимых элементов. Однако, в отличии от рассмотренных ранее случаев, здесь зависимость будет от формы.

Рассмотрим следующую простую панель:

<?xml version="1.0" encoding="UTF-8"?>
<datapanel>
   <tab id="1" name="Сотрудники и оргструктура">
      <element id="10" type="xforms" template="orgFilter.xml" proc="orgFilter"/>
      <element id="30" type="grid" proc="orgGrid">
         <related id="10"/>
      </element>		
   </tab>
</datapanel>

Здесь над гридом будет нарисована простейшая форма. В Showcase есть ограничение - только одна форма может быть нарисована непосредственно на панели, остальные могут прописываться в отдельных модальных окнах.

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

ALTER PROCEDURE [dbo].[orgFilter]  
   @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;  

   set @xformsdata =  
      '<schema xmlns="">
         <record name=""/>
      </schema>'
   
   set @xformssettings =
      '<properties>
         <event name="single_click" linkId="1">
            <action>
               <main_context>current</main_context>
               <datapanel type="current" tab="current">
                  <element id="30"/>
               </datapanel>
            </action>
         </event>
      </properties>'      
END

Ее шаблон:

<?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"/>
           
        <xf:model id="mainModel">
            <xf:instance id="mainInstance">
                <schema xmlns=""/>
            </xf:instance>

            <xf:bind/>

        </xf:model>

    </head>
    <body>
        <!--<xf:output value="serialize(instance('mainInstance'))"/>-->

        <div class="control" style="width: 200px; padding: 2px;  float: left;  clear: both;">
            <xf:input class="textArea" style="font-size: small; height: 34px;"
                ref="/schema/record/@name">
                <xf:label>Наименование подразделения: </xf:label>
            </xf:input>
        </div>
        
        <div style="float: left; padding-top:20px;">
            <xf:trigger>
                <xf:label>Отобразить</xf:label>
                <xf:action ev:event="DOMActivate">
                    <xf:load
                        resource="javascript:gwtXFormFilter('xformId','1', null)"/>
                </xf:action>
            </xf:trigger>
        </div>
    </body>
</html>

После заполнения формы и клике на кнопку "Отобразить" будет обработан linkId=1, который перерисует грид (элемент с id=30).

Самое главное будет происходить в процедуре грида:

ALTER PROCEDURE [dbo].[orgGrid]
   @main_context nvarchar(512)='' ,  
   @add_context nvarchar(512)='' ,  
   @filterinfo xml='',  
   @session_context xml='',
   @sortcols nvarchar(1024)='', 
   @element_id nvarchar(512)='',
   @gridsettings xml='' output,      
   @error_mes nvarchar(max) = '' output
AS
BEGIN

   SET NOCOUNT ON;

   declare @filter_name as nvarchar(50)

   set @filter_name = coalesce(@session_context.value('(/sessioncontext/related/xformsContext[@id = 10]/
formData/schema/record/@name)[1]', 'nvarchar(50)'),'')
   if @filter_name = '' 
      set @filter_name = '%%'
   else 
      set @filter_name = '%'+@filter_name+'%'

   SELECT 
      o."uid" as "~~id"
      , o."name" as "Наименование"
      ,'<properties>
         <event name="row_single_click">
            <action>
               <main_context>current</main_context>
               <datapanel type="current" tab="current">
                  <element id="130"/>
               </datapanel>
            </action>
         </event>                                         
      </properties>' as "~~properties" 
      FROM "orgStructure" o
      where o.name like @filter_name 
   
   SET @gridsettings=
      '<gridsettings>      
         <columns>
            <col id="Наименование" width="325px"/>
         </columns>
         <properties pagesize="10" autoSelectRecordId="1" profile="gr_withoutExcel.properties"/>
      </gridsettings>';
END

В нашем случае, когда элемент зависит от формы, в переменную @session_context придет следующий xml:

<sessioncontext>
   <username>имя пользователя</username>
   <sid>S-1-5-21-3280272421-4220533252-1382601228-1147</sid>
   <email>info@curs.ru<email/>
   <fullusername>полное имя пользователя</fullusername>
   <phone>9392612<phone/>   
   <related>     
      <xformsContext id="10">
         <formData><schema xmlns=""><record name=""/></schema></formData>
      </xformsContext>         
   </related>
</sessioncontext>

Здесь в тэге <formData/> прописан xml с данными из формы выше, поэтому можем в процедуре грида получить значение для фильтрации. В переменной @filter_name мы указали значение для сравнения через like в запросе.