Инструменты пользователя

Инструменты сайта


limb3:ru:packages:wact:form_tags

Теги форм с активными компонентами или без

Роль атрибута runat

Любой тег в 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(), нужно использовать:

  • Значение атрибута ID, если он установлен.
  • Значение атрибута name, если атрибут id не установлен.
  • Если атрибуты ID и name не указаны, то WACT сгенерирует идентификатор случайным образом, поэтому идентификатор «угадать» будет сложно.

Например:

<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="server"

Если форма содержит несколько элементов и является тегом с активным компонентом, тогда все элементы формы будут также иметь активные компоненты. Это называется наследование значения атрибута runat.

Наследование runat работает для таких тегов форм как:

  • <input>
  • <label>
  • <select>
  • <textarea>

Например:

<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>

Все элементы этой формы будут иметь активный компонент после компиляции

Отмена наследования runat атрибута

Обратите внимание, что тег <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>

Теги полей формы с runat='server' внутри обычной html-формы

При желании можно использовать 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 для указания значения элемента формы

В вышеприведенном примере мы использовали атрибут given_value для указания значения опции, которая выбрана внутри <select> тега.

given_value поддерживается для следующих WACT-тегов элементов форм:

  • input
  • select
  • textarea
  • js_checkbox
  • wysiwyg (при установке пакета WYSIWYG)

Естественно, соответствующий тег должен иметь также атрибут 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 используется для других целей, а нам хотелось реализовать нечто общее для всех тегов.

Элементы форм с динамическими атрибутами name и id

Начиная с версии 0.5 WACT-теги элементов форм могут использовать динамические значения для атрибутов name и id, например:

  <wysiwyg type="text" name="titles[{$news.id}]" profile='FCKSimple' runat='server' given_value="{$news.title}"></wysiwyg>

Обсуждение

Ваш комментарий. Вики-синтаксис разрешён:
   ___  __  __ ______ __  __ __  __
  / _ \ \ \/ //_  __/ \ \/ / \ \/ /
 / ___/  \  /  / /     \  /   \  / 
/_/      /_/  /_/      /_/    /_/
 
limb3/ru/packages/wact/form_tags.txt · Последние изменения: 2010/11/10 10:02 (внешнее изменение)