CommuniGate Pro
Версия 6.4
 

Программирование Веб-Сервера (WSSP)

Модуль Веб Приложения CommuniGate Pro обрабатывает запросы для файлов WSSP вызывая компонент, который создаёт набор данных - словарь, содержащий ключи - текстовые строки и значения, связанные с этими ключами. Значения могут быть текстовыми строками, числами, отметками времени, массивами или словарями. Дополнительную информацию о типах данных смотрите в разделе Данные.

Например, когда требуется вывести страницу Домена по умолчанию, вызывается специальный компонент. Компонент обрабатывает параметры запроса (HTML FORM) и создаёт набор данных - словарь, содержащий ключи и их значения. Например, набор данных, созданный компонентом при обработке запроса на Вход (Login) может содержать ключи canAutoSignup, hasMailLists и hasCertificate.

Модуль Веб Приложения может затем использовать код сценария из файла WSSP для преобразования этого набора данных в страницу, использующую язык разметки (HTML, WML и т.д.).




Элементы Сценария

Файл WSSP является файлом с языком разметки (обычно - HTML) с двумя дополнительными типами элементов:
  • текстовыми элементами, начинающимися и заканчивающимися двумя символами процентов (%%)
  • структурными элементами, начинающимися маркером <!--%% и заканчивающимися маркером -->.

Ниже приводится образец документа WSSP:

<html>
<body>

<h1>Welcome to %%server%%. Your ID is %%ID%%.</h1>

<!--%%IF EXISTS(lastLogin)-->
Last time you visited us on %%lastLogin%%
<!--%%ENDIF-->


</body>
</html>

Этот WSSP документ содержит текстовые элементы %%server%%, %%ID%% и %%lastLogin%%, а также структурные элементы <!--%%IF EXISTS(lastLogin)--> и <!--%%ENDIF--> (эти текстовые элементы являются фиктивными, не пытайтесь использовать эти примеры в ваших .wssp страницах).

Если документ WSSP должен содержать символы вне таблицы ASCII, то должна использоваться кодировка UTF-8. При обработке документа WSSP, модуль Веб Приложения запрашивает значение строки charset из созданного словаря с данными. Если это значение не равно UTF-8, то текст WSSP преобразовывается в эту кодировку страницы.


Выражения

Текстовые и структурные элементы WSSP используют выражения - комбинации имён и символов, при помощи которых задаются данные, получаемые из словарей и других доступных источников данных.

В сценариях WSSP используется несколько типов выражений:

  • элемент данных
  • итератор массива
  • элемент с ключом
  • элемент с индексом
  • вызов функции
  • логическое выражение
  • строковая константа

Алфавитно-цифровая строка (такая, как system или id) является именем элемента данных. Значением такого выражения является значение из набора данных, связанного с этим именем. Если в наборе данных не имеется указанного ключа, то значением выражения является нулевое значение.
Пример: набор данных имеет ключ system и связанное с ним значение строку Sun Solaris; соответственно, значением выражения system является строка Sun Solaris.

Словарь набора данных является независимым от регистра, так что имена элементов данных также являются независимыми от регистра.

Алфавитно-цифровая строка, за которой следуют символы []интерпретируется как имя итератора индекса. Оно может использоваться только внутри структуры <!--%%FOREACH name...--> ....<!--%%ENDFOR name-->, где определён этот элемент с индексом (смотрите ниже). Имена итераторов индекса независимы от регистра.

Выражение, за которым следует символ точка (.) и алфавитно-цифровая строка является элементом с ключом. Выражение до символа точки вычисляется, и его значение должно быть словарём. Алфавитно-цифровая строка после символа точки задаёт ключ, который будет использоваться для получения значения из этого словаря. Если значением выражения до символа точка не является словарь, или если он не содержит указанного ключа, то значение элемента с ключом является нулевым.
Ключи могут быть указаны как строки в кавычках, в этом случае они могут содержать не алфавитно-цифровые символы.
Пример: набор данных имеет ключ settings и связанный с ним словарь из двух элементов {OS = "Sun Solaris"; CPU = "sparc";}. Значением выражения settings.OS будет строка Sun Solaris, значение выражения settings."OS1" будет пустым.

Выражение, за которым следует выражение индекса в квадратных скобках ([index]) является элементом с индексом. Выражение до квадратной скобки вычисляется, его значение должно быть массивом или словарём. Выражение индекса вычисляется и его значением должно быть число или числовая строка. Это число указывает, какой именно элемент массива или ключ словаря будет значением этого индексированного выражения. Если значение выражения индекса равно 0, то возвращается первый элемент массива или первый ключ словаря.
Выражение индекса может быть задано как числовая константа.
Если значение выражения до символа квадратная скобка не является массивом или словарём, или значение выражения индекса не является числом, или если значение выражения индекса имеет отрицательное, либо равное, либо большее, чем число элементов массива/словаря, значение, то значение выражения индекса считается пустым.

Алфавитно-цифровая строка, за которой следует символ (, является вызовом функции. Элементы после символа ( задают параметры функции, за которыми должен следовать символ ).
Имена функций независимы от регистра.
В списке ниже приводятся все доступные функции и их параметры.

Логические выражения являются двумя выражениями, разделёнными символами | (ИЛИ), символом & (И) или символом ^ (ИСКЛЮЧАЮЩЕЕ ИЛИ).
Так же возможно использование скобок:

expression1 | expression2
expression1 & expression2
(expression1 & expression2) | expression3

Логическое (булево) значение выражения положительно (истинно), если:

  • значение выражение является строкой, не начинающейся с символов N, n, - и 0, или
  • значение выражения является ненулевым числом.
  • значение выражения является отметкой времени, и это не константа "далёкое прошлое".

Строковая константа заключается в двойные кавычки. Символы двойной кавычки и обратной косой черты должны быть защищены в константной строке символом обратной косой черты \: "My \"test\" string".

SESSION(key)
Эта функция может использоваться только в связанных с сессиями запросах. Значением функции является значение набора данных сессии, связанного со строкой key. Параметр key может быть задан как алфавитно-цифровая строка или константная строка.
Пример: значением выражения SESSION(accountName) является имя Пользователя CommuniGate Pro, для которого была открыта эта сессия.
Набор данных сессии является независимым от регистра. В нём содержатся следующие ключи и значения:
КлючЗначение
IDстрока с уникальным идентификатором этой сессии
accountNameстрока с именем Пользователя сессии
domainNameстрока с именем Домена, которому принадлежит Пользователь этой сессии
filesRefстрока с префиксом URL, необходимым для получения файлов Вида Интерфейса сессии
fullAccountNameстрока с полным именем Пользователя сессии accountName@domainName
loginAddressстрока, содержащая сетевой (IP) адрес, с которого этот пользователь установил сессию
loginTimeотметка времени начала сессии
selectableMailboxesмассив, в котором содержатся имена всех "выбираемых" папок
addressBooksмассив, в котором содержатся имена всех доступных адресных книг
webFoldersмассив с именами папок в Хранилище Файлов
selectedMailboxстрока с именем Папки назначения для последней операции Копировать/Передвинуть
selectedAddressBookстрока с именем выбранной адресной книги.
selectedWebFolderстрока с именем Папки в Хранилище Файлов, выбранной для последней операции Записать Файлы
webSiteEnabledэтот элемент - строка со значением "YES" существует, если Лимит Хранилища для Хранилища Файлов не установлен в ноль
openMailboxesсловарь со всеми открытыми Папками (ключами словаря являются имена Папок в кодировке UTF8).

Веб Приложения CG/PL могут добавлять ключи в набор данных сессии.
SETTINGS(key)
Эта функция может использоваться только в запросах внутри сессий. Значением функции является значение фактически действующей настройки Веб Интерфейса Пользователя, связанной со строкой key. Параметр key может быть задан как алфавитно-цифровая строка или константная строка.
ACCOUNTSETTINGS(key)
Эта функция может использоваться только в запросах внутри сессий. Значением функции является значение фактически действующей установки Пользователя, связанной со строкой key. Параметр key может быть задан как алфавитно-цифровая строка или строка в кавычках.
INCLUDEARG(number)
Эта функция может использоваться только внутри включаемого файла. Key должно быть десятичным числом, указывающим номер параметра элемента <!--%%INCLUDE--> которым был вызван этот файл.
Первый параметр имеет номер 0.
Если в элементе <!--%%INCLUDE--> не было указано достаточное количество параметров, то значение функции является пустым.
EXISTS(expression)
Параметром является выражение. Его значение вычисляется, и функция возвращает строку "YES", если вычисленное значение не является нулевым или строку "NO", если возвращённое значение является нулевым.
DOESNOTEXIST(expression)
Параметром является выражение. Его значение вычисляется, и функция возвращает строку "NO", если вычисленное значение не является нулевым или строку "YES", если возвращённое значение является пустым.
YESNO(expression)
Параметром является выражение. Его логическое значение вычисляется и, если оно положительно (истинно), то функция возвращает строку "YES"; в противном случает она возвращает строку "NO".
BOOLARRAY()
Значением является массив из двух элементов, содержащий строки "NO" и "YES".
NOT(expression)
Параметром является выражение. Вычисляется логическое значение и функция возвращает пустое значение, если значение положительно (истинно); иначе функция возвращает строку "YES".
EQUALS(expression1 AND expression2)
Оба выражения вычисляются и, если вычисленные значения совпадают (включая случай, когда оба выражения имеют пустое значение), то функция возвращает строку "YES". В противном случае функция возвращает пустое значение.
EQUALSNOCASE(expression1 AND expression2)
Оба выражения вычисляются. Функция возвращает строку "YES", если оба вычисленных выражения имеют пустое значение, либо они являются строками, и эти строки совпадают при использовании независимой от регистра операции сравнения ASCII строк. Во всех других случаях функция возвращает пустое значение.
EQUALS(expression AND string)
Значение выражения вычисляется и сравнивается с константной строкой. Если значение соответствует строке, то функция возвращает строку "YES". В противном случае функция возвращает пустое значение.
EQUALSNOCASE(expression AND string)
Значение выражения вычисляется и сравнивается с константной строкой. Функция возвращает строку "YES", если вычисленное выражение совпадает со строкой при использовании независимой от регистра операции сравнения ASCII строк. В противном случае функция возвращает пустое значение.
ISINDEX(expression IN scanner)
Параметр scanner должен быть именем внешней по отношению к этой части кода сценария конструкции <!--%%FOREACH scanner IN ...-->. Значение выражения вычисляется и, если строка и её числовое значение совпадают с текущим индексом в массиве, для которого используется этот scanner, то функция возвращает строку "YES". В противном случае функция возвращает пустое значение.
ISFIRST(scanner)
Параметр scanner должен быть именем внешней по отношению к этой части кода сценария конструкции <!--%%FOREACH scanner IN ...-->. Если текущее значение индекса массива равно нулю, то функция возвращает строку "YES". В противном случае функция возвращает пустое значение.
ISLAST(scanner)
Параметр scanner должен быть именем внешней по отношению к этой части кода сценария конструкции <!--%%FOREACH scanner IN ...-->. Если текущее значение индекса равно числу элементов массива или словаря минус единица, то функция возвращает строку "YES". В противном случае функция возвращает пустое значение.
ISEVEN(scanner)
Параметр scanner должен быть именем внешней по отношению к этой части кода сценария конструкции <!--%%FOREACH scanner IN ...-->. Если текущее значение индекса чётное, то функция возвращает строку "YES". В противном случае функция возвращает пустое значение.
ISHALF(scanner)
Параметр scanner должен быть именем внешней по отношению к этой части кода сценария конструкции <!--%%FOREACH scanner IN ...-->. Если текущее значение индекса равно числу элементов массива или словаря, разделённому на 2, то функция возвращает строку "YES". В противном случае функция возвращает пустое значение.
CHECKED(expression)
Параметром является выражение. Вычисляется его логическое значение и, если значение положительно (истинно), то функция возвращает строку "checked"; в противном случае функция возвращает пустое значение.
HASPARENTMAILBOX(expression)
Параметром является выражение. Его значение вычисляется, и функция возвращает строку "YES", если вычисленное значение является строкой, являющейся именем иерархической папки. В противном случае функция возвращает пустое значение.
ISSTRING(expression)
Параметром является выражение. Его значение вычисляется, и функция возвращает строку "YES", если вычисленное значение является строкой. В противном случае функция возвращает пустое значение.
ISNUMBER(expression)
Параметром является выражение. Его значение вычисляется, и функция возвращает строку "YES", если вычисленное значение является числом. В противном случае функция возвращает пустое значение.
ISARRAY(expression)
Параметром является выражение. Его значение вычисляется, и функция возвращает строку "YES", если вычисленное значение является массивом. В противном случае функция возвращает пустое значение.
ISDICTIONARY(expression)
Параметром является выражение. Его значение вычисляется, и функция возвращает строку "YES", если вычисленное значение является словарём. В противном случае функция возвращает пустое значение.
ISDATE(expression)
Параметром является выражение. Его значение вычисляется, и функция возвращает строку "YES", если вычисленное значение является отметкой времени. В противном случае функция возвращает пустое значение.
ISDATA(expression)
Параметром является выражение. Его значение вычисляется, и функция возвращает строку "YES", если вычисленное значение является блоком данных. В противном случае функция возвращает пустое значение.
NULL()
Эта функция возвращает пустое значение.
EMPTYSTRING()
Значением этой функции является пустая строка.
EMPTYARRAY()
Значением этой функции является пустой массив.
EMPTYDICTIONARY()
Значением этой функции является пустой словарь.
CURRENTTIME()
Значением функции является отметка времени - текущее глобальное время.
SELECTEDLANGUAGE()
Значением функции является строка с именем текущего "выбранного языка".
SELECTEDTIMEZONE()
Значением функции является строка с именем текущего "выбранного часового пояса".
STRING(key)
Значением этой функции является объект, связанный с key в Наборе Текстовых Данных Вида Интерфейса. Объект должен быть строкой, в противном случае функция возвращает пустое значение. Ключ может быть задан либо как строка в кавычках, либо как выражение - значение выражения вычисляется и используется как ключ.
DICTIONARY(key)
Значением этой функции является объект, связанный с key в Наборе Текстовых Данных Вида Интерфейса. Объект должен быть словарём, в противном случае функция возвращает пустое значение. Ключ может быть задан либо как строка в кавычках, либо как выражение - значение выражения вычисляется и используется как ключ.
ARRAY(key)
Значением этой функции является объект, связанный с key в Наборе Текстовых Данных Вида Интерфейса. Объект должен быть массивом, в противном случае функция возвращает пустое значение. Ключ может быть задан либо как строка в кавычках, либо как выражение - значение выражения вычисляется и используется как ключ.
TRANSLATE(string USING dictionary)
Параметр string должен быть выражением со значением типа строка; параметр dictionary должен быть выражением со значением типа словарь. Если для ключа, заданного значением первого параметра в словаре содержится значение типа строка, то функция возвращает эту строку. В противном случае возвращается значение параметра string;
Пример: набор данных содержит элемент boxName со значением типа строка INBOX и элемент boxNames - словарь {INBOX = Incoming; Trash = "Trash Can";}. Значением выражение TRANSLATE(boxName USING boxNames) является строка "Incoming".
CONTAINS(string IN array)
Если значение параметра array является массивом и строка совпадает с одним из элементов массива, то функция возвращает строку "YES". В противном случае функция возвращает пустое значение.
Строка может быть задана либо как константная строка, либо как выражение.
RANDOMELEMENT(array)
Параметр array должен иметь значение типа массив; значением этой функции является случайным образом выбранный элемент массива.
MONTHNAMES()
Функция возвращает фиксированный массив из 12 строковых элементов: ("Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec").
WEEKDAYS() и WEEKDAYS(expression)
Если выражение не указано, то функция возвращает фиксированный массив из 7 строковых элементов: (Sun,Mon,Tue,Wed,Thu,Fri,Sat).
Если указано выражение, то его значением должна быть строка с одним из названий дня недели; в этом случае функция возвращает массив с названиями дней недели, начинающийся с указанного дня недели:
WEEKDAYS(startOfWeek)
возвращает ("Tue","Wed","Thu","Fri","Sat","Sun","Mon") если значение переменной startOfWeek было "Tue".
KNOWNCHARSETS()
Функция возвращает фиксированный массив строковых элементов - названий кодировок, известных системе: ("ISO-8059-1","ISO-2022-jp","KOI8-R", ...).
KNOWNTIMEZONES()
Функция возвращает фиксированный массив строковых элементов - названий часовых поясов, известных системе ("NorthAmerica/Pacific","Europe/Central","(+0900) Japan/Korea", ...)
REQUESTSECURE()
Функция возвращает строку "YES", если текущий HTTP запрос является безопасным (то есть, отправленным по протоколу HTTPS); в противном случае функция возвращает пустое значение.
REQUESTRESOURCE()
Функция возвращает строку ресурса (локальную часть строки URL, возможно с параметрами) текущего запроса HTTP.
REQUESTSOURCEIP()
Функция возвращает строку с Адресом IP, с которого был получен запрос HTTP.
SERVERVERSION()
Функция возвращает строку с номером версии Сервера CommuniGate Pro.

Текстовые Элементы

Текстовые элементы указываются в двойных знаках процентов. Телом текстового элемента является выражение (возможно с префиксом).

%%expression%%
Выражение вычисляется. Если значением выражения является строка или число, то оно заменяет собой текстовый элемент в результирующем коде разметки.
В противном случае весь текстовый элемент удаляется из результирующего кода разметки.
%%HTML:expression%%
Выражение вычисляется. Если значением выражения является строка или число, то оно заменяет собой текстовый элемент, используя специальные символы HTML. Значение строки конвертируется из UTF-8 в требуемую кодировку.
В противном случае весь текстовый элемент удаляется из результирующего кода разметки.
Пример:
Если результатом выражения является строка ">=GO=>", то этот текстовый элемент заменяется на:
&gt;=GO=&gt;
%%HTMLUTF8:expression%%
Выражение вычисляется. Если значением выражения является строка или число, то оно заменяет собой текстовый элемент, используя специальные HTML символы (строка не конвертируется из UTF-8 в кодировку страницы).
В противном случае весь текстовый элемент удаляется из результирующего кода разметки.
Пример:
Если результатом выражения является строка >=GO=>, то этот текстовый элемент заменяется на:
&gt;=GO=&gt;
%%URL:expression%%
Выражение вычисляется. Если значением выражения является строка или число, то оно заменяет собой текстовый элемент, используя специальные символы для URL.
В противном случае весь текстовый элемент удаляется из результирующего кода разметки.
Пример:
Если результатом выражения является строка "Stop It?", то этот текстовый элемент заменяется на:
Stop%20It%3F
%%MAILBOXRAWNAME:expression%%
Выражение вычисляется. Если значение не является строкой, то весь текстовый элемент удаляется из результирующего кода разметки. Если результатом является строка, то она преобразовывается из кодировки IMAP для имён папок в кодировку UTF-8, затем она преобразовывается в требуемую кодировку, а затем преобразованная строка заменяет собой текстовый элемент, используя специальные HTML символы.
%%MAILBOXNAME:expression%%
Выражение вычисляется. Если значение не является строкой, то весь текстовый элемент удаляется из результирующего кода разметки. Если результатом является строка X, то вычисляется выражение TRANSLATE(X USING DICTIONARY("MailboxNames")). Затем префикс работает аналогично префиксу MAILBOXRAWNAME:.
%%MAILBOXLASTNAME:expression%%
Выражение вычисляется. Если значение не является строкой, то весь текстовый элемент удаляется из результирующего кода разметки. Если результатом является строка X, то она интерпретируется как имя папки. Если это имя иерархической папки, то используется только последняя часть имени; в противном случае используется всё имя. Имя (или его последняя часть) преобразовывается таким же образом, как и при использовании префикса MAILBOXNAME:.
%%URLMAILBOXPARENT:expression%%
Выражение вычисляется. Если значение не является строкой, то весь текстовый элемент удаляется из результирующего кода разметки. Если результатом является строка X, то она интерпретируется как имя папки. Если это имя иерархической папки, то используется имя родительской папки. Оно преобразовывается таким же образом, как и при использовании префикса URL:. Если это имя не иерархической папки, то весь текстовый элемент удаляется из результирующего кода разметки.
%%JAVASCRIPT:expression%%
Выражение вычисляется. Если значение не является строкой или числом, то весь текстовый элемент удаляется из результирующего кода разметки. Если значением выражения является строка или число, то оно заменяет собой текстовый элемент, используя специальные символы для JavaScript. Результат преобразовывается в Unicode и все символы вне ASCII представляются в виде последовательностей \uhhhh.
Обратите внимание: этот префикс не ставит знаков кавычек в начале и в конце строки.
Пример:
если результатом выражения является строка 'What do "they" think?', то этот текстовый элемент заменяется на:
What do \"they\" think
%%JSON:expression%%
Выражение вычисляется. Значение конвертируется в представление JSON (JavaScript Object Notation), и эта строка подменяет собой текстовый элемент. Отметки времени представляются как строки дат в формате RFC822.
Пример:
если результатом выражения является массив ( 'What do "they" think?', #123), то этот текстовый элемент заменяется на:
["What do \"they\" think",124]
%%SIZE:expression%%
Выражение вычисляется. Если значение не является строкой или числом, то весь текстовый элемент удаляется из результирующего кода разметки.
Если значением выражения является строка, то она конвертируется в числовое значение (число байт).
Строка должна содержать некоторое число и, возможно, суффикс k или K (в этом случае число умножается на 1024), либо суффикс m или M suffix (в этом случае число умножается на 1048576).
В качестве альтернативы, строка может начинаться с буквы u или U; в этом случае она конвертируется в числовое значение -1.
Если значением выражения является число, то используется это числовое значение.
Результирующее число преобразовывается в "строку размера" с использованием словаря, получаемого при помощи выражения DICTIONARY("SizePictures"). Если число отрицательное, то для трансляции строки unlimited применяется словарь и результат используется для замещения этого текстового элемента; при этом проводятся такие же преобразования, как и для текстового элемента с префиксом HTML:.
Далее проверяется, является ли вычисленное число байт целым числом Мегабайт или Килобайт, и больше ли оно чем один. Затем из словаря получается значение строки, связанной с ключом "M", "K" или "" (пустая строка). Предполагается, что в строке содержится комбинация символов ^0, замещаемая числом мегабайт, килобайт или байт, заданных в значении expression. Результирующая строка обрабатывается аналогично методу, используемому префиксом текстового элемента HTML:.
Если результатом выражения DICTIONARY("SizePictures") является пустое значение, или словарь не содержит значения строки для требуемого ключа, то результирующая строка строится с использованием числа и имени ключа (20M, 1345K, 182345777).
%%ROUNDSIZE:expression%%
Этот префикс работает так же, как и префикс SIZE:, но числовое значение expression может быть изменено: если значение равно или больше 10000, то оно конвертируется в значение, выраженное в "Кило" (значение = значение / 1024 * 1024), а если значение больше либо равно чем 10240000, то оно конвертируется в значение, выраженное в "Мега" (значение = значение / 1048576 * 1048576).
%%TIME:expression%%
Выражение вычисляется.
Если результат является пустым значением, то весь текстовый элемент удаляется из результирующего кода разметки.
Если результатом является число, то его значение интерпретируется как число секунд.
Если значением выражения является строка, то она конвертируется в числовое значение (число секунд):
Строка должна содержать некоторое число и, возможно, либо суффикс s или S, либо суффикс m или M (в этом случае число умножается на 60), либо суффикс h или H (в этом случае число умножается на 3600), либо суффикс d или D (в этом случае число умножается на 86400).
Результирующее число преобразовывается в "строку времени" с использованием словаря, получаемого при помощи выражения DICTIONARY("TimePictures").
Далее проверяется, является ли вычисленное число секунд целым числом недель, дней, часов или минут, и больше ли оно чем один. Затем из словаря получается значение строки, связанной с ключом weeks, days, hours, minutes или seconds. Предполагается, что в строке содержится комбинация символов ^0, замещаемая числом недель, дней, часов, минут или секунд, заданных в значении expression. Результирующая строка преобразовывается из UTF-8 в требуемую кодировку, а затем преобразованная строка заменяет собой текстовый элемент, используя специальные символы HTML.
Если результатом выражения DICTIONARY("TimePictures") является пустое значение, или словарь не содержит значения строки для требуемого ключа, то результирующая строка строится с использованием числа, пробела и имени ключа (3 weeks, 11 hours, 5 seconds).
Пример:
Если элемент данных elapsedTime равен строке 2400, то текстовый элемент
%%TIME:elapsedTime%%
будет заменяться следующей строкой:
40 minutes

Если DICTIONARY("TimePictures") существует и содержит в ключе minutes значение "^0mins", то текстовый элемент
%%TIME:elapsedTime%%
будет заменяться на строку
40mins
%%DATETIME(formatName):expression%%
Выражение вычисляется. Если значение не является отметкой времени, то весь текстовый элемент удаляется из результирующего кода разметки. Если значение является отметкой времени, то оно преобразовывается в текстовую строку заданного формата.
Параметр format может быть задан как алфавитно-цифровая строка или строка в кавычках.
Строка формата является результатом выражения DICTIONARY("DatePictures").formatName Если это выражение не имеет результата в виде текстовой строки, то вместо него используется строка ((^h:^m:^s ^W ^D-^M-^Y)). Строка формата является результатом выражения DICTIONARY("DatePictures").formatName Если это выражение не имеет результата в виде текстовой строки, то вместо него используется строка ((^h:^m:^s ^W ^D-^M-^Y)).
При обработке строки формата соответствующие комбинации символов заменяются фактическими значениями отметок времени:
символызаменяются на
^Dдень месяца (2 цифры)
^dдень месяца (1 или 2 цифры)
^Mимя месяца (одно из возвращаемых функцией MONTHNAMES()), транслированное через словарь DICTIONARY("DatePictures"))
^Nномер месяца (2 цифры, от 01 до 12)
^Yгод (2 цифры)
^yгод (4 цифры)
^sзначение секунд (2 цифры)
^mзначение минут (2 цифры)
^Hзначение часов (2 цифры), от 00 до 23
^hзначение часов (1 или 2 цифры), от 12, 1 и до 11
^tстрока AM или PM, транслированная через DICTIONARY("DatePictures")
^wномер дня недели (Воскресенье - 0)
^Wимя дня недели (одно из возвращаемых функцией WEEKDAYS()), транслированное через словарь DICTIONARY("DatePictures")

Результирующая строка помещается в код разметки с использованием такой же обработки, как и у префикса HTML:.
%%LOCALDATETIME(formatName):expression%%
Обработка совпадает с используемой в префиксе DATETIME(formatName), но значение отметки времени преобразовывается сначала в местное время.
%%DATETIMEAS(format):expression%%
Выражение вычисляется. Если значение не является отметкой времени, то весь текстовый элемент удаляется из результирующего кода разметки. Если значение является отметкой времени, то оно преобразовывается в текстовую строку заданного формата.
Параметр format должен быть строкой или выражением со значением типа строка. Эта строка используется в качестве строки формата.
%%LOCALDATETIMEAS(format):expression%%
Обработка совпадает с используемой в префиксе DATETIMEAS(format), но значение отметки времени преобразовывается сначала в местное время.
%%DATE:expression%%
Обрабатывается так же, как префикс DATETIME("dateOnly").
%%LOCALDATE:expression%%
Обрабатывается так же, как префикс LOCALDATETIME("dateOnly").
%%DATEWEEK:expression%%
Обрабатывается так же, как префикс DATETIME("dayAndDate").
%%DATETIME:expression%%
Обрабатывается так же, как префикс DATETIME("dateAndTime").
%%LOCALDATETIME:expression%%
Обрабатывается так же, как префикс LOCALDATETIME("dateAndTime").
%%DATETIMESHORT:expression%%
Обрабатывается так же, как:
  • префикс DATETIME("timeOnly"), если значение отметки о времени, заданное в выражении, "очень близко" к текущему времени (абсолютная разница менее 22 часов),
  • префикс DATETIME("monthDate"), если значение отметки о времени, заданное в выражении, "близко" к текущей дате (абсолютная разница менее 180 дней),
  • префикс DATETIME("dateOnly") во всех остальных случаях.
%%LOCALDATETIMESHORT:expression%%
Обработка совпадает с используемой в префиксе DATETIMESHORT:, но значение выражения преобразовывается сначала в местное время.
%%HTMLTRUNCATED(number):expression%%
Выражение вычисляется. Если значение не является строкой, то весь текстовый элемент удаляется из результирующего кода разметки. Если результатом является строка, то она обрезается, а затем из UTF-8 преобразовывается в требуемую кодировку, а далее преобразованная строка заменяет собой текстовый элемент, используя специальные HTML символы. Заменяется не более чем number число символов ("глифов"). Если в строке имеется большее количество глифов, то символы .. будут добавлены в конец строки.
Пример: если результатом выражения является строка "Test Subject", то текстовый элемент с префиксом HTMLTRUNCATED(10) заменяется на
Test Subje..
%%HTMLTRUNCATED(expression1):expression%%
Аналогично вышеописанному, но параметр expression1 является вычисляемым выражением. Параметр expression1 должен иметь числовое значение. Это значение задаёт число глифов, которое будет взято из строки expression.
Пример: HTMLTRUNCATED(STRING("FieldLength")):theField
%%HTMLSUBST(parameter0,parameter1,...):expression%%
Вычисляются выражение и все N параметров. Если значения параметров не является строкой, то весь текстовый элемент удаляется из результирующего кода разметки. Если результатом является строка, то все её подстроки вида ^N заменяются на строковые значения выражения parameterN (подстроки ^0 заменяются на значения parameter0, подстроки ^1 заменяются на значения parameter1 и т.д.). Если значением параметра не является строка, то подстрока ^N удаляется.
Результирующая строка преобразовывается из кодировки UTF-8 в требуемую кодировку, а затем преобразованная строка заменяет собой текстовый элемент, используя специальные HTML символы.
Пример: если элемент text1 Набора данных Text является строкой "My String1", элемент var2 Набора данных Result является My Var2, а элемент text2 Набора данных Text является строкой "comparing ^0 & ^1" , то следующий код:
%%HTMLSUBST(STRING("text1"),var2):STRING("text2")%%
будет заменяться на строку
comparing My String1 &amp; My Var2
.
%%URLSUBST(parameter0,parameter1,...):expression%%
Аналогично вышеописанному, но результирующая строка заменяет собой этот текстовый элемент, используя специальные символы для URL.
%%INDEX:scanner%%
Параметр scanner должен быть именем внешней по отношению к этой части кода сценария конструкции <!--%%FOREACH scanner IN ...-->. Этот текстовый элемент заменяется на десятичное значение индекса сканнера. Для первого элемента используется значение 0.
%%INDEX1:scanner%%
Параметр scanner должен быть именем внешней по отношению к этой части кода сценария конструкции <!--%%FOREACH scanner IN ...-->. Этот текстовый элемент заменяется на десятичное значение индекса сканнера. Для первого элемента используется значение 1.
%%DUMP:expression%%
Выражение вычисляется. Текстовое представление значения выражения заменяет этот текстовый элемент.
%%LENGTH:expression%%
Выражение вычисляется.
Если значением является строка, то этот текстовый элемент заменяется на длину строки (в байтах).
Если значение является массивом, то этот текстовый элемент заменяется на количество элементов в массиве.
Если значением является словарь, то этот текстовый элемент заменяется на количество пар ключ-значение, содержащихся в этом словаре.
В противном случае, этот текстовый элемент удаляется.
%%CENTS:expression%%
Выражение вычисляется. Его числовое значение преобразовывается в числовую строку с как минимум 3 десятичными цифрами, а символ десятичной запятой (.) вставляется перед двумя последними десятичными цифрами. Результирующая строка заменяет собой этот текстовый элемент.

Структурные Элементы

Структурные элементы начинаются с маркера <!--%% и заканчиваются маркером -->. Сами структурные элементы всегда удаляются из результирующего кода разметки.

<!--%%IF expression-->
За этим структурным элементом могут следовать один или несколько элементов
<!--%%ELIF expression-->
за ними может идти элемент
<!--%%ELSE-->
за ними должен быть элемент
<!--%%ENDIF-->
.

Вычисляется логическое значение выражения элемента IF, затем вычисляются значения выражений ELIF (если они существуют) до тех пор, пока одно из этих значений не окажется положительным (истинно).
Если найден элемент с таким значением, то обрабатывается часть сценария, находящаяся между этим элементом и элементами ELIF, ELSE или ENDIF.
Если элемент не найден и элемент ELSE отсутствует, то сценарий между элементами IF и ENDIF удаляется полностью; в противном случае обрабатывается часть сценария, находящаяся между элементами ELSE и ENDIF.
Пример:
<!--%%IF EXISTS(lastLogin)-->We have not seen you since <i>%%HTML:lastLogin%%</i>
<!--%%ELSE-->Welcome, new user!
<!--%%ENDIF-->
Если в этом примере набор данных содержит элемент lastLogin со строковым значением 20-Apr-2007, то эта часть сценария выведет следующий текст:
We have not seen you since <i>20-Apr-2007</i>

Если набор данных не содержит элемента lastLogin, то эта часть сценария выведет следующий текст:
Welcome, new user!
<!--%%FOREACH scanner in expression-->
или
<!--%%FORALL scanner in expression-->
За этим структурным элементом может следовать элемент
<!--%%EMPTYFOR scanner-->
который должен оканчиваться элементом
<!--%%ENDFOR scanner-->
. Все элементы должны иметь одинаковую алфавитно-цифровую строку scanner.

Значение expression вычисляется. Результирующее значение должно быть массивом или словарём.
Часть сценария между элементами <!--%%FOREACH scanner ...--> и <!--%%EMPTYFOR scanner--> или (если элемент <!--%%EMTPYFOR scanner--> не существует) часть сценария между элементами <!--%%FOREACH scanner ...--> и <!--%%ENDFOR scanner--> обрабатывается повторно, для каждого элемента словаря или массива.

Выражения, заданные в этой части сценария (называемой "телом цикла") могут использовать ссылку на scanner scanner[] для того, что бы получить доступ к текущему элементу значения expression.
Если expression является словарём, то ссылка на ключ scanner[*] может использоваться для доступа к ключу текущего элемента.
Если значение expression не является массивом или словарём, или же если оно является пустым массивом или словарём и при этом задан элемент <!--%%EMPTYFOR scanner-->, то обрабатывается часть сценария между элементами <!--%%EMPTYFOR scanner--> и <!--%%ENDFOR scanner-->.
Пример:
<table border="1">
<tr><td>File Name</td><td>File Size</td></tr>
<!--%%FOREACH elem in fileList-->
<tr><td>%%HTML:elem[].name%%</td><td>%%elem[].size%%</td></tr>
<!--%%EMPTYFOR elem-->
<tr><td colspan="0">&nbsp;</td></tr>
<!--%%ENDFOR elem-->
</table>

В этом примере предполагается, что элемент данных fileList является массивом словарей. Предполагается, что в каждом словаре содержатся строковые значения для ключей name и size.
Если значением fileList является
({name=MyReport; size=2300;},{name="My Old Report"; size=4000;})
то эта часть сценария создаст следующий HTML код:
<table border="1">
<tr><td>File Name</td><td>File Size</td></tr>
<tr><td>MyReport</td><td>2300</td></tr>
<tr><td>My Old Report</td><td>4000</td></tr>
</table>


Конструкции <!--%%IF ...--> ...<!--%%ELSE--> ...<!--%%ENDIF--> и конструкции <!--%%FOREACH ...--> ... <!--%%ENDFOR ...--> могут быть вложенными.
<!--%%FOREACHINC scanner in expression-->
Аналогично конструкции <!--%%FOREACH , но часть кода в "теле цикла" повторяется на один раз больше, чем число элементов в массиве (или в словаре) значений expression.
Для этого дополнительного этапа значения scanner[*] и scanner[] являются пустыми.
Если значение expression не является массивом или словарём, то тело цикла не повторяется и обрабатывается часть сценария между элементами <!--%%EMPTYFOR scanner--> и <!--%%ENDFOR scanner--> (если они есть).
<!--%%FOREACHREV scanner in expression-->
Аналогично конструкции <!--%%FOREACH , но часть кода в "теле цикла" повторяется для каждого элемента массива (или словаря) в значении expression, взятых в обратном порядке (последний элемент - первым).
<!--%%INCLUDE filename[( parameter1 [, parameter2 ... ])]-->
Параметр filename должен быть константной строкой или выражением со значением типа строка.
Файл с указанным именем filename берётся из того же Вида Интерфейса, из которого был взят этот сценарий. В файле должен содержаться WSSP код. Этот код выполняется в текущем контексте (используя тот же набор данных).
Результирующий код разметки используется для замены этого структурного элемента.

Для файлов, предназначенных для использования в элементе INCLUDE, рекомендуется использовать расширения .wssi.

Элементы INCLUDE могут быть вложенными, то есть, файл .wssi может включать в себя другой файл .wssi.

В отличие от операторов #include в языках C и C++, этот оператор является реальным оператором, а не оператором препроцессора. В результате, если элемент <!--%%INCLUDE filename--> используется внутри конструкции <!--%%FOREACH ...--> ... <!--%%ENDFOR ...-->, то код filename может выполняться несколько раз, по разу для каждого элемента массива, используемого в конструкции FOREACH.

Вы также можете указать один или несколько параметров, заключив их в круглые скобки и разделяя их запятой. Каждый параметр является выражением, которое обрабатывается до выполнения кода filename.
Код в filename может получать значения параметров, используя функцию INCLUDEARG.
<!--%%NUMERICMENU selected [DEFAULT selectedDefault ] IN (number1,number2,....,numberN) [ DISPLAY dictionary]-->
Этот элемент заменяется на последовательность строковых элементов <option value="value">presentation.
Число элементов и value, используемое для каждого элемента, определяются согласно списку чисел number1,number2,....,numberN. Эти числа должны быть заданы в возрастающем порядке и не должны быть меньше -1.
Выражение selected вычисляется, и его значением должна быть строка. Строковое числовое значение используется для добавления ключевого слова selected в элемент <option value="value">, имеющий это же value.
Ключевое слово DISPLAY и выражение dictionary могут быть опущены. В этом случае строки presentation совпадают со строками value, то есть, эти строки являются числами.
Пример:
Элемент набора данных sizeLimit имеет строковое значение 200.
Элемент:
<!--%%NUMERICMENU sizeLimit IN (-1,0,100,200,300)-->
будет заменяться следующим текстом кода разметки:
<option value="-1">-1<option value="0">0
<option value="100">100<option value="200" selected>200<option value="300">300


Если ключевое слово DISPLAY и выражение dictionary указаны, то выражение вычисляется. Если значением выражения является словарь, то строки presentation являются числовыми значениями, "транслированными" через этот словарь; далее результат преобразовывается в требуемую кодировку и представляется при помощи специальных символов HTML.
Пример:
Элемент набора данных sizeLimit имеет строковое значение 200.
Текстовый набор данных Вида Интерфейса содержит словарь Limits: {"-1" = Unlimited; 0 = "Off & Shut";}.
Элемент:
<!--%%NUMERICMENU sizeLimit IN (-1,0,100,200,300) DISPLAY DICTIONARY("Limits")-->
будет заменяться следующим текстом кода разметки:
<option value="-1">Unlimited<option value="0">Off &amp; Shut
<option value="100">100<option value="200" selected>200<option value="300">300


Если указано ключевое слово DEFAULT с выражением selectedDefault, то дополнительная строка <option value="-2">defaultPresentation добавляется перед последовательностью. Если значение выражения selected является пустым, то к этому строковому элементу будет добавлено ключевое слово selected.

Строка defaultPresentation является строкой DefaultValuePicture, полученной из Текстового Набора данных Вида Интерфейса. Эта строка должна содержать комбинацию символов ^0. Эта комбинация символов заменяется на значение выражения selectedDefault. Если указан словарь DISPLAY, то значение выражения selectedDefault сначала транслируется.
Пример:
Элемент набора данных sizeLimit имеет строковое значение 200.
Элемент набора данных defLimit является строкой -1.
В Текстовом Наборе данных Вида Интерфейса содержится строка DefaultValuePicture: default(^0).
Текстовый набор данных Вида Интерфейса содержит словарь Limits: {"-1" = Unlimited; 0 = "Off & Shut";}.
Элемент:
<!--%%NUMERICMENU sizeLimit DEFAULT defLimit IN (-1,0,100,200,300) DISPLAY DICTIONARY("Limits")-->
будет заменяться на следующий текст разметки (HTML):
<option value="-2">default(Unlimited)
<option value="-1">Unlimited<option value="0">Off &amp; Shut
<option value="100">100<option value="200" selected>200<option value="300">300
<!--%%TIMEMENU selected [DEFAULT selectedDefault ] IN (time1,time2,....,timeN) [ DISPLAY dictionary]-->
Этот элемент обрабатывается так же, как и элемент NUMERICMENU. Единицы timeN задают временные интервалы, преобразовываемые в числовые значения (число секунд), используя такой же алгоритм, как и при обработке текстового элемента TIME:.
Выражения selected и selectedDefault должны возвращать строки. Каждая строка преобразовывается в числовое значение (число секунд), используя такой же алгоритм, как и при обработке текстовых элементов TIME:.
Значения транслируются при помощи указанного словаря DISPLAY. Если словарь DISPLAY не задан или не содержит для данного значения строки, то строки presentation для времени создаются с использованием такого же метода, как и при обработке текстовых элементов TIME:.
<!--%%SIZEMENU selected [DEFAULT selectedDefault ] IN (size1,size2,....,sizeN) [ DISPLAY dictionary]-->
Этот элемент обрабатывается так же, как и элемент NUMERICMENU. Единицы sizeN задают размеры данных, преобразовываемые в числовые значения (число байт), используя такой же алгоритм, как и при обработке текстовых элементов SIZE:.
Результатом выражений selected и selectedDefault должны быть строки. Каждая строка преобразовывается в числовое значение (число байт), используя такой же алгоритм, как и при обработке текстового элемента SIZE:.
Значения транслируются при помощи указанного словаря DISPLAY. Если словарь DISPLAY не задан или не содержит для данного значения строки, то строки presentation для размера создаются с использованием такого же метода, как и при обработке текстовых элементов SIZE:.
<!--%%ENUMMENU selected [DEFAULT selectedDefault ] IN valueSet [ DISPLAY dictionary]-->
Этот элемент заменяется на последовательность строковых элементов <option value="value">presentation.

Число элементов и value, используемое для каждого элемента, определяются по значению выражения valueSet. Это значение должно быть массивом строк. Value в каждом элементе является строковым индексом в результирующем массиве valueSet.

Выражение selected вычисляется и его значением должна быть строка. Ключевое слово selected добавляется в элемент <option value="value">, созданный для элемента массива valueSet, который соответствует результату выражения selected.

Ключевое слово DISPLAY и выражение dictionary могут быть опущены. В этом случае строки presentation совпадают со результирующими строками элементов valueSet.
Пример:

Элемент набора данных color является строкой "Green".
Элемент набора данных colors является массивом ("Blue", "Green", "Red").
Элемент:
<!--%%ENUMMENU color IN colors-->
будет заменяться на следующий текст разметки (HTML):
<option value="0">Blue<option value="1" selected>Green<option value="2">Red


Если ключевое слово DISPLAY и выражение dictionary указаны, то выражение вычисляется. Если значением выражения является словарь, то он используется для "трансляции" массива строк valueSet до преобразования их в требуемую кодировку и помещения в результирующий код разметки с использованием специальных символов HTML.
Пример:

Элемент набора данных color является строкой "Green".
Элемент набора данных colors является массивом ("Blue", "Green", "Red").
Набор данных Вида Интерфейса содержит словарь Colors: {Blue = "Night Blue"; Green = "Grass Green";}.
Элемент:
<!--%%ENUMMENU color IN colors DISPLAY DICTIONARY("Colors")-->
будет заменяться на следующий текст разметки (HTML):
<option value="0">Night Blue<option value="1" selected>Grass Green<option value="2">Red


Если указаны ключевое слово DEFAULT с выражением selectedDefault, то дополнительная строка <option value="-1">defaultPresentation добавляется до последовательности. Если значение выражения selected является пустым, то к этому строковому элементу будет добавлено ключевое слово selected.

Строка defaultPresentation является строкой DefaultValuePicture, полученной из Текстового Набора данных Вида Интерфейса. Эта строка должна содержать комбинацию символов ^0. Эта комбинация символов заменяется на значение выражения selectedDefault. Если указано ключевое слово DISPLAY, то значение выражения selectedDefault сначала транслируется.
Пример:
Элемент набора данных color является строкой "Green".
Элемент набора данных defColor является строкой "Blue".
Элемент набора данных colors является массивом ("Blue", "Green", "Red").
В Текстовом Наборе данных Вида Интерфейса содержится строка DefaultValuePicture: default(^0).
Набор данных Вида Интерфейса содержит словарь Colors: {Blue = "Night Blue"; Green = "Grass Green";}.
Элемент:
<!--%%ENUMMENU color DEFAULT defColor IN colors DISPLAY DICTIONARY("Colors")-->
будет заменяться на следующий HTML код:
<option value="-1">default(Night Blue)<option value="0">Night Blue
<option value="1" selected>Grass Green<option value="2">Red
<!--%%BOOLMENU selected [DEFAULT selectedDefault ] [ DISPLAY dictionary]-->
Этот элемент заменяется на последовательность строковых элементов <option value="value">presentation аналогично тому, как это происходит при обработке элемента ENUMMENU.
В отличие от элемента ENUMMENU, в этом элементе не содержится часть IN valueSet: вместо этого используется встроенный массив ("NO","YES").
<!--%%MAILBOXMENU selected [DEFAULT selectedDefault ] IN mailboxList [NOINBOX ]-->
Этот элемент заменяется на последовательность строковых элементов <option value="value">presentation аналогично тому, как это происходит при обработке элемента ENUMMENU.
Значения выражений selected и selectedDefault конвертируются так же, как они конвертируются для текстового элемента, имеющего префикс MAILBOXNAME:, используя словарь MailboxNames из Текстового Набора данных Вида Интерфейса; по этой причине элементы MAILBOXMENU не имеют части DISPLAY.
Если указано ключевое слово NOINBOX, то папка INBOX (если она существует в mailboxList) не отображается.
<!--%%DAYTIMEMENU selected [DEFAULT selectedDefault ] [PERIOD timePeriod ] -->
Этот элемент заменяется на последовательность строковых элементов <option value="value">presentation для формирования меню времени дня. Каждое значение является временем в секундах и его представлением является строка, отображающая это время с использованием формата "hourMinute" (или строки формата "^H:^m", если элемент "hourMinute" не найден в данных DICTIONARY("DatePictures").
Значение времени генерируются, начиная с полуночи (00:00) и до 23:59 с шагом, заданным в timePeriod (в минутах).
Если ключевое слово PERIOD и значение timePeriod не указаны, то используется шаг в 30 минут (1800 секунд).
Если ключевое слово PERIOD указано, то значение timePeriod может быть либо числовой константой, задающей интервал времени в минутах, либо выражением. Значение выражения вычисляется и преобразовывается в число. Это число указывает период времени в секундах.
Выражения selected и selectedDefault должны иметь числовые значения - текущее выбранное (и являющееся умолчанием) время дня (секунды, считая от полуночи).
<!--%%CALENDARTIMEMENU selected [PERIOD timePeriod ] -->
Этот элемент создаёт такое же меню HTML, как и элемент DAYTIMEMENU.
Значение выражения selected должно быть отметкой времени. Временная часть этого значения используется как текущее выбранное значение времени дня.
<!--%%LOCALCALENDARTIMEMENU selected [PERIOD timePeriod ] -->
Этот элемент создаёт такое же меню HTML, как и элемент DAYTIMEMENU.
Значение выражения selected должно быть отметкой времени. Значение преобразовывается в местный часовой пояс, и временная часть этого значения используется как текущее выбранное значение времени дня.
<!--%%STRINGMENU selected [DEFAULT selectedDefault ] IN valueSet [ DISPLAY dictionary]-->
Этот элемент работает аналогично элементу ENUMMENU, но используемые значения являются фактическими значениями данных, а не их номерами, как в элементе ENUMMENU. Значением по умолчанию является строка default.
<!--%%CALENDARDATECONTROL selected NAME name [DAYSBEFORE before] [DAYSAFTER after] [CANNEVER ] -->
Этот элемент создаёт элемент управления или набор элементов управления для данных календаря, используя выражение selected. Значение выражения должно быть отметкой времени; в противном случае весь текстовый элемент удаляется из результирующего кода разметки.

Если указанное время раньше текущей даты больше чем на before дней или если оно позже текущей даты больше чем на after дней, то этот элемент заменяется текстом с несколькими текстовыми элементами управления. В противном случае создаётся управляющий элемент меню.

Значения before и after должен быть заданы как числа.
Если значение before не указано явно, оно считается равным 7.
Если значение after не указано явно, оно считается равным 31.
Если используется ключевое слово CANNEVER, то меню содержит пункт Never, имеющим значение remote future. Если выбранное значение равно значению remote future, то создаётся элемент управления в виде меню.

Элемент name должен быть строкой.

Для создания элементов управления форматная строка dateOnly берётся из словаря DatePictures и коды текстового элемента управления используются для замены имеющихся в ней комбинаций символов ^D, ^M, ^Y и ^y. Каждый элемент управления имеет заданный name и префикс: элемент управления для дня имеет имя name-D, элемент управления для месяца имеет имя name-M, элемент управления для 2 цифр года года имеет имя name-Y, и элемент управления для 4 цифр года имеет имя name-y.

Если создаётся меню, то генерируется элемент языка разметки select. Он имеет заданное имя name. Меню содержит элемент для текущей даты, элементы before для предыдущих дат и элементы after для последующих дат. Форматирование элементов осуществляется при помощи форматной строки dayAndMonthDate из словаря DatePictures.
Для даты "after+1" добавляется дополнительный элемент с текстом .... При выборе этого элемента выбранное значение даты переносится за диапазон дат, имеющихся в меню, что позволяет пользователю использовать текстовый элемент управления и выбирать произвольную дату.
<!--%%LOCALCALENDARDATECONTROL selected NAME name [DAYSBEFORE before] [DAYSAFTER after] -->
Этот элемент создаёт такой же код разметки HTML, как и элемент CALENDARDATECONTROL.
Значение выражения selected должно быть отметкой времени. Предполагается, что значение выражено в глобальном (GMT) времени, поэтому сначала значение преобразовывается в местное время.

Руководство CommuniGate Pro. Copyright © 2020-2023, АО СталкерСофт