Перечень статей   Цветовые обозначения   Choose language


Унификация WebForms2 и XForms



Перенесение механизма WebForms (размножение html-элементов) в 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>

В целях унификации и упрощения предлагаю для демонстрации альтернатив

Select payment method: Cash
Credit card
Time at home
Select payment method: Cash
Credit card
Credit card number
Expiration date
вместо 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 из базы данных

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



Тюрин Дмитрий



Перечень статей   Цветовые обозначения   Choose language