Template Toolkit

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

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

Template::Plugin::Directory

[ ◄ Template::Plugin::Date ] [ Template::Plugin::Dumper ► ]
Плагин для генерации списка содержимого каталога.

Оглавление

ОБЗОР

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

    [% USE dir = Directory(dirpath) %]
    # files возвращает список обычных файлов
    [% FOREACH file = dir.files %]
       [% file.name %] [% file.path %] ...
    [% END %]
    # dirs возвращает список подкаталогов
    [% FOREACH subdir = dir.dirs %]
       [% subdir.name %] [% subdir.path %] ...
    [% END %]
    # list возвращает и то и другое вперемешку
    [% FOREACH item = dir.list %]
       [% IF item.isdir %]
	  Directory: [% item.name %]
       [% ELSE %]
          File: [% item.name %]
       [% END %]
    [% END %]
    # определяем VIEW для отображения каталогов/файлов
    [% VIEW myview %]
       [% BLOCK file %]
       File: [% item.name %]
       [% END %]
       [% BLOCK directory %]
       Directory: [% item.name %]
       [% item.content(myview) | indent -%]
       [% END %]
    [% END %]
    # выводим содержимое каталога, используя представление
    [% myview.print(dir) %]

ОПИСАНИЕ

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

Плагин Template Toolkit предоставляет простой интерфейс для просмотра каталогов. Он выделен из модуля Template::Plugin::File и использует объекты Template::Plugin::File для представления файлов в каталоге. Подкаталоги внутри каталога представляются следующими экземплярами Template::Plugin::Directory.

Конструктор ожидает в качестве аргумента имя каталога.

    [% USE dir = Directory('/tmp') %]

После этого он предоставляет доступ к файлам и подкаталогам, содержащимся в каталоге.

    # обычные файлы (не каталоги)
    [% FOREACH file = dir.files %]
       [% file.name %]
    [% END %]
    # только каталоги
    [% FOREACH file = dir.dirs %]
       [% file.name %]
    [% END %]
    # файлы и/или каталоги
    [% FOREACH file = dir.list %]
       [% file.name %] ([% file.isdir ? 'directory' : 'file' %])
    [% END %]
    [% USE Directory('foo/baz') %]

Конструктор плагина возбуждает исключение 'Directory', если указанный путь не существует, не является каталогом или происходит ошибка при вызове на нем stat() (смотри Template::Plugin::File). Иначе он сканирует каталог и создает массивы: 'files', содержащий файлы, 'dirs', содержащий каталоги и 'list', содержащий вместе и файлы и каталоги. Можно указать опцию 'nostat', чтобы запретить проверки файлов/каталогов и сканирование каталога.

Каждый файл в каталоге будет представлен экземпляром класса Template::Plugin::File, и каждый каталог другим экземпляром Template::Plugin::Directory. Если установлен флаг 'recurse', то эти каталоги будут содержать следующие вложенные элементы и так далее. Без установленного флага 'recurse' (по умолчанию), каждый из них является лишь меткой каталога и не содержит дополнительно ничего до тех пор пока не будет явно вызван его собственный метод scan(). У файлов и/или каталогов можно проверять флаг 'isdir', который возвращает истинное значение, если элемент является каталогом или ложное, если это обычный файл.

    [% FOREACH file = dir.list %]
       [% IF file.isdir %]
          * Directory: [% file.name %]
       [% ELSE %]
          * File: [% file.name %]
       [% END %]
    [% END %]

Этот пример показывает как вы можете пройти вглубь по дереву каталога, отображая по мере прохода его содержимое. При запрещенном флаге 'recurse' (установка по умолчанию), необходимо вызывать метод scan() для каждого каталога, чтобы найти файлы и вложенные в него подкаталоги.

    [% USE dir = Directory(dirpath) %]
    * [% dir.path %]
    [% INCLUDE showdir %]
    [% BLOCK showdir -%]
      [% FOREACH file = dir.list -%]
        [% IF file.isdir -%]
        * [% file.name %]
          [% file.scan -%]
	  [% INCLUDE showdir dir=file FILTER indent(4) -%]
        [% ELSE -%]
        - [% f.name %]
        [% END -%]
      [% END -%]
     [% END %]

Этот упрощенный пример (с небольшим переформатированием для ясности) из теста t/directry.t, который производит следующий вывод:

    * test/dir
    	- file1
    	- file2
    	* sub_one
    	    - bar
    	    - foo
    	* sub_two
    	    - waz.html
    	    - wiz.html
    	- xyzfile

Флаг 'recurse' может быть установлен (по умолчанию он запрещен), чтобы заставить конструктор автоматически пройти вглубь по всем подкаталогам, создавая для каждого новый объект Template::Plugin::Directory и заполняя его содержимое. В этом случае нет необходимости явно вызывать метод scan().

    [% USE dir = Directory(dirpath, recurse=1) %]
       ...
        [% IF file.isdir -%]
        * [% file.name %]
	  [% INCLUDE showdir dir=file FILTER indent(4) -%]
        [% ELSE -%]
           ...

С версии 2.01, Template Toolkit предоставляет поддержку представлений. Представление может быть определно как блок VIEW ... END и может содержать определения блоков BLOCK для файлов ('file') и каталогов ('directory').

    [% VIEW myview %]
    [% BLOCK file %]
       - [% item.name %]
    [% END %]

    [% BLOCK directory %]
       * [% item.name %]
         [% item.content(myview) FILTER indent %]
    [% END %]
    [% END %]

Затем можно вызвать метод представления print(), передав ему в качестве аргумента объект Directory.

    [% USE dir = Directory(dirpath, recurse=1) %]
    [% myview.print(dir) %]

Когда каталог представляется через представление [% myview.print(dir) %] или [% dir.present(view) %], обрабатывается блок BLOCK 'directory' BLOCK внутри представления VIEW 'myview', с переменной 'item' указывающей на объект Directory.

    [% BLOCK directory %]
       * [% item.name %]
         [% item.content(myview) FILTER indent %]
    [% END %]

Вначале выводится имя каталога, а затем для каждого элемента внутри каталога вызывается метод content(view), чтобы получить его представление. Следующие каталоги будут связаны с блоком 'directory' и файлы будут связаны с блоком 'file'.

При запрещенной опции 'recurse' (как это установлено по умолчанию), блок 'directory' должен явно вызывать scan() для каждого каталога.

    [% VIEW myview %]
    [% BLOCK file %]
       - [% item.name %]
    [% END %]

    [% BLOCK directory %]
       * [% item.name %]
	 [% item.scan %]
         [% item.content(myview) FILTER indent %]
    [% END %]
    [% END %]
    [% USE dir = Directory(dirpath) %]
    [% myview.print(dir) %]

ПЛАНЫ

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

Было бы неплохо иметь возможность задавать опции accept/ignore, чтобы работать с наборами файлов.

АВТОРЫ

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

Михаэль Стивенс (Michael Stevens <michael@etla.org>) написал исходный базовый плагин Directory. Энди Уардли (Andy Wardley <abw@wardley.org>) разделил его на отдельные плагины File и Directory, добавил немного кода и документации по поддержке VIEW, и сделал несколько небольших правок.

ВЕРСИЯ

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

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

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

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

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

СМОТРИ ТАКЖЕ

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

Template::Plugin, Template::Plugin::File, Template::View

[ ◄ Template::Plugin::Date ] [ Template::Plugin::Dumper ► ]

[ Пособия ] [ Руководство ] [ Модули ] [ Библиотеки ] [ Утилиты ] [ Вопросы ] [ Релиз ] [ Perl-ресурсы ]

http://www.template-toolkit.ru/