Alterator/form: различия между версиями

Материал из ALT Linux Wiki
Нет описания правки
 
(не показано 40 промежуточных версий 5 участников)
Строка 1: Строка 1:
== Модуль (alterator lookout form) ==
{{span|font-size:180%;|Модуль (alterator lookout form)}}
----


В этом модуле сделана попытка упростить работу со стандартными диалогами, практически убрав необходимость адресовать виджеты с помощью document:id.
== Адресация полей ==
Каждое поле адресуется по значению атрибута <tt>name</tt>.
Метка поля должна иметь имя, совпадающее с именем соответствующего ей поля.


Пусть интересующие нас поля ввода (и подписи к ним) имеют атрибуты "name", значение которых совпадает с названиями соответствующих параметров при общении с бакендом. В этом случае можно использовать следующие функции:
Пример:
<source lang="lisp">
(label text "Field name" name "field")(edit name "field" value "Field value")
</source>


* '''(form-get-elements-by-name name)''' -- получить список виджетов с указанным именем.
Исключение — в качестве поля выступает виджет label. В этом случае метки с тем значением атрибута name быть не должно.
* '''(form-get-label-by-name name)''' -- получить первый виджет типа "label" с указанным именем.
* '''(form-read url . args-n-names)''' -- прочитать из бакенда (action read) указанные параметры и заполнить соответствующие поля
* '''(form-write url . args-n-names)''' -- отправить в бакенд (action write) значения полей с указанными именами
* '''(form-get name)''' -- получить значение поля с именем name
* '''(form-set! name val)''' -- записать значение в поле с именем name
* '''(form-apply name . args)''' -- применить args ко всем элементам с именем name и вернуть список результатов.  


Кроме того, в /std/base определены обертки, перехватывающие исключения при общении с бакендом и выводящие окно предупреждения.
Пример:
* '''(form-read/message url . args-n-names)'''
<source lang="lisp">
* '''(form-write/message url . args-n-names)'''
(label name "field" value "Field label") ;; Ошибка!!!
(label name "field" value "Static field")
</source>


Аргументы args-n-names функций form-read/write обрабатываются довольно хитрым способом. Если первый аргумент -- список, то это -- параметры, передаваемые бакенду. Все остальные аргументы -- имена виджетов, значения которых надо читать или заполнять. Если имена виджетов не указаны - заполняются все виджеты.
== Функции доступа к значениям полей ==
* '''(form-value name)''' — получить значение поля с именем <tt>name</tt>
* '''(form-value-list . namelist)''' — получить полный список имён полей и их значений в формате plist. namelist - необязательный параметр, список строк - имён полей. В этом случае ответ будет содержать имена и значения только тех имён что перечислены в этом списке.


То есть можно писать, например, так:
== Функции модификации значений полей ==
* (form-read "/url") -- Чтение информации из бакенда, заполнение всех элементов формы
* '''(form-update-value name value)''' — изменить значение поля с именем <tt>name</tt> на значение <tt>value</tt>.
* (form-read "/url" '(par1 "val1")) -- то же, но бакенду передается параметр par1=val1
* '''(form-update-value-list namelist data)''' — заполнить поля с именами перечисленными в списке <tt>namelist</tt> согласно значениям <tt>data</tt> возвращённым командой <tt>woo-read-first</tt>
* (form-read "/url" "name1" "name2" "name3")
* '''(form-update-enum name data)''' — заполнить поле с именем <tt>name</tt> типа enum списком значений <tt>data</tt>, возвращённым командой <tt>woo-list</tt>
* (form-read "/url" '(par1 "val1") "name1" "name2" "name3") -- то же, но заполняются только указанные поля


Если мы хотим вручную сформировать список значений <tt>data</tt> во фронтенде, это можно сделать следующим образом:
<tt>(list (list "" "name" enum1 "label" label_for_enum1) (list "" "name" enum2 "label" label_for_enum2))</tt>
Здесь <tt>enum1</tt>,<tt>enum2</tt> — значения, которые будет принимать поле, <tt>label_for_enum1</tt>,<tt>label_for_enum2</tt> — текст, который будет выводиться пользователю.


===Пример использования===
== Функции модификации состояний полей ==
Эти функции меняют свойства одновременно и полей и меток к ним.


Было:
* '''(form-update-visibility namelist status)''' - изменить видимость поля в соотвестствии со значением переменной status - булевого типа. namelist - или список имён полей или одно поле.
<pre>
* '''(form-update-activity namelist status)''' - изменить активность поля в соответствии со значением переменной status - булевого типа. namelist - или список имён полей или одно поле.
(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)
* '''(form-bind name event proc)''' — привязать вызов процедуры <tt>proc</tt> в случае возникновения события <tt>event</tt> в виджете с именем <tt>name</tt>. Допустимые события: «click», «change».
  (document:id mypar1-id (checkbox text (_ "my parameter - 1")))
* '''(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>


  (label text (_ "my parameter - 2:") align "right")
{{Category navigation|title=Alterator|category=Alterator|sortkey={{SUBPAGENAME}}}}
  (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)))
</pre>
 
Стало:
<pre>
(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)))
</pre>
 
 
=== Неочевидное ===
 
* form-read заполняет только интерактивные элементы формы. Если хочется заполнить label - приходится, например, делать скрытый виджет типа edit, заполнять его, а затем вручную перенести значение:
 
<pre>
(label name "lable-name")
(edit name "label"
...
(form-read "/url" ... "label")
(form-apply "label-name" (form-get "label")
</pre>
 
* поля ищутся в документе, который определяется ячейкой (cell) form:document. В /std/base ячейка устанавливается на document:root. Непонятно, можно ли использовать это для чего-то полезного (по отдельности работать с двумя формами в одном документе, например).
 
===TODO===
 
* Включить в модуль и в это описание работу с эффектами?

Текущая версия от 20:21, 20 июля 2015

Модуль (alterator lookout form)


Адресация полей

Каждое поле адресуется по значению атрибута name. Метка поля должна иметь имя, совпадающее с именем соответствующего ей поля.

Пример:

(label text "Field name" name "field")(edit name "field" value "Field value")

Исключение — в качестве поля выступает виджет label. В этом случае метки с тем значением атрибута name быть не должно.

Пример:

(label name "field" value "Field label") ;; Ошибка!!!
(label name "field" value "Static field")

Функции доступа к значениям полей

  • (form-value name) — получить значение поля с именем name
  • (form-value-list . namelist) — получить полный список имён полей и их значений в формате plist. namelist - необязательный параметр, список строк - имён полей. В этом случае ответ будет содержать имена и значения только тех имён что перечислены в этом списке.

Функции модификации значений полей

  • (form-update-value name value) — изменить значение поля с именем name на значение value.
  • (form-update-value-list namelist data) — заполнить поля с именами перечисленными в списке namelist согласно значениям data возвращённым командой woo-read-first
  • (form-update-enum name data) — заполнить поле с именем name типа enum списком значений data, возвращённым командой woo-list

Если мы хотим вручную сформировать список значений data во фронтенде, это можно сделать следующим образом: (list (list "" "name" enum1 "label" label_for_enum1) (list "" "name" enum2 "label" label_for_enum2)) Здесь enum1,enum2 — значения, которые будет принимать поле, label_for_enum1,label_for_enum2 — текст, который будет выводиться пользователю.

Функции модификации состояний полей

Эти функции меняют свойства одновременно и полей и меток к ним.

  • (form-update-visibility namelist status) - изменить видимость поля в соотвестствии со значением переменной status - булевого типа. namelist - или список имён полей или одно поле.
  • (form-update-activity namelist status) - изменить активность поля в соответствии со значением переменной status - булевого типа. namelist - или список имён полей или одно поле.

Другие функции

  • (form-bind name event proc) — привязать вызов процедуры proc в случае возникновения события event в виджете с именем name. Допустимые события: «click», «change».
  • (form-replace url . url-args) — перенаправить на страницу по адресу url и передать аргументы url-args
  • (form-popup url . url-args) — вызвать страницу по адресу url как popup и передать аргументы url-args