Существуют формы, которые повторяются на различных страницах:
Форма для атрибутов (редактирование профиля, регистрация на олимпиаду)
Форма редактирования основной информации профиля (редактирование профиля, регистрация в тестирующей системе)
Форма управления атрибутами списка пользователей (Список пользователей, выборка пользователей, печать)
...
Хотелось бы иметь возможность создать шаблон формы, а не иметь копию html формы на странице.
Решение
Был написан модуль Form, использующий HTML::Template
Путь до шаблонов и расширение прописаны в nsuts_new_olymp.cfg в разделе [Templates]
Требуется указать SERVER_DIR после установки тестирующей системы (Возможно, это нужно как-то переделать)
Описание
setType – указать тип формы:
Тип
Описание
open
Ставится только <form> без </form>
close
Ставится только </form>
both
Ставится и <form>, и </form>
neither
Не будут установлены <form> и </form>
addRow – добавить элемент на форму в качестве аргументов идут (filter, type иногда можно ставить undef):
name – Название элемента, которое обычно пишется перед элементом формы
id – обычно ставится в атрибут name у input, select и т.д
type – text, password, и т.д
filter – regexp для значения, проверяет после вызова метода check.
comment – комментарий или ошибка, которая обычно где-то пишется
setFormOptions – Установить action, method, name для формы.
setSubmitOptions Установить атрибуты для input submit, берутся ключи из переданного hashи ставится так key = value. Если переданная ссылка на hash=undef, то кнопка submit не устанавливается.
check – проверяет, что значения элементов формы удовлетворяют filter. Если был установлен filter = undef, то фильтр по умолчанию /^.+$/
setTemplate – указать название шаблона, по умолчанию Default Template?.
getHTML – возвращает html формы, устанавливает значения из $post/$get для элементов формы. В наследниках можно переопределить и добавлять элементы в hash $self->{_rows} и они будут доступны в шаблоне.
setTitle – установить заголовок формы, доступен в шаблоне по form_
По умолчанию стоит экранирование переменных шаблона, но его можно отключить указав атрибут escape="no" у tmpl_var в шаблоне.
По умолчанию включен _rows_enable, который позволяет на основе $post/$get устанавливать переданные значения в форму. Его можно отключить, указав значение 0.
В форме доступны переменные form_title, form_attr, form_submit, form_submit_enable, form_open, form_end.
Подробнее в Form.pm?, примеры использования – Attribute Form.pm?, Registration Form.pm?.
Примечание: У form_submit, form_attr и comment escape=none, т.к там находится что-то вроде form_submit = 'value="Сохранить" name="saveattrs"'. В comment иногда выводится ошибка, а там '<font color=red>...</font>'.
Проблемы
У HTML::Template есть какая-то проблема с utf8, не помогает установка опции utf8 => 1, open_mode и т.д. Найденное решение – указать filter для template, который делает utf8::decode.