|
Программирование >> Программный интерфейс приложений
Редактирование записей. (Модификация даты истечения срока членства после возобновления членства.) Поиск членов, имеющих общие научные интересы. Размещение списка членов на Web-узле. Для рещения одних задач достаточно сценариев, запускающихся из командной строки. Для рещения других задач в следующем разделе будут созданы сценарии, которые можно использовать одновременно с Web-сервером. Но все равно останутся нерешенные задачи. Все они будут решены окончательно в главе 8, Интерфейс API для языка написания сценариев РНР . Генерация каталога общества Историческая Лига Одной из наших целей является получение данных из списка Историческая Лига в различных форматах. Простейшим форматом, который будет нами создан, является список имен приглашенных на ежегодный банкет. Он будет включен в состав большого буклета. Значит все, что нам нужно - это нечто, что потом можно будет вставить в этот буклет. Для печатного каталога необходимо нечто более изысканное , чем простой текст. Хорошим решением здесь может быть формат RTF (Rich Text Format), разработанный компанией Microsoft для совместимости различных текстовых редакторов. Определенно, к числу таких редакторов относится редактор Word. Но этот формат будет понят и такими текстовыми редакторами, как WordPerfect и AppleWorks. Разные текстовые редакторы поддерживают различные подмножества RTF, но мы воспользуемся основным подмножеством спецификации формата RTF, который будет воспринят любым текстовым процессором, воспринимающим формат RTF даже в минимальном наборе. Процедуры создания приглашения на банкет и каталога в формате RTF принципиально идентичны: генерация запроса поиска записей, затем запуск цикла выборки и форматирования каждой записи. При таком общем подобии, лучше всего избегать написания двух отдельных сценариев. Для этого напишем универсальный сценарий gen dir, который может генерировать каталог в различных форматах. Структура сценария будет такой. 1. Инициализация формата. Для каталога участников банкета никакой специальной инициализации не нужно, но необходимо создать некий предварительный код для версии, обрабатывающий формат RTF. 2. Выбрать и распечатать каждую запись, отформатированную под соответствующий тип вывода. 3. После того как все записи обработаны, выполнить все необходимые операции по очистке и завершению работы. И опять же при обработке буклета для банкета такая обработка не нужна, она будет нужна для RTF-версии. В будушем этот сценарий можно будет использовать для вывода в других форматах, поэтому предусмотрим такую возможность с помощью расширяемой конструкции switchbox . Элементы этой конструкции будут определять функцию для различных операций: функцию инициализации, функцию чтения записи из таблицы и функцию очистки. # switchbox, содержащий функции форматирования для каждого формата ту (%switchbox) banquet => # функции для каталога банкета { init => undef, # инициализация не требуется entry =>\Sformat banquet entry cleanup => undef # очистка не требуется rtf => # функции для обработки формата RTF init => \&rtf init, entry => \&format rtf entry, cleanup => \srtf cleanup Элементы конструкции switchbox маркированы названием формата (в этом случае banquet и rtf). Сценарий позволяет определять нужный формат прямо в командной строке: % gen dir banquet % gen dir rtf Таким образом, всегда можно без особого труда добавить новую возможность. 1. Написать три форматирующие функции. 2. Добавить в конструкцию switchbox новый элемент, который вызывает эти функции. 3. Для вывода в новом формате вызвать gen dir и указать название формата в командной строке. Код выбора соответствующей ветви switchbox в зависимости от значения первого аргумента командной строки показан ниже. Это основано на том факте, что ветвление производится на базе названия формата в % switchbox. Если такого ключа нет в switchbox, формат будет признан ошибочным. При этом не нужно прописывать имена форматов прямо в коде, так как он определяется автоматически. Если нет названия формата или в командной строке указано ошибочное имя, сценарий вьщает сообщение об ошибке и отображает перечень допустимых имен: # проверка на присутствие в командной строке хотя бы одного аргумента @ARGV == 1 or die Использование: gen dir format type\пДoпycтимыe форматы: ]01П ( , sort {keys (%switchbox) ) ) . \n ; # определение элемента switchbox, соответствующего аргументу, # указанному в командной строке # если не найдено, тип формата неверный ту ($func hashref ) = $switchbox{$ARGV[0]}; defined {$func hashref ) or die Неизвестный формат: $ARGV[0] \пДопустимые форматы: . ]01п ( , sort (keys (%switchbox) ) ) . \n ; Если в командной строке указан существующий формат, этот профаммный код устанавливает переменную $func hashref. Это значение будет ссылкой на функции обработки выбранного формата. Затем можно запустить запрос выборки нужной записи. После этого вызывается функция инициализации, выборки и печати записей, затем - функция очистки памяти: # генерация запроса ту ($sth) = $dbh->prepare (qq{ SELECT * FROM member ORDER BY last name, first name $sth->execute (); # вызов функции инициализации i{$func hashref ->(init}) if defined ($func hashref ->{init}) ; # выборка и печать записей, если есть функция форматирования If (defined ($func hashref ->{entry}) ) while (my $entry ref = $sth->fetchrow hashref ( NAME lc )) { # передача ссылки на функцию форматирования i{$func hashref ->{entry}} ($entry ref ) ; $sth->finish {); # вызов функции очистки памяти i($func hashref ->{cleanup}} if defined ($func hashref ->{cleanup}) Метод fetchrow hashref 0 в цикле выборки используется для того, чтобы функции форматирования имели информацию о порядке следования столбцов. Это можно узнать из афибута $sth->{NAME} (который содержит имена столбцов в порядке, в котором они возвращаются), но зачем это делать? По ссьшке функции форматирования могут определить имена непосредственно нужных столбцов с помощью $entry ref->{col name}. Это не совсем эффективный, но достаточно простой прием, которым можно пользоваться для любого генерируемого формата, потому что достаточно хорошо известно, какие поля данных нам пофебуются. Теперь только и остается, что написать функции для каждого формата вывода (т.е. функции, указанные в элементах консфукции switchbox).
|
© 2006 - 2024 pmbk.ru. Генерация страницы: 0
При копировании материалов приветствуются ссылки. |