|
|
Строка 18: |
Строка 18: |
| </pre> | | </pre> |
| | | |
| + | === Функции доступа к значениям полей === |
| + | * (form-value name) - получить значение поля с именем <tt>name</tt> |
| + | * (form-value-list) - получить полный список имён полей и их значений в формате plist. |
| | | |
- | В этом модуле сделана попытка упростить работу со стандартными диалогами, практически убрав необходимость адресовать виджеты с помощью document:id.
| + | === Функции модификации значений полей === |
| + | * (form-update-value name value) - изменить значение поля с именем <tt>name</tt> на значение <tt>value</tt>. |
| + | * (form-update-value-list namelist data) - заполнить поля с именами перечисленными в списке <tt>namelist</tt> согласно значениям <tt>data</tt> возвращённым командой <tt>woo-read-first</tt> |
| + | * (form-update-enum name datalist) - заполнить поле с именем <tt>name</tt> типа enum списком значений <tt>datalist</tt>, возвращённым командой <tt>woo-list</tt> |
| | | |
- | Кроме того, этот модуль используется при работе с эффектами в модуле [[Alterator/lookout/effects|(alterator loоkout effects)]].
| + | === Другие функции === |
- | | + | *(form-bind name event proc) - привязать вызов процедуры <tt>proc</tt> в случае возникновения события <tt>event</tt> в виджете с именем <tt>name</tt>. Допустимые события: "click","change". |
- | Описание относится к '''alterator-lookout-1.4-alt3'''. Интерфейс библиотеки, вероятно, ещё не застабилизировался, поэтому массово применять её пока не рекомендуется.
| + | *(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> |
- | Примеры использования — в модулях 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 lang="scheme">
| + | |
- | (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)))
| + | |
- | </source>
| + | |
- | | + | |
- | === Неочевидное + TODO ===
| + | |
- | | + | |
- | * Если хочется заполянить параметр неинтерактивного виджета (например, label) из бэкенда — можно, например, сделать скрытый виджет типа edit, заполнять его, а затем вручную переносить значение:
| + | |
- | | + | |
- | <pre>
| + | |
- | (label name "label2")
| + | |
- | (edit name "label" visibility #f)
| + | |
- | ...
| + | |
- | (form-read "/url")
| + | |
- | (form-element-apply "label2" (form-input-get-value "label"))
| + | |
- | </pre>
| + | |
- | | + | |
- | === TODO ===
| + | |
- | | + | |
- | * сделать специальный алиас для label, который бы при общении с бэкендом трактовался как поле ввода (и имел атрибут value)…
| + | |
- | * переименовать 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 и о нем почти всегда вообще не думать)
| + | |
Исключение - в качестве поля выступает виджет label. В этом случае метки с тем значением атрибута name быть не должно.