Alterator/form: различия между версиями
Строка 5: | Строка 5: | ||
Пусть интересующие нас поля ввода (и подписи к ним) имеют атрибуты "name", значение которых совпадает с названиями соответствующих параметров при общении с бакендом. В этом случае можно использовать следующие функции: | Пусть интересующие нас поля ввода (и подписи к ним) имеют атрибуты "name", значение которых совпадает с названиями соответствующих параметров при общении с бакендом. В этом случае можно использовать следующие функции: | ||
* '''(form | * '''(form-get-elements-by-name name)''' -- получить список виджетов с указанным именем. | ||
* '''(form | * '''(form-get-label-by-name name)''' -- получить первый виджет типа "label" с указанным именем. | ||
* '''(form | * '''(form-read url . names)''' -- прочитать из бакенда (action read) указанные параметры и заполнить соответствующие поля | ||
* '''(form | * '''(form-write url . names)''' -- отправить в бакенд (action write) значения полей с указанными именами | ||
* '''(form | * '''(form-get name)''' -- получить значение поля с именем name | ||
* '''(form | * '''(form-set! name val)''' -- записать значение в поле с именем name | ||
* '''(form-apply name . args)''' -- применить args ко всем элементам с именем name и вернуть список результатов. | |||
Кроме того, в /std/base определены обертки, перехватывающие исключения при общении с бакендом и выводящие окно предупреждения. | Кроме того, в /std/base определены обертки, перехватывающие исключения при общении с бакендом и выводящие окно предупреждения. | ||
* '''(form | * '''(form-read/message url . names)''' | ||
* '''(form | * '''(form-write/message url . names)''' | ||
Было: | Было: | ||
Строка 62: | Строка 63: | ||
(document:surround "/std/base") | (document:surround "/std/base") | ||
(define (write-to-backend) (form | (define (write-to-backend) (form-write/message "/test" "par1" "par2" "par3" "par4")) | ||
(define (read-from-backend) (form | (define (read-from-backend) (form-read/message "/test" "par1" "par2" "par3" "par4")) | ||
(gridbox columns "0;100" | (gridbox columns "0;100" | ||
Строка 91: | Строка 92: | ||
TODO: Включить в модуль и в это описание работу с эффектами (?) | TODO: Включить в модуль и в это описание работу с эффектами (?) | ||
=== Кривости === | |||
* form-read заполняет только интерактивные элементы формы. Если хочется заполнить label - приходится, например, сделать скрытый виджет типа edit, заполнять его, а затем вручную перенести значение: | |||
<pre> | |||
(label name "lable-name") | |||
(edit name "label" | |||
... | |||
(form-read "/url" ... "label") | |||
(form-apply "label-name" (form-get "label") | |||
</pre> |
Версия от 15:22, 6 октября 2008
Модуль (alterator lookout form)
В этом модуле сделана попытка упростить работу со стандартными диалогами, практически убрав необходимость адресовать виджеты с помощью document:id.
Пусть интересующие нас поля ввода (и подписи к ним) имеют атрибуты "name", значение которых совпадает с названиями соответствующих параметров при общении с бакендом. В этом случае можно использовать следующие функции:
- (form-get-elements-by-name name) -- получить список виджетов с указанным именем.
- (form-get-label-by-name name) -- получить первый виджет типа "label" с указанным именем.
- (form-read url . names) -- прочитать из бакенда (action read) указанные параметры и заполнить соответствующие поля
- (form-write url . names) -- отправить в бакенд (action write) значения полей с указанными именами
- (form-get name) -- получить значение поля с именем name
- (form-set! name val) -- записать значение в поле с именем name
- (form-apply name . args) -- применить args ко всем элементам с именем name и вернуть список результатов.
Кроме того, в /std/base определены обертки, перехватывающие исключения при общении с бакендом и выводящие окно предупреждения.
- (form-read/message url . names)
- (form-write/message url . names)
Было:
(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") (define (write-to-backend) (form-write/message "/test" "par1" "par2" "par3" "par4")) (define (read-from-backend) (form-read/message "/test" "par1" "par2" "par3" "par4")) (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 (write-to-backend))) (button text (_ "Reset") (when clicked (read-from-backend))) ) ) (document:root (when loaded (read-from-backend)))
(техническое: поля ищутся в документе, который определяется ячейкой (cell) form:document. В /std/base ячейка устанавливается на document:root)
TODO: Включить в модуль и в это описание работу с эффектами (?)
Кривости
- form-read заполняет только интерактивные элементы формы. Если хочется заполнить label - приходится, например, сделать скрытый виджет типа edit, заполнять его, а затем вручную перенести значение:
(label name "lable-name") (edit name "label" ... (form-read "/url" ... "label") (form-apply "label-name" (form-get "label")