Самоучитель по SQL-сервер в Linux



Условная логика

Простейший способ условной генерации данных в LXP основан на встроенной поддержке тегов условной логики. Условные теги позволяют скрывать или активизировать целые блоки посредством проверки условий для переменных и cookie. К числу основных условных тегов LXP относятся теги: <if>, <ifnot>, <ifcookie>, <ifnotcookie>, <else>, <elseif> и <elseifnot>.

Теги <1f> и <1fnot> работают с переменными LXP (или компонентами объектов), тогда как теги <1 fcookie> и <1 f notcooki e> работают с файлами cookie текущего домена. Иначе говоря, теги <if> и <ifcookie> обладают одинаковыми логическими функциями, различаются только проверяемые исходные данные.

Тег <el se> имеет более общий характер и реализует проверку инвертированных условий для тегов, упоминавшихся выше. Теги <elseif> и <elseifnot> в действителыюсти всего лишь обеспечивают сокращенную запись для вложения тегов <i f> и <1fnot> в блоки <else>.

Теги <if> и <ifnot>

Без атрибутов теги <1f> и <1fnot> не выполняют никаких полезных функций. Однако с правильно указанными атрибутами они позволяют легко и быстро помечать блоки разметки и обеспечивать их отображение при определенных условиях.

Тег <if>

Тег <i f> сравнивает свои атрибуты с переменными, имена которых соответствуют именам атрибутов. Если значение заданного атрибута совпадает со значением переменной, блок разметки между <if> и парным тегом </if> обрабатывается LXP. В противном случае весь блок (от <if> до </if>) полностью игнорируется вместе со всей разметкой.

В зависимости от типа логической проверки в тег <1 f> включается имя атрибута, пара «имя/значение» или серия таких пар.

Если указано только имя атрибута (например, <i f test>), LXP проверяет только существование каких-либо символов, присвоенных переменной с указанным именем. Если переменная содержит пустое значение (или вообще не существует), проверка завершается неудачей, а соответствующий блок исключается из обработки. Если значение найдено, блок обрабатывается обычным образом.

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

В листинге 13.13 тег <if> проверяет существование значения переменной с именем name, а также проверяет, содержит ли переменная access значение 1.

Листинг 13.13. Использование тега <if>

<1хр>

<if name access="l"> <strong>Success!</strong><br />

A <em>name</em> is set. and <em>access</em> is set to l.<br />

</if> <

/lxp>

Тег <ifnot>

Тег <ifnot> во всех отношениях противоположен тегу <if>. Например, при перечислении нескольких атрибутов блок <ifnot> обрабатывается лишь в том случае, если не выполняется ни одного из проверяемых условий.

В листинге 13.14 тег <ifnot> убеждается в том, что переменная с именем error не содержит значения, а также проверяет, что переменная access не равна 0.

Листинг 13.14. Использование тега <ifnot>

<1хр>

<ifnot error access="0"> <strong>Success!</strong><br />

An <em>error</em> is not set. and <em>access</em> is not set to 0.<br />

</ifnot>

</lxp>

ПРИМЕЧАНИЕ

В одном теге LXP не допускается определение двух атрибутов с одинаковыми именами (то есть тег <ifnot access="0" access="2"> неправилен). Следовательно, проверка двух условий для одной переменной должна производиться двумя отдельными тегами.

Вложение логических тегов

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

В некоторых случаях вложение логических тегов требуется для проверки нескольких условий с одной переменной. Это связано с тем, что имя переменной может встречаться в логическом теге всего один раз.

В листинге 13.15 приведен пример вложения нескольких логических тегов в один тег <if> верхнего уровня.

Листинг 13.15. Вложение логических тегов

<1хр>

<if answer> <strong>You have supplied an answer!</strong><br />

<if answer="12">

Your answer is correct!<br />

</1f>

<ifnot answer="12">

Your answer of <putvar name="answer">. though, is incorrect.<br />

</ifnot>

<if answer="12" cheatcode>

You appear to be cheating, however.

</if>

</if>

</lxp>

В листинге 13.15 первый тег <i f> проверяет, задано ли значение аргумента answer. Если значение отсутствует, весь внутренний блок не обрабатывается.

Второй тег <if> проверяет, содержит ли переданный аргумент answer значение 12. Если условие выполняется, блок тега <i f> обрабатывается, а если нет — не обрабатывается.

Следующий тег <ifnot> проверяет, отличен ли аргумент answer от 12. В этом случае обрабатывается внутренний блок тега <i fnot>.

Наконец, последний Ter<if> в листинге 13.15 проверяет, содержит ли аргумент answer значение 12 и был ли при этом передан аргумент cheatcode. Если аргумент равен 12, а переменная cheatcode существует, обрабатывается блок последнего тега <if> (в данном примере он просто выводит сообщение).

Теги < ifcookie> и <ifnotcookie>

Теги <ifcookie> и <ifnotcookie> аналогичны тегам <if> и <ifnot>, с одним принципиальным различием: при проверке используются не переменные, хранимые в памяти, а файлы cookie, хранимые в некотором домене и доступные через браузер.

В листинге 13.16 блок LXP строит персональное приветствие для пользователя, если в его браузере хранится cookie с именем username.

Листинг 13.16. Теги <ifcookie> и <ifnotcookie>

<1хр> <ifcookie username>

Welcome back. <putcookie name="username">.<br />

</ifcookie>

<ifnotcook1e username>

<include src="login.php" />

</ifnotcookie>

</lxp>

Если cookie с именем username не существует, выводится стандартная страница для ввода пользовательских данных, реализованная в документе РНР. Документ воспроизводится посредством подзапроса Apache (см. подраздел «Включение внешних источников данных» в разделе «Включение данных»).

Теги <else>, <elseif> и <elseifnot>

Теги <else>, <e!seif> и <else1fnot> помогают организовать проверку более сложных логических условий по сравнению с отдельными командами <if> и <ifnot>.

Тег <else> открывает блок, который воспроизводится лишь в том случае, если предыдущее условие (при вложении логических тегов — находящееся на том же уровне) было ложным. Если последнее логическое условие было истинным, блок <else> не обрабатывается.

В листинге 13.17 простое условие <if> проверяет переменную с именем answer. Если переменная не существует, то блок, заключенный между тегами <else> и </ else>, обрабатывается; в противном случае — не обрабатывается.

Листинг 13.17. Использование тега <else>

<1хр>

<ifanswer>

Thank you for supplying an answer.

</if>

<e1se>

You nave not yet supplied an answer.<br/>

<include src="forms/question.lxp" />

</else>

</lxp>

Как упоминалось выше, теги <el sei f> и <el sei fnot> всего лишь сокращают объем записи. Они работают точно так же, как теги <1 f > и <i f not>, вложенные в блок <el se>. Например, следующие два блока функционально идентичны:

<if conditionl="true">

Condition 1 is True. </if> <eise>

<if condition2="true"> Condition 2 is tnue.

</if>

</else>

...

<if conditioni="true">

Condition 1 is True.

</if>

<elseif condition2="true">

Condition 2 is true.

</elseif>

Теги <el se> повышают эффективность и упрощают дальнейшее сопровождение условных конструкции. При использовании тега <else> LXP автоматически следит за выполнением предыдущего условия, и вам не приходится проверять его заново в инвертированном виде.

В листинге 13.18 реализована та же логика, что в приведенном выше листинге 13.15, но объем кода сокращен за счет применения тега <else>.

Листинг 13.18. Последовательная проверка с использованием тега <else>

<1хр>

<1f answer> <strong>You have supplied an answer!</strong><br />

<if answer="12"> Your answer is correct!<br />

<if cheatcode>

You appear to be cheating, however.

</if>

<else>

Congratulations for not cneating!

</eise>

</if>

<else>

Your answer of <putvar name="answer">. though, is incorrect.<br />

</else>

</if>

<else>

You have not yet supplied an answer.<br />

<include src="forms/question.Ixp" />

</else>

</lxp>