Alterator/module/types: различия между версиями

Материал из ALT Linux Wiki
Нет описания правки
Строка 1: Строка 1:
=== Автоматическая проверка данных ===
=== Автоматическая проверка данных ===


Иногда необходимо производить валидацию введённых пользователем данных. Можно это делать вручную в бакенде, но гораздо удобнее воспользоваться автоматической проверкой типов, выполняемой альтератором при передаче данных в бакенд.
Иногда необходимо производить валидацию введённых пользователем данных. Можно это делать вручную в бэкенде, но гораздо удобнее воспользоваться автоматической проверкой типов, выполняемой альтератором при передаче данных в бэкенд.




==== Изменения в бакенде ====
==== Изменения в бэкенде ====


Делается это следующим образом. В бакенде добавляется ответ на запрос "type". В нем перечисляются параметры, с которыми работает бакенд, и их типы. Для формирования правильного ответа стоит воспользоваться стандартной библиотекой, например для бакенда на shell объявление типов будет выглядить следующим образом.
Делается это следующим образом. В бэкенде добавляется ответ на запрос «type». В нем перечисляются параметры, с которыми работает бэкенд, и их типы. Для формирования правильного ответа стоит воспользоваться стандартной библиотекой, например для бэкенда на shell объявление типов будет выглядить следующим образом.


<source lang="bash">
<source lang="bash">
Строка 24: Строка 24:
</source>
</source>


В примере выше объявлено что параметр 'a' будет иметь тип 'IP адрес', 'b' - 'TCP порт' и теперь пользователь не сможет передать в бакенд в качестве 'a' что-либо отличное IP адреса и в качестве 'b' что-либо отличное от целого числа находящегося в определённом диапазоне.
В примере выше объявлено что параметр 'a' будет иметь тип 'IP адрес', 'b' — 'TCP порт' и теперь пользователь не сможет передать в бэкенд в качестве 'a' что-либо отличное IP адреса и в качестве 'b' что-либо отличное от целого числа находящегося в определённом диапазоне.


==== Изменения в интерфейсе ====
==== Изменения в интерфейсе ====


На этом возможности системы типов не исчерпываются. Предположим, что пользователь ввёл-таки неправильное значение в поле, соотвествующее параметру 'a'. Он увидит следующее сообщение об ошибке:
На этом возможности системы типов не исчерпываются. Предположим, что пользователь ввёл-таки неправильное значение в поле, соотвествующее параметру 'a'. Он увидит следующее сообщение об ошибке:
<pre>
<source lang="text">
a: недопустимый IP-адрес
a: недопустимый IP-адрес
</pre>
</source>


Однако никакого 'a' на его экране не наблюдается. В каком именно поле случилась ошибка?
Однако никакого 'a' на его экране не наблюдается. В каком именно поле случилась ошибка?


Система типов alterator в состоянии справиться с этим. Для этого всего-лишь необходимо, чтобы у '''названия поля''' был задан атрибут 'name' содержащий '''имя параметра бакенда''', которому соответвует это поле.
Система типов alterator в состоянии справиться с этим. Для этого всего-лишь необходимо, чтобы у '''названия поля''' был задан атрибут 'name' содержащий '''имя параметра бэкенда''', которому соответствует это поле.


Пример для qt:
Пример для qt:
<pre>
<source lang="text">
...
...
   (label text "Field" name "a")
   (label text "Field" name "a")
   (edit name "a")
   (edit name "a")
...
...
</pre>
</source>


Теперь в случае ошибки, пользователь увидит следующее сообщение:
Теперь в случае ошибки, пользователь увидит следующее сообщение:
<pre>
<source lang="text">
Field: недопустимый IP-адрес
Field: недопустимый IP-адрес
</pre>
</source>


Аналогичный пример для html:
Аналогичный пример для html:
<pre>
<source lang="html4strict">
....
....
   <span name="a" translate="_">Field:</span>
   <span name="a" translate="_">Field:</span>
   <input type="text" name="a"/>
   <input type="text" name="a"/>
...
...
</pre>
</source>


==== Список типов ====
==== Список типов ====

Версия от 16:27, 26 октября 2008

Автоматическая проверка данных

Иногда необходимо производить валидацию введённых пользователем данных. Можно это делать вручную в бэкенде, но гораздо удобнее воспользоваться автоматической проверкой типов, выполняемой альтератором при передаче данных в бэкенд.


Изменения в бэкенде

Делается это следующим образом. В бэкенде добавляется ответ на запрос «type». В нем перечисляются параметры, с которыми работает бэкенд, и их типы. Для формирования правильного ответа стоит воспользоваться стандартной библиотекой, например для бэкенда на shell объявление типов будет выглядить следующим образом.

. alterator-sh-functions

on_message()
{
 case "$in_action" in
   type)
     write_type_item a ipv4-address
     write_type_item b tcp-port
     ;;
   read)
   ...
 esac
}

В примере выше объявлено что параметр 'a' будет иметь тип 'IP адрес', 'b' — 'TCP порт' и теперь пользователь не сможет передать в бэкенд в качестве 'a' что-либо отличное IP адреса и в качестве 'b' что-либо отличное от целого числа находящегося в определённом диапазоне.

Изменения в интерфейсе

На этом возможности системы типов не исчерпываются. Предположим, что пользователь ввёл-таки неправильное значение в поле, соотвествующее параметру 'a'. Он увидит следующее сообщение об ошибке:

a: недопустимый IP-адрес

Однако никакого 'a' на его экране не наблюдается. В каком именно поле случилась ошибка?

Система типов alterator в состоянии справиться с этим. Для этого всего-лишь необходимо, чтобы у названия поля был задан атрибут 'name' содержащий имя параметра бэкенда, которому соответствует это поле.

Пример для qt:

...
  (label text "Field" name "a")
  (edit name "a")
...

Теперь в случае ошибки, пользователь увидит следующее сообщение:

Field: недопустимый IP-адрес

Аналогичный пример для html:

....
   <span name="a" translate="_">Field:</span>
   <input type="text" name="a"/>
...

Список типов

название типа комментарии
boolean #t или #f
date YYYY-MM-DD, месяц от 01 до 12, день от 01 до 31
time HH:MM:SS
ipv4-address NNN.NNN.NNN.NNN
ipv4-address-list список адресов, разделенный пробелами
ipv4-network NNN.NNN.NNN.NNN/MM
hostname ^[.a-zA-Z0-9_-]*$
hostname-list список имен, разделенный пробелами
tcp-port 0..65535
iso-3166-alpha-2 двухбуквенный код страны
system-account-name ^[a-z][a-z0-9_-]*$