Унификация WebForms2 и XForms
WebForms2
предоставляет возможность размножения html-элемента
(со вложенными в него элементами).
Для этого любому элементу может быть добавлен атрибут repeat
(и сопутствующие ему атрибуты
repeat-start
, repeat-min
,
repeat-max
).
<tr id="order" repeat="template">
<td><input type="text" name="row[order].product"></td>
<td><input type="text" name="row[order].quantity"></td>
<td><button type="remove">Remove This Row</button></td>
</tr>
<tr>
<td><button type="add" template="order">Add Row</button></td>
</tr>
В целях унификации и упрощения предлагаю для демонстрации альтернатив
вместо XForms использовать механизм, применяемый в WebForms, а именно:
<tr id="ecommerce">
<td><input type="text" name="number"></td>
<td><input type="text" name="expire"></td>
</tr>
<tr>
<td><input type="radio" name="method" value="cc"
template="ecommerce">Credit card</td>
</tr>
и
<tr id="ecommerce">
<td><input type="text" name="number"></td>
<td><input type="text" name="expire"></td>
</tr>
<tr>
<td><input type="checkbox" name="method" value="cc"
template="ecommerce">Credit card</td>
</tr>
ибо механизм XForms слишком сложен, отягощен двумя искусственными приемами:
связыванием ('binding') и ограничением значений ('constraining values').
Оба эти приема пере-усложняют и должны использоваться факультативно.
Кроме того, ограничение значений уже развито в WebForms2
(атрибут pattern
и новые значения атрибута type
тега input
),
и нет необходимости дублировать эти возможности.
<xforms:model>
<xforms:instance>
<ecommerce xmlns="">
<method/>
<number/>
<expiry/>
</ecommerce>
</xforms:instance>
<xforms:submission action="http://example.com/submit" method="post" id="submit"/>
<xforms:bind nodeset="/payment/number" relevant="/payment/@method = 'cc'">
<xforms:bind nodeset="/payment/expiry" relevant="/payment/@method = 'cc'">
</xforms:model>
<select1 ref="method">Select Payment Method:
<item>Cash <value>cash</value> </item>
<item>Credit <value>cc</value> </item>
</select1>
<input ref="number">Credit Card Number</input>
<input ref="expiry">Expiration Date</input>
<submit submission="submit">Submit</submit>
WebForms в существующем виде позволяет только размножать html-элемент,
но не заполять размноженные копии
значениями,
ранее внесенными через этот же документ в некоторую базу данных.
Предлагаю добавить такую возможность и ввести для этого атрибуты
repeat-data
(указывает идентификатор элемента data с данными) и
repeat-right
(указывает название атрибута, содержащего
права доступа к записи,
например, значение read атрибута означает,
что поля записи недоступны для редактирования,
а саму запись нельзя удалить кнопкой
<button
type
=remove>).
Соответственно значение атрибута repeat-start
должно интерпретироваться как количество пустых (незаполненных) html-элементов,
существующих кроме тех, что заполнены атрибутом repeat-data.
<tr id="order" repeat-data="records" repeat-right="r">
<td><input type="text" name="product"></td>
<td><input type="text" name="quantity"></td>
<td><button type="remove">Remove This Row</button></td>
</tr>
<tr>
<td><button type="add" template="order">Add Row</button></td>
</tr>
<data id="records">
<order product="Tom figurine" quantity="12" r="read">
<order product="Jerry figurine" quantity="5" r="operate">
</data>
Любому пользователю, вносящему данные, нужно право на обновление, т.к. он может
ошибиться в вносимых значениях. Любой изменяющий поля может записать в них
бессмысленные значения или присвоить полям "null" - и то, и другое равносильно
удалению записи. Очень странно выглядело бы право на обновление без права на
чтение. Отсюда следует, что право на обновление бессмысленно без прав на
удаление и чтение и должно быть дополнено ими - такое целостное право назовем
правом оперировать (operate = update + delete + read).
WebForms2 для совместимости с базой данных сервера должен отправлять те же конструкции
(<order
product
= quantity
= >),
что получил браузер
(практика индексов в xml-конструкциях изначально порочна, неуместна).
<order product="Tom figurine" quantity="12>
<order product="Jerry figurine" quantity="5">
И с этим форматом отправки диссонирует формат XForms
<ecommerce>
<method>cc</method>
<number>1235467789012345</number>
<expiry>2001-08</expiry>
</ecommerce>
В целях унификации предлагаю использовать только один из форматов кодирования.
Поскольку вариант XForms идет в разрез с практикой баз данных,
предлагаю в XForms использовать формат, применяемый в WebForms, а именно:
<ecommerce method="cc" number="1235467789012345" expiry="2001-08">
Отправка на сервер: название отправляемого тега
Несмотря на то, что XForms копирует значение атрибута
id
=ecommerce в название тега (ecommerce
),
WebForms2 не должен делать то же самое, т.е.
<tr id="ord" repeat-data="records" repeat-right="r">
отправит
<order product="Tom figurine" quantity="12>
<order product="Jerry figurine" quantity="5">
а не ORD
<ord product="Tom figurine" quantity="12>
<ord product="Jerry figurine" quantity="5">
Тюрин Дмитрий