Alterator/form
Материал из ALT Linux Wiki
(→Модуль (alterator lookout form)) |
(→Модуль (alterator lookout form)) |
||
Строка 17: | Строка 17: | ||
'''Работа с виджетами''' | '''Работа с виджетами''' | ||
- | * <tt>(form-get-elements-by-name document name)</tt> — Получить список виджетов с указанным именем | + | * '''<tt>(form-get-elements-by-name document name)</tt>''' — Получить список виджетов с указанным именем |
- | * <tt>(form-element-apply document name . args)</tt> — Применить args ко всем виджетам с именем name и вернуть список результатов | + | * '''<tt>(form-element-apply document name . args)</tt>''' — Применить args ко всем виджетам с именем name и вернуть список результатов |
- | * <tt>(form-get-label document name)</tt> — Получить первый виджет типа <tt>label</tt> с указанным именем. Сейчас используется только при выводе сообщений об ошибках несоответствия типа. | + | * '''<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-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-get-value document name)</tt>''' — получить значение поля с именем name |
- | * <tt>(form-input-set-value! document name val)</tt> — записать значение в поле с именем name | + | * '''<tt>(form-input-set-value! document name val)</tt>''' — записать значение в поле с именем name |
'''Работа с бэкендом:''' | '''Работа с бэкендом:''' | ||
- | * <tt>(form-read document url . args)</tt> — прочитать данные из бэкенда (action read) и заполнить все соответствующие поля | + | * '''<tt>(form-read document url . args)</tt>''' — прочитать данные из бэкенда (action read) и заполнить все соответствующие поля |
- | * <tt>(form-write document url . args)</tt> — отправить в бэкенд (action write) значения всех полей | + | * '''<tt>(form-write document url . args)</tt>''' — отправить в бэкенд (action write) значения всех полей |
- | * <tt>(form-read-names document names url . args)</tt> — прочитать из бэкенда (action read) указанные параметры и заполнить соответствующие поля | + | * '''<tt>(form-read-names document names url . args)</tt>''' — прочитать из бэкенда (action read) указанные параметры и заполнить соответствующие поля |
- | * <tt>(form-write-names document names url . args)</tt> — отправить в бэкенд (action write) значения полей с указанными именами | + | * '''<tt>(form-write-names document names url . args)</tt>''' — отправить в бэкенд (action write) значения полей с указанными именами |
: Здесь document — документ в рамках которого происходит поиск виджетов. url и args — аргументы для общения с бэкендом… | : Здесь document — документ в рамках которого происходит поиск виджетов. url и args — аргументы для общения с бэкендом… | ||
- | : Кроме того, в <tt>/std/base</tt> определены обёртки, устанавливающие document в document:root, а также выводящие окно предупреждения при ошибках в общении с бэкендом: | + | : Кроме того, в '''<tt>/std/base</tt>''' определены обёртки, устанавливающие document в document:root, а также выводящие окно предупреждения при ошибках в общении с бэкендом: |
- | * <tt>(form-get-value name)</tt> = <tt>(form-input-get-value document::root name)</tt> | + | * '''<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-set-value! name value)</tt> = <tt>(form-input-set-value! document::root name value)</tt>''' |
- | * <tt>(form-apply name . args)</tt> | + | * '''<tt>(form-apply name . args)</tt>''' |
- | * <tt>(form-read/message url . args)</tt> | + | * '''<tt>(form-read/message url . args)</tt>''' |
- | * <tt>(form-write/message url . args)</tt> | + | * '''<tt>(form-write/message url . args)</tt>''' |
- | * <tt>(form-read-names/message names url . args)</tt> | + | * '''<tt>(form-read-names/message names url . args)</tt>''' |
- | * <tt>(form-write-names/message names url . args)</tt> | + | * '''<tt>(form-write-names/message names url . args)</tt>''' |
=== Пример использования === | === Пример использования === | ||
Строка 123: | Строка 123: | ||
</pre> | </pre> | ||
- | TODO | + | === TODO === |
+ | |||
+ | * сделать специальный алиас для label, который бы при общении с бэкендом трактовался как поле ввода (и имел атрибут value)… | ||
+ | * переименовать form-get-elements-by-name -> form-get-elements (по аналогии с остальными функциями) | ||
+ | * переименовать form-element-apply -> form-elements-apply (т.к. она действует на все элементы с заданным именем, точно так же, как и form-get-elements-by-name) | ||
+ | * вернуть функции form-{get,set}-document для определения текущего документа, убрать соответствующие обертки из /std/base. (Наличие оберток с непохожими именами - явное зло. С другой стороны, явно указывать во всех вызовах документ тоже не хочется, поскольку его можно установить один раз в /std/base и о нем почти всегда вообще не думать) |
Версия 09:27, 14 ноября 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)
Пример использования
Было:
"/std/base""/test""/test""0;100""my parameter - 1""my parameter - 2:""right""m.p. - 3:""right""m.p. - 4:""right""/test/par4values""0;100""Apply""Reset"
Стало:
"/std/base""0;100""my parameter - 1""par1""my parameter - 2:""right""par2""m.p. - 3:""right""par3""m.p. - 4:""right""/test/par4values""par4""0;100""Apply""/test""Reset""/test"
Неочевидное + 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)…
- переименовать form-get-elements-by-name -> form-get-elements (по аналогии с остальными функциями)
- переименовать form-element-apply -> form-elements-apply (т.к. она действует на все элементы с заданным именем, точно так же, как и form-get-elements-by-name)
- вернуть функции form-{get,set}-document для определения текущего документа, убрать соответствующие обертки из /std/base. (Наличие оберток с непохожими именами - явное зло. С другой стороны, явно указывать во всех вызовах документ тоже не хочется, поскольку его можно установить один раз в /std/base и о нем почти всегда вообще не думать)