Blog (75)
Komentarze (5.2k)
Recenzje (0)
@nintyfanNowości w Bonsole(4): Obsługa formularzy i pierwszy przydatny przykład

Nowości w Bonsole(4): Obsługa formularzy i pierwszy przydatny przykład

21.04.2020 11:55

W końcu stworzyłem przydatny program. Służy do edycji /etc/passwd za pomocą formularza html lub konsolowego (w zależności od uruchomionego backend-u).

Obsługa formularzy przez backend konsolowy. Co prawda nie działa jeszcze zbyt przyzwoicie, ale formularze są używalne.
Obsługa formularzy przez backend konsolowy. Co prawda nie działa jeszcze zbyt przyzwoicie, ale formularze są używalne.
Przemieszczamy się za pomocą tabulatora, aktywujemy za pomocą entera. Co prawda jezszcze nie wszystko działa, bo wskazuje zaznaczenie wielu kontrolek, mimo że jest jedna, ale to jezszcze nie jest wersja ostateczna.
Przemieszczamy się za pomocą tabulatora, aktywujemy za pomocą entera. Co prawda jezszcze nie wszystko działa, bo wskazuje zaznaczenie wielu kontrolek, mimo że jest jedna, ale to jezszcze nie jest wersja ostateczna.

Zaprezentowałem już, jak działa obsługa formularzy w backendzie konsolowym. Ogólnie źle, prawda? Znacznie lepiej się prezentuje obsługa przez backend normalny/Bonsole. Tak wygląda ten sam formularz w backendzie normalnym:

699905

Mamy tutaj przycisk następne, zapisz pełny plik i utwórz nowy rekord. Przycisk następne nie jest zawsze widoczny, a gdy jest to możliwe, ukazuje się przycisk poprzednie.

Do zrzutu pliku, tworzymy plik tymczasowy, zapisujemy w nim dane, usuwamy plik docelowy poleceniem rm (z shella), przenosimy plik tymczasowy w miejsce usuniętego poleceniem mv (z shella). Gdy te operacje nie są możliwe, to wykorzystujemy pkexec. Wykorzystuję polecenia powłoki (shella), gdyż jest to najlepszy sposób, w przypadku przenoszenia plików (implementacja czegoś takiego jest dosyć trudna, zważywszy iż możemy mieć wiele systemów plików, dowiązania, itd.). Może w przyszłości się to zmieni.

Ze strony programisty

Przede wszystkim, to programy należy łączyć z biblioteką kliencką Bonsole. Ona ładuje odpowiedni backend, w zależności od ustawień użytkownika. Mamy do dyspozycji trochę wywołań i konwencji:

Bonsole wymaga, by program generował drzewo dokumentu, dokładając kolejne elementy do elementu głównego, zwróconego przez:

bonsole_reset_document(0);
xmlDocPtr a = bonsole_window(0);
xmlNodePtr root = xmlDocGetRootElement(a);

xmlDocGetRootElement. Jak jednak widać, musimy najpierw pobrać dokument przez bonsole_window. Zero przekazane jako argument oznacza kontekst - obecnie wymagane jest, by zawsze podawać w miejsce kontekstu NULL (bądź też 0).

bonsole_reset_document(kontekst) resetuje dokument dla wskazanego kontekstu. Jest to wymóg, dzięki któremu poprzednie elementy nie pozostaną w drzewie przy kolejnym generowaniu widoku.

Wspomnę, że Bonsole korzysta z libxml2 i aplikacja także musi.

Do utworzenia formularzy, posiłkujemy się znacznikiem form, nadając mu atrybut action o wartości app:nazwa_akcji . Podczas przesyłania formularza, bonsole będzie się zachowywać jak przeglądarka internetowa, dodając parametry po znaku ? (poprzedzonego nazwą akcji - bez app:), oddzielając każdy przez znak &, a wartości i nazwy zmiennych oddzielając znakiem równości.

Takie ciągi będą przesyłane do pętli obsługi żądań/komunikatów. By nadać wartości polom formularza, posiłkujemy się:

bonsole_set_form(kontekst, "app:nazwa_akcji", "json");

W json nazwy pól to nazwy pól formularza, a wartości pól to wartości pól formularza.

Możemy także pobrać wartości pól formularza w dowolnym momencie, poprzez:

bonsole_get_form(kontekst, akcja, prefix);

Za kontekst oczywiście podstawiamy NULL, za akcję nazwę akcji formularza, wraz z app:, a za prefix app:nazwa_prefiksu. Jest jednak jeden minus. Wywołanie tej funkcji oznacza wysłanie komunikatu do pętli obsługi komunikatów, a nie powrót z wynikiem w miejscu wywołania

Postaram się naprawić to w przyszłości.

Wybrane dla Ciebie
Komentarze (2)