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

Материал из ALT Linux Wiki
Строка 43: Строка 43:
Можно также заглянуть в файл <tt>/tmp/config</tt> и убедиться, что он содержит строку <tt>'value'</tt>.
Можно также заглянуть в файл <tt>/tmp/config</tt> и убедиться, что он содержит строку <tt>'value'</tt>.


====Графический интерфейс====
==== Графический интерфейс ====
Интерфейс командой строки хорошо, но графический &mdash; ещё лучше. Установим необходимые дополнительные пакеты и
Интерфейс командой строки хорошо, но графический — ещё лучше. Установим необходимые дополнительные пакеты и
опять воспользуемся стандартными правилами, предоставляемыми alterator для создания простейшего описания интерфейса, а также специального файла, содержащего описание модуля. Последний потребуется для приложения, визуализирующего интерфейс.
опять воспользуемся стандартными правилами, предоставляемыми <tt>alterator</tt> для создания простейшего описания интерфейса, а также специального файла, содержащего описание модуля. Последний потребуется для приложения, визуализирующего интерфейс.
<pre>
<pre>
$ sudo apt-get install alterator-standalone
$ sudo apt-get install alterator-standalone
Строка 51: Строка 51:
$ make generate-ui-qt
$ make generate-ui-qt
</pre>
</pre>
В результате появятся файлы applications/simple.desktop и ui/simple/index.scm . Во втором мы сохраним следующее описание интерфейса:
В результате появятся файлы <tt>applications/simple.desktop</tt> и <tt>ui/simple/index.scm</tt> . Во втором мы сохраним следующее описание интерфейса:
<source lang="scheme">
<source lang="scheme">
(document:surround "/std/frame")
(document:surround "/std/frame")
Строка 57: Строка 57:
(label text "Simple module")
(label text "Simple module")
</source>
</source>
Первая строчка служебная. Вторая &mdash; сообщает о требовании создать метку с текстом 'Simple module'. Подобные конструкции можно вкладывать друг в друга, например:
Первая строчка служебная. Вторая — сообщает о требовании создать метку с текстом <tt>'Simple module'</tt>. Подобные конструкции можно вкладывать друг в друга, например:
<source lang="scheme">
<source lang="scheme">
...
...
Строка 66: Строка 66:
интерфейс из двух меток, сгруппированных горизонтально.
интерфейс из двух меток, сгруппированных горизонтально.


Для запуска интерфейса воспользуемся утилитой '''alterator-standalone'''. В качестве единственного параметра данная утилита принимает имя файла описания модуля (без суффикса desktop), в нашем случае это 'simple'.
Для запуска интерфейса воспользуемся утилитой '''alterator-standalone'''. В качестве единственного параметра данная утилита принимает имя файла описания модуля (без суффикса desktop), в нашем случае это <tt>'simple'</tt>.
<pre>
<pre>
$ /usr/sbin/alterator-standalone -l
$ /usr/sbin/alterator-standalone -l
Строка 72: Строка 72:
В результате на экране появится окно [[Image:Alterator-simple1.png|thumb|left|первый графический интерфейс]] с надписью 'Simple module'.
В результате на экране появится окно [[Image:Alterator-simple1.png|thumb|left|первый графический интерфейс]] с надписью 'Simple module'.


Теперь необходимо наладить взаимодействие с бакендом. Для этого необходимо создать два обработчика событий и воспользоваться функциями:
Теперь необходимо наладить взаимодействие с бэкендом. Для этого необходимо создать два обработчика событий и воспользоваться функциями:
* '''woo-read-first''' &mdash; прочитать данные из бакенда
* '''<tt>woo-read-first</tt>''' — прочитать данные из бэкенда
* '''woo-get-option''' &mdash; получить значение параметра из ответа бакенда
* '''<tt>woo-get-option</tt>''' — получить значение параметра из ответа бэкенда
* '''woo-write''' &mdash; записать данные в бакенд
* '''<tt>woo-write</tt>''' — записать данные в бэкенд
Первый обработчик события (loaded) будет вызываться при старте интерфейса, в этом обработчике будет происходить запрос "read" к бакенду и полученное значение переменной 'parameter' будет записано в текстовое поле.
Первый обработчик события (loaded) будет вызываться при старте интерфейса, в этом обработчике будет происходить запрос «read» к бэкенду и полученное значение переменной 'parameter' будет записано в текстовое поле.
Второй обработчик события (clicked) будет вызываться при нажатии на кнопку 'OK' и в результате его работы будет происходить запрос "write" к бакенду на изменение значения переменной 'parameter' на то, что записано в текстовом поле.
Второй обработчик события (clicked) будет вызываться при нажатии на кнопку {{button|OK}} и в результате его работы будет происходить запрос «write» к бэкенду на изменение значения переменной 'parameter' на то, что записано в текстовом поле.


Суммируя сказанное получаем следующее описание интерфейса:
Суммируя сказанное получаем следующее описание интерфейса:
Строка 97: Строка 97:
</source>
</source>


Функция '''document:id''' назначает текстовому полю идентификатор по которому потом можно к нему ссылаться. А '''document:root''' &mdash; ссылка на текущее окно.
Функция '''document:id''' назначает текстовому полю идентификатор по которому потом можно к нему ссылаться. А '''document:root''' — ссылка на текущее окно.


Запустив интерфейс вы уже сможете считывать и редактировать содержимое файла /tmp/config.[[Image:Alterator-simple2.png|thumb|left|графический интерфейс, работающий с бакендом]]
Запустив интерфейс вы уже сможете считывать и редактировать содержимое файла /tmp/config.[[Image:Alterator-simple2.png|thumb|left|графический интерфейс, работающий с бэкендом]]


====Web-интерфейс====
====Web-интерфейс====

Версия от 09:59, 18 ноября 2008

Первый модуль

Лучше один раз увидеть, чем сто раз услышать, поэтому давайте сразу попробуем создать простейший модуль alterator. Сделаем проект alterator-simple — модуль который будет изменять значение одной переменной по имени parameter.

Бэкенд

Сначала установим пакет alterator, создадим каталог с проектом и скопируем туда стандартный Makefile.

$ sudo apt-get install alterator
$ mkdir alterator-simple
$ cd alterator-simple
$ cp /usr/share/alterator/build/Makefile .

В скопированном Makefile изменим значение переменной NAME на simple и тут же воспользуемся стандартным правилом alterator для создания заготовки бэкенда на shell:

$ make generate-backend-sh

В результате появится файл backend3/simple. Посмотрим на него внимательнее. Основной цикл работы бэкенда — функция message_loop. Функция on_message — главная точка обработки входящих сообщений. Входящие параметры появляются в виде переменных shell с именем вида $in_name. Главный параметр action — определяет вид действия, который запрашивается у бэкенда. Основные действия:

  • read — прочитать значение переменной
  • write — изменить значение переменной
  • list — получить список значений

Остановимся более подробно на первых двух действиях. Научим бэкенд при запросе read считывать значение переменной parameter из файла, а при запросе write записывать значение переменной parameter обратно в файл.

case "$in_action" in
    read)
        write_string_param parameter "$(cat /tmp/config 2>/dev/null)"
        ;;
    write)
        [ -n "$in_parameter" ] && echo "$in_parameter" >/tmp/config
        ;;
...

Сразу же проверим бэкенд, поработав с ним через интерфейс командной строки — alterator-cmdline.

$ alterator-cmdline -l /simple action read
parameter:
$ alterator-cmdline -l /simple action write parameter value
$ alterator-cmdline -l /simple action read
parameter:value

Можно также заглянуть в файл /tmp/config и убедиться, что он содержит строку 'value'.

Графический интерфейс

Интерфейс командой строки хорошо, но графический — ещё лучше. Установим необходимые дополнительные пакеты и опять воспользуемся стандартными правилами, предоставляемыми alterator для создания простейшего описания интерфейса, а также специального файла, содержащего описание модуля. Последний потребуется для приложения, визуализирующего интерфейс.

$ sudo apt-get install alterator-standalone
$ make generate-desktop-file
$ make generate-ui-qt

В результате появятся файлы applications/simple.desktop и ui/simple/index.scm . Во втором мы сохраним следующее описание интерфейса:

(document:surround "/std/frame")

(label text "Simple module")

Первая строчка служебная. Вторая — сообщает о требовании создать метку с текстом 'Simple module'. Подобные конструкции можно вкладывать друг в друга, например:

...
(hbox
 (label text "First")
 (label text "Second"))

интерфейс из двух меток, сгруппированных горизонтально.

Для запуска интерфейса воспользуемся утилитой alterator-standalone. В качестве единственного параметра данная утилита принимает имя файла описания модуля (без суффикса desktop), в нашем случае это 'simple'.

$ /usr/sbin/alterator-standalone -l

В результате на экране появится окно

первый графический интерфейс

с надписью 'Simple module'.

Теперь необходимо наладить взаимодействие с бэкендом. Для этого необходимо создать два обработчика событий и воспользоваться функциями:

  • woo-read-first — прочитать данные из бэкенда
  • woo-get-option — получить значение параметра из ответа бэкенда
  • woo-write — записать данные в бэкенд

Первый обработчик события (loaded) будет вызываться при старте интерфейса, в этом обработчике будет происходить запрос «read» к бэкенду и полученное значение переменной 'parameter' будет записано в текстовое поле. Второй обработчик события (clicked) будет вызываться при нажатии на кнопку OK и в результате его работы будет происходить запрос «write» к бэкенду на изменение значения переменной 'parameter' на то, что записано в текстовом поле.

Суммируя сказанное получаем следующее описание интерфейса:

(document:surround "/std/frame")

(hbox
 (label text "Parameter value:")
 (document:id parameter (edit)))

(button text "OK"
  (when clicked
    (woo-write "/simple" 'parameter (parameter value))))

(document:root
  (when loaded
     (let ((data (woo-read-first "/simple")))
       (parameter value (woo-get-option data 'parameter)))))

Функция document:id назначает текстовому полю идентификатор по которому потом можно к нему ссылаться. А document:root — ссылка на текущее окно.

Запустив интерфейс вы уже сможете считывать и редактировать содержимое файла /tmp/config.

графический интерфейс, работающий с бэкендом

Web-интерфейс

На этом возможности alterator не исчерпываются. Давайте создадим и web-интерфейс управления файлом /tmp/config. Поставим дополнительные пакеты, запустим необходимые сервисы и привычно воспользуемся стандартным правилом make для создания заготовки описания web-интерфейса.

$ sudo apt-get install alterator-fbi
$ make generate-ui-html

Сервис ahttpd - генератор интерфейса со встроенным web сервером. Может работать как сервис. А при запуске с параметром '-l' не уходит в фоновый режим и начинает использовать файлы с описанием интерфейса и бакенды из локального каталога. Таким образом можно заниматься отладкой своего проекта.

Файл с описанием интерфейса templates/simple/index.html, самый обычный html-файл.

<html wf="form">
    <body>
        <form method="POST">
            <p>Simple</p>
        </form>
    </body>
</html>

Находясь в рабочем каталоге, запускаем ahttpd:

$ /usr/sbin/ahttpd -l

После чего в любимом браузере отправляемся по адресу 'https://localhost:8080/simple'.

первый web-интерфейс

После того как мы введём имя и пароль администратора системы, перед нам откроется центр управления. Наш модуль в нём ещё не зарегистрирован (и потому отсуствует в боковом меню), но тем не менее к нему можно уже обратиться.

Теперь, как и в случае с графическим интерфейсом необходимо наладить взаимодействие с бакендом. Здесь не требуется прописывать каких-либо дополнительных инструкций, достаточно добавить текстовое поле и дать ему имя совпадающее с именем параметра:

<html wf="form">
    <body>
        <form method="POST">
            <p>Parameter value:<input type="text" class="text" name="parameter"/></p>
            <input type="submit" class="btn" value="OK"/>
        </form>
    </body>
</html>
web-интерфейс, работающий с бакендом

Обновив страницу в web-браузере мы уже сможем ,как и в случае с графическим интерфейсом, менять содержимое файла /tmp/config.