Любой тег в WACT шаблоне при желании может иметь активный компонент фазы выполнения. Для этого существует специальный атрибут runat, который должен иметь значение «server», чтобы активизировать создание активного компонента. Для специальных WACT-тегов, таких как <core:datasource>, <list:list> этот атрибут автоматически ставится в значение server. А для обычных HTML-тегов, типа <a>, <img> и т.д. значение этого тега по-умолчанию равно client, что значит этот тег не имеет активного компонента.
Теги форм - особый случай: иногда они требуют активного компонента, а иногда нет, например:
<!-- Это обычная форма, HTML тег. Компилятор ее пропустит--> <form id="MyFormA"> <!-- ... --> </form> <!-- Эта форма будет дополнена активным компонентом, так как содержит атрибут runat="server" --> <form id="MyFormB" runat="server"> <!-- ... --> </form>
Так как формы играют очень важную форму в любом приложении, WACT содержит готовую реализацию этих тегов в качестве компонентов.
Для форм введен дополнительный механизм именования тегов, который дополнительно использует атрибут «name» (обычно используется для идентификации тегов <input>).
Для идентификации компонентов формы используются несколько видоизмененные правила. Итак, для того, чтобы получить какой-либо компоненты формы, например, при помощи метода WactTemplate :: getChild(), нужно использовать:
Например:
<form id="MyForm" runat="server"> <!-- Уникальный идентификатор id="Input1" --> <input type="text" id="Input1" name="foo"> <!-- Уникальный идентификатор id="bar" --> <input type="text" name="bar"> <!-- Какое либо сгенерированное значение, например id="1003" --> <input type="text"> </form>
Если форма содержит несколько элементов и является тегом с активным компонентом, тогда все элементы формы будут также иметь активные компоненты. Это называется наследование значения атрибута runat.
Наследование runat работает для таких тегов форм как:
Например:
<form id="MyForm" runat="server"> <label for="name">Name:</label> <input type="text" value="name"> <br> <label for="email">Email:</label> <input type="text" value="email"> <br> <input type="submit"> </form>
Все элементы этой формы будут иметь активный компонент после компиляции
Обратите внимание, что тег <input type=«submit»>
в примере также будет иметь активный компонент, что совсем не обязательно, а иногда даже ошибочно.
Есть два способа «отключить» наследование значения атрибута runat=«server».
Наследование может быть отключено совсем при помощи атрибута children_reuse_runat=«false»
тега <form>, например, так:
<form id="MyForm" runat="server" children_reuse_runat="false"> <!-- Ни один из этих тегов не будет зарегистрирован как компонент фазы исполнения --> <label for="name">Name:</label> <input type="text" value="name"/> <br> <label for="email">Email:</label> <input type="text" value="email"/> <br> <input type="submit"> </form>
Другой способ, это указать другое значение атрибута runat, то есть runat=«client» или же поместить его в тег CoreLiteralTag, например:
<form id="MyForm" runat="server"> <!-- Эти теги отнаследуют runat='server' --> <label for="name">Name:</label> <input type="text" value="name"> <br> <label for="email">Email:</label> <input type="text" value="email"> <br> <!-- Этот не будет содержать компонента фазы исполнения. Более правильный способ --> <input type="submit" runat="client"> <!-- Этот также не будет содержать компонента фазы исполнения --> <core:literal> <input type="reset"> </core:literal> </form>
При желании можно использовать WACT-теги форм без использования <form runat='server'>. Эта возможность появилась, начиная с версии 0.5
Чаще всего эту возможность используют для тега <select>, который в этом случае позволяет генерить набор <option> тегов средствами WACT, например:
<form name='my_form'> <select:options_source from="{$#items}" use_as_name='name' target='item_select'/> <select runat='server' id='my_select' name='my_select' given_value='{$#item_id}'></select> <input type='checkbox' name='is_featured' given_value='{$is_featured}' runat='server'/> </form>
Здесь мы использовали тег <select:options_source> для формирования массива данных для <options> списка и тег <select runat='server'> для генерации этого списка. До верси 0.5 этой возможности без наличия <form runat='server'> не было и приходилось генерить списки опций при помощи php-кода, что не всегда удобно.
В вышеприведенном примере мы использовали атрибут given_value для указания значения опции, которая выбрана внутри <select> тега.
given_value поддерживается для следующих WACT-тегов элементов форм:
Естественно, соответствующий тег должен иметь также атрибут runat='server' или наследовать этот признак от формы:
<form id='publishing' name='publishing' method='POST'> <wysiwyg type="text" id="featured_title" name="featured_title" profile='FCKSimple' runat='server' given_value='{$#news.title}'></wysiwyg> <select id='featured_status' name='featured_status' runat='server' given_value='{$#news.status}'> <option value='0'>Новая</option> <option value='1'>Утвержденная</option> <option value='2'>Архивная</option> </select> </form>
В качестве given_value можно использовать любое выражение.
P.S. Почему именно given_value - все дело в теге <input type='checkbox' value='some_value'>, где атрибут value используется для других целей, а нам хотелось реализовать нечто общее для всех тегов.
Начиная с версии 0.5 WACT-теги элементов форм могут использовать динамические значения для атрибутов name и id, например:
<wysiwyg type="text" name="titles[{$news.id}]" profile='FCKSimple' runat='server' given_value="{$news.title}"></wysiwyg>
Обсуждение