Template Toolkit: Модули: Template::Plugin::Table

Template Toolkit

(русская редакция)

[ Пособия ] [ Руководство ] [ Модули ] [ Библиотеки ] [ Утилиты ] [ Вопросы ] [ Релиз ] [ Perl-ресурсы ] Форум ]
 
Поиск
Template Toolkit | Модули | Template::Plugin::Table

Template::Plugin::Table

[ ◄ Template::Plugin::String ] [ Template::Plugin::URL ► ]
Плагин для представления данных в виде таблицы

Оглавление

ОБЗОР

Индекс ] [ Модули ] [ Наверх ]

    [% USE table(list, rows=n, cols=n, overlap=n, pad=0) %]
    [% FOREACH item = table.row(n) %]
       [% item %]
    [% END %]
    [% FOREACH item = table.col(n) %]
       [% item %]
    [% END %]
    [% FOREACH row = table.rows %]
       [% FOREACH item = row %]
          [% item %]
       [% END %]
    [% END %]
    [% FOREACH col = table.cols %]
       [% col.first %] - [% col.last %] ([% col.size %] entries)
    [% END %]

ОПИСАНИЕ

Индекс ] [ Модули ] [ Наверх ]

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

    [% USE Table(list, rows=5) %]
    [% USE table(list, cols=5) %]

Имя плагина 'Table' можно указывать в нижнем регистре, как показано во втором примере выше. Также можно указать для плагина альтернативное имя переменной согласно обычному синтаксису Template Toolkit.

    [% USE mydata = table(list, rows=5) %]

Затем можно использовать плагин для табличного представления набора данных. На самом деле данные никак не перстраиваются, но становятся доступны через row(), col(), rows() и cols() как если бы они были сформатированы в обычную двумерную таблицу. Так, если наш простой список состоит из букв алфавита от 'a' до 'z', приведенные выше директивы USE создадут плагины, содержащие следующие представления алфавита.

    [% USE table(alphabet, ... %]
    rows=5                  cols=5
    a  f  k  p  u  z        a  g  m  s  y
    b  g  l  q  v           b  h  n  t  z
    c  h  m  r  w           c  i  o  u
    d  i  n  s  x           d  j  p  v
    e  j  o  t  y           e  k  q  w
                            f  l  r  x

Запросить конкретные строку или колонку можно с помощью методов row() и col().

    [% USE table(alphabet, rows=5) %]
    [% FOREACH item = table.row(0) %]
       # [% item %] set to each of [ a f k p u z ] in turn
    [% END %]
    [% FOREACH item = table.col(2) %]
       # [% item %] set to each of [ m n o p q r ] in turn
    [% END %]

Данные в строках возвращаются слева направо, в колонках сверху вниз. Нумерация колонок строк ведется с 0. По умолчанию, неполные строки или колонки будут дополнены неопределенными значениями, чтобы их размер был одинаковым с остальными строками или колонками. Например, последняя строка (строка 4) в первом примере будет содержать значения [ e j o t y undef ]. Template Toolkit безопасно примет эти неопределенные значения и выведет пустую строку. Кроме того можно использовать директиву IF чтобы проверить установлено ли значение.

   [% FOREACH item = table.row(4) %]
      [% IF item %]
         Item: [% item %]
      [% END %]
   [% END %]

Можно явно запретить опцию "добивания" строк/колонок ('pad') при создании плагина. В этом случае последняя строка/колонка может быть возвращена неполной (то есть содержать меньшее число элементов).

   [% USE table(alphabet, cols=5, pad=0) %]
   [% FOREACH item = table.col(4) %]
      # [% item %] set to each of 'y z'
   [% END %]

Метод rows() возвращает все строки/колонки в таблице как ссылку на массив строк (каждая из которых в свою очередь является ссылкой на массив). При вызове метода row() без аргументов вызывается rows(), которая возвращает все строки в таблице.

Аналогично для cols() и col().

    [% USE table(alphabet, cols=5) %]
    [% FOREACH row = table.rows %]
       [% FOREACH item = row %]
          [% item %]
       [% END %]
    [% END %]

Template Toolkit предоставляет методы элементов массива (строк или колонок) first(), last() и size(), которые возвращают соответственно первый и последний элемент и общее количество элементов в строке/колонке. Следующий пример показывает, как можно это использовать для разбиения алфавита на 3 примерно одинаковых части.

    [% USE table(alphabet, cols=3, pad=0) %]
    [% FOREACH group = table.col %]
       [ [% group.first %] - [% group.last %] ([% group.size %] letters) ]
    [% END %]

Вывод:

    [ a - i (9 letters) ]
    [ j - r (9 letters) ]
    [ s - z (8 letters) ]

Также можно использовать метод для работы с массивами общего назначения join() для объединения элементов массива в строку через определенный разделитель.

    [% USE table(alphabet, cols=5) %]
    [% FOREACH row = table.rows %]
       [% row.join(' - ') %]
    [% END %]

Данные в таблице упорядочены сверху вниз, а не поперек, но это легко преобразуется при выводе. Например, чтобы сформатировать данные в 5 колонок, но вывести их не сверху вниз, а справа налево, указываем 'rows=5', чтобы выстроить данные следующим образом:

    a  f  .  .
    b  g  .
    c  h
    d  i
    e  j

а затем в цикле проходим каждую колонку (a-e, f-j, и т.д.), выводя данные слева направо.

    a  b  c  d  e
    f  g  h  i  j
    .  .
    .

Код этого примера будет выглядет примерно следующим образом:

    [% USE table(alphabet, rows=3) %]
    [% FOREACH cols = table.cols %]
      [% FOREACH item = cols %]
        [% item %]
      [% END %]
    [% END %]
    a  b  c
    d  e  f
    g  h  i
    j  .  .
    .

В дополнение к ссылке на массив конструктору плагина Table можно передать ссылку на объект Template::Iterator или его производного класса. В этом случае, вначале вызывается метод итератора get_all(), который возвращает все оставшиеся элементы, которые затем доступны через обычный интерфейс Table.

    [% USE DBI(dsn,user,pass) -%]
    # query() возвращает итератор
    [% results = DBI.query('SELECT * FROM alphabet ORDER BY letter') %]

    # передаем плагину Table
    [% USE table(results, rows=8 overlap=1 pad=0) -%]
    [% FOREACH row = table.cols -%]
       [% row.first.letter %] - [% row.last.letter %]:
          [% row.join(', ') %]
    [% END %]

АВТОР

Индекс ] [ Модули ] [ Наверх ]

Энди Уардли (Andy Wardley <abw@andywardley.com>)

http://www.andywardley.com/

ВЕРСИЯ

Индекс ] [ Модули ] [ Наверх ]

2.65, поставляется в составе Template Toolkit версии 2.14, дата релиза - 4 октября 2004.

АВТОРСКИЕ ПРАВА

Индекс ] [ Модули ] [ Наверх ]

  Copyright (C) 1996-2004 Andy Wardley.  All Rights Reserved.
  Copyright (C) 1998-2002 Canon Research Centre Europe Ltd.

Этот модуль является свободно-распространяемым программным обеспечением; вы можете распространять и/или модифицировать его на тех же условиях, что и Perl.

СМОТРИ ТАКЖЕ

Индекс ] [ Модули ] [ Наверх ]