Тег foreach выполняет перебор по элементу-контейнеру всех пар ключ-значение и размещает их в области видимости дочерних узлов.
Атрибуты тега foreach
Наименование | Тип данных | Описание | Примечания |
---|---|---|---|
var | строковый | Имя или значение переменной | Не обязателен |
container | строковый в формате JSON | Область перебора |
В переменную counter
из таблицы documents.carditem
получаются значения счетчиков, которые затем выводятся при печати в отчет. На печать для каждого счетчика будут выведены переменные ключ counter.key
и значение counter.value
.
<select query="select coalesce(counters) as counters from documents.carditem where documentid = $document.id$"> <foreach var="counter" container="counters"> <var name="counter.key"/><text>: </text><var name="counter.value"/><br/> </foreach> </select>
Если атрибут counter
не задан, то переменным с id
счетчика и значением счетчика можно сразу присвоить имена key
и value:
<select query="select coalesce(counters) as counters from documents.carditem where documentid = $document.id$"> <foreach container="counters"> <var name="key"/><text>: </text><var name="value"/><br/> <if var="key" op="eq" value="777"> <text>Сработала акция со счетчиком 777</text><br/> <text>и его значение:</text><var name="value"/><br/> </if> </foreach> </select>
Используя значения счетчика, можно настроить различное поведение для печати на чеке.
Пусть существует набор счетчиков, значения которых необходимо проверить и указать соответственно каждому некоторый статус карты.
Счетчик | Значение |
---|---|
777 | 22 |
444 | 8 |
xxx | 4 |
123 | отсутствует |
Если в файле sale.xml задать следующую схему, где вместо ??? указать id счетчика:
<select query="select coalesce(counters) as counters from documents.carditem where documentid = $document.id$"> <op var="isCounterExist" set="0"/> <foreach container="counters"> <if var="key" op="eq" value="???"> <op var="isCounterExist" set="1.000"/> <if var="value" op="ge" value="0"> <if var="value" op="le" value="7"> <text>Статус вашей карты:</text><br/> <text>Серебро</text><br/> </if> </if> <if var="value" op="ge" value="10"> <if var="value" op="le" value="50"> <text>Статус вашей карты:</text><br/> <text>Золото</text><br/> </if> </if> </if> </foreach> <if var="$isCounterExist$" op="ne" value="1.000"><br/> <text>Статус вашей карты:</text><br/> <text>Бронза</text><br/> </if> </select>
В этом случае при печати чека в каждом из случаев будет следующее поведение:
value="???" | Поведение |
---|---|
777 | Значение счетчика попадает в диапазон от 10 до 50. На печать будет выведен текст: «Статус вашей карты: Золото» |
444 | Значение счетчика не входит ни в один из заданных диапазонов. На печать статус карты не выводится |
xxx | Значение счетчика входит в диапазон от 0 до 7. На печать будет выведен текст: «Статус вашей карты: Серебро» |
123 | Счетчик отсутствует в карте. На печать будет выведен текст: "Статус вашей карты: Бронза" |