Учебник по Showcase: Селектор

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

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


xml с данными:

<schema xmlns="">
   <record postId="" postName=""/>
</schema>

Шаблон:

<?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:xf="http://www.w3.org/2002/xforms">
    <head>
        <xf:model id="mainModel">
 
            <xf:instance id="mainInstance">
                <schema xmlns=""/>
            </xf:instance>

        </xf:model>
    </head>
    <body>

        <xf:input ref="/schema/record/@postName">
            <xf:label>Должность: </xf:label>
        </xf:input>
        <xf:selector 
             buttonLabel="..." 
             procListAndCount="'postListAndCount'" 
             generalFilters="''" 
             currentValue="'XPath(/schema/record/@postName)'"
             windowCaption="'Выберите название'"
             xpathMapping="{
                            'XPath(/schema/record/@postId)'   : 'id', 
                            'XPath(/schema/record/@postName)' : 'name'
                            }"
             />
        <xf:trigger>
            <xf:label>X</xf:label>
            <xf:action ev:event="DOMActivate">
                <xf:setvalue ref="/schema/record/@postId" value=""/>
                <xf:setvalue ref="/schema/record/@postName" value=""/>
            </xf:action>
        </xf:trigger>
    </body>
</html>

Ранее мы познакомились с элементом управления xf:select1, который позволяет выбрать значение из списка. Однако, часто бывает, что список не является фиксированным, а хранится в базе. Также хочется, чтобы при этом была возможность поиска значений в этом списке. Для решения данных вопросов мы создали новый элемент xf:selector, который не описан в спецификации XForms. Внешне этот элемент выглядит как обычная кнопка, при щелчке на которую появляется кнопка выбора.

Этот элемент содержит следующие атрибуты:

  • buttonLabel - заголовок кнопки;
  • procListAndCount - процедура, возвращающая список значений для выбора;
  • currentValue - текущее значение, которое будет стоять по умолчанию в окне выбора;
  • generalFilters - xml с параметрами, которые будут передаваться в процедуру;
  • xpathMapping - заполнение формы.

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

ALTER PROCEDURE [dbo].[postListAndCount](
   @main_context nvarchar(512)='' ,  
   @add_context nvarchar(512)='' ,  
   @filterinfo xml='',  
   @session_context xml='',
   @params xml='',
   @curValue VARCHAR(MAX)='',
   @startsWith BIT='',
   @firstRecord INT='0',
   @recordCount INT='10',
   @countAllRecords INT='10' OUTPUT
   ) 
   AS
   BEGIN
   
      IF @startsWith = 1
         SET @curValue = @curValue + '%'
      ELSE
         SET @curValue = '%'+@curValue+'%';
      
      WITH result AS (
         SELECT 
            uid as id,
	    [name] as name,
            ROW_NUMBER() OVER (ORDER BY [name]) AS rnum 
         FROM posts WHERE [name] LIKE @curValue)
      SELECT
        id, name  FROM result WHERE rnum BETWEEN (@firstRecord + 1) AND (@firstRecord + @recordCount)
        ORDER BY rnum;	
        
      SELECT @countAllRecords = COUNT(*) FROM posts WHERE name LIKE @curValue;           
        
   END

Помимо стандартных переменных контекста она содержит следующие переменные:

  • @params - xml, который формируется из значений в generalFilters
  • @curValue - текущее значение
  • @startsWith - фильтрация происходит c начала или по вхождению
  • @firstRecord и @recordCount - с какой позиции начинать отображение и сколько значений отображать (т.к. запрос к базе всегда происходит при каждой прокрутке ползунка)
  • @countAllRecords - возвращаемое количество значений из списка (нужен для расчета размера ползунка и необходимости его наличия)

Также процедура возвращает таблицу. Обязательными столбцами являются id и name. При этом в списке селектора будет отображаться именно name. Заполнение выбранными значениями происходит с помощью атрибута xpathMapping, в котором прописываются пары "заполняемый узел" - "столбец из выбранной записи". Обратите внимание, что все XPath-выражения в селекторе прописываются через функцию XPath().