Включение внешних источников данных
Работа с полями
При итеративном выполнении блока включения SQL возможны два варианта обращения к значениям полей: можно воспользоваться общим тегом <field> или объектом this, который заполняется значениями всех полей для текущей итерации.
Как и при включении XML, тег <field> может содержать атрибут name, идентифицирующий выводимое поле. В противном случае поля выводятся последовательными тегами <field> в порядке их перечисления в запросе (слева направо).
Кроме того, к значениям полей можно обращаться при помощи конструкции this. поле, где поле – имя поля. Например, во включенном блоке SQL следующие два тега выводят одинаковый результат:
<field name="id" /> <putvar name="this.id" />
Объект this поддерживается в основном ради применения условных тегов и подстановки переменных с данными, возвращаемыми в итоговых наборах SQL. В листинге 13.28 приведен пример запроса SQL и форматирования выходных данных с применением условных тегов.
Листинг 13.28. Включение результатов запроса SQL.
<lхр> <include sql="SELECT datname .datdba AS userjd FROM pg_database"> <if this.user_id="$userid"> <strong><field /></strong><br /> <setvar owned_databases="$owned_databases @this.datname" /> </if> <else> <field /><br /> </else> </include> </lxp>
Работа с метаданными SQL
При выполнении запросов SQL объект LXP с именем sql заполняется информацией о полученном итоговом наборе. Он содержит переменные sql.numrows, sql.numcols, sql.numfields (псевдоним для sql.numcols), sql.rown sql.offset.
Переменная sql.numrows содержит количество записей, полученных в результате запроса. Переменная sql.numcols (а также ее псевдоним sql.numfields) содержит количество полей в каждой записи. При итеративном выполнении блока, заключенного между <include> и </include>, переменная sql .row содержит числовой индекс текущей записи, начиная с 1, а переменная sql.offset – числовой индекс, начиная с 0.
В листинге 13.29 переменная sql.row используется для вывода индекса текущей записи в блоке <include>. После вывода результатов запроса переменная sql.numrows выводит количество выбранных записей.
Листинг 13.29. Использование объектной переменной sql.
<lхр> <include sqVSELECT * FROM pg_user ORDER BY usename LIMIT 5"> User #<putvar name="sql.row" />: <putvar name="this.usename" /><br /> </include> <br /> Selected <putvar name="sql.numrows" /> rows. </lxp>
Результат выполнения листинга 13.29 выглядит так:
User #1: alien<br /> User #2: barbara<br /> User #3: ben<br /> User #4: corwin<br /> User #5: david<br /> <br /> Selected 5 rows.