Pobierz prezentację
Pobieranie prezentacji. Proszę czekać
OpublikowałDominik Wiercigroch Został zmieniony 10 lat temu
1
Tworzenie Aplikacji Internetowych dr Wojciech M. Gańcza 9
2
Lista książek Teraz coś bardziej skomplikowanego – pełna lista książek. Na liście będziemy mogli zaznaczać ksiązki do dalszych akcji Lista książek będzie zawierać nie tylko tytuły – ale także status książki Na status składają się różne dane Status powinien podawać maksymalną informację o książce
3
Lista książek… Książka jest potrzebna I ją posiadamy – znacznik OK. I jej nie posiadamy Liczba oferowanych książek Lub informacja od kogo ją kupujemy Ksiązka nie jest potrzebna a ją posiadamy Informacja o możliwości sprzedania Informacja o ofercie Informacja o tym, że ktoś ją zarezerwował
4
Cel – lista książek
5
Lista książek - kod $neededBooks = $dbase->getBooksNeededByUser($user); $booksHaving = $dbase->getOwnBooks ($user); $offers = $dbase->countOffers(); $sellingBooks= $dbase->getTransactionsOfSeller ($user); $buyingBooks = $dbase->getTransactionsOfBuyer ($user); $selection = new SelectedItems("selectedbooks"); $allBooks= null; switch($filter) { case 0: $allBooks = new RecordsetMerge(&$booksHaving, &$neededBooks, 0, 3); break; case 1: $allBooks = new RecordsetSubtract(&$neededBooks, &$booksHaving, 0, 3); break; case 2: $allBooks = new RecordsetSubtract(&$booksHaving, &$neededBooks, 0, 3); break; }
6
Lista książek - kod $booksWithOffers = new RecordsetJoin( &$allBooks, &$offers, 0,0,3,1); $books = new RecordsetTransformation( &$booksWithOffers, "0|3|2+1+4+5|6|9"); $booksWithN = new RecordsetJoin( &$books, &$buyingBooks, 0,0,1,1); $booksWithNS = new RecordsetJoin( &$booksWithN, &$sellingBooks, 0,0,1,1); $data = new FormatCheckbox( &$booksWithNS, "0", "selectedbooks", $selection); $withSelector = new CreateStateInfo( &$data, "1|0|3+5+8+4|2"); $grid = new GridBuilder( "Tytuł:LB3|Wybierz:CN3:60|Uwagi:CN1:160 |Opis:LN1:250"); $grid->renderGrid(&$output, &$withSelector);
7
Brakujące klasy Na poprzednim wykładzie prezentowane były klasy SelectedItems – kolekcja elementów które zostały wybrane FormatCheckbox – formatowanie komórki gridu w postaci pola pozwalającego na zaznaczanie Brakuje jeszcze: CreateStateInfo – klasa formatująca status w zależności od informacji z bazy
8
Status Formatowanie statusu jest bardzo nietypową operacją Jest silnie zależny od postaci danych Nie ma sensu silić się na uniwersalność Dane dotyczące statusu są rozrzucone po polach wejściowego rekordsetu Pola wejściowe mogą nie istnieć bo łączenie rekordsetów dodaje pola tylko gdy rekordy pasują.
9
Status… Klasa formtująca status będzie użyta tyko w jednym kontekście Nie musi być uniwersalna! class CreateStateInfo extends RecordsetOperation { function RecordsetOperation(&$source, $definition) { $this->CreateBookInfo(&$source, $definition); }
10
Status … Status składa się z Ikony wskazującej na status ksiązki Dodatkowego tekstu który zawiera uzupełniające informacje Skorzystamy z pól: Czy ksiązka jest nam potrzebna Czy książkę oferujemy Kto kupuje / sprzedaje Ilość oferowanych książek
11
Status … function createField(&$sourceArray, &$schema) { $state = ""; $additionaLinfo = ""; $additionaLinfo = $sourceArray[$schema[3]]; if ($additionaLinfo == "") { $additionaLinfo = "brak ofert"; } else { switch($additionaLinfo % 10) { case 1: $additionaLinfo.= " oferta"; break;
12
Status … case 2: case 3: case 4: $additionaLinfo.= " oferty"; break; default: $additionaLinfo.= " ofert"; break; } if ($sourceArray[$schema[0]] == 0) { if ($sourceArray[$schema[2]] == "") { if ($sourceArray[$schema[3]] == "") $state = "need0"; else $state = "need"; }
13
Status … else { $state = "buying"; $additionaLinfo = "sprzedający: ". $sourceArray[$schema[2]]; } else { if ($sourceArray[$schema[1]] == "") { $state = "have"; $additionaLinfo = ""; } else if ($sourceArray[$schema[2]] == "") { $state = "offering"; }
14
Status … else { $state = "selling"; $additionaLinfo = "kupujący: ". $sourceArray[$schema[2]]; } return "<div style=\"background-image: url('graphics/". $state. ".gif'); background-repeat: no-repeat; background-position: center top; height: 32px; vertical-align: middle; padding-top: 20px;\" >". $additionaLinfo. " "; }
15
Wybór użytkownika Ustawienie użytkownika powinniśmy powiązać z logowaniem Informacja o tym czy, i kto jest zalogowany powinna być przechowywana w przeglądarce Nie powinna być jednak dostępna z poziomu strony lub formularza Najlepsze wydaje się COOKIE – dostępne z serwera
16
SecurityCheck class SecurityCheck { var $value; var $errorMessage; function SecurityCheck() { global $_FAKE; $this->value = $_FAKE["login"]; $this->errorMessage = $_FAKE["loginerr"]; if ($this->value=="" && $this->errorMessage=="") { $this->value = $_COOKIE["login"]; $this->errorMessage = $_COOKIE["loginerr"]; }
17
SecurityCheck… function render(&$output) { $output->out("<input type=\"hidden\" name=\"lout\" value=\"\">"); if ($this->value != 0) { $dataAccess = new DataAccess(); $user = $dataAccess->getUserInfo( $this->value); if (!$user->eof()) { $user = $user->get(); // wyświetl informacje o użytkowniku }
18
Sprawdzenie użytkownika Na każdej stronie aplikacji powinniśmy sprawdzać czy użytkownik jest zalogowany W naszej aplikacji jest tylko jedna strona, można więc sprawdzić użytkownika przed wyborem – który panel powinien być wyświetlony A jeśli nie jest zalogowany – panelem aplikacji jest panel logowania.
19
Sprawdzenie użytkownika… $user = new SecurityCheck(); $panel = null; if ($user->getUser() == 0) { $panel = new LoginPanel(); if ($user->errorMessage == 1) { $panel->setError(); } else { // Tu – wybór panelu do wyświetlenia
20
Panel logowania Panel logowania składa się z kontrolek w których użytkownik na wpisać login oraz hasło Jeśli panel logowania jest wyświetlany mimo wysłania tych informacji – to znaczy że hasło lub użytkownik są błędne!
21
LoginPanel class LoginPanel { var $errorMessage; function LoginPanel() { $this->errorMessage = ""; } function setError() { $this->errorMessage = "Nieprawidłowe dane. Sprawdź czy identyfikator uzytkownika i haslo są prawidłowe i spróbuj jeszcze raz."; }
22
LoginPanel … function render(&$output) { $login = new ControlEdit("logn", ""); $passw = new ControlPassword("pass", ""); $output->out("<div style=\"text-align: center; width: 100%; height: 400px\"><div style=\"height: 150px; text-align: center; color: red; padding: 100 0 0 0; font-weight: bold; \"> $this->errorMessage "); $output->out("<span style=\"width: 100px; text-align: left\"> Użytkownik: ");
23
LoginPanel $login->render(&$output); $output->out(" <span style=\"width: 100px; text-align: left\"> Hasło: "); $passw->render(&$output); $output->out(" <input style=\"width: 200px; margin: 10 0 0 100; background-color: #6a5131; color: white; font-weight: bold; background-repeat: no-repeat; background-image=url( 'graphics/login.gif')\" type=submit name=subm1 value=\"wejdź\">"); $output->out(" "); }
24
Wybór grup
25
GroupSelectionPanel class GroupSelectionPanel { var $dbase; var $user; function GroupSelectionPanel( &$dbase, $user) { $this->dbase = &$dbase; $this->user = $user; }
26
GroupSelectionPanel… function render(&$output) { $separators = new SectionRenderer(); $separators->render(&$output, "Przypisania do grup"); $column = new ColumnSplitter(&$output, "33%|33%|34%"); $lastColumn = 0; $categorie = $this->dbase->getGrupCategories(); $columns->renderBegin(); while(!$categories->eof()) { $category = $categories->get(); $id = $category[0]; $name = $category[1]; $column = $category[2]; if ($lastColumn != $column) { $columns->renderSplit(); $lastColumn = $column; } $separators->render(&$output, $name); $this->renderCategory(&$output, $id); } $columns->renderEnd(); }
27
GroupSelectionPanel… function renderCategory(&$output, $id) { $allGrups = $this->dbase->getGrupsOfCategory($id); $grupsOfUser = $this->dbase->getGrupsOfUser( $this->user); $allData = new RecordsetJoin(&$allGrups, &$grupsOfUser, 0, 0, 1, 1); $withID = new AddHiddenIdentity(&$allData, "grup", 0, 1); $withCheck = new FormatCheckbox(&$withID, "0", "belongToGrup", "2", true, ""); $ready = new RecordsetTransformation( &$withCheck, "0|1"); $grid = new GridBuilder("Należę:CB3:100| Nazwa grupy:LB3"); $grid->renderGrid(&$output, &$ready); }
28
Dane muszą być odbierane Panel z wyborem grup – tylko przygotowuje interfejs Potrzebny jest reaktor – który przesłane dane zapisze do bazy danych Przyda się także zestaw przycisków do zapisu oraz do odwołania zapisu (cancel)
29
Przyciski class SaveAndCancel { function render(&$output) { $output->out("<span style=\"float: right; text-align: center; width: 30px; height: 19px; overflow: hidden; padding-top: 2; background-image: url('". $GRAPHPATH. "save.gif')\"> <a style=\"text-decoration: none;\ href=\"javascript: document.f1.submit();\"> "); $output->out("<span style=\"float: right; text-align: center; width: 30px; height: 19px; overflow: hidden; padding-top: 2; background-image: url('". $GRAPHPATH. "cancel.gif')\"> <a style=\"text-decoration: none;\" href=\"javascript: document.location = document.location;\"> "); }
30
W następnym odcinku Reakcja na zmianę przynależności do grup Edycja a właściwie – edycje książek Posiadanych – by można je było usunąć Lub zaoferować gdy niepotrzebne Lub odwołać/zatwierdzić zakup Lub zaznaczyć, że są już kupione poza systemem Lub zaznaczyć, że są sprzedane poza systemem.
Podobne prezentacje
© 2024 SlidePlayer.pl Inc.
All rights reserved.