13 августа 2009 г.

GtkHTML. Работа с формами

Обработка форм в GtkHTML далеко не очевидна, поэтому я решил посвятить ей отдельную статью.



О GtkHTML информации в интернете очень мало, а про работу с формами я вообще ничего не нашёл и знакомился с ними на единственном примере.

Для всех элементов формы вместо привычных <input> необходимо использовать тэг <OBJECT>, причём он один заменяет всю форму (далее станет понятно). Как только GtkHTML встретит данный тэг - будет издан сигнал 'object-requested', в ответ на который вызовем функцию on_object_requested(). Ей автоматически передадутся два объекта - GtkHTML и GtkHTMLEmbedded. Последний представляет из себя контейнер для встраивания виджетов в HTML-код. В функции on_object_requested() создаём обычные виджеты, помещаем их в GtkHTMLEmbedded и работаем с ними, как со всеми остальными, рассматриваемыми в предыдущих статьях.

Если у Вас имеется некий готовый HTML-код с формой, то необходимо написать простой парсер, который вырежет всё, что находится между <form> и </form>, вставит на это место <OBJECT> и далее, в соответствии с кодом формы, создаст интерфейс. Но это уже чистый PHP, поэтому останавливаться на данном вопросе не буду.

Полный код программы:

<?php
 
$window = new GtkWindow();
$window->connect_simple('destroy', array('Gtk', 'main_quit'));
 
$html = new GtkHTML();
$str = "<OBJECT>";
$html->connect('object-requested', 'on_object_requested');
$html->load_from_string($str);
 
$window->add($html);
$window->show_all();
Gtk::main();
 
function on_object_requested($html, $embedded)
{
$hbox = new GtkHBox();
$hbox->show();
 
$entry = new GtkEntry();
$entry->connect('activate', 'on_printing');
$entry->show();
$hbox->pack_start($entry, TRUE, TRUE);
 
$button = new GtkButton('Press');
$button->connect_simple('clicked', 'on_printing', $entry);
$button->show();
$hbox->pack_start($button, FALSE, FALSE);
 
$embedded->add($hbox);
 
return TRUE;
}
 
function on_printing($entry)
{
echo "Содержимое поля ввода: " . $entry->get_text() . "\r\n";
}
 
?>

7 комментариев:

Анонимный комментирует...

Браво! только вчера спросил в 18:30, а уже через час статья есть!

вот это скорость! спасибо, как рас то что надо!
в понедельник по тестирую =)

Анонимный комментирует...

Здравствуйте, сорри за анонимность, а есть ли возможность использовать PHP-GTK2 и gecko?

просто в списке библиотек есть библиотека GtkMozEmbed ( http://gtk.php.net/manual/en/mozembed.gtkmozembed.php )
список функций, но без примера и с плохим знанием английского тяжело разобраться самому.
P.S.: мануалы с сайта мозиллы сильно устарели.
Спасибо.

Shecspi комментирует...

Сегодня вечером скомпилирую php-gtk с поддержкой GtkMozEmbed и попробую. Если получится, то напишу статью.

Shecspi комментирует...

Да, GtkMozEmbed действительно использует движок Gecko. Судя по Python-версии он является достаточно мощным и проходит Acid3 на 73 балла. Но вот в PHP-GTK, почему-то, подключить данный модуль у меня не получается, хотя он скомпилирован с параметром --with-mozembed.

Анонимный комментирует...

жаль... но спасибо за попытку

alex комментирует...

--with-asdasdasd

тоже скомпилируется и будет в билде отображатся, это не значит что компонент подключился, нужно смотреть configure скрипт, умеет ли он реагировать на --with-mozembed, и искать почему не подключает

Shecspi комментирует...

Умеет. По крайней мере в справочной информации имеется соответствующая строчка
./configure --help