Alterator/form: различия между версиями
Ilis (обсуждение | вклад) |
Ilis (обсуждение | вклад) Нет описания правки |
||
Строка 1: | Строка 1: | ||
== Модуль (alterator lookout form) == | == Модуль (alterator lookout form) == | ||
'''Адресация виджетов по атрибуту name. Автоматическое заполнение диалога из | '''Адресация виджетов по атрибуту <tt>name</tt>. Автоматическое заполнение диалога из бэкенда и отправка значений в бэкенд.''' | ||
В этом модуле сделана попытка упростить работу со стандартными диалогами, практически убрав необходимость адресовать виджеты с помощью document:id. | В этом модуле сделана попытка упростить работу со стандартными диалогами, практически убрав необходимость адресовать виджеты с помощью document:id. | ||
Строка 7: | Строка 7: | ||
Кроме того, этот модуль используется при работе с эффектами в модуле [[Alterator/lookout/effects|(alterator loоkout effects)]]. | Кроме того, этот модуль используется при работе с эффектами в модуле [[Alterator/lookout/effects|(alterator loоkout effects)]]. | ||
Описание относится к '''alterator-lookout-1.4-alt3'''. Интерфейс библиотеки, вероятно, | Описание относится к '''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 — аргументы для общения с бэкендом… | ||
Кроме того, в '''/std/base''' определены | Кроме того, в '''/std/base''' определены обёртки, устанавливающие 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> | ||
===Пример использования=== | === Пример использования === | ||
Было: | Было: | ||
Строка 116: | Строка 115: | ||
=== Неочевидное + TODO === | === Неочевидное + TODO === | ||
* Если хочется заполянить параметр неинтерактивного виджета (например, label) из | * Если хочется заполянить параметр неинтерактивного виджета (например, label) из бэкенда — можно, например, сделать скрытый виджет типа edit, заполнять его, а затем вручную переносить значение: | ||
<pre> | <pre> | ||
Строка 126: | Строка 125: | ||
</pre> | </pre> | ||
TODO: сделать бы специальный алиас для label, который бы при общении с | TODO: сделать бы специальный алиас для label, который бы при общении с бэкендом трактовался как поле ввода (и имел атрибут value)… |
Версия от 16:53, 12 ноября 2008
Модуль (alterator lookout form)
Адресация виджетов по атрибуту name. Автоматическое заполнение диалога из бэкенда и отправка значений в бэкенд.
В этом модуле сделана попытка упростить работу со стандартными диалогами, практически убрав необходимость адресовать виджеты с помощью document:id.
Кроме того, этот модуль используется при работе с эффектами в модуле (alterator loоkout effects).
Описание относится к alterator-lookout-1.4-alt3. Интерфейс библиотеки, вероятно, ещё не застабилизировался, поэтому массово применять её пока не рекомендуется.
Примеры использования — в модулях alterator-{xinetd, datetime}
…
Пусть в диалоге поля ввода имеют атрибуты name, значение которых совпадает с названиями соответствующих параметров при общении с бэкендом. Также, эти имена могут иметь подписи к этим полям ввода (важно для работы с эффектами и для вывода сообщений об ошибках при несоответствии типов). В этом случае можно использовать следующие функции:
Работа с виджетами
- (form-get-elements-by-name document name) — Получить список виджетов с указанным именем
- (form-element-apply document name . args) — Применить args ко всем виджетам с именем name и вернуть список результатов
- (form-get-label document name) — Получить первый виджет типа label с указанным именем. Сейчас используется только при выводе сообщений об ошибках несоответствия типа.
- (form-get-input document name) — Получить поле ввода с указанным именем. Поля ввода — это виджеты одного из типов (checkbox edit listbox spinbox slider timeedit dateedit combobox listbox textbox radiolistbox multilistbox checklistbox), значения которых мы хотим получать из бэкенда и передавать обратно. Функция вываливается с исключением form-error, если таких полей больше одного.
- (form-input-get-value document name) — получить значение поля с именем name
- (form-input-set-value! document name val) — записать значение в поле с именем name
Работа с бэкендом:
- (form-read document url . args) — прочитать данные из бэкенда (action read) и заполнить все соответствующие поля
- (form-write document url . args) — отправить в бэкенд (action write) значения всех полей
- (form-read-names document names url . args) — прочитать из бэкенда (action read) указанные параметры и заполнить соответствующие поля
- (form-write-names document names url . args) — отправить в бэкенд (action write) значения полей с указанными именами
Здесь document — документ в рамках которого происходит поиск виджетов. url и args — аргументы для общения с бэкендом…
Кроме того, в /std/base определены обёртки, устанавливающие document в document:root, а также выводящие окно предупреждения при ошибках в общении с бэкендом:
- (form-get-value name) = (form-input-get-value document::root name)
- (form-set-value! name value) = (form-input-set-value! document::root name value)
- (form-apply name . args)
- (form-read/message url . args)
- (form-write/message url . args)
- (form-read-names/message names url . args)
- (form-write-names/message names url . args)
Пример использования
Было:
(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)))
Стало:
(document:surround "/std/base")
(gridbox columns "0;100"
(spacer)
(checkbox text (_ "my parameter - 1") name "par1"))
(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)))
Неочевидное + TODO
- Если хочется заполянить параметр неинтерактивного виджета (например, label) из бэкенда — можно, например, сделать скрытый виджет типа edit, заполнять его, а затем вручную переносить значение:
(label name "label2") (edit name "label" visibility #f) ... (form-read "/url") (form-element-apply "label2" (form-input-get-value "label"))
TODO: сделать бы специальный алиас для label, который бы при общении с бэкендом трактовался как поле ввода (и имел атрибут value)…