среда, 2 февраля 2011 г.

Zeta3 - изменения языка описания тем

Дружественный синтаксис импорта элементов
Это самое значимое изменение синтаксиса. Решает серьезную проблему использования XPath в предыдущей версии. Пользователи, конструкторы в принципе не понимали конструкций типа embed "((_SELFELEMENT/reprotset[@id='${id}'])[position()=last()])/*" и могли только как-то случайно догадываться что же происходит при ее выполнении.
Вместо зубодробительного оператора embed, перенесенного теперь в ядро загрузчика BXL и выполняющего системные функции и замены введен оператор include.
include позволяет указать имя элемента, его идентификатор, из какого источника взять (по умолчанию текущая тема) и как использовать (взять самый последний, объединить из всех импортированных тем и т.п.).
include выполняется ПОСЛЕ применения параметров в конструкции ${paramname} и при этом правильно ведет себя с подстановками параметров в виде ${paramname}:
при стандартном импорте из текущей темы все уже итак настроено на текущую тему,
при импорте из другой темы все импортируется как есть без попыток приписать свои значения,
при импорте из глобальной области (где заведомо еще не было применения параметров) - параметры повторно применяются.


Полный синтаксис include (в квадратных скобках [..] указаны необязательные элементы, вертикальная черта "|" разделяет варианты, курсивом parameter указаны части в которые требуется поставить пользовательское значение:
include ELEMENTNAME, ELEMENTID [,all] [,outer] [,source=root|THEMACODE]
где 
  • ELEMENTNAME - имя элемента который требуется включить, например reportset, reportsetex
  • ELEMENTID - код (ИД) элемента
  • all - означает, что надо объединить содержимое всех элементов (по умолчанию берется последний, дочерняя тема переопределяет импортированные)
  • outer - означает, что нужно взять элемент целиком (по умолчанию берется СОДЕРЖИМОЕ элемента)
  • source - источник элемента, по умолчанию - текущая тема, source=root  запрашивает данные из всего файла тем, от корня, source=THEMACODE запрашивает данные из указанной темы.
ПРИМЕРЫ:

1. Простая заготовка под перекрытие в дочерних темах

thema t1:
       item i1 :
                include reportset, Aa
       reportset Aa :
                col mycol

thema t2 :
       imports t1
       reportset Aa :
                col c1
Во второй теме появится:
item i1 :
        col c1
а mycol будет перекрыт

2. Простая заготовка под расширение в дочерних темах

thema t1:
       item i1 :
                include reportsetex, Aa

       reportsetex Aa :

                col mycol
thema t2 :
       imports t1
       reportsetex Aa :
                col c1
В теме t2 будет и колонка c1 и колонка mycol  в прямом порядке наследования

3. Использование корня тем с пост подстановкой параметров

thema t1:
       rootrow=myrow
       item i1 :
                include reportset, mainrow, source=root
....
#где-то может вообще в другом файле
reportset mainrow :
         row "${rootrow}"

В итоге в t1 будет:
item i1 :
        row myrow

4. Импорт контента из другой темы (пока видно одно полезное использование - можно сделать псведотему с одним префиксом безопасности и затащить в нее отчеты, формы в готовом виде из других тем, без полного импорта темы)

thema t1 :
           item i1 :
                     row row1
           item i2 :
                     row row10

thema t2 :
           item i1 :
                     row row2
           item i2 :
                     row row20
thema t3 :
          include item, i1, outer, from=t1
          include item, i2, outer, from=t2


Теперь в t3:

thema t3 :
          item i1 :
                     row row1
          item i2 :
                     row row20
Причем если были подстановки ${paramname}, сохранятся значение ИСХОДНЫХ тем

ПРОЧИЕ НОВОВВЕДЕНИЯ
  • Упрощенный автоимпора
для того чтобы тема могла использовать код другой в качестве имени элемента с автоимпортом целевая тема не обязана быть абстрактной, так, теперь вполне работает:
thema t1 
t1 t2
t2 t3
что эквивалентно:
thema t1
thema t2:
          imports t1
thema t3:
          imports t2
Ранее же, t1 и t2 были обязаны быть абстрактными.
  • Упразднена разница между abst и this.active=false
Сама по себе абстрактность темы эквивалентна ее неактивности, никакого большего смысла эта конструкция не несет и упраздняется, abst оставлен для совместимости и более простого кодирования, для самой же системы abst - эквивалент this.active=false
  • Автоматическая проверка наличия циклических связей
  • Имя темы по умолчанию равно коду темы
  • Более четкая модель сведения импорта и уровней тем (исключает конфликты порядка описания тех или иных элементов)
В частности не имеет больше значения порядок описания параметров.
Так если раньше:
thema t1 :
      x="x${y}x"
      y="y${z}y"
      z="z"
привело бы к  неправильному результату:
thema t1 :
      x="xx"
      y="yy"
      z="z"
То теперь все нормально:
thema t1 :
      x="xyzyx"
      y="yzy"
      z="z"
  • Более четкая модель поддержки генериков
Конструкция ZZindexZZ  заменяется ZZZ, генерики обрабатываются ДО основных тем без резольвинга параметров, но с прошивкой своих кодов в генерики.

Комментариев нет:

Отправить комментарий