${Pylons} Przewodnik część 2
|
|
- Alojzy Sikora
- 10 lat temu
- Przeglądów:
Transkrypt
1 Tworzymy formularz. ${Pylons} Przewodnik część 2 Spróbujmy stworzyć w naszym projekcie formularz do rejestracji użytkowników. Będzie on posiadał cztery pola: login, hasło, hasło_potwierdzone oraz e mail. W tym celu dodajmy nową akcję kontrolera users: class UsersController(BaseController): def index(self): # Return a rendered template # return render('/template.mako') # or, Return a response c.name = "d'arc" return render('users/index.xhtml') def register(self): return render('users/register.xhtml') a następnie widok users/register.xhtml: <form action="create" method="post"> <fieldset> <legend>formularz rejestracyjny</legend> <div><label for="loginfield">login: </label><input type="text" name="login" id="loginfield" /></div> <div><label for=" field">e mail: </label><input type="text" name=" " id=" field" /></div> <div><label for="passwordfield">hasło: </label><input type="password" name="password" id="passwordfield" /></div> <div><label for="password_confirmationfield">potwierdź hasło: </label><input type="password" name="password_confirmation" id="password_confirmationfield" /></div> </fieldset> <div><input type="submit" name="create" value="zarejestruj" /></div> </form> Przyjrzyjmy się kodowi HTML. Pierwszym elementem, na który warto zwrócić uwagę to parametr action. Jest ona po prostu nazwą akcji. Dane z forumlarza zostaną wysłane do metody create. Nie stworzyliśmy jeszcze niczego o tej nazwie, jednak na to przyjdzie czas później. Dane będą przesyłane metodą post, choćby dlatego, aby informacje takie jak hasło nie pojawiły się przypadkiem w pasku adresu. Ale czy Pylons może nam jakoś pomóc przy tworzeniu kodu formularza? Oczywiście :) W skład Jan Koprowski 1
2 Pylons wchodzi między innymi WebHelpers 1. Jest to zbiór funkcji, które, między innymi, próbują skróci czas jaki poświęcamy na klepanie kodu HTML starając się wygenerować go za nas. Po kolei. Ładujemy helpery. Aby móc korzystać z helperów musimy na starcie je załadować. W tym celu wyedtujmy plik lib/helpers.py i dopiszmy na końcu linijkę: """Helper functions Consists of functions to typically be used within templates, but also available to Controllers. This module is available to both as 'h'. """ # Import helpers as desired, or define your own, ie: # from webhelpers.html.tags import checkbox, password from webhelpers.html.tags import form, text, password, submit, end_form Dzięki temu w naszych szablonach będą dostępne funkcje potrzebne nam do wygenerowania formularzy. Czas na edycję naszego widoku. Zrobimy to krok po kroku. Przechodzimy na helpery. Na starcie wygenerujmy sam tag <form>: ${h.form('/create', method='post')} <fieldset> <legend>formularz rejestracyjny</legend> <div><label for="loginfield">login: </label><input type="text" name="login" id="loginfield" /></div> <div><label for=" field">e mail: </label><input type="text" name=" " id=" field" /></div> <div><label for="passwordfield">hasło: </label><input type="pasword" name="password" id="passwordfield" /></div> <div><label for="password_confirmationfield">potwierdź hasło: </label><input type="password" name="password_confirmation" id="password_confirmationfield" /></div> </fieldset> <div><input type="submit" name="create" value="zarejestruj" /></div> </form> Powyższa linijka generuje dokładnie taki sam kod HTML jak ten pisany przez nas wcześniej. Dużo krócej prawda? W porządku. Teraz pozamieniajmy pola tekstowe: 1 Jan Koprowski 2
3 ${h.form('/create', method='post')} <fieldset> <legend>formularz rejestracyjny</legend> <div><label for="loginfield">login: </label>$ {h.text("login", id="loginfield")}</div> <div><label for=" field">e mail: </label>$ {h.text(" ", id=" field")}</div> <div><label for="passwordfield">hasło: </label><input type="password" name="password" id="passwordfield" /></div> <div><label for="password_confirmationfield">potwierdź hasło: </label><input type="password" name="password_confirmation" id="password_confirmationfield" /></div> </fieldset> <div><input type="submit" name="create" value="zarejestruj" /></div> </form> Ilość kodu, jaki musimy napisać aby nasz formularz ukazał się światu systematycznie maleje :) O to chodzi. Teraz czas na pola haseł: ${h.form('/create', method='post')} <fieldset> <legend>formularz rejestracyjny</legend> <div><label for="loginfield">login: </label>$ {h.text("login", id="loginfield")}</div> <div><label for=" field">e mail: </label>$ {h.text(" ", id=" field")}</div> <div><label for="passwordfield">hasło: </label>$ {h.password("password", id="passwordfield")}</div> <div><label for="password_confirmationfield">potwierdź hasło: </label>${h.password("password_confirmation", id="password_confirmationfield")}</div> </fieldset> <div><input type="submit" name="create" value="zarejestruj" /></div> </form> Na koniec wygenerujemy jeszcze przycisk submit oraz znacznik końca formularza. Jan Koprowski 3
4 ${h.form('/create', method='post')} <fieldset> <legend>formularz rejestracyjny</legend> <div><label for="loginfield">login: </label>$ {h.text("login", id="loginfield")}</div> <div><label for=" field">e mail: </label>$ {h.text(" ", id=" field")}</div> <div><label for="passwordfield">hasło: </label>$ {h.password("password", id="passwordfield")}</div> <div><label for="password_confirmationfield">potwierdź hasło: </label>${h.password("password_confirmation", id="password_confirmationfield")}</div> </fieldset> <div>${h.submit("create", "Zarejestruj")}</div> ${h.end_form()} Jak rozumieć istnienie helperów? No właśnie. Przecież to samo możemy napisać ręcznie. Można na to spojrzeć z kilku stron. Po pierwsze: dobrze napisane helpery dają nam pewność, że generowany przez nie kod będzie zgodny ze standardami, na przykład W3C. Jeżeli zależy nam na standardach i chcemy ograniczyć czas poświęcony na sesje spędzone z walidatorem można to postrzegać jako jakiś zysk. Helpery tworzą też swoistą warstwę abstrackji. Jeżeli powiedzmy za kilka lat tworzenie stron internetowych w niczym nie będzie przypominało dzisiejszego kodu HTML. Wtedy wystarczy podmienić w całym Framerowku to co generują helpery, wgrać nową jego wersję i nasza strona spełnia już najnowsze standardy (o ile oczywiście 100% portalu zostało wygenerowane co jest tylko teoretycznie możliwe). Czy więc zawsze należy używać helperów? Nie. Należy ich używać z rozsądkiem. Dobrym przykładem "zbędnego" użycia jest ostatnia linijka naszego formularza. ${h.end_form()} jest znacznie dłuższe niż </form>. Istnieją frameworki, w których nie znajdziesz funkcji odpowiedzialnej za wygenerowanie "nieopłacalnych" z punktu widzenia długości kodu tagów: przykładowo </form>. Wyświetlamy zawartość formularza. Aby wyświetlić zawartość formularza stworzymy w kontrolerze users akcję create a następnie wywołamy szablon, do którego przekażemy wysłane wartości. Do dzieła. Na start wyedytujmy plik controllers/users.py: Jan Koprowski 4
5 class UsersController(BaseController): def index(self): # Return a rendered template # return render('/template.mako') # or, Return a response c.name = "d'arc" return render('users/index.xhtml') def register(self): return render('users/register.xhtml') def create(self): c.login = request.post['login'] c. = request.post[' '] c.password = request.post['password'] c.password_confirmation = request.post['password_confirmation'] return render('users/create.xhtml') Zatrzymajmy się na chwilkę i przeanalizujmy co się tutaj tak właściwie dzieje. Po pierwsze tworzymy cztery zmienne globalne, które za moment wyświetlimy w naszym widoku. Nowym elementem jest niewątpliwie request.post. Obiekt request zawiera między innymi słownik POST, z którego pobieramy dane wysłane wcześniej formularzem. Na koniec renderujemy widok, który za moment stworzymy. Osoby znające troszkę lepiej Pylons mogą zastanawiać się dlaczego nie użyto metody request.params. W naszym formularzu jawnie zarządaliśmy wysyłani danych metodą POST. Dane pobierane za pomocą request.params mogłyby zostać równie dobrze przesłane metodą GET. Warto o tym pamiętać. Mając to na uwadze możemy upewnić się skąd pochodzą informacje, konkretyzując z jakiego źródła je pobieramy. Użycie request.post, jest w tym momencie celowe. Czas na widok. Stwórz plik users/create.xhtml. <strong>login</strong>: ${c.login}<br /> <strong>e mail</strong>: ${c. }<br /> <strong>hasło</strong>: ${c.password}<br /> <strong>potwierdzenie hasła</strong>: $ {c.password_confirmation} Teraz po wysłaniu formularza zobaczymy wpisane przez nas dane. Jan Koprowski 5
6 Walidacja formularza. Nigdy nie polegaj wyłącznie na walidacji po stronie klienta opartej o JavaScript czy AJAX. Technologie te mogą znacznie uprzyjemnić i ułatwić wprowadzenie poprawnych danych użytkownikowi, "na bieżąco" informując go o nieprawidłowościach, bez potrzeby wysyłani formularza jednak metody stosowane po stronie klienta w żaden sposób nie gwarantują wysłania formularzem poprawnych wartości. Wniosek? Zawsze sprawdzaj dane po stronie serwera: mechanizmy client side traktuj jako dodatek ale nigdy im nie ufaj. Warto zauważyć, że szalenie użyteczne jest tutaj wykorzystanie zapytań AJAX dla reguł walidacji. Dzięki temu mamy szansę przestrzegać zasady DRY i nie implementować ponownie tych samych reguł walidacji w innym języku programowania, po stronie klienta. Daje nam to automatyczną koniunkcję iż formularz zwalidowany po stronie użytkownika poprawnie przejdzie testy po stronie serwera. Zazwyczaj formularze rejestracyjne wyposażone są w mechanizm walidacji, który wymusza na nas aby hasła były zgodne, login nie był za krótki, e mail posiadał formę e maila i wiele innych. Spróbujemy wyposażyć w takie mechanizmy również naszą stronę. Pylons potrafi korzystać, ze stworzonego specjalnie w tym celu mechanizmu zwanego FormEncode 2. Spróbujmy użyć go w naszym przypadku. Zacznijmy od zdefiniowania kryteriów. Umówmy się, że login nie będzie mógł być krótszy niż cztery znaki i dłuższy niż 25, E mail będzie musiał przypominać e mail, a hasła będą musiały być nie krótsze niż 8 znaków i zgodne ze sobą. Wszystkie pola będą wymagane. Ok. Walidacja naszego formularza będzie polegała na stworzeniu klasy opisującej wcześniej założone przez nas obostrzenia i dodaniu dekoratora do metody mającej odebrać dane z naszego widoku. Skoro wiemy już jak wszystko ma się zachowywać czas na przejście do konkretu. Zaczniemy od stworzenia klasy. W tym celu dodajmy do naszego projektu plik model/form.py: import formencode class RegisterForm(formencode.Schema): allow_extra_fields = True filter_extra_fields = True Powyższy kod to nic innego jak zaimportowanie na starcie formencode, z którego będziemy korzystać i stworzenie klasy. Dziedziczy po klasie Schema. Dodaliśmy na początek dwa atrybuty. Otóż chodzi o to, że w naszym formularzu istnieją pola, które nie powinny być poddane walidacji. Jest to na przykład nasz przycisk submit. Ustawienie wartości allow_extra_fields = True oraz filter_extra_fields = True pozwoli ominąć te, dla których nie ustawimy żadnych restrykcji. Na starcie zacznijmy od minimalnej długości hasła. Ma być nie krótsze niż 8 znaków: 2 Jan Koprowski 6
7 import formencode class RegisterForm(formencode.Schema): allow_extra_fields = True filter_extra_fields = True password = formencode.validators.minlength(8, not_empty=true) Proszę bardzo. Powyższa linjka to wywołanie walidatora MinLength dla pola password. Pierwszym parametrem jest liczba osiem. Dodatkowo dodaliśmy parametr not_empty=true, który wywoła odpowiedni błąd gdy będziemy chcieli zostawić puste pole. Jak łatwo się domyślić skoro istnieje MinLength to istnieje również MaxLength. Mamy więc komplet potrzebny do walidacji pola loginu. Jak jedna połączyć dwa warunki. Służy do tego metoda All: import formencode class RegisterForm(formencode.Schema): allow_extra_fields = True filter_extra_fields = True login = formencode.all(formencode.validators.minlength(4, not_empty=true), formencode.validators.maxlength(25, not_empty=true)) password = formencode.validators.minlength(8, not_empty=true) Co tutaj się wydarzyło? Skorzystaliśmy z metody All aby spiąć klamrą nasze dwa warunki. Pierwszy z nich mówi o tym, że minimalna długość loginu jest równa 4 i pole nie może być puste. Drugi, że maksymalna długość loginu jest równa 25 i pole nie może być puste. Oczywiście dublowanie warunku not_empty=true nie jest konieczne. W porządku. Mamy login, mamy sprawdzanie długości hasła. Brakuje jeszcze sprawdzania poprawności e mail a i sprawdzanie zgodności powtórzonego hasła. Zacznijmy od adresu skrzynki pocztowej: import formencode class RegisterForm(formencode.Schema): allow_extra_fields = True filter_extra_fields = True login = formencode.all(formencode.validators.minlength(4, not_empty=true), formencode.validators.maxlength(25, not_empty=true)) = formencode.validators. (not_empty=true) password = formencode.validators.minlength(8, not_empty=true) Tym razem skorzystaliśmy z walidatora , i dodaliśmy znanym nam już skądinąd warunek iż Jan Koprowski 7
8 pole jest wymagane. Teraz czas na potwierdzenie poprawności hasła. Po pierwsze atrybuty, dla których nie stworzyliśmy regułek nie są dostępne w naszej klasie (dwie pierwsze wartości), tak więc nasza klasa nie wie jeszcze nic o polu password_confirmation. Łatwo temu zaradzić tworząc jaką neutralną zasadę. Powiedzmy, że hasło powtórzone będzie musiało być stringiemi: class RegisterForm(formencode.Schema): allow_extra_fields = True filter_extra_fields = True login = formencode.all(formencode.validators.minlength(4, not_empty=true), formencode.validators.maxlength(25, not_empty=true)) = formencode.validators. (not_empty=true) password = formencode.validators.minlength(8, not_empty=true) password_confirmation = formencode.validators.string() Fantastycznie. Skoro już zaradziliśmy naszemu "problemowi: i nasza klasa wie już o polu password_confirmation możemy sprawdzić czy zawiera to samo co password. Skorzystamy tutaj z metody w walidacji o nazwie FieldsMatch, który przyjmuje jako parametry nazwy atrybutów, które mają być ze sobą zgodne. Aby jednak porównać pola muszą one przejść wszystkie poprzednie testy. Wskażemy to przypisując regułkę do pola chained_validators. Ale szkoda gadać. Kod będzie mówił sam za siebie: class RegisterForm(formencode.Schema): allow_extra_fields = True filter_extra_fields = True login = formencode.all(formencode.validators.minlength(4, not_empty=true), formencode.validators.maxlength(25, not_empty=true)) = formencode.validators. (not_empty=true) password = formencode.validators.minlength(8, not_empty=true) password_confirmation = formencode.validators.string() chained_validators = [formencode.validators.fieldsmatch('password', 'password_confirmation')] Wiele więcej informacji o możliwych do zastosowania walidatorach oraz ich działaniu znajdziesz w PylonsBook 3 oraz dokumentacji FormEncode Jan Koprowski 8
9 Podczas pisania kursu próbowałem zastosować wersję walidowania e maili z włączonym sprawdzaniem domeny w DNS, parametrem resolve_domain=true. Pierwszym błędem jaki zaczął zwracać Pylons był rzekomy brak moduły DNS pochodzącego z projektu pydns 5 (oczywiście w konsoli Pythona importowanie modułu było bezproblemowe). Próba odszukania plików modułu skończyła się fiaskiem: katalog, na który wskazywała dokumentacja był traktowany przez system jako plik binarny. Ostatecznie "pomogło" ściągnięcie najnowszych źródeł ze strony projektu i zainstalowanie ich z użycie pliku setup.py (sudo python setup.py install) jednak i tym razem biblioteka okazała się wadliwa pojawiały się problem z kodowanie znaków, domyślam się zawartych w adresie e mail. Wiadomości z bugiem wysłana do developerów jest odrzucana przez serwer pocztowy. Walidacja w akcji. Czas na nasz kontroler tutaj zabiegi będą czysto kosmetyczne. Na początek przygotujmy naszemu kontrolerowi warsztat i zaimportujmy niezbędne moduły. import logging from pylons import request, response, session, tmpl_context as c from pylons.controllers.util import abort, redirect_to from pylons.decorators import validate from darc.lib.base import BaseController, render #from darc import model from darc.model.form import RegisterForm log = logging.getlogger( name ) class UsersController(BaseController): def index(self): # Return a rendered template # return render('/template.mako') # or, Return a response c.name = "d'arc" return render('users/index.xhtml') def register(self): return render('users/register.xhtml') def create(self): c.login = request.post['login'] c. = request.post[' '] 5 Jan Koprowski 9
10 Z kwestii formalnych: na starcie zaimportowaliśmy dekorator validate, a następnie naszą klasę, w której zapisaliśmy informacje o wymaganiach jakie chcemy aby spełniały dane wysyłane przez nasz formularz. To jednak ciut za mało aby wszystko zaczęło współgrać zaczęła działać. Czas na magię: class UsersController(BaseController): def index(self): # Return a rendered template # return render('/template.mako') # or, Return a response c.name = "d'arc" return render('users/index.xhtml') def register(self): return form="register") def create(self): c.login = request.post['login'] c. = request.post[' '] I tylko tyle? Zapytacie. Tak. Tylko tyle. Użyliśmy składni dekoratora. Pierwszym parametrem jest szablon, do którego mają pasować dane wysłane przez nasz formularz. Tworzyliśmy go w poprzednim rozdziale. Drugi to nazwa akcji kontrolera, do której należy wrócić kiedy coś się nie powiedzie. Inaczej: nazwa akcji zawierającej formularz. Możesz już przetestować swoje dzieło. Składnia dekoratorów została wprowadzona w języku Python dopiero po wersji 2.3. Jeżeli chcesz używasz wersji Pythona nie obsługującej dekoratorów zamiast wpisz validate(schema=registerform(), form="register")(create) po deklaracji metody create. Zauważ, że podczas nieudanej walidacji, któregoś z pól, dane w formularzu pozostają na swoim miejscu. Psujemy dalej czyli XSS w natarciu. No to się narobiliśmy! Mysz się nie prześliźnie mogłoby się wydawać sielanka, fajrant! Domyślnie w wersji włączona jest nawet ochrona przed atakami XSS. Winowajca nazywa się default_filters=['escape'] i znajdziemy go w pliku config/environment.py. Zobaczmy co się stanie jeżeli wyłączymy escapowanie. W tym celu wyedtujemy plik widoku users/ create.xhtml Jan Koprowski 10
11 <strong>login</strong>: ${c.login}<br /> <strong>e mail</strong>: ${c. }<br /> <strong>hasło</strong>: ${c.password n}<br /> <strong>potwierdzenie hasła</strong>: $ {c.password_confirmation} Opcja n powoduje wyłączenie domyślnego filtru. Teraz wpisz w pole hasła <script>alert('akuku')</script>. Nasz tekst zostanie wstawiony bez zamiany znaczników < i > na encje HTML przez co przeglądarka potraktuje go jak kod JavaScript. Pojawi się więc okienko z informacją "akuku". Pozostawmy opcję n i dodajmy do niej przykładowo h: <strong>login</strong>: ${c.login}<br /> <strong>e mail</strong>: ${c. }<br /> <strong>hasło</strong>: ${c.password n,h}<br /> <strong>potwierdzenie hasła</strong>: $ {c.password_confirmation} Opcja h to włączenie opcji esacpowania HTML. Uzyskaliśmy więc taki sam efekt jak na początku. Użycie literki u spowoduje bezpieczne wyświetlanie charakterystyczne dla adresów URL, zaś literka x przyda nam się gdy będzie potrzebowali filtrować kod XML. Inne przydatne opcje to trim, które wycina spacje z początku i końca stringu czy unicode, które zwróci obiekt unicode Pythona. Użyteczną opcją może okazać się również decode.<jakieś kodowanie>, które zwracając string użyje wskazanego kodowania. Zawsze escapuj dane. Jeżeli masz wątpliwości w którym miejscu, rób to najbliżej wyjścia (w widoku gdy wyświetlasz dane). Tworzymy layout. Zazwyczaj strona posiada jakiś powtarzający się na każdej stronie element. Menu, czy chociażby nagłówki, które generalnie dla każdej strony są takie same. Spróbujmy więc stworzyć przykładowy layout. Niech będzie to plik templates/layout.xhtml. <?xml version="1.0" encoding="utf 8"?> <!DOCTYPE html PUBLIC " //W3C//DTD XHTML 1.0 Frameset//EN" " frameset.dtd"> <html> <head> <title>d'arc</title> <meta http equiv="content Type" content="application/xhtml+xml; charset=utf 8" /> <meta name="author" content="imi ę Nazwisko" /> </head> <body> ${next.body()} </body> </html> Jan Koprowski 11
12 Poza kodem XHTML, który widać na pierwszy rzut oka wkradł się ${next.body()}. ${next.body()} to nic innego jak informacja dla Mako, iż życzymy sobie tutaj wstawić treść naszego następnego dokumentu. Już pokazuję jak to działa. Aby to sprawdzić musimy powiedzieć naszym widokom,z którego szablonu mają skorzystać. W tym celu edytujemy kolejno pliki users/create.xhtml, users/index.xhtml oraz users/register.xhtml: <%inherit file="/layout.xhtml"/> <strong>login</strong>: ${c.login}<br /> <strong>e mail</strong>: ${c. }<br /> <strong>hasło</strong>: ${c.password n,entity}<br /> <strong>potwierdzenie hasła</strong>: $ {c.password_confirmation} <%inherit file="/layout.xhtml"/> <h1>indeks uzytkowników</h1> <ul> <li>${c.name}</li> </ul> <%inherit file="/layout.xhtml"/> ${h.form('create', method='post')} <fieldset> <legend>formularz rejestracyjny</legend> <div><label for="loginfield">login: </label>$ {h.text("login", id="loginfield")}</div> <div><label for=" field">e mail: </label>$ {h.text(" ", id=" field")}</div> <div><label for="passwordfield">hasło: </label>$ {h.password("password", id="passwordfield")}</div> <div><label for="password_confirmationfield">potwierdź hasło: </label>${h.password("password_confirmation", id="password_confirmationfield")}</div> </fieldset> <div>${h.submit("create", "Zarejestruj")}</div> ${h.end_form()} Proszę bardzo. Znacznik inherit na początku każdego z plików poinformuje Mako iż chcemy zawrzeć ten plik wewnątrz wskazanego w parametrze. Aby udowodnić, że wszystko gra podejrzyj źródła swojej strony :) Jan Koprowski 12
13 Piszemy testy. Testowanie aplikacji często bywa traktowane po macoszemu. Być może dlatego, że zostawiane są zawsze na koniec. I rzeczywiście w małych projektach, pisanych adhoc, w których kod pisze się tylko raz i mają działać pomysł testowania może okazać się stratą czasu. W dużych przedsięwzięciach okazuje się przydatny. Wyobraź sobie, że masz całkiem rozbudowany system (ze 40 kontrolerów każdy po 7 13 akcji) i wprowadzasz w losowej ich części jakąś nową funkcjonalność. Perspektywa odwiedzania 40 * 7+13/2 stron i sprawdzanie czy wszystko działa... jest strasznie czasochłonna. Lepiej napisać testy i je "odpalić" co trwa dużo szybciej. Do sprawdzania poprawności dostajemy ponownie Paste 6. Nasze przykłady oprzemy o jedną metodę, polegającą na sprawdzeniu czy to co zwróciła strona internetowa zawiera jakieś wyrażenie. Czyli czy kod strony posiada jakiś, zadany przez nas wcześniej, fragment. Otwieramy plik tests/functional/test_users.py. Kod ten został utworzony przez generator gdy tworzyliśmy kontroler. Czas wyjaśnić co się w nim znajduje: from darc.tests import * class TestUsersController(TestController): def test_index(self): response = self.app.get(url(controller='users', action='index')) # Test response... Widzimy tutaj klasę testującą TestUsersController. Została wygenerowana automatycznie metoda wywołująca akcję index. Nazewnictwo jest proste: test_nazwaakcji, którą testujemy. Fragment response = self.app.get(url(controller='users', action='index')) "odwiedza" stronę i kod, który został zwrócony do przeglądarki zapisuje w zmiennej response. Mamy więc tam źródło witryny. Najprostszą metodą sprawdzenia czy dostaliśmy to czego oczekujemy jest wykonanie sprawdzenia obecności w źródle dobrze nam znanego fragmentu. W tym przypadku spodziewamy się <h1>indeks. from darc.tests import * class TestUsersController(TestController): def test_index(self): response = self.app.get(url(controller='users', action='index')) assert '<h1>indeks' in response # Test response... Proste prawda? Nasza nowa linijka sprawdzi czy w zmiennej response znajduje się ciąg <h1>indeks. W podobny sposób potraktujmy kolejne elementy naszego serwisu. Najprościej bo w analogiczny sposób możemy napisać metodę dla register: 6 applications.html Jan Koprowski 13
14 from darc.tests import * class TestUsersController(TestController): def test_index(self): response = self.app.get(url(controller='users', action='index')) assert '<h1>indeks' in response # Test response... def test_register(self): response = self.app.get(url(controller='users', action='register')) assert '<legend>formularz rejestracyjny</legend>' in response Oczywiście możesz wybrać inny charakterystyczny dla danej witryny fragment. To było banalnie proste. Sprawa zaczyna się komplikować przy chęci przetestowania metody create. Po pierwsze, jak pamiętamy działa ona wyłącznie dla danych przesłanych z użyciem POST poza tym jakoś te dane trzeba przesłać. Pierwszy warunek możemy szybko spełnić, jak łatwo się domyśleć, zamieniając self.app.get na self.app.post. Do przesłania przykładowych danych wykorzystamy argument params. from darc.tests import * class TestUsersController(TestController): def test_index(self): response = self.app.get(url(controller='users', action='index')) assert '<h1>indeks' in response # Test response... def test_register(self): response = self.app.get(url(controller='users', action='register')) assert '<legend>formularz rejestracyjny</legend>' in response def test_create(self): response = self.app.post(url(controller='users', action='create'), params={'login': 'johny', ' ': 'jan.koprowski@gmail.com', 'password': 'haslo1234', 'password_confirmation': 'haslo1234'}) assert '<strong>login</strong>' in response Tym razem wywołaliśmy naszą akcję z użyciem metody POST, dodatkowo przekazując z użyciem Jan Koprowski 14
15 słownika, odpowiednie wartości. Przypomnę, że test powinien dać wynik pozytywny. Tak więc przesłane przez nas parametry muszą być "poprawne". Walidacja nadal działa i dla błędnych wartości zwróci nam ponownie formularz test się nie powiedzie. Jeżeli chciałbyś testować czy coś się nie powiedzie (np. podając złe dane sprawdzić czy wywołał się formularz) możesz to zrobić stosując słówko not np. assert '<strong>login</strong>' not in response. Oczywiście istnieje inne metody będące dokładniejsze i mniej podatne na zmiany źródeł witryny. Zauważ, że w testach nie wykorzystujemy polskich liter. Niestety, podczas próby ich użycia nawet z nagłówkiem # * encoding: utf 8 * otrzymywałem błędy kodera. Jak widać można sobie jednak dać bez nich radę. Koniec części drugiej. Na "dziś" to już wszystko. Nauczyłeś się naprawdę sporo. Czas na własne eksperymenty i oswojenie się z nabytą wiedzą. Warto poszerzyć informacje o metodzie pozyskiwania danych użytecznych przy prowadzeniu testów. Linki podałem w stopce na odpowiedniej stronie. Powodzenia! Licencja nc nd/2.5/pl/ Jan Koprowski 15
16 Spis treści Tworzymy formularz...1 Ładujemy helpery...2 Przechodzimy na helpery...2 Jak rozumieć istnienie helperów?...4 Wyświetlamy zawartość formularza...4 Walidacja formularza...6 Walidacja w akcji...9 Psujemy dalej czyli XSS w natarciu...10 Tworzymy layout...11 Piszemy testy...13 Koniec części drugiej...15 Licencja...15 Jan Koprowski 16
Modele danych walidacja widoki zorientowane na model
Modele danych walidacja widoki zorientowane na model 1. Wprowadzenie Modele danych Modele danych w ASP.NET MVC to klasy znajdujące się w katalogu Models. Ich zadaniem jest mapowanie danych przesyłanych
Laboratorium 7 Blog: dodawanie i edycja wpisów
Laboratorium 7 Blog: dodawanie i edycja wpisów Dodawanie nowych wpisów Tworzenie formularza Za obsługę formularzy odpowiada klasa Zend_Form. Dla każdego formularza w projekcie tworzymy klasę dziedziczącą
ASP.NET MVC. Podstawy. Zaawansowane programowanie internetowe Instrukcja nr 3
3 ASP.NET MVC Podstawy 1 1. Cel zajęć Celem zajęć jest zapoznanie się z podstawami ASP.NET MVC 2.0 Framework. 2. Zadanie Proszę zbudować prostą aplikację WWW przy zastosowaniu framework a ASP.NET MVC 2.0
Kurs rozszerzony języka Python
Środowisko Django, cz. 3 19 stycznia 2018 Plan wykładu 1 2 Konstrukcja formularzy Walidacja i zapis 3 Ograniczenie dostępu 4 Plan wykładu 1 2 Konstrukcja formularzy Walidacja i zapis 3 Ograniczenie dostępu
Laboratorium 1 Wprowadzenie do PHP
Laboratorium 1 Wprowadzenie do PHP Ćwiczenie 1. Tworzenie i uruchamianie projektu PHP w Netbeans Tworzenie projektu Uruchom środowisko NetBeans. Stwórz nowy projekt typu PHP Application (File->New Project,
Ajax. 1. Wprowadzenie. 2. Aplikacja serwerowa
Ajax 1. Wprowadzenie Do tej pory każda akcja na Waszej stronie kończyła się nowym requestem do serwera i przeładowaniem całej strony w przeglądarce. W tej instrukcji dodamy elementy asynchroniczne na stronie,
Na początku utworzymy formularz w czystym języku HTML i przetestujemy go za pomocą przeglądarki WWW.
Tematy: Przygotowanie formularza Przesyłanie danych przez formularz Mechanizm PostBack W rozdziale 1. pojawiła się prosta definicja strony WWW definicja ta określiła dynamiczną stronę WWW jako stronę,
Tworzenie kampanii mailowych. Tworzenie kampanii mailowych.
Tworzenie kampanii mailowych. Główną funkcjonalnością wielokrotnego autorespondera Pername Mail Marketer jest możliwość prowadzenia kampanii mailowych. Mówiąc prościej jest to masowe wysyłanie wiadomości
Tworzenie witryn internetowych PHP/Java. (mgr inż. Marek Downar)
Tworzenie witryn internetowych PHP/Java (mgr inż. Marek Downar) Rodzaje zawartości Zawartość statyczna Treść statyczna (np. nagłówek, stopka) Layout, pliki multimedialne, obrazki, elementy typograficzne,
APLIKACJA SHAREPOINT
APLIKACJA SHAREPOINT Spis treści 1. Co to jest SharePoint?... 2 2. Tworzenie nowej witryny SharePoint (obszar roboczy)... 2 3. Gdzie znaleźć utworzone witryny SharePoint?... 3 4. Personalizacja obszaru
FAQ Systemu EKOS. 1. Jakie są wymagania techniczne dla stanowiska wprowadzania ocen?
27.06.11 FAQ Systemu EKOS 1. Jakie są wymagania techniczne dla stanowiska wprowadzania ocen? Procedura rejestracji ocen wymaga podpisywania protokołów (w postaci wypełnionych formularzy InfoPath Forms
Facelets ViewHandler
JSF i Facelets Wprowadzenie JSP (JavaServer Pages) są natywną i najczęściej używaną technologią do tworzenia warstwy prezentacyjnej dla JSF (JavaServer Faces) Istnieją alternatywne technologie opisu wyglądu
${Pylons} 0.9.7 Przewodnik część 3
${Pylons} 0.9.7 Przewodnik część 3 Czas na bazę danych. Nasza aplikacja posiada już formularz, który wydaje się być perfekcyjnym narzędziem do zakładania użytkownikom kont. Posiadamy nawet metodę create.
Wprowadzenie do Internetu Zajęcia 5
Zajęcia 5 Formularze w PHP Przekazywanie danych ze strony do skryptu PHP Dane ze strony WWW do skryptu PHP można przekazać za pomocą formularzy. W tym celu należy stworzyć formularz (znacznik ),
Języki programowania wysokiego poziomu. PHP cz.3. Formularze
Języki programowania wysokiego poziomu PHP cz.3. Formularze Formularze Sposób przesyłania danych formularza do serwera zależy od wybranej metody HTTP: Metoda GET
Tworzenie stron internetowych z wykorzystaniem HTM5, JavaScript, CSS3 i jquery. Łukasz Bartczuk
Tworzenie stron internetowych z wykorzystaniem HTM5, JavaScript, CSS3 i jquery Łukasz Bartczuk Moduł 3 Formularze Agenda Podstawy formularzy HTML Podstawowe kontrolki formularzy HTML Nowe kontrolki z HTML
Informatyka II. Laboratorium Aplikacja okienkowa
Informatyka II Laboratorium Aplikacja okienkowa Założenia Program będzie obliczał obwód oraz pole trójkąta na podstawie podanych zmiennych. Użytkownik będzie poproszony o podanie długości boków trójkąta.
SZYBKI START. Tworzenie nowego połączenia w celu zaszyfrowania/odszyfrowania danych lub tekstu 2. Szyfrowanie/odszyfrowanie danych 4
SZYBKI START Tworzenie nowego połączenia w celu zaszyfrowania/odszyfrowania danych lub tekstu 2 Szyfrowanie/odszyfrowanie danych 4 Szyfrowanie/odszyfrowanie tekstu 6 Tworzenie nowego połączenia w celu
Baza danych do przechowywania użytkowników
System logowania i rejestracji jest bardzo przydatną funkcjonalnością na każdej stronie. Umożliwia sprawną identyfikację i zarządzanie użytkownikami. Strona ze skryptem logowania nabiera dużej wartości.
Dokument hipertekstowy
Dokument hipertekstowy Laboratorium 3 Struktura semantyczna i formularze mgr inż. Krzysztof Wróbel Katedra Lingwistyki Komputerowej Design stackoverflow.com Design coursesweb.net Design accessibleculture.org
Programowanie w Ruby
Programowanie w Ruby Wykład 13 Marcin Młotkowski 16 stycznia 2013 Plan wykładu Testowanie aplikacji w Ruby on Rails Testowanie modeli Testy funkcjonalne: testowanie kontrolerów Testy integracyjne Testowanie
Laboratorium 6 Tworzenie bloga w Zend Framework
Laboratorium 6 Tworzenie bloga w Zend Framework Przygotowanie bazy danych 1. Wykonaj skrypt blog.sql, który założy w bazie danych dwie tabele oraz wpisze do nich przykładowe dane. Tabela blog_uzytkownicy
Dokumentacja smsapi wersja 1.4
Dokumentacja smsapi wersja 1.4 1. Wprowadzenie Platforma smsapi została skierowana do użytkowników chcących rozbudować swoje aplikacje o system wysyłania smsów. Aplikacja ta w prosty sposób umożliwia integrację
IIIIIIIIIIIIIIIMMIMMIII
IIIIIIIIIIIIIIIMMIMMIII O programie Program Itelix itender Manager przeznaczony jest do zarządzania zapytaniami ofertowymi przesyłanymi za pomocą poczty elektronicznej przez firmy korzystające z systemu
Podstawy technologii WWW
Podstawy technologii WWW Ćwiczenie 8 PHP, czyli poczatki nowej, dynamicznej znajomosci Na dzisiejszych zajęciach rozpoczniemy programowanie po stronie serwera w języku PHP. Po otrzymaniu żądania serwer
Miejski System Zarządzania - Katowicka Infrastruktura Informacji Przestrzennej
Miejski System Zarządzania - Katowicka Infrastruktura Informacji Przestrzennej Geoportal Usługa portalu edukacyjnego Instrukcja użytkownika Historia zmian Wersja Data Kto Opis zmian 1.0 2014-05-27 Sygnity
AKTYWNY SAMORZĄD. Instrukcja użytkownika. www.as.tylda.pl
AKTYWNY SAMORZĄD Instrukcja użytkownika TYLDA Sp. z o.o. 65-001 Zielona Góra ul. Wazów 6a tel. 68 324-24-72 68 325-75-10 www.tylda.pl tylda@tylda.pl wersja 1.1 2014.12.01 2 Spis treści 1. Konta użytkowników...
Przewodnik... Budowanie listy Odbiorców
Przewodnik... Budowanie listy Odbiorców W tym przewodniku dowiesz się jak Skutecznie budować listę Odbiorców, korzystając z narzędzi dostępnych w Twoim koncie oraz zarządzać ustawieniami subskrypcji. Każda
Aplikacje internetowe - laboratorium
Aplikacje internetowe - laboratorium PHP Celem ćwiczenia jest przygotowanie prostej aplikacji internetowej opartej o język PHP. Aplikacja ilustruje takie mechanizmy jak: obsługa formularzy oraz obsługa
Budowanie listy Odbiorców
Budowanie listy Odbiorców W tym przewodniku dowiesz się jak Skutecznie budować listę Odbiorców, korzystając z narzędzi dostępnych w Twoim koncie oraz zarządzać ustawieniami subskrypcji. Budowanie listy
Programy LeftHand - Obsługa plików JPK. Luty 2017
Programy LeftHand - Obsługa plików JPK Luty 2017 Spis treści 1. Wstęp... 2 2. Pierwsze uruchomienie funkcji JPK... 2 3. Generowanie plików JPK... 9 4. Wysyłanie plików JPK... 10 5. Pobieranie i drukowanie
Programowanie internetowe
Programowanie internetowe Wykład 1 HTML mgr inż. Michał Wojtera email: mwojtera@dmcs.pl Plan wykładu Organizacja zajęć Zakres przedmiotu Literatura Zawartość wykładu Wprowadzenie AMP / LAMP Podstawy HTML
Referat z przedmiotu Technologie Internetowe SPIS TREŚCI
SPIS TREŚCI 1.Dwie metody przekazu danych do serwera 2 2.Metoda GET przykład 3 3.Metoda POST przykład 4 4.Kiedy GET a kiedy POST 5 5.Szablony po co je stosować 7 6.Realizacja szablonu własną funkcją 8
Dokumentacja panelu Klienta
Dokumentacja panelu Klienta Wersja 1.1 Strona 1 z 17 Spis treści Historia zmian... 3 Logowanie do Panelu Klienta... 4 Panel... 5 Wysyłki... 6 Przyłączenia... 7 Ustawienia... 8 Zasoby... 8 Integracje...
Instrukcja importu przesyłek. z Menedżera Sprzedaży do aplikacji Webklient
Instrukcja importu przesyłek z Menedżera Sprzedaży do aplikacji Webklient Instrukcja importu przesyłek z Menedżera Sprzedaży do aplikacji Webklient Wersja 1.0 Warszawa, Luty 2015 Strona 2 z 7 Instrukcja
Instrukcja użytkownika
Instrukcja użytkownika Systemu MEWA 2.0 w ramach Regionalnego Programu Operacyjnego Województwa Mazowieckiego 2014-2020 dla wnioskodawców/beneficjentów 1. Wstęp System MEWA 2.0 jest narzędziem przeznaczonym
Instrukcja użytkownika
Instrukcja użytkownika Systemu MEWA 2.0 w ramach Regionalnego Programu Operacyjnego Województwa Mazowieckiego 2014-2020 dla wnioskodawców/beneficjentów 1. Wstęp System MEWA 2.0 jest narzędziem przeznaczonym
Dokumentacja panelu Klienta
Dokumentacja panelu Klienta Wersja 1.2 Strona 1 z 25 Spis treści Historia zmian... 3 Logowanie do panelu Klienta... 4 Panel... 5 Wysyłki... 6 Przyłączenia... 7 Ustawienia... 8 Zasoby... 8 Integracje...
WINDOWS Instalacja serwera WWW na systemie Windows XP, 7, 8.
WINDOWS Instalacja serwera WWW na systemie Windows XP, 7, 8. Gdy już posiadamy serwer i zainstalowany na nim system Windows XP, 7 lub 8 postawienie na nim serwera stron WWW jest bardzo proste. Wystarczy
Bazy Danych i Usługi Sieciowe
Bazy Danych i Usługi Sieciowe Język PHP Paweł Witkowski Wydział Matematyki, Informatyki i Mechaniki Jesień 2011 P. Witkowski (Wydział Matematyki, Informatyki i Mechaniki) BDiUS w. VIII Jesień 2011 1 /
Moduł Notatki Systemu Obsługi Zamówień Publicznych UTP-Bydgoszcz Instrukcja postępowania do 1000 Euro
Moduł Notatki Systemu Obsługi Zamówień Publicznych UTP-Bydgoszcz Instrukcja postępowania do 1000 Euro Spis treści 1. Logowanie się do systemu...2 2. Wybranie z menu Nowe zamówienie...2 3. Wypełnienie formularza...2
Przewodnik użytkownika (instrukcja) AutoMagicTest
Przewodnik użytkownika (instrukcja) AutoMagicTest 0.1.21.137 1. Wprowadzenie Aplikacja AutoMagicTest to aplikacja wspierająca testerów w testowaniu i kontrolowaniu jakości stron poprzez ich analizę. Aplikacja
Aplikacje WWW - laboratorium
Aplikacje WWW - laboratorium JavaServer Pages Celem ćwiczenia jest zbudowanie kilku prostych stron internetowych z użyciem technologii JSP. Podczas ćwiczenia wykorzystany zostanie algorytm sortowania bąbelkowego
Zbieranie kontaktów.
Zbieranie kontaktów. Autor: Roman Przydatek Silvanet Hanna Kumpicka Polskie prawo zabrania wysyłania ofert handlowych na adresy e-mail, których właściciele nie wyrazili na to jednoznacznie zgody. W celu
2 Podstawy tworzenia stron internetowych
2 Podstawy tworzenia stron internetowych 2.1. HTML5 i struktura dokumentu Podstawą działania wszystkich stron internetowych jest język HTML (Hypertext Markup Language) hipertekstowy język znaczników. Dokument
PHP: bloki kodu, tablice, obiekty i formularze
1 PHP: bloki kodu, tablice, obiekty i formularze SYSTEMY SIECIOWE Michał Simiński 2 Bloki kodu Blok if-else Switch Pętle Funkcje Blok if-else 3 W PHP blok if i blok if-else wyglądają tak samo i funkcjonują
Panel Administracyjny (wersja beta)
TransmisjeOnline.pl Panel Administracyjny (wersja beta) Umożliwia zaplanowanie i zdefiniowanie sesji, zarządzanie użytkownikami, dostęp do danych konta oraz faktur. TransmisjeOnline sp. z o.o. z siedzibą
1. Rejestracja 2. Logowanie 3. Zgłaszanie nowego wniosku projektowego
1. Rejestracja Dostęp do wniosku projektowego możliwy jest jedynie dla zarejestrowanych użytkowników. Aby zostać zarejestrowanym należy wypełnić formularz dostępny na stronie www.polskapomoc.gov.pl, a
Podstawy technologii WWW
Podstawy technologii WWW Ćwiczenie 11 PHP, MySQL: więcej, więcej!, więcej!!. tabel i funkcjonalności. Na dzisiejszych zajęciach zdefiniujemy w naszej bazie kilka tabel powiązanych kluczem obcym i zobaczymy,
Aplikacje webowe w obliczu ataków internetowych na przykładzie CodeIgniter Framework
Uniwersytet Zielonogórski Wydział Elektrotechniki, Informatyki i Telekomunikacji Aplikacje webowe w obliczu ataków internetowych na przykładzie CodeIgniter Framework mgr inż. Łukasz Stefanowicz dr inż.
Program dla praktyki lekarskiej
Program dla praktyki lekarskiej ErLab Instrukcja konfiguracji i obsługi Spis Treści 1. Wstęp... 2 2. Konfiguracja... 3 2.1. Serwer... 3 2.2. Laboratorium... 3 2.3. Punkt pobrań... 4 3. Wysyłanie skierowania...
Aplikacje WWW - laboratorium
Aplikacje WWW - laboratorium PHP. Celem ćwiczenia jest przygotowanie prostej aplikacji internetowej wykorzystującej technologię PHP. Aplikacja pokazuje takie aspekty, obsługa formularzy oraz zmiennych
https://lsi.ncbr.gov.pl
Instrukcja składania wniosku o dofinansowanie w systemie informatycznym IP na potrzeby konkursu nr 2/1.1.2/2015 INFORMACJE OGÓLNE 1. Wnioski o dofinansowanie projektu w ramach konkursu nr 2/1.1.2/2015
AUDYT DOSTĘPNOŚCI STRONY INTERNETOWEJ
Poznań, 2012-10-04 AUDYT DOSTĘPNOŚCI STRONY INTERNETOWEJ NAZWA ADRES STRONY ILOŚĆ BŁĘDÓW WCAG 33 ILOŚĆ OSTRZEŻEŃ WCAG 3 TYP DOKUMENTU UŻYTY FORMAT (X)HTML JĘZYK OWANIE STRONY Urząd Marszałkowski Województwa
Formularze. Instrukcja MailSolutions Zarządzanie Panelem Administratora Aplikacja zgodna wymogami RODO
Instrukcja MailSolutions Zarządzanie Panelem Administratora Aplikacja zgodna wymogami RODO Formularze a) Przeglądaj lokalne formularze Dzięki tej funkcji można przeglądać wszystkie formularze lokalne,
Backend Administratora
Backend Administratora mgr Tomasz Xięski, Instytut Informatyki, Uniwersytet Śląski Katowice, 2011 W tym celu korzystając z konsoli wydajemy polecenie: symfony generate:app backend Wówczas zostanie stworzona
Publikowanie strony WWW
Danuta ROZPŁOCH-NOWAKOWSKA Strona 1 2007-10-11 Moduł 2 (1. część) Publikowanie strony WWW Do publikowania stron WWW wykorzystywany był dotychczas w ramach zajęć wydziałowy serwer WWW. Kroki publikacji
Aplikacje WWW - laboratorium
Aplikacje WWW - laboratorium Serwlety Celem ćwiczenia jest przygotowanie kilku prostych serwletów ilustrujących możliwości tej technologii. Poszczególne ćwiczenia prezentują sposób przygotowania środowiska,
Dokumentacja Skryptu Mapy ver.1.1
Dokumentacja Skryptu Mapy ver.1.1 2 Dokumentacja Skryptu Mapy ver.1.1 Spis treści Dokumentacja skryptu... 3 Dodatkowe informacje i kontakt... 7 3 Dokumentacja Skryptu Mapy ver.1.1 Dokumentacja skryptu
E-faktura PKP Energetyka
E-faktura PKP Energetyka Podręcznik użytkownika 1. Rejestracja na portalu... 2 1.1. Wybór rodzaju klienta... 2 1.2. Formularz dla klient indywidualnego... 2 1.3. Formularz dla jednoosobowej działalności
Dane - pobieranie, przekazywanie i przechowywanie. dr Beata Kuźmińska-Sołśnia
Dane - pobieranie, przekazywanie i przechowywanie dr Beata Kuźmińska-Sołśnia Definicja funkcji function nazwa (lista parametrów) { blok instrukcji Użycie instrukcji return wartość kończy działanie funkcji
Aplikacje internetowe
Temat: Język HTML i style CSS Aplikacje internetowe Pracownia specjalistyczna, studia podyplomowe, rok 2011/2012 1. Stwórz formularz HTML pozwalający na rejestrację użytkownika w aplikacji internetowej.
Zajęcia 4 - Wprowadzenie do Javascript
Zajęcia 4 - Wprowadzenie do Javascript Co to jest Javascript Javascript jest językiem skryptowym pozwalającym na dołączanie dodatkowej funkcjonalności do stron WWW. Jest ona najczęściej związana z modyfikacją
INSTRUKCJA UŻYTKOWNIKA GENERATORA WNIOSKÓW O DOFINANSOWANIE DLA WNIOSKODAWCÓW
INSTRUKCJA UŻYTKOWNIKA GENERATORA WNIOSKÓW O DOFINANSOWANIE DLA WNIOSKODAWCÓW Historia zmian dokumentu Nr wersji Data wersji Komentarz/Uwagi/Zakres zmian 1.0 2015-11-19 Utworzenie dokumentu 1 Spis treści
Formularze HTML. dr Radosław Matusik. radmat
www.math.uni.lodz.pl/ radmat Ramy formularza: Grupowanie pól formularza
INSTRUKCJA zakładania konta w Społecznoś ci CEO
INSTRUKCJA zakładania konta w Społecznoś ci CEO KROK 1 W celu uzupełnienia formularza rejestracyjnego należy zarejestrować/zalogować się w Społeczności CEO https://spolecznosc.ceo.org.pl. Społeczność CEO
Dokumentacja systemu NTP rekrut. Autor: Sławomir Miller
Dokumentacja systemu NTP rekrut Autor: Sławomir Miller 1 Spis treści: 1. Wstęp 1.1 Wprowadzenie 1.2 Zakres dokumentu 2. Instalacja 2.1 Wymagania systemowe 2.2 Początek 2.3 Prawa dostępu 2.4 Etapy instalacji
Instrukcja składania wniosku o dofinansowanie w systemie informatycznym IP na potrzeby konkursu nr 1/1.1.1/2015
Instrukcja składania wniosku o dofinansowanie w systemie informatycznym IP na potrzeby konkursu nr 1/1.1.1/2015 INFORMACJE OGÓLNE 1. Wnioski o dofinansowanie projektu w ramach konkursu nr 1/1.1.1/2015
1. REJESTRACJA W INTERIM24.PL... 2 2. PANEL UŻYTKOWNIKA ZAWARTOŚĆ... 8 3. UZUPEŁNIENIE PROFILU... 9
Strona1 Platforma Interim24.pl została stworzona w ramach projektu Interim management nowość w zarządzaniu wiekiem i firmą współfinansowanego przez Unię Europejską w ramach Europejski Funduszu Społecznego.
SYSTEM ZARZĄDZANIA DANYMI OSOBOWYMI - INSTRUKCJA UŻYTKOWNIKA
SYSTEM ZARZĄDZANIA DANYMI OSOBOWYMI - INSTRUKCJA UŻYTKOWNIKA 1. Wstęp System Zarządzania Danymi Osobowymi (dalej SZDO) składa się z: konsoli użytkownika posiadającej funkcjonalności niezbędne m. in. do
1. Zaloguj się do systemu UONET+ jako administrator i uruchom moduł Administrowanie.
UONET+ Co zrobić, gdy szkoła obsługiwana przez system UONET+ jest likwidowana? W poradzie opisano czynności, jakie należy wykonać w przypadku, gdy szkoła obsługiwana przez system UONET+ ulega likwidacji
Komponent Formularz. Rys. 1. Strona programu Joomla - http://joomla.pl. Rys. 2. Instalacja komponentu
Komponent Formularz Instalacja Aby wykorzystać gotowy komponent do tworzenia formularzy w systemie CMS (Joomla), naleŝy uprzednio zaimplementować go, postępując według poniŝszego schematu: 1. Wejść na
REFERAT O PRACY DYPLOMOWEJ
REFERAT O PRACY DYPLOMOWEJ Temat pracy: Projekt i budowa systemu zarządzania treścią opartego na własnej bibliotece MVC Autor: Kamil Kowalski W dzisiejszych czasach posiadanie strony internetowej to norma,
Instrukcja użytkownika
Instrukcja użytkownika Systemu MEWA 2.0 w ramach Regionalnego Programu Operacyjnego Województwa Mazowieckiego 2014-2020 dla wnioskodawców/beneficjentów 1. Wstęp System MEWA 2.0 jest narzędziem przeznaczonym
wfirma (Moduł Magento) v Strona 1 z 12
wfirma (Moduł Magento) v.1.20.0 Strona 1 z 12 Spis treści Zgodny z Magento... 3 Instalacja.... 3 Problem z instalacją... 3 Odinstalowanie modułu:... 4 Konfiguracja.... 5 Ustawienia dokumentów... 6 Ustawienia
app/ - folder zawiera pliki konfiguracyjne dla całej aplikacji src/ - folder zawiera cały kod PHP aplikacji
Baza danych i ORM Projekt zestaw usług dostępnych pod daną domeną. Aplikacja niezależnie działające programy/serwisy (w obrębie pojektu). Zwyczajowo projekt posiada dwie aplikacje: Frontend Backend Moduł
Budowa aplikacji ASP.NET współpracującej z bazą dany do obsługi przesyłania wiadomości
Budowa aplikacji ASP.NET współpracującej z bazą dany do obsługi przesyłania wiadomości część 2 Zaprojektowaliśmy stronę dodaj_dzial.aspx proszę jednak spróbować dodać nowy dział nie podając jego nazwy
Instrukcja składania wniosku o dofinansowanie w systemie informatycznym IP na potrzeby konkursu nr 1/1.1.1/2017 INFORMACJE OGÓLNE 1. Wnioski o dofinansowanie projektu w ramach konkursu nr 1/1.1.1/2017
Kurier DPD dla Subiekt GT
Dane aktualne na dzień: 20-01-2018 12:11 Link do produktu: http://www.strefalicencji.pl/kurier-dpd-dla-subiekt-gt-p-123.html Kurier DPD dla Subiekt GT Cena Dostępność 199,00 zł Dostępny Numer katalogowy
Instalacja systemu zarządzania treścią (CMS): Joomla
Instalacja systemu zarządzania treścią (CMS): Joomla Na stronie http://www.cba.pl/ zarejestruj nowe konto klikając na przycisk:, następnie wybierz nazwę domeny (Rys. 1a) oraz wypełnij obowiązkowe pola
Instrukcja do programu Przypominacz 1.5
Instrukcja do programu Przypominacz 1.5 Program Przypominacz 1.5 pozwala w prosty sposób wykorzystać dane z systemu sprzedaży Subiekt GT do prowadzenia tzw. miękkiej windykacji poprzez wysyłanie kontrahentom
Angular, cz. II. Tworzenie serwisów Web 2.0. dr inż. Robert Perliński rperlinski@icis.pcz.pl
ngular, cz. II 1/24 Angular, cz. II Tworzenie serwisów Web 2.0 dr inż. Robert Perliński rperlinski@icis.pcz.pl Politechnika Częstochowska Instytut Informatyki Teoretycznej i Stosowanej 10 kwietnia 2015
MVC w praktyce tworzymy system artykułów. cz. 2
MVC w praktyce tworzymy system artykułów. cz. 2 W drugiej części artykułu o wzorcu MVC stworzymy część skryptu, odpowiedzialną za obsługę kategorii. Tworzymy kontroler kategorii Na początek stwórzmy plik
Wyrażenie wewnątrz nawiasów jest atomem (rozpatrujemy je jako całość).
Wyrażenia regularne pełnią istotną rolę w PHP. Umożliwiają one opisywanie i przetwarzanie długich ciągów znaków. Dzieje się to na zasadzie porównania danego ciągu znaków z określonym wzorem, ułożonym przez
4. Podstawowa konfiguracja
4. Podstawowa konfiguracja Po pierwszym zalogowaniu się do urządzenia należy zweryfikować poprawność licencji. Można to zrobić na jednym z widżetów panelu kontrolnego. Wstępną konfigurację można podzielić
Instrukcja zarządzania kontem jednostki samorządu terytorialnego w serwisie internetowym
Instrukcja zarządzania kontem jednostki samorządu terytorialnego w serwisie internetowym www.esiop.legionowo.pl Rejestracja w serwisie: Aby utworzyć konto w serwisie, należy otworzyć w przeglądarce internetowej
KUP KSIĄŻKĘ NA: PRZYKŁADOWY ROZDZIAŁ KOMUNIKATY DLA UŻYTKOWNIKA
KUP KSIĄŻKĘ NA: WWW.PRAKTYCZNEPHP.PL PRZYKŁADOWY ROZDZIAŁ KOMUNIKATY DLA UŻYTKOWNIKA KOMUNIKATY DLA UŻYTKOWNIKA W większości aplikacji potrzebujesz mieć możliwość powiadomienia użytkownika o rezultacie
Programowanie w Sieci Internet Python - c. d. Kraków, 28 listopada 2014 r. mgr Piotr Rytko Wydział Matematyki i Informatyki
Programowanie w Sieci Internet Python - c. d. Kraków, 28 listopada 2014 r. mgr Piotr Rytko Wydział Matematyki i Informatyki Co dziś będziemy robić Uwierzytelnianie użytkowników, Obiekt session, Silniki
Ciekawym rozwiązaniem służącym do obsługi zdarzeń dla kilku przycisków w ramach jednej aktywności może być następujący kod:
1. Listener dla przycisku. Ciekawym rozwiązaniem służącym do obsługi zdarzeń dla kilku przycisków w ramach jednej aktywności może być następujący kod: W linii 24 tworzymy globalną metodę mglobal_onclicklistener,
Dokumentacja SMS przez FTP
Dokumentacja SMS przez FTP 1 Wprowadzenie... 2 Właściwości plików... 3 Tworzenie konfiguracji w Panelu Klienta... 4 Raporty doręczeń... 5 Historia zmian... 6 2 Wprowadzenie Usługa wysyłki SMS przez FTP
Katalog książek cz. 3: Web Service
Katalog książek cz. 3: Web Service Przygotowanie usługi sieciowej (web service) 1) Uruchom Netbeans, otwórz projekt przygotowany w ramach poprzednich zajęć. W kolejnych krokach przerobimy klasę BookManager
FORMULARZE Formularz ma formę ankiety, którą można wypełnić na stronie. Taki formularz może być np. przesłany pocztą elektroniczną e-mail.
1 FORMULARZE Formularz ma formę ankiety, którą można wypełnić na stronie. Taki formularz może być np. przesłany pocztą elektroniczną e-mail.
Podręcznik Sprzedającego. Portal aukcyjny
Podręcznik Sprzedającego Portal aukcyjny Spis treści 1. Czym jest KupTam.pl?... 3 2. Logowanie do serwisu... 3 3. Rejestracja... 4 4. Tworzenie domeny aukcyjnej... 7 5. Wybór domeny... 9 6. Obsługa portalu...
CMS Admin instrukcja administratora
CMS Admin instrukcja administratora system zarządzania treścią CMS Made Simple http://www.cmsmadesimple.org/ 1 Strona bazowa konferencji: http://bcc.impan.pl/test/ Link do panelu administracyjnego: http://bcc.impan.pl/test/
Użytkowniku programu FINKA, przekazujemy E-book, który omawia najważniejsze kwestie dotyczące generowania i wysyłania JPK.
Użytkowniku programu FINKA, przekazujemy E-book, który omawia najważniejsze kwestie dotyczące generowania i wysyłania JPK. Na wstępie omówimy kwestie generowania JPK z programów Finka. W dalszej części
Programy LeftHand - Obsługa plików JPK. Wrzesień 2016
Programy LeftHand - Obsługa plików JPK Wrzesień 2016 Spis treści 1. Wstęp...2 2. Pierwsze uruchomienie funkcji JPK...2 3. Generowanie plików JPK...9 4. Wysyłanie plików JPK...10 5. Pobieranie i drukowanie
Przykładowa integracja systemu Transferuj.pl
Krajowy Integrator Płatności Spółka Akcyjna z siedzibą w Poznaniu, przy ul. Św. Marcin 73/6, wpisana do rejestru przedsiębiorców Krajowego Rejestru Sądowego prowadzonego przez Sąd Rejonowy Poznań Nowe
Instrukcja obsługi programu Klient SMS v.1.0
Instrukcja obsługi programu Klient SMS v.1.0 Rozpoczęcie pracy z programem Aby rozpocząć pracę z aplikacją kliencką należy uruchomić dowolną przeglądarkę internetową i wpisać adres: lub http://