240 likes | 346 Views
dr inż. Piotr Czapiewski. Systemy zarządzania treścią Wykład 6. PHP OOP – Member overloading. Overloading Znaczenie inne niż w większości języków obiektowych Metoda dynamicznego tworzenia pól i metod „Magiczne metody” __g et() , __set() , __ isset () , __ unset ()
E N D
dr inż. Piotr Czapiewski Systemy zarządzania treściąWykład 6
PHP OOP – 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 obiektowy i łatwy zapis do bazy
Zend Framework Budujemy blog
Nowy projekt – Nasz Blog zfcreateprojectNaszBlog cdNaszBlog
Włączenie Zend_Layout w projekcie zfenablelayout
Efekt włączenia Zend_Layout [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/" [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
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="<?phpecho$this->baseUrl('main.css'); ?>"></head><body><divid="page"><divid="menu"><ahref="<?phpecho$this->baseUrl(); ?>">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
Zend_Db_Table • Realizacja wzorca projektowego Table Data Gateway • Tworzenie klasy pośredniczącej w dostępiedo 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 • Tworzymy model dla tabeli wpisy • Klasa Blog_Model_Wpisydziedzicząca z Zend_Db_Table_Abstract <?phpclassBlog_Model_WpisyextendsZend_Db_Table_Abstract{protected$_name = 'wpisy';}
Automatyczne ładowanie klas • application.ini • Klasy z przedrostkiem Blog_ będą automatycznie ładowane (bez wywołania 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" ...
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; } }
Pobieranie danych z modeluWyświetlenie wszystkich wpisów na stronie głównej • Wyświetlenie wpisów w widoku:(application/views/scripts/index/index.phtml) classIndexControllerextendsZend_Controller_Action {publicfunctionindexAction() {$mdl = newBlog_Model_Wpisy();$wpisy = $mdl->fetchAll();$this->view->wpisy=$wpisy; } }
Wyświetlanie treści wpisu • Implementacja wyświetlania treści całego wpisu • Dodanie akcji /index/pokaz • Dodanie na stronie głównej linku do akcji pokaz, przekazanie id wpisu • W akcji pokaz: pobranie pojedynczego wpisu • Wyświetlenie w widoku pokaz.phtml zfcreate action pokaz Index
Dodawanie wpisów • Implementacja dodawania wpisów • Stworzenie formularza Blog_Form_Wpis • Stworzenie akcji /index/dodaj • W akcji dodaj: • Stworzenie instancji formularza • Przekazanie do widoku • W widoku dodaj.phtml: • Wyświetlenie formularza
Dodawanie wpisów • Obsługa przesłanego formularza • Sprawdzenie poprawności danych • Stworzenie instancji modelu Blog_Model_Wpisy • Stworzenie nowego wiersza • Zapisanie danych