Alterator/form

Материал из ALT Linux Wiki

< Alterator(Различия между версиями)
Перейти к: навигация, поиск
(Модуль (alterator lookout form))
 
(15 промежуточных версий не показаны.)
Строка 1: Строка 1:
-
==  Модуль (alterator lookout form) ==
+
{{span|font-size:180%;|Модуль (alterator lookout form)}}
 +
----
-
=== Адресация полей ===
+
== Адресация полей ==
Каждое поле адресуется по значению атрибута <tt>name</tt>.
Каждое поле адресуется по значению атрибута <tt>name</tt>.
Метка поля должна иметь имя, совпадающее с именем соответствующего ей поля.
Метка поля должна иметь имя, совпадающее с именем соответствующего ей поля.
Пример:
Пример:
-
<pre>
+
<source lang="lisp">
(label text "Field name" name "field")(edit name "field" value "Field value")
(label text "Field name" name "field")(edit name "field" value "Field value")
-
</pre>
+
</source>
-
Исключение - в качестве поля выступает виджет label. В этом случае метки с тем значением атрибута name быть не должно.
+
Исключение — в качестве поля выступает виджет label. В этом случае метки с тем значением атрибута name быть не должно.
Пример:
Пример:
-
<pre>
+
<source lang="lisp">
(label name "field" value "Field label") ;; Ошибка!!!
(label name "field" value "Field label") ;; Ошибка!!!
(label name "field" value "Static field")
(label name "field" value "Static field")
-
</pre>
 
-
 
-
 
-
В этом модуле сделана попытка упростить работу со стандартными диалогами, практически убрав необходимость адресовать виджеты с помощью document:id.
 
-
 
-
Кроме того, этот модуль используется при работе с эффектами в модуле [[Alterator/lookout/effects|(alterator loоkout effects)]].
 
-
 
-
Описание относится к '''alterator-lookout-1.4-alt3'''. Интерфейс библиотеки, вероятно, ещё не застабилизировался, поэтому массово применять её пока не рекомендуется.
 
-
 
-
Примеры использования — в модулях alterator-{xinetd, datetime}
 
-
 
-
 
-
 
-
Пусть в диалоге поля ввода имеют атрибуты <tt>name</tt>, значение которых совпадает с названиями соответствующих параметров при общении с бэкендом. Точно такие же атрибуты могут иметь подписи к этим полям ввода (это важно для работы с эффектами и для вывода сообщений об ошибках при несоответствии типов). В этом случае можно использовать следующие функции:
 
-
 
-
'''Работа с виджетами'''
 
-
 
-
* '''<tt>(form-get-elements-by-name document name)</tt>''' — Получить список виджетов с указанным именем
 
-
* '''<tt>(form-element-apply document name . args)</tt>''' — Применить args ко всем виджетам с именем name и вернуть список результатов
 
-
* '''<tt>(form-get-label document name)</tt>''' — Получить первый виджет типа <tt>label</tt> с указанным именем. Сейчас используется только при выводе сообщений об ошибках несоответствия типа.
 
-
* '''<tt>(form-get-input document name)</tt>''' — Получить поле ввода с указанным именем. Поля ввода — это виджеты одного из типов ('''<tt>checkbox edit listbox spinbox slider timeedit dateedit combobox listbox textbox radiolistbox multilistbox checklistbox</tt>'''), значения которых мы хотим получать из бэкенда и передавать обратно. Функция вываливается с исключением form-error, если таких полей больше одного.
 
-
* '''<tt>(form-input-get-value document name)</tt>''' — получить значение поля с именем name
 
-
* '''<tt>(form-input-set-value! document name val)</tt>''' — записать значение в поле с именем name
 
-
 
-
'''Работа с бэкендом:'''
 
-
 
-
* '''<tt>(form-read document url . args)</tt>''' — прочитать данные из бэкенда (action read) и заполнить все соответствующие поля
 
-
* '''<tt>(form-write document url . args)</tt>''' — отправить в бэкенд (action write) значения всех полей
 
-
* '''<tt>(form-read-names document names url . args)</tt>''' — прочитать из бэкенда (action read) указанные параметры и заполнить соответствующие поля
 
-
* '''<tt>(form-write-names document names url . args)</tt>''' — отправить в бэкенд (action write) значения полей с указанными именами
 
-
: Здесь document — документ в рамках которого происходит поиск виджетов. url и args — аргументы для общения с бэкендом…
 
-
: Кроме того, в '''<tt>/std/base</tt>''' определены обёртки, устанавливающие document в document:root, а также выводящие окно предупреждения при ошибках в общении с бэкендом:
 
-
 
-
* '''<tt>(form-get-value name)</tt> = <tt>(form-input-get-value document::root name)</tt>'''
 
-
* '''<tt>(form-set-value! name value)</tt> = <tt>(form-input-set-value! document::root name value)</tt>'''
 
-
* '''<tt>(form-apply name . args)</tt>'''
 
-
* '''<tt>(form-read/message url . args)</tt>'''
 
-
* '''<tt>(form-write/message url . args)</tt>'''
 
-
* '''<tt>(form-read-names/message names url . args)</tt>'''
 
-
* '''<tt>(form-write-names/message names url . args)</tt>'''
 
-
 
-
=== Пример использования ===
 
-
 
-
Было:
 
-
<source lang="scheme">
 
-
(document:surround "/std/base")
 
-
 
-
(define (write-to-backend)
 
-
  (catch/message (lambda()
 
-
    (woo-write "/test"
 
-
      'par1 (mypar1-id value)
 
-
      'par2 (mypar2-id value)
 
-
      'par3 (mypar3-id value)
 
-
      'par4 (mypar4-id value) ))))
 
-
 
-
(define (read-from-backend)
 
-
  (catch/message (lambda()
 
-
    (let ((data (woo-read-first "/test")))
 
-
      (mypar1-id value (woo-get-option data 'par1))
 
-
      (mypar2-id value (woo-get-option data 'par2))
 
-
      (mypar3-id value (woo-get-option data 'par3))
 
-
      (mypar4-id value (woo-get-option data 'par4)) ))))
 
-
 
-
(gridbox columns "0;100"
 
-
  (spacer)
 
-
  (document:id mypar1-id (checkbox text (_ "my parameter - 1")))
 
-
 
-
  (label text (_ "my parameter - 2:") align "right")
 
-
  (document:id mypar2-id (edit))
 
-
 
-
  (label text (_ "m.p. - 3:") align "right")
 
-
  (document:id mypar3-id (edit))
 
-
 
-
  (label text (_ "m.p. - 4:") align "right")
 
-
  (document:id mypar4-id (combobox enumref "/test/par4values"))
 
-
 
-
  (spacer)
 
-
  (gridbox columns "0;100"
 
-
    (button text (_ "Apply") (when clicked (write-to-backend)))
 
-
    (button text (_ "Reset") (when clicked (read-from-backend))) )
 
-
)
 
-
 
-
(document:root (when loaded (read-from-backend)))
 
</source>
</source>
-
Стало:
+
== Функции доступа к значениям полей ==
-
<source lang="scheme">
+
* '''(form-value name)''' — получить значение поля с именем <tt>name</tt>
-
(document:surround "/std/base")
+
* '''(form-value-list . namelist)''' — получить полный список имён полей и их значений в формате plist. namelist - необязательный параметр, список строк - имён полей. В этом случае ответ будет содержать имена и значения только тех имён что перечислены в этом списке.
-
(gridbox columns "0;100"
+
== Функции модификации значений полей ==
-
  (spacer)
+
* '''(form-update-value name value)''' — изменить значение поля с именем <tt>name</tt> на значение <tt>value</tt>.
-
  (checkbox text (_ "my parameter - 1") name "par1"))
+
* '''(form-update-value-list namelist data)''' — заполнить поля с именами перечисленными в списке <tt>namelist</tt> согласно значениям <tt>data</tt> возвращённым командой <tt>woo-read-first</tt>
-
 
+
* '''(form-update-enum name data)''' — заполнить поле с именем <tt>name</tt> типа enum списком значений <tt>data</tt>, возвращённым командой <tt>woo-list</tt>
-
  (label text (_ "my parameter - 2:") align "right")
+
-
  (edit name "par2")
+
-
 
+
-
  (label text (_ "m.p. - 3:") align "right")
+
-
  (edit name "par3")
+
-
 
+
-
  (label text (_ "m.p. - 4:") align "right")
+
-
  (combobox enumref "/test/par4values" name "par4")
+
-
 
+
-
  (spacer)
+
-
  (gridbox columns "0;100"
+
-
    (button text (_ "Apply") (when clicked (form-write/message "/test")))
+
-
    (button text (_ "Reset") (when clicked (form-read/message "/test"))) )
+
-
)
+
-
 
+
-
(document:root (when loaded (read-from-backend)))
+
-
</source>
+
-
=== Неочевидное + TODO ===
+
Если мы хотим вручную сформировать список значений <tt>data</tt> во фронтенде, это можно сделать следующим образом:
 +
<tt>(list (list "" "name" enum1 "label" label_for_enum1) (list "" "name" enum2 "label" label_for_enum2))</tt>
 +
Здесь <tt>enum1</tt>,<tt>enum2</tt> — значения, которые будет принимать поле, <tt>label_for_enum1</tt>,<tt>label_for_enum2</tt> — текст, который будет выводиться пользователю.
-
* Если хочется заполянить параметр неинтерактивного виджета (например, label) из бэкенда — можно, например, сделать скрытый виджет типа edit, заполнять его, а затем вручную переносить значение:
+
== Функции модификации состояний полей ==
 +
Эти функции меняют свойства одновременно и полей и меток к ним.
-
<pre>
+
* '''(form-update-visibility namelist status)''' - изменить видимость поля в соотвестствии со значением переменной status - булевого типа. namelist - или список имён полей или одно поле.
-
(label name "label2")
+
* '''(form-update-activity namelist status)''' - изменить активность поля в соответствии со значением переменной status - булевого типа. namelist - или список имён полей или одно поле.
-
(edit name "label" visibility #f)
+
-
...
+
-
(form-read "/url")
+
-
(form-element-apply "label2" (form-input-get-value "label"))
+
-
</pre>
+
-
=== TODO ===
+
== Другие функции ==
 +
* '''(form-bind name event proc)''' — привязать вызов процедуры <tt>proc</tt> в случае возникновения события <tt>event</tt> в виджете с именем <tt>name</tt>. Допустимые события: «click», «change».
 +
* '''(form-replace url . url-args)''' — перенаправить на страницу по адресу <tt>url</tt> и передать аргументы <tt>url-args</tt>
 +
* '''(form-popup url . url-args)''' — вызвать страницу по адресу <tt>url</tt> как popup и передать аргументы <tt>url-args</tt>
-
* сделать специальный алиас для label, который бы при общении с бэкендом трактовался как поле ввода (и имел атрибут value)…
+
{{Category navigation|title=Alterator|category=Alterator|sortkey={{SUBPAGENAME}}}}
-
* переименовать form-get-elements-by-name -> form-get-elements (по аналогии с остальными функциями form-get-input, form-get-label)
+
-
* переименовать form-element-apply -> form-elements-apply (т.к. она действует на все элементы с заданным именем, точно так же, как и form-get-elements-by-name)
+
-
* вернуть функции form-{get,set}-document для определения текущего документа, убрать соответствующие обертки из /std/base. (Наличие оберток с непохожими именами - явное зло. С другой стороны, явно указывать во всех вызовах  документ тоже не хочется, поскольку его можно установить один раз в /std/base и о нем почти всегда вообще не думать)
+

Текущая версия на 17:21, 20 июля 2015

Модуль (alterator lookout form)


Содержание

Адресация полей

Каждое поле адресуется по значению атрибута name. Метка поля должна иметь имя, совпадающее с именем соответствующего ей поля.

Пример:

(label text "Field name" name "field")(edit name "field" value "Field value")

Исключение — в качестве поля выступает виджет label. В этом случае метки с тем значением атрибута name быть не должно.

Пример:

(label name "field" value "Field label") ;; Ошибка!!!
(label name "field" value "Static field")

Функции доступа к значениям полей

  • (form-value name) — получить значение поля с именем name
  • (form-value-list . namelist) — получить полный список имён полей и их значений в формате plist. namelist - необязательный параметр, список строк - имён полей. В этом случае ответ будет содержать имена и значения только тех имён что перечислены в этом списке.

Функции модификации значений полей

  • (form-update-value name value) — изменить значение поля с именем name на значение value.
  • (form-update-value-list namelist data) — заполнить поля с именами перечисленными в списке namelist согласно значениям data возвращённым командой woo-read-first
  • (form-update-enum name data) — заполнить поле с именем name типа enum списком значений data, возвращённым командой woo-list

Если мы хотим вручную сформировать список значений data во фронтенде, это можно сделать следующим образом: (list (list "" "name" enum1 "label" label_for_enum1) (list "" "name" enum2 "label" label_for_enum2)) Здесь enum1,enum2 — значения, которые будет принимать поле, label_for_enum1,label_for_enum2 — текст, который будет выводиться пользователю.

Функции модификации состояний полей

Эти функции меняют свойства одновременно и полей и меток к ним.

  • (form-update-visibility namelist status) - изменить видимость поля в соотвестствии со значением переменной status - булевого типа. namelist - или список имён полей или одно поле.
  • (form-update-activity namelist status) - изменить активность поля в соответствии со значением переменной status - булевого типа. namelist - или список имён полей или одно поле.

Другие функции

  • (form-bind name event proc) — привязать вызов процедуры proc в случае возникновения события event в виджете с именем name. Допустимые события: «click», «change».
  • (form-replace url . url-args) — перенаправить на страницу по адресу url и передать аргументы url-args
  • (form-popup url . url-args) — вызвать страницу по адресу url как popup и передать аргументы url-args
 
Личные инструменты