Шаблоны для форм
Постановка задачи
Существуют формы, которые повторяются на различных страницах:
- Форма для атрибутов (редактирование профиля, регистрация на олимпиаду)
- Форма редактирования основной информации профиля (редактирование профиля, регистрация в тестирующей системе)
- Форма управления атрибутами списка пользователей (Список пользователей, выборка пользователей, печать)
- ...
Хотелось бы иметь возможность создать шаблон формы, а не иметь копию 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?.
Пример шаблона
Default Form.tmpl?
Примечание: У 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.