610 likes | 769 Views
dr inż. Piotr Czapiewski. Technologie tworzenia aplikacji internetowych Wykład 4. PHP – Member overloading. PHP – Member overloading. Overloading Znaczenie inne niż w większości języków obiektowych Metoda dynamicznego tworzenia pól i metod „Magiczne metody”
E N D
dr inż. Piotr Czapiewski Technologie tworzenia aplikacji internetowychWykład 4
PHP – Memberoverloading Overloading • Znaczenie inne niż w większości języków obiektowych • Metoda dynamicznego tworzenia pól i metod „Magiczne metody” • __get(), __set(), __isset(), __unset() • Wywoływane automatycznie przy próbie dostępu do nieistniejącego lub ukrytego pola (private, protected)
Przykłady stosowania w Zend • Przekazywanie danych z kontrolera do widoku • Przechowywanie danych w modelu • Równocześnie dostęp obiektowyi łatwy zapis do bazy
Zend Framework Przykład – Kalkulator
Nowy projekt – Kalkulator zfcreateproject Kalkulator cd Kalkulator
Konfiguracja hosta wirtualnego • Konfiguracja serwera Apache • Plik httpd.conf lub plik dołączany przez httpd.conf • W przypadku pakietu XAMPP: c:\xampp\apache\conf\extra\httpd-vhosts.conf <VirtualHost *:80> DocumentRoot "C:/xampp/htdocs/Kalkulator/public" ServerNamekalkulator.localhost ErrorLog "logs/kalkulator.error.log" CustomLog "logs/kalkulator.access.log" combined </VirtualHost>
Konfiguracja hosta wirtualnego • Konfiguracja systemu • Jaki adres IP ma host o nazwie kalkulator.localhost? • Plik hosts: c:\windows\system32\drivers\etc\hosts 127.0.0.1 kalkulator.localhost
Widok – akcja index/views/scripts/index/index.phtml <div><h1>Witamy w Zendowym Kalkulatorze</h1><formaction="/index/dodaj"method="POST"><inputtype="text"name="a"><inputtype="text"name="b"><inputtype="submit"value="Dodaj"></form></div>
Nowa akcja – dodaj zf create action dodaj Index
Kontroler – akcja dodajIndexController.php, dodajAction() publicfunctiondodajAction(){$a = $this->getRequest()->getParam('a');$b = $this->getRequest()->getParam('b'); $c = $a + $b;$this->view->wynik = $c;}
Widok – akcja dodaj/views/scripts/index/dodaj.phtml <h1>Wynik dodawania:<?phpecho$this->wynik;?></h1><ahref="/index/index/"> Fajnie było, chcę jeszcze raz! </a>
Zend Framework Zend_Layout, Zend_Db, Zend_Form
Włączenie Zend_Layout zfenablelayout [production] phpSettings.display_startup_errors = 0 phpSettings.display_errors = 0 includePaths.library = APPLICATION_PATH "/../library" bootstrap.path = APPLICATION_PATH "/Bootstrap.php" bootstrap.class = "Bootstrap" appnamespace = "Application" resources.frontController.controllerDirectory = APPLICATION_PATH "/controllers" resources.frontController.params.displayExceptions = 0 resources.layout.layoutPath = APPLICATION_PATH "/layouts/scripts/"
Zend_Layout <html><head><title>Kalkulator</title><metahttp-equiv="content-type“content="text/html; charset=UTF-8"></head><body><?phpecho$this->layout()->content?></body></html>
Zend_Layout Szablon: layout.phtml <html><head><title>Kalkulator</title><metahttp-equiv="content-type“content="text/html; charset=UTF-8"></head><body><?phpecho$this->layout()->content?></body></html> Kod wysłany do przeglądarki <html><head><title>Kalkulator</title><metahttp-equiv="content-type„content="text/html; charset=UTF-8"></head><body><div><h1>Witamy w Zendowym Kalkulatorze</h1><formaction="/index/dodaj"method="POST"><inputtype="text"name="a"><inputtype="text"name="b"><inputtype="submit"value="Dodaj"></form></div></body></html> Widok związany z akcją: index.phtml <div><h1>Witamy w Zendowym Kalkulatorze</h1><formaction="/index/dodaj"method="POST"><inputtype="text"name="a"><inputtype="text"name="b"><inputtype="submit"value="Dodaj"></form></div>
Zend_Form classApplication_Form_KalkulatorextendsZend_Form{ publicfunctioninit() {$this->setMethod('post');$this->addElement('text', 'a');$this->addElement('text', 'b');$this->addElement('submit', 'Dodaj'); } }
Zend_Form publicfunctioninit() {$this->setMethod('post');$a = $this->createElement('text', 'a');$a->setRequired(true);$a->addValidator(newZend_Validate_Int());$a->setLabel('a = ');$this->addElement($a);$b = $this->createElement('text', 'b');$b->setRequired(true);$b->addValidator(newZend_Validate_Int());$b->setLabel('b = ');$this->addElement($b);$this->addElement('submit', 'Dodaj');}
Zend_Form publicfunctioninit() {$this->setMethod('post');$this->addElement('text', 'a', array('label' => 'a = ','required' => true,'validators' => array('int') ));$this->addElement('text', 'b', array('label' => 'b = ','required' => true,'validators' => array('int') ));$this->addElement('submit', 'Dodaj');}
Zend_Form – wyświetlanie formularza Kontroler: IndexController.php publicfunctionindexAction() {$form = newApplication_Form_Kalkulator();$form->setAction('/index/index');$this->view->form = $form;} Widok: index.phtml <div><h1>Witamy w Zendowym Kalkulatorze</h1><?phpecho$this->form; ?></div>
Zend_Form – obsługa formularza publicfunctionindexAction() {$form = newApplication_Form_Kalkulator();$form->setAction('/index/index');$this->view->form = $form;if($this->getRequest()->isPost()) {if($form->isValid($_POST)) {$this->_forward('dodaj'); } }}
Zend_DbKonfiguracja dostępu do bazy danych [production] phpSettings.display_startup_errors = 0 phpSettings.display_errors = 0 includePaths.library = APPLICATION_PATH "/../library" bootstrap.path = APPLICATION_PATH "/Bootstrap.php" bootstrap.class = "Bootstrap" appnamespace = "Application" resources.frontController.controllerDirectory = APPLICATION_PATH "/controllers" resources.frontController.params.displayExceptions = 0 resources.layout.layoutPath = APPLICATION_PATH "/layouts/scripts/" resources.db.adapter = "pdo_mysql" resources.db.params.host = "localhost" resources.db.params.username = "student99" resources.db.params.password = "tajne_haslo" resources.db.params.dbname = "student99" resources.db.params.charset = utf8 [staging : production] [testing : production] phpSettings.display_startup_errors = 1 phpSettings.display_errors = 1 [development : production] phpSettings.display_startup_errors = 1 phpSettings.display_errors = 1 resources.frontController.params.displayExceptions = 1 resources.db.adapter = "pdo_mysql" resources.db.params.host = "localhost" resources.db.params.username = "student99" resources.db.params.password = "tajne_haslo" resources.db.params.dbname = "student99" resources.db.params.charset = utf8
Zend_DbZapytania SQL • Dostęp do adaptera bazy danych: • $db = Zend_Db_Table::getDefaultAdapter(); • Metody dostępu do danych: • insert(), update(), delete(), query(), … • fetchAll(), fetchAssoc(), fetchCol(), fetchOne(), …
Zend_DbZapytania SQL - przykłady $db = Zend_Db_Table::getDefaultAdapter();$sql = 'select * from wpisy';$result = $db->fetchAll($sql);foreach($resultas$row)echo$row['id'] . ' ' . $row['tytul'] . '<br>'; Zwraca tablicę $sql = 'select * from wpisy where id = ?';$row = $db->fetchRow($sql, array(1));echo$row['id'] . ' ' . $row['tytul'] . '<br>';
Zend_DbZapytania SQL - przykłady $sql = 'select id, tytulfrom wpisy';$result = $db->fetchPairs($sql);foreach($resultas$id => $tytul)echo$id . ' ' . $tytul . '<br>'; $sql = 'selectcount(*) from wpisy';$n = $db->fetchOne($sql);
Zend_Db_Table • Realizacja wzorca projektowego Table Data Gateway • Tworzenie klasy pośredniczącej w dostępie do tabeli bazy danych • Jedna tabela = jedna klasa pośrednicząca • Proste operacje – bez użycia SQL • Metody: • fetchAll(), find(), save(), delete(), insert(), createRow()
Zend_Db_Table Tabela w bazie danych: wpisy Model: Wpisy.php <?phpclassApplication_Model_WpisyextendsZend_Db_Table_Abstract{protected$_name = 'wpisy';}
Zend_Db_TablePobieranie danych $model = newApplication_Model_Wpisy();$wpisy = $model->fetchAll();foreach($wpisyas$wpis)echo$wpis->tytul . '<br>'; Zwraca obiekt klasy Zend_Db_Table_Rowset_Abstract $res = $model->fetchAll('id < 7', 'tytul'); $res = $model->fetchAll('id < 7', 'tytul'); $wpis = $model->find(3)->current();
Zend_Db_TableDodawanie nowych wierszy $dane = array('tytul' => 'Nowy wpis','tresc' => 'Ala ma kota...','skrot' => 'Ala...' ); $model->insert($dane); Metoda insert $wpis = $model->createRow();$wpis->tytul = 'Nowy wpis';$wpis->tresc = 'Ala ma kota...';$wpis->skrot = 'Ala...';$wpis->save(); Obiekt Zend_Db_Table_Row
Zend_Db_TableModyfikacja wierszy $dane = array('tytul' => 'Zmieniony tytuł','tresc' => 'Całkiem nowa treść' ); $model->update($dane, 'id=26'); Metoda update $wpis = $model->find(26)->current();$wpis->tytul = 'Zmieniony tytuł';$wpis->tresc = 'Całkiem nowa treść';$wpis->save(); Obiekt Zend_Db_Table_Row
Zend_Db_TableKonstruowanie zapytań $select = $model->select();$select->where('data_dodania >= ?', '2010-03-01');$select->where('data_dodania < ?', '2010-04-01');$select->order('tytul');$res = $model->fetchAll($select); $select = $model->select()->where('data_dodania >= ?', '2010-03-01')->where('data_dodania < ?', '2010-04-01')->order('tytul');$res = $model->fetchAll($select);
Zend_Db_TableKonstruowanie zapytań $select = $model->select(Zend_Db_Table::SELECT_WITH_FROM_PART);$select->where('data_dodania >= ?', '2010-03-01');$select->where('data_dodania < ?', '2010-04-01');$select->order('tytul'); $select->setIntegrityCheck(false);$select->join('uzytkownicy', 'wpisy.autor=uzytkownicy.id'); $res = $model->fetchAll($select);
Automatyczne ładowanie klas • Zend_Loader automatycznie ładuje definicje klas, o ile spełniają warunki określone w konfiguracji • Klasa:Application_Model_Wpisy • Plik:/application/models/Wpisy.php • Klasa: Application_Form_Wpis • Plik:/application/forms/Wpis.php
Nowy projekt – Nasz Blog zfcreateprojectNaszBlog cdNaszBlog
Włączenie Zend_Layout zfenablelayout
Efekt włączenia Zend_Layout • Domyślny szablon layout.phtml <?phpecho$this->layout()->content; ?>
Nasz Blog – szablon layout.phtml <!DOCTYPEHTMLPUBLIC"-//W3C//DTDHTML4.01Transitional//EN"><html><head><title>ZFBlog</title><metahttp-equiv="Content-Type" content="text/html; charset=UTF-8"><linkrel="stylesheet"type="text/css" href="/main.css"></head><body><divid="page"><divid="menu"><ahref="/">Strona główna</a> |<ahref="">Dodaj wpis</a> |<ahref="">Zaloguj</a></div><divid="content"><?phpecho$this->layout()->content; ?></div></div></body></html>
Nasz Blog – widok index.phtml <h1>Witamy w Naszym Blogu</h1>
Model Dostęp do bazy danych
Konfiguracja bazy danychapplication.ini [production] phpSettings.display_startup_errors = 0 phpSettings.display_errors = 0 includePaths.library = APPLICATION_PATH "/../library" bootstrap.path = APPLICATION_PATH "/Bootstrap.php" bootstrap.class = "Bootstrap" appnamespace = "Application" resources.frontController.controllerDirectory = APPLICATION_PATH "/controllers" resources.frontController.params.displayExceptions = 0 resources.layout.layoutPath = APPLICATION_PATH "/layouts/scripts/" resources.db.adapter = "pdo_mysql" resources.db.params.host = "localhost" resources.db.params.username = "zf_blog" resources.db.params.password = "zf_blog" resources.db.params.dbname = "zf_blog" resources.db.params.charset = utf8 [staging : production] [testing : production] phpSettings.display_startup_errors = 1 phpSettings.display_errors = 1 [development : production] phpSettings.display_startup_errors = 1 phpSettings.display_errors = 1 resources.frontController.params.displayExceptions = 1 resources.db.adapter = "pdo_mysql" resources.db.params.host = "localhost" resources.db.params.username = "zf_blog" resources.db.params.password = "zf_blog" resources.db.params.dbname = "zf_blog" resources.db.params.charset = utf8
Automatyczne ładowanie klas • application.ini • Klasy z przedrostkiem Blog_ będą automatycznie ładowane (bez require) [production] phpSettings.display_startup_errors = 0 phpSettings.display_errors = 0 includePaths.library = APPLICATION_PATH "/../library" bootstrap.path = APPLICATION_PATH "/Bootstrap.php" bootstrap.class = "Bootstrap" appnamespace = "Blog" ...
Zend_Db_Table • Tworzymy model dla tabeli wpisy • Klasa Blog_Model_Wpisy dziedzicząca z Zend_Db_Table_Abstract <?phpclassBlog_Model_WpisyextendsZend_Db_Table_Abstract{protected$_name = 'wpisy';}
Pobieranie danych z modelu • Pobranie wszystkich wpisów: • fetchAll() • fetchAll($where, $order) • Pobranie wpisu o konkretnym ID: • find($id) $mdl = newBlog_Model_Wpisy();$wpisy = $mdl->fetchAll(); $mdl = newBlog_Model_Wpisy();$wpis = $mdl->find($id)->current();
Pobieranie danych z modeluWyświetlenie wszystkich wpisów na stronie głównej • Pobranie wszystkich wpisów i przekazanie do widoku:(application/controllers/IndexController.php) classIndexControllerextendsZend_Controller_Action {publicfunctionindexAction() {$mdl = newBlog_Model_Wpisy();$wpisy = $mdl->fetchAll();$this->view->wpisy=$wpisy; } }