Alterator/form

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

(Различия между версиями)
Перейти к: навигация, поиск
(Модуль (alterator lookout form))
(Модуль (alterator lookout form))
Строка 5: Строка 5:
Пусть интересующие нас поля ввода (и подписи к ним) имеют атрибуты "name", значение которых совпадает с названиями соответствующих параметров при общении с бакендом. В этом случае можно использовать следующие функции:
Пусть интересующие нас поля ввода (и подписи к ним) имеют атрибуты "name", значение которых совпадает с названиями соответствующих параметров при общении с бакендом. В этом случае можно использовать следующие функции:
-
* '''(form:get-elements-by-name name)''' -- получить список виджетов с указанным именем.
+
* '''(form-get-elements-by-name name)''' -- получить список виджетов с указанным именем.
-
* '''(form:get-label-by-name name)''' -- получить первый виджет типа "label" с указанным именем.
+
* '''(form-get-label-by-name name)''' -- получить первый виджет типа "label" с указанным именем.
-
* '''(form:read url . names)''' -- прочитать из бакенда (action read) указанные параметры и заполнить соответствующие поля  
+
* '''(form-read url . names)''' -- прочитать из бакенда (action read) указанные параметры и заполнить соответствующие поля  
-
* '''(form:write url . names)''' -- отправить в бакенд (action write) значения полей с указанными именами
+
* '''(form-write url . names)''' -- отправить в бакенд (action write) значения полей с указанными именами
-
* '''(form:get name)''' -- получить значение поля с именем name
+
* '''(form-get name)''' -- получить значение поля с именем name
-
* '''(form:set name val)''' -- записать значение в поле с именем name
+
* '''(form-set! name val)''' -- записать значение в поле с именем name
 +
* '''(form-apply name . args)''' -- применить args ко всем элементам с именем name и вернуть список результатов.
Кроме того, в /std/base определены обертки, перехватывающие исключения при общении с бакендом и выводящие окно предупреждения.
Кроме того, в /std/base определены обертки, перехватывающие исключения при общении с бакендом и выводящие окно предупреждения.
-
* '''(form:read/message url . names)'''
+
* '''(form-read/message url . names)'''
-
* '''(form:write/message url . names)'''
+
* '''(form-write/message url . names)'''
Было:
Было:
Строка 62: Строка 63:
(document:surround "/std/base")
(document:surround "/std/base")
-
(define (write-to-backend) (form:write/message "/test" "par1" "par2" "par3" "par4"))  
+
(define (write-to-backend) (form-write/message "/test" "par1" "par2" "par3" "par4"))  
        
        
-
(define (read-from-backend) (form:read/message "/test" "par1" "par2" "par3" "par4"))
+
(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>

Версия 12: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")
 
Личные инструменты