Cyfroteka.pl

klikaj i czytaj online

Cyfro
Czytomierz
00621 008418 10491675 na godz. na dobę w sumie
Tworzenie aplikacji z Yii. Receptury - książka
Tworzenie aplikacji z Yii. Receptury - książka
Autor: Liczba stron: 384
Wydawca: Helion Język publikacji: polski
ISBN: 978-83-246-8596-7 Data wydania:
Lektor:
Kategoria: ebooki >> komputery i informatyka >> webmasterstwo >> inne
Porównaj ceny (książka, ebook, audiobook).

Poznaj najlepsze przepisy dla Yii!

PHP to jeden z języków programowania najczęściej wybieranych do tworzenia stron internetowych i aplikacji webowych. Yii to platforma MVC napisana w języku PHP, która sprawi, że Twój kod będzie bardziej przejrzysty, a osiągnięcie założonych celów - znacznie prostsze. Jeżeli połączysz potencjał PHP ze wsparciem Yii, otrzymasz kombajn, który pozwoli Ci w okamgnieniu poradzić sobie z dowolnym problemem.

Książka ta należy do cenionej przez programistów serii „Receptury”. Znajdziesz w niej najczęściej spotykane problemy wraz z ich najlepszymi rozwiązaniami. W trakcie lektury dowiesz się, jak skonfigurować reguły URL, przekazywać wiadomości pomiędzy żądaniami oraz stosować widoki częściowe. Ponadto poznasz najlepsze przepisy na wykorzystanie technologii AJAX oraz biblioteki jQuery wspólnie ze szkieletem Yii. Jeżeli stoisz przed problemem zabezpieczenia aplikacji przed spamem i chciałbyś wykorzystać mechanizm CAPTCHA, to znajdziesz tu szczegółową instrukcję, jak to zrobić. Co jeszcze odkryjesz w tej książce? Najlepsze porady dotyczące wydajności, współpracy z bazą i bezpieczeństwa. Jest to lektura obowiązkowa dla każdego programisty chcącego wykorzystać możliwości Yii w swojej aplikacji!

Dzięki tej książce:

Poznaj możliwości szkieletu Yii!

Znajdź podobne książki Ostatnio czytane w tej kategorii

Darmowy fragment publikacji:

Tytuł oryginału: Yii Application Development Cookbook, Second Edition Tłumaczenie: Joanna Zatorska ISBN: 978-83-246-8596-7 Copyright © Packt Publishing 2013. First published in the English language under the title “Yii Application Development Cookbook – Second Edition” © Helion 2014. All rights reserved. All rights reserved. No part of this book may be reproduced or transmitted in any form or by any means, electronic or mechanical, including photocopying, recording or by any information storage retrieval system, without permission from the Publisher. Wszelkie prawa zastrzeżone. Nieautoryzowane rozpowszechnianie całości lub fragmentu niniejszej publikacji w jakiejkolwiek postaci jest zabronione. Wykonywanie kopii metodą kserograficzną, fotograficzną, a także kopiowanie książki na nośniku filmowym, magnetycznym lub innym powoduje naruszenie praw autorskich niniejszej publikacji. Wszystkie znaki występujące w tekście są zastrzeżonymi znakami firmowymi bądź towarowymi ich właścicieli. Autor oraz Wydawnictwo HELION dołożyli wszelkich starań, by zawarte w tej książce informacje były kompletne i rzetelne. Nie bierze jednak żadnej odpowiedzialności ani za ich wykorzystanie, ani za związane z tym ewentualne naruszenie praw patentowych lub autorskich. Wydawnictwo HELION nie ponosi również żadnej odpowiedzialności za ewentualne szkody wynikłe z wykorzystania informacji zawartych w książce. Wydawnictwo HELION ul. Kościuszki 1c, 44-100 GLIWICE tel. 32 231 22 19, 32 230 98 63 e-mail: helion@helion.pl WWW: http://helion.pl (księgarnia internetowa, katalog książek) Pliki z przykładami omawianymi w książce można znaleźć pod adresem: ftp://ftp.helion.pl/przyklady/twapyi.zip Drogi Czytelniku! Jeżeli chcesz ocenić tę książkę, zajrzyj pod adres http://helion.pl/user/opinie/twapyi Możesz tam wpisać swoje uwagi, spostrzeżenia, recenzję. Printed in Poland. • Kup książkę • Poleć książkę • Oceń książkę • Księgarnia internetowa • Lubię to! » Nasza społeczność Spis tre(cid:258)ci O autorze O recenzentach Wst(cid:218)p Rozdzia(cid:239) 1. Dla zaawansowanych Wst(cid:218)p U(cid:285)ywanie getterów i setterów U(cid:285)ywanie zdarze(cid:241) Yii Korzystanie z importowania i automatycznego (cid:239)adowania U(cid:285)ywanie wyj(cid:200)tków Konfiguracja komponentów Konfiguracja domy(cid:258)lnych ustawie(cid:241) wid(cid:285)etów U(cid:285)ywanie kolekcji platformy Yii Obs(cid:239)uga (cid:285)(cid:200)da(cid:241) Rozdzia(cid:239) 2. Trasy, kontroler i widoki Wst(cid:218)p Konfigurowanie regu(cid:239) URL Generowanie adresów URL wed(cid:239)ug (cid:258)cie(cid:285)ek U(cid:285)ywanie wyra(cid:285)e(cid:241) regularnych w regu(cid:239)ach URL Tworzenie regu(cid:239) URL dla stron statycznych Przekazywanie w(cid:239)asnych regu(cid:239) URL w trakcie dzia(cid:239)ania programu U(cid:285)ycie kontrolerów bazowych U(cid:285)ycie zewn(cid:218)trznych akcji Wy(cid:258)wietlanie stron statycznych przy u(cid:285)yciu metody CViewAction 7 8 9 13 13 13 16 23 26 29 32 34 37 41 41 42 45 49 52 55 59 60 64 Kup książkęPoleć książkę Spis tre(cid:286)ci U(cid:285)ycie wiadomo(cid:258)ci typu flash U(cid:285)ycie kontekstu kontrolera w widoku Ponowne wykorzystanie widoków poprzez widoki cz(cid:218)(cid:258)ciowe U(cid:285)ycie klipów U(cid:285)ycie dekoratorów Definiowanie kilku uk(cid:239)adów Dzielenie danych na strony i sortowanie danych Rozdzia(cid:239) 3. Ajax i jQuery Wst(cid:218)p Wczytywanie bloku z wykorzystaniem technologii AJAX Zarz(cid:200)dzanie zasobami Do(cid:239)(cid:200)czanie zasobów do strony Korzystanie z formatu JSON Przekazywanie konfiguracji z PHP do JavaScript Obs(cid:239)uga zró(cid:285)nicowanej liczby danych wej(cid:258)ciowych Renderowanie tre(cid:258)ci po stronie klienta Rozdzia(cid:239) 4. U(cid:285)ywanie formularzy Wst(cid:218)p Pisanie w(cid:239)asnych walidatorów Przesy(cid:239)anie plików na serwer Dodawanie CAPTCHA Dostosowywanie CAPTCHA Tworzenie w(cid:239)asnego wid(cid:285)etu do pobierania danych z wykorzystaniem CInputWidget Rozdzia(cid:239) 5. Testowanie aplikacji Wst(cid:218)p Przygotowanie (cid:258)rodowiska testowego Pisanie i uruchamianie testów jednostkowych U(cid:285)ywanie konfiguracji testów Testowanie aplikacji z wykorzystaniem testów funkcjonalnych Generowanie raportów pokrycia Rozdzia(cid:239) 6. Baza danych, aktywny rekord i triki zwi(cid:200)zane z modelem Wst(cid:218)p Pobieranie danych z bazy danych Definiowanie kilku po(cid:239)(cid:200)cze(cid:241) z bazami danych i korzystanie z nich U(cid:285)ywanie podzbiorów do uzyskania modeli dla ró(cid:285)nych j(cid:218)zyków Przetwarzanie pól modelu metodami przypominaj(cid:200)cymi zdarzenia aktywnego rekordu Stosowanie j(cid:218)zyka markdown i HTML Pod(cid:258)wietlanie kodu przez Yii Automatyzacja znaczników czasu Automatyczne ustawianie autora 4 66 67 69 71 73 74 76 79 79 79 85 90 93 96 98 104 119 119 119 122 126 131 133 137 137 138 141 146 152 156 161 161 162 167 170 173 175 178 183 185 Kup książkęPoleć książkę Implementacja odwzorowania dziedziczenia do pojedynczej tabeli U(cid:285)ywanie CDbCriteria Rozdzia(cid:239) 7. U(cid:285)ywanie komponentów Zii Wst(cid:218)p U(cid:285)ywanie dostawców danych U(cid:285)ywanie siatek U(cid:285)ywanie list Tworzenie niestandardowych kolumn siatek Rozdzia(cid:239) 8. Rozszerzanie Yii Wst(cid:218)p Tworzenie zachowa(cid:241) modeli Tworzenie komponentów Tworzenie akcji kontrolerów do wielokrotnego u(cid:285)ycia Tworzenie kontrolerów wielokrotnego u(cid:285)ytku Tworzenie wid(cid:285)etów Tworzenie polece(cid:241) CLI Tworzenie filtrów Tworzenie modu(cid:239)ów Niestandardowe renderowanie widoków Przygotowywanie rozszerze(cid:241) do dystrybucji Rozdzia(cid:239) 9. Obs(cid:239)uga b(cid:239)(cid:218)dów, debugowanie i logowanie komunikatów Wst(cid:218)p U(cid:285)ywanie ró(cid:285)nych tras przekierowania logów Analizowanie stosu wywo(cid:239)a(cid:241) b(cid:239)(cid:218)dów Yii Logowanie komunikatów i u(cid:285)ywanie informacji kontekstowych Implementowanie w(cid:239)asnej inteligentnej procedury obs(cid:239)ugi b(cid:239)(cid:218)du 404 Rozdzia(cid:239) 10. Bezpiecze(cid:241)stwo Wst(cid:218)p U(cid:285)ywanie filtrów kontrolerów U(cid:285)ywanie CHtml i CHtmlPurifier do zapobiegania atakom XSS Zapobieganie atakom typu SQL injection Zapobieganie atakom CSRF U(cid:285)ywanie RBAC Opis dzia(cid:239)ania Rozdzia(cid:239) 11. Dostrajanie wydajno(cid:258)ci Wst(cid:218)p Przestrzeganie najlepszych praktyk Przyspieszanie obs(cid:239)ugi sesji U(cid:285)ywanie (cid:239)a(cid:241)cuchów zale(cid:285)no(cid:258)ci pami(cid:218)ci podr(cid:218)cznej Spis tre(cid:286)ci 187 191 193 193 194 200 207 212 219 219 219 225 229 232 236 238 242 244 250 254 259 259 260 266 268 272 277 277 277 282 286 291 294 297 303 303 303 307 311 5 Kup książkęPoleć książkę Spis tre(cid:286)ci Profilowanie aplikacji z wykorzystaniem Yii Wykorzystywanie buforowania HTTP Rozdzia(cid:239) 12. U(cid:285)ywanie zewn(cid:218)trznego kodu Wst(cid:218)p Korzystanie z platformy Zend Framework w Yii Dostosowywanie mechanizmu automatycznego (cid:239)adowania w Yii Korzystanie z platformy Kohana w Yii Korzystanie z PEAR w Yii Korzystanie z narz(cid:218)dzia Composer w Yii Rozdzia(cid:239) 13. Wdra(cid:285)anie Wst(cid:218)p Zmiana uk(cid:239)adu folderów Yii Przenoszenie aplikacji poza folder g(cid:239)ówny Udost(cid:218)pnianie folderu platformy Przenoszenie fragmentów konfiguracji do oddzielnych plików U(cid:285)ywanie kilku konfiguracji do uproszczenia wdra(cid:285)ania Implementowanie i wykonywanie zada(cid:241) cron Tryb konserwacji Skorowidz 317 327 333 333 334 338 342 349 351 357 357 357 360 362 364 367 371 373 376 6 Kup książkęPoleć książkę 8 Rozszerzanie Yii W tym rozdziale zostan(cid:200) poruszone nast(cid:218)puj(cid:200)ce zagadnienia: (cid:81) Tworzenie zachowa(cid:241) modeli. (cid:81) Tworzenie komponentów. (cid:81) Tworzenie akcji kontrolerów do wielokrotnego u(cid:285)ycia. (cid:81) Tworzenie kontrolerów do wielokrotnego u(cid:285)ycia. (cid:81) Tworzenie wid(cid:285)etu. (cid:81) Tworzenie polece(cid:241) CLI. (cid:81) Tworzenie filtrów. (cid:81) Tworzenie modu(cid:239)ów. (cid:81) Niestandardowe renderowanie widoków. (cid:81) Przygotowywanie rozszerze(cid:241) do dystrybucji. Wst(cid:218)p W tym rozdziale poka(cid:285)(cid:218) nie tylko, jak implementowa(cid:202) w(cid:239)asne rozszerzenie Yii, ale tak(cid:285)e jak przygotowa(cid:202) rozszerzenie do wielokrotnego u(cid:285)ycia i do u(cid:285)ytku przez spo(cid:239)eczno(cid:258)(cid:202). Ponadto omó- wi(cid:218) wiele zagadnie(cid:241), które nale(cid:285)y rozwa(cid:285)y(cid:202), aby nasze rozszerzenie by(cid:239)o mo(cid:285)liwie wydajne. Tworzenie zachowa(cid:241) modeli W dzisiejszych aplikacjach sieci WWW spotykamy wiele podobnych rozwi(cid:200)za(cid:241). Wiod(cid:200)ce pro- dukty, takie jak Google Gmail, definiuj(cid:200) ciekawe wzorce interfejsu u(cid:285)ytkownika. Jednym z nich Kup książkęPoleć książkę Tworzenie aplikacji z Yii jest nietrwa(cid:239)e usuwanie. Zamiast ostatecznego usuwania poprzedzonego konieczno(cid:258)ci(cid:200) wielu potwierdze(cid:241) Gmail pozwala u(cid:285)ytkownikowi na natychmiastowe oznaczenie wiadomo(cid:258)ci jako usuni(cid:218)tych, a nast(cid:218)pnie na ich (cid:239)atwe przywrócenie. To samo zachowanie mo(cid:285)na zastosowa(cid:202) do dowolnego obiektu, takiego jak posty bloga, komentarze itd. Utwórzmy zachowanie, które pozwoli na oznaczanie modeli jako usuni(cid:218)tych, przywracanie modeli i zaznaczanie jeszcze nie usuni(cid:218)tych, usuni(cid:218)tych oraz wszystkich modeli. W tej recep- turze do zaplanowania zachowania i przetestowania, czy implementacja jest poprawna, zasto- sujemy podej(cid:258)cie test-driven development. Przygotowanie Wykonaj poni(cid:285)sze czynno(cid:258)ci: 1. Utwórz baz(cid:218) danych i dodaj do niej tabel(cid:218) post: CREATE TABLE `post` ( `id` int(11) NOT NULL auto_increment, `text` text, `title` varchar(255) default NULL, `is_deleted` tinyint(1) NOT NULL default 0 , PRIMARY KEY (`id`) ) 2. Skonfiguruj Yii, aby korzysta(cid:239) z tej bazy danych w aplikacji g(cid:239)ównej (protected/ config/main.php). 3. Upewnij si(cid:218), (cid:285)e aplikacja test ma takie same ustawienia (protected/config/test.php). 4. Usu(cid:241) komentarz z komponentu fixture w ustawieniach aplikacji test. 5. Skorzystaj z Gii do wygenerowania modelu Post. Jak to zrobi(cid:202)… 1. Przygotujmy (cid:258)rodowisko testowe, zaczynaj(cid:200)c od zdefiniowania konfiguracji testów dla modelu Post w pliku protected/tests/fixtures/post.php: ?php return array( array( id = 1, title = post1 , text = post1 , is_deleted = 0, ), array( id = 2, title = post2 , text = post2 , 220 Kup książkęPoleć książkę Rozdzia(cid:225) 8. • Rozszerzanie Yii is_deleted = 1, ), array( id = 3, title = post3 , text = post3 , is_deleted = 0, ), array( id = 4, title = post4 , text = post4 , is_deleted = 1, ), array( id = 5, title = post5 , text = post5 , is_deleted = 0, ), ); 2. Musimy utworzy(cid:202) przypadek testowy. Umie(cid:258)(cid:202) nast(cid:218)puj(cid:200)cy kod w pliku protected/tests/unit/soft_delete/SoftDeleteBehaviorTest.php: ?php class SoftDeleteBehaviorTest extends CDbTestCase { protected $fixtures = array( post = Post , ); function testRemoved() { $postCount = Post::model()- removed()- count(); $this- assertEquals(2, $postCount); } function testNotRemoved() { $postCount = Post::model()- notRemoved()- count(); $this- assertEquals(3, $postCount); } function testRemove() { $post = Post::model()- findByPk(1); $post- remove()- save(); $this- assertNull(Post::model()- notRemoved()- findByPk(1)); } 221 Kup książkęPoleć książkę Tworzenie aplikacji z Yii function testRestore() { $post = Post::model()- findByPk(2); $post- restore()- save(); $this- assertNotNull(Post::model()- notRemoved()- findByPk(2)); } function testIsDeleted() { $post = Post::model()- findByPk(1); $this- assertFalse($post- isRemoved()); $post = Post::model()- findByPk(2); $this- assertTrue($post- isRemoved()); } } 3. Nast(cid:218)pnie musimy zaimplementowa(cid:202) zachowanie, do(cid:239)(cid:200)czy(cid:202) je do modelu i upewni(cid:202) si(cid:218), (cid:285)e test zako(cid:241)czy si(cid:218) powodzeniem. Utwórz nowy podfolder soft_delete w folderze protected/extensions. Umie(cid:258)(cid:202) w tym podkatalogu nowy plik SoftDeleteBehavior.php. Najpierw do(cid:239)(cid:200)cz zachowanie do modelu Post: class Post extends CActiveRecord { // … public function behaviors() { return array( softDelete = array( class = ext.soft_delete.SoftDeleteBehavior ), ); } // … 4. Teraz zaimplementuj klas(cid:218) protected/extensions/soft_delete/SoftDeleteBehavior.php: ?php class SoftDeleteBehavior extends CActiveRecordBehavior { public $flagField = is_deleted ; public function remove() { $this- getOwner()- {$this- flagField} = 1; return $this- getOwner(); } public function restore() { 222 Kup książkęPoleć książkę Rozdzia(cid:225) 8. • Rozszerzanie Yii $this- getOwner()- {$this- flagField} = 0; return $this- getOwner(); } public function notRemoved() { $criteria = $this- getOwner()- getDbCriteria(); $criteria- compare($this- flagField, 0); return $this- getOwner(); } public function removed() { $criteria = $this- getOwner()- getDbCriteria(); $criteria- compare($this- flagField, 1); return $this- getOwner(); } public function isRemoved() { return (boolean)$this- getOwner()- {$this- flagField}; } } 5. Uruchom test i upewnij si(cid:218), (cid:285)e zako(cid:241)czy(cid:239) si(cid:218) pomy(cid:258)lnie. 6. To wszystko. Utworzyli(cid:258)my zachowanie wielokrotnego u(cid:285)ycia, które mo(cid:285)emy wykorzysta(cid:202) w kolejnych projektach jedynie poprzez do(cid:239)(cid:200)czenie ich do modelu. Opis dzia(cid:239)ania Zacznijmy od przypadku testowego. Poniewa(cid:285) zamierzamy u(cid:285)y(cid:202) zestawu modeli, definiujemy konfiguracje testów. Zestaw konfiguracji jest umieszczany w bazie danych za ka(cid:285)dym razem, gdy wykonywana jest metoda testowa. Aby skorzysta(cid:202) z konfiguracji, klasa testu powinna by(cid:202) dziedziczona po klasie CDbTestCase i mie(cid:202) zadeklarowan(cid:200) w(cid:239)a(cid:258)ciwo(cid:258)(cid:202) prywatn(cid:200) $fixtures. protected $fixtures = array( post = Post , ); W powy(cid:285)szej definicji post to nazwa pliku zawieraj(cid:200)cego definicje konfiguracji testów, za(cid:258) Post to nazwa modelu, do którego zostan(cid:200) zastosowane konfiguracje testów. Najpierw testujemy w(cid:239)asne zakresy removed i notRemoved. Powinni(cid:258)my ograniczy(cid:202) rezultat wy- szukiwania jedynie do usuni(cid:218)tych elementów, a nast(cid:218)pnie do elementów nieusuni(cid:218)tych. Ponie- wa(cid:285) wiemy, jakie dane uzyskamy z konfiguracji testów, mo(cid:285)emy w nast(cid:218)puj(cid:200)cy sposób spraw- dzi(cid:202) w testach liczb(cid:218) elementów usuni(cid:218)tych i nieusuni(cid:218)tych: 223 Kup książkęPoleć książkę Tworzenie aplikacji z Yii $postCount = Post::model()- removed()- count(); $this- assertEquals(2, $postCount); Nast(cid:218)pnie testujemy metody remove i restore. Metoda testowa remove ma nast(cid:218)puj(cid:200)c(cid:200) posta(cid:202): $post = Post::model()- findByPk(1); $post- remove()- save(); $this- assertNull(Post::model()- notRemoved()- findByPk(1)); Element definiujemy poprzez identyfikator id, usuwamy go, a nast(cid:218)pnie próbujemy go odzy- ska(cid:202), korzystaj(cid:200)c z zakresu notRemoved. Poniewa(cid:285) element zosta(cid:239) usuni(cid:218)ty, powinni(cid:258)my w wy- niku otrzyma(cid:202) null. Na zako(cid:241)czenie testujemy metod(cid:218) isRemoved, która po prostu zwraca warto(cid:258)(cid:202) odpowiedniej kolumny w postaci boolowskiej warto(cid:258)ci logicznej. Teraz przejd(cid:283)my do interesuj(cid:200)cych szczegó(cid:239)ów implementacji. Poniewa(cid:285) implementujemy za- chowanie modelu aktywnego rekordu, musimy skorzysta(cid:202) z rozszerzenia klasy CActiveRecord- Behavior. W zachowaniu mo(cid:285)emy doda(cid:202) nasze w(cid:239)asne metody. Zostan(cid:200) one w(cid:239)(cid:200)czone do mo- delu, do którego do(cid:239)(cid:200)czone b(cid:218)dzie zachowanie. W ten sposób dodajemy metody znajduj(cid:200)ce si(cid:218) w zakresach remove/restore/isRemoved i removed/notRemoved: public function remove() { $this- getOwner()- {$this- flagField} = 1; return $this- getOwner(); } public function removed() { $criteria = $this- getOwner()- getDbCriteria(); $criteria- compare($this- flagField, 1); return $this- getOwner(); } W obydwu metodach u(cid:285)ywamy metody getOwner do uzyskania obiektu, do którego do(cid:239)(cid:200)czono zachowanie. W naszym przypadku jest to model, dlatego mo(cid:285)emy pracowa(cid:202) z jego danymi lub zmieni(cid:202) jego kryteria wyszukiwania. Zwracamy instancj(cid:218) modelu, aby umo(cid:285)liwi(cid:202) (cid:239)a(cid:241)cuchowe wywo(cid:239)ania metod w nast(cid:218)puj(cid:200)cy sposób: $post- remove()- save(); Dodatkowe informacje Pozosta(cid:239)o jeszcze kilka spraw, które nale(cid:285)y omówi(cid:202) w niniejszej recepturze. 224 Kup książkęPoleć książkę Rozdzia(cid:225) 8. • Rozszerzanie Yii CActiveRecordBehavior i CModelBehavior Niekiedy przyda(cid:239)oby si(cid:218) nieco wi(cid:218)cej elastyczno(cid:258)ci w zachowaniu, na przyk(cid:239)ad aby umo(cid:285)liwi(cid:202) reagowanie na zdarzenia modelu. Zarówno w CActiveRecordBehavior, jak i w CModelBehavior dost(cid:218)pne s(cid:200) metody odpowiadaj(cid:200)ce zdarzeniom, które mo(cid:285)na nadpisa(cid:202), aby obs(cid:239)u(cid:285)y(cid:202) zdarze- nia modelu. Przyk(cid:239)adowo: je(cid:258)li chcemy obs(cid:239)u(cid:285)y(cid:202) w zachowaniu kaskadowe usuwanie, mo(cid:285)emy to zrobi(cid:202), nadpisuj(cid:200)c metod(cid:218) afterDelete. Wi(cid:218)cej typów zachowa(cid:241) Zachowania mo(cid:285)na do(cid:239)(cid:200)czy(cid:202) nie tylko do modelu, ale równie(cid:285) do dowolnego komponentu. Ka(cid:285)de zachowanie dziedziczy po klasie CBehavior, dlatego mo(cid:285)emy u(cid:285)y(cid:202) jego metod w nast(cid:218)- puj(cid:200)cy sposób: (cid:81) Metoda getOwner s(cid:239)u(cid:285)y do uzyskania komponentu, do którego do(cid:239)(cid:200)czono zachowanie. (cid:81) Metody getEnabled i setEnabled s(cid:239)u(cid:285)(cid:200) do sprawdzania, czy zdarzenie jest aktywne, i do ustawiania jego stanu. (cid:81) Metody attach i detach mog(cid:200) by(cid:202) odpowiednio u(cid:285)ywane do inicjalizowania zdarzenia i czyszczenia tymczasowych danych, utworzonych podczas korzystania z zachowania. Warto przeczyta(cid:202) Dodatkowe informacje o zachowaniach mo(cid:285)na znale(cid:283)(cid:202) na nast(cid:218)puj(cid:200)cych stronach API: (cid:81) http://www.yiiframework.com/doc/api/CActiveRecordBehavior (cid:81) http://www.yiiframework.com/doc/api/CModelBehavior (cid:81) http://www.yiiframework.com/doc/api/CBehavior Zobacz te(cid:285) (cid:81) Receptura „Przygotowywanie rozszerze(cid:241) do dystrybucji”. Tworzenie komponentów Je(cid:258)li pewien kod w naszej aplikacji wygl(cid:200)da jak kod wielokrotnego u(cid:285)ytku, ale nie wiemy, czy jest to zachowanie, wid(cid:285)et, czy co(cid:258) innego, prawdopodobnie jest to komponent. Komponent powinien dziedziczy(cid:202) po klasie CComponent lub CApplicationComponent. Po utworzeniu mo(cid:285)na go do(cid:239)(cid:200)czy(cid:202) do aplikacji i skonfigurowa(cid:202) w pliku konfiguracyjnym protected/config/main.php. Jest to g(cid:239)ówna korzy(cid:258)(cid:202) w porównaniu z u(cid:285)ywaniem czystej klasy PHP. Ponadto uzyskujemy wsparcie dla zachowa(cid:241), zdarze(cid:241), getterów i setterów. 225 Kup książkęPoleć książkę Tworzenie aplikacji z Yii W naszym przyk(cid:239)adzie zaimplementujemy prosty komponent aplikacji EImageManager, który b(cid:218)dzie móg(cid:239) skalowa(cid:202) obrazy, korzystaj(cid:200)c z biblioteki GD, do(cid:239)(cid:200)czy(cid:202) j(cid:200) do aplikacji i jej u(cid:285)y(cid:202). Przygotowanie Aby wypróbowa(cid:202) skalowanie obrazów, musimy zainstalowa(cid:202) rozszerzenie PHP o nazwie GD. Jak to zrobi(cid:202)… 1. Utwórz plik protected/components/EImageManager.php: ?php class EImageManager extends CApplicationComponent { protected $image; protected $width; protected $height; protected $newWidth; protected $newHeight; public function resize($width = false, $height = false){ if($width!==false) $this- newWidth = $width; if($height!==false) $this- newHeight = $height; return $this; } public function load($filePath) { list($this- width, $this- height, $type) = getimagesize($filePath); switch ($type) { case IMAGETYPE_GIF: $this- image = imagecreatefromgif($filePath); break; case IMAGETYPE_JPEG: $this- image = imagecreatefromjpeg($filePath); break; case IMAGETYPE_PNG: $this- image = imagecreatefrompng($filePath); break; default: throw new CException( Niew(cid:239)a(cid:258)ciwy typ obrazu . $type); } 226 Kup książkęPoleć książkę Rozdzia(cid:225) 8. • Rozszerzanie Yii return $this; } public function save($filePath) { $ext = pathinfo($filePath, PATHINFO_EXTENSION); $newImage = imagecreatetruecolor($this- newWidth, $this- newHeight); imagecopyresampled($newImage, $this- image, 0, 0, 0, 0, $this- newWidth, $this- newHeight, $this- width, $this- height); switch($ext) { case jpg : case jpeg : imagejpeg($newImage, $filePath); break; case png : imagepng($newImage, $filePath); break; case gif : imagegif($newImage, $filePath); break; default: throw new CException( Niew(cid:239)a(cid:258)ciwy typ obrazu , $ext); } imagedestroy($newImage); if(!is_file($filePath)) throw new CException( Niepowodzenie zapisu. ); } function __destruct() { imagedestroy($this- image); } } 2. Nast(cid:218)pnie musimy do(cid:239)(cid:200)czy(cid:202) nasz komponent do aplikacji. W pliku protected/ config/main.php musimy doda(cid:202) nast(cid:218)puj(cid:200)cy kod: ... // application components components = array( image = array( class = EImageManager , ), ... 3. Teraz mo(cid:285)emy u(cid:285)y(cid:202) komponentu w nast(cid:218)puj(cid:200)cy sposób: 227 Kup książkęPoleć książkę Tworzenie aplikacji z Yii Yii::app()- image - load(Yii::getPathOfAlias( webroot ). /src.png ) - resize(100,100) - save(Yii::getPathOfAlias( webroot ). /dst.png ); Opis dzia(cid:239)ania Aby mo(cid:285)na by(cid:239)o doda(cid:202) komponent do aplikacji, musi on dziedziczy(cid:202) po klasie CApplication- Component. Do(cid:239)(cid:200)czanie jest tak proste jak dodawanie nowej tablicy do sekcji component w kon- figuracji. Warto(cid:258)(cid:202) class w tablicy okre(cid:258)la klas(cid:218) komponentu, za(cid:258) inne warto(cid:258)ci s(cid:200) ustawiane poprzez odpowiadaj(cid:200)ce im w(cid:239)a(cid:258)ciwo(cid:258)ci publiczne komponentu i settery. Sama implementacja jest bardzo prosta. Wywo(cid:239)ania GD opakowujemy w wygodne API, zawie- raj(cid:200)ce metody save, load i resize. Aby mo(cid:285)na by(cid:239)o wykonywa(cid:202) (cid:239)a(cid:241)cuchowe wywo(cid:239)ania API, load i resize zwracaj(cid:200) sam komponent. Korzystaj(cid:200)c z Yii::app(), mo(cid:285)emy uzyska(cid:202) dost(cid:218)p do naszej klasy poprzez nazw(cid:218) jej kompo- nentu. W naszym przypadku b(cid:218)dzie to Yii::app()- image. Dodatkowe informacje Oprócz tworzenia w(cid:239)asnych komponentów mo(cid:285)emy dokona(cid:202) wiele wi(cid:218)cej. Nadpisywanie istniej(cid:200)cych komponentów aplikacji Przez wi(cid:218)kszo(cid:258)(cid:202) czasu nie ma potrzeby tworzenia w(cid:239)asnych komponentów aplikacji, poniewa(cid:285) inne rodzaje rozszerze(cid:241) takich jak wid(cid:285)ety czy zachowania zawieraj(cid:200) niemal wszystkie rodza- je kodu wielokrotnego u(cid:285)ytku. Jednak(cid:285)e nadpisywanie komponentów podstawowej platformy jest popularn(cid:200) praktyk(cid:200) i mo(cid:285)na go u(cid:285)y(cid:202) do dostosowania zachowania platformy dla w(cid:239)asnych potrzeb bez konieczno(cid:258)ci wprowadzania zmian w kodzie platformy. Przyk(cid:239)adowo: aby mo(cid:285)na by(cid:239)o uzyska(cid:202) rol(cid:218) u(cid:285)ytkownika z bazy danych z wykorzystaniem Yii::app()- user- role, mo(cid:285)emy w nast(cid:218)puj(cid:200)cy sposób zaimplementowa(cid:202) dziedziczenie po komponencie CWebUser: ?php class WebUser extends CWebUser { private $_model = null; function getRole() { if($user = $this- getModel()){ return $user- role; } else return guest ; } 228 Kup książkęPoleć książkę Rozdzia(cid:225) 8. • Rozszerzanie Yii private function getModel(){ if($this- _model === null){ if($this- id === null) return null; $this- _model = User::model()- findByPk($this- id); } return $this- _model; } } Aby zast(cid:200)pi(cid:202) standardowy komponent u(cid:285)ytkownika, nale(cid:285)y dostosowa(cid:202) plik konfiguracyjny main.php: ... // application components components = array( user = array( class = WebUser , // other properties ), ... W powy(cid:285)szym kodzie okre(cid:258)lili(cid:258)my now(cid:200) klas(cid:218) class dla komponentu user. Warto przeczyta(cid:202) Dodatkowe informacje o komponentach mo(cid:285)na znale(cid:283)(cid:202) na nast(cid:218)puj(cid:200)cych stronach API: (cid:81) http://www.yiiframework.com/doc/api/CComponent/ (cid:81) http://www.yiiframework.com/doc/api/CApplicationComponent/ Zobacz te(cid:285) (cid:81) Receptura „Przygotowywanie rozszerze(cid:241) do dystrybucji”. Tworzenie akcji kontrolerów do wielokrotnego u(cid:285)ycia Popularne akcje, takie jak usuwanie modelu aktywnego rekordu wed(cid:239)ug klucza prywatnego lub uzyskiwanie danych dla automatycznego uzupe(cid:239)niania z wykorzystaniem AJAX, mo(cid:285)na przenie(cid:258)(cid:202) do akcji wielokrotnego u(cid:285)ytku i pó(cid:283)niej w razie potrzeby do(cid:239)(cid:200)czy(cid:202) j(cid:200) do kontrolera. W tej recepturze utworzymy akcj(cid:218) do wielokrotnego u(cid:285)ytku delete, która b(cid:218)dzie usuwa(cid:202) okre- (cid:258)lony model aktywnego rekordu wed(cid:239)ug jego klucza g(cid:239)ównego. 229 Kup książkęPoleć książkę Tworzenie aplikacji z Yii Przygotowanie 1. Utwórz now(cid:200) aplikacj(cid:218) Yii, korzystaj(cid:200)c z polecenia yiic webapp. 2. Utwórz i skonfiguruj now(cid:200) baz(cid:218) danych. 3. Wykonaj nast(cid:218)puj(cid:200)ce zapytanie SQL: CREATE TABLE `post` ( `id` int(11) NOT NULL auto_increment, `text` text, `title` varchar(255) default NULL, PRIMARY KEY (`id`) ); CREATE TABLE `comment` ( `id` int(11) NOT NULL auto_increment, `text` text, PRIMARY KEY (`id`) ); 4. Wygeneruj modele dla tabel post i comment, korzystaj(cid:200)c z Gii. Jak to zrobi(cid:202)… 1. Utwórz plik protected/extensions/actions/EDeleteAction.php i umie(cid:258)(cid:202) w nim nast(cid:218)puj(cid:200)cy kod: ?php class EDeleteAction extends CAction { public $modelName; public $redirectTo = array( index ); /** * Uruchamia akcj(cid:266). * Ta metoda jest wywo(cid:225)ywana przez kontroler posiadaj(cid:261)cy t(cid:266) akcj(cid:266). */ public function run($pk) { CActiveRecord::model($this- modelName)- deleteByPk($pk); if(Yii::app()- getRequest()- getIsAjaxRequest()) { Yii::app()- end(200, true); } else { $this- getController()- redirect($this- redirectTo); } } } 230 Kup książkęPoleć książkę 2. Nast(cid:218)pnie do(cid:239)(cid:200)czymy akcj(cid:218) do kontrolera protected/controllers/DeleteController.php: Rozdzia(cid:225) 8. • Rozszerzanie Yii ?php class DeleteController extends CController { public function actions() { return array( deletePost = array( class = ext.actions.EDeleteAction , modelName = Post , redirectTo = array( indexPosts ), ), deleteComment = array( class = ext.actions.EDeleteAction , modelName = Comment , redirectTo = array( indexComments ), ), ); } public function actionIndexPosts() { echo Jestem akcj(cid:200) index dla modelu Post. ; } public function actionIndexComments() { echo Jestem akcj(cid:200) index dla modelu Comment. ; } } 3. To wszystko. Teraz mo(cid:285)esz usun(cid:200)(cid:202) post, odwiedzaj(cid:200)c stron(cid:218) /delete/deletePost/ pk/ pk , a tak(cid:285)e usun(cid:200)(cid:202) komentarz, odwiedzaj(cid:200)c /delete/deleteComment/pk/ pk . Po usuni(cid:218)ciu zostaniemy przekierowani do odpowiedniej akcji index. Opis dzia(cid:239)ania Aby utworzy(cid:202) akcj(cid:218) zewn(cid:218)trznego kontrolera, nasza klasa powinna dziedziczy(cid:202) po klasie CAction. Jedyn(cid:200) metod(cid:200), któr(cid:200) nale(cid:285)y zaimplementowa(cid:202), jest run. W naszym przypadku ak- ceptuje ona parametr o nazwie pk ze zmiennej $_GET, korzystaj(cid:200)c z mechanizmu automatycz- nego do(cid:239)(cid:200)czania parametru dost(cid:218)pnego w Yii, i próbuje usun(cid:200)(cid:202) odpowiedni model. Aby zapewni(cid:202) mo(cid:285)liwo(cid:258)(cid:202) dostosowywania komponentu, utworzyli(cid:258)my dwie publiczne w(cid:239)a(cid:258)ci- wo(cid:258)ci, które mo(cid:285)na konfigurowa(cid:202) poprzez kontroler. Jest to w(cid:239)a(cid:258)ciwo(cid:258)(cid:202) modelName przecho- wuj(cid:200)ca nazw(cid:218) modelu, z którym pracujemy, oraz redirectTo okre(cid:258)laj(cid:200)ca tras(cid:218), do której u(cid:285)yt- kownik zostanie przekierowany. 231 Kup książkęPoleć książkę Tworzenie aplikacji z Yii Sama konfiguracja odbywa si(cid:218) poprzez implementacj(cid:218) metody actions w kontrolerze. Mo(cid:285)e- my tam do(cid:239)(cid:200)czy(cid:202) akcj(cid:218) raz lub kilka razy i skonfigurowa(cid:202) jej w(cid:239)a(cid:258)ciwo(cid:258)ci publiczne. Dodatkowe informacje W klasie CAction zaimplementowane s(cid:200) dwie przydatne metody. Pierwsza to getController. Mo(cid:285)emy jej u(cid:285)y(cid:202) do pobrania instancji kontrolera, do którego do(cid:239)(cid:200)czona jest akcja. B(cid:218)dzie nam to potrzebne do przekierowania do innej akcji lub na przyk(cid:239)ad do wygenerowania (cid:239)a(cid:241)cucha URL. Drug(cid:200) metod(cid:200) jest getId zwracaj(cid:200)ca nazw(cid:218) akcji, okre(cid:258)lon(cid:200) w metodzie actions kontrolera. Warto przeczyta(cid:202) Dodatkowe informacje o zewn(cid:218)trznej akcji kontrolera mo(cid:285)na znale(cid:283)(cid:202) na nast(cid:218)puj(cid:200)cych stro- nach API: (cid:81) http://www.yiiframework.com/doc/api/CAction/ (cid:81) http://www.yiiframework.com/doc/api/CController/#actions-detail Zobacz te(cid:285) (cid:81) Receptura „Tworzenie kontrolerów wielokrotnego u(cid:285)ytku”. (cid:81) Receptura „Przygotowywanie rozszerze(cid:241) do dystrybucji”. Tworzenie kontrolerów wielokrotnego u(cid:285)ytku W Yii mo(cid:285)emy tworzy(cid:202) kontrolery wielokrotnego u(cid:285)ytku. Je(cid:258)li rozwijamy wiele aplikacji lub kontrolerów tego samego rodzaju, przeniesienie ca(cid:239)ego wspólnego kodu do kontrolera wielo- krotnego u(cid:285)ytku pozwoli nam zaoszcz(cid:218)dzi(cid:202) wiele czasu. W tej recepturze utworzymy prosty kontroler wielokrotnego u(cid:285)ytku o nazwie api, który za- implementuje proste API JSON CRUD dla modelu. B(cid:218)dzie ono pobiera(cid:202) dane z metod POST i GET i odpowiada(cid:202) danymi w formacie JSON oraz odpowiednim kodem odpowiedzi HTTP. Przygotowanie 1. Utwórz now(cid:200) aplikacj(cid:218) Yii, korzystaj(cid:200)c z polecenia yiic webapp. 2. Utwórz now(cid:200) baz(cid:218) danych i wykonaj nast(cid:218)puj(cid:200)ce zapytanie SQL: 232 Kup książkęPoleć książkę Rozdzia(cid:225) 8. • Rozszerzanie Yii CREATE TABLE `post` ( `id` int(11) NOT NULL auto_increment, `text` text, `title` varchar(255) default NULL, PRIMARY KEY (`id`) ); 3. Skonfiguruj aplikacj(cid:218), aby korzysta(cid:239)a z utworzonej bazy danych, i wygeneruj model, korzystaj(cid:200)c z Gii. W naszym przyk(cid:239)adzie u(cid:285)yjemy modelu Post, jednak mo(cid:285)e to by(cid:202) dowolny model. Jak to zrobi(cid:202)… 1. Utwórz plik protected/extensions/json_api/JsonApiController.php i umie(cid:258)(cid:202) w nim nast(cid:218)puj(cid:200)cy kod: ?php class JsonApiController extends CController { const RESPONSE_OK = OK ; const RESPONSE_NO_DATA = Brak danych ; const RESPONSE_NOT_FOUND = Nie znaleziono ; const RESPONSE_VALIDATION_ERRORS = B(cid:239)(cid:218)dy walidacji ; public $modelName; public function init() { parent::init(); if(empty($this- modelName)) throw new CException( Nale(cid:285)y okre(cid:258)ci(cid:202) modelName przed u(cid:285)yciem JsonApiController. ); } public function actionCreate() { if(empty($_POST)) $this- respond(400, self::RESPONSE_NO_DATA); $model = new $this- modelName; $model- setAttributes($_POST); if($model- save()) $this- respond(200, self::RESPONSE_OK); else $this- respond(400, self::RESPONSE_VALIDATION_ERRORS, $model- getErrors()); } 233 Kup książkęPoleć książkę Tworzenie aplikacji z Yii public function actionGet($pk) { $model = CActiveRecord::model($this- modelName)- findByPk($pk); if(!$model) $this- respond(404, self::RESPONSE_NOT_FOUND); $this- respond(200, self::RESPONSE_OK, $model- getAttributes()); } public function actionUpdate($pk) { if(empty($_POST)) $this- respond(400, self::RESPONSE_NO_DATA); $model = CActiveRecord::model ($this- modelName)- findByPk($pk); if(!$model) $this- respond(404, self::RESPONSE_NOT_FOUND); $model- setAttributes($_POST); if($model- save()) $this- respond(200, self::RESPONSE_OK); else $this- respond(400, self::RESPONSE_VALIDATION_ERRORS, $model- getErrors()); } public function actionDelete($pk) { if(CActiveRecord::model($this- modelName)- deleteByPk($pk)) { $this- respond(200, self::RESPONSE_OK); } else { $this- respond(404, self::RESPONSE_NOT_FOUND); } } protected function respond($httpCode, $status, $data = array()) { $response[ status ] = $status; $response[ data ] = $data; echo CJSON::encode($response); Yii::app()- end($httpCode, true); } } 2. Nast(cid:218)pnie musimy do(cid:239)(cid:200)czy(cid:202) kontroler do naszej aplikacji poprzez plik protected/ config/main.php. Mo(cid:285)na to osi(cid:200)gn(cid:200)(cid:202) poprzez dodanie konfiguracji kontrolera do w(cid:239)a(cid:258)ciwo(cid:258)ci controllerMap klasy CWebApplication, dlatego musimy umie(cid:258)ci(cid:202) nast(cid:218)puj(cid:200)cy kod na pocz(cid:200)tku tablicy konfiguracji: ... controllerMap = array( 234 Kup książkęPoleć książkę Rozdzia(cid:225) 8. • Rozszerzanie Yii api = array( class = ext.json_api.JsonApiController , modelName = Post , ), ), ... 3. To wszystko. Do(cid:239)(cid:200)czyli(cid:258)my kontroler i skonfigurowali(cid:258)my go, aby mo(cid:285)na by(cid:239)o pracowa(cid:202) z modelem Post. Potrzebne s(cid:200) nam formularze do przes(cid:239)ania danych, jednak je(cid:258)li mamy ju(cid:285) jakie(cid:258) dane, mo(cid:285)emy u(cid:285)y(cid:202) metod get bezpo(cid:258)rednio z URL, na przyk(cid:239)ad /api/get/pk/1. Aplikacje powinny zwraca(cid:202) dane w nast(cid:218)puj(cid:200)cym formacie: { status : OK , data :{ id : 1 , text : post1 , title : post1 , is_deleted : 0 }} Opis dzia(cid:239)ania Gdy uruchomiona jest aplikacja i przekazujemy do niej tras(cid:218) tak(cid:200) jak api/get, to zanim urucho- mimy ApiController::actionGet Yii, musimy sprawdzi(cid:202), czy zdefiniowany zosta(cid:239) controller- Map. Poniewa(cid:285) zdefiniowany jest tu kontroler api, Yii uruchamia go, zamiast post(cid:218)powa(cid:202) w zwy- k(cid:239)y sposób. W samym kontrolerze zdefiniowali(cid:258)my w(cid:239)a(cid:258)ciwo(cid:258)(cid:202) modelName, aby mo(cid:285)na by(cid:239)o po(cid:239)(cid:200)czy(cid:202) si(cid:218) wie- lokrotnie z kontrolerem i uzyska(cid:202) API dla kilku modeli. Ustawiamy j(cid:200), gdy do(cid:239)(cid:200)czamy kontroler. Sam kontroler nie ró(cid:285)ni si(cid:218) znacznie od zwyk(cid:239)ego kontrolera, z wyj(cid:200)tkiem kilku szczegó(cid:239)ów: (cid:81) Podczas pracy z aktywnym rekordem now(cid:200) klas(cid:218) tworzymy w nast(cid:218)puj(cid:200)cy sposób: $model = new $this- modelName; (cid:81) Model znajdujemy w nast(cid:218)puj(cid:200)cy sposób: $model = CActiveRecord::model($this- modelName); (cid:81) To pozwala nam unikn(cid:200)(cid:202) sztywnego przypisania do specyficznego modelu i zamiast tego okre(cid:258)li(cid:202) nazw(cid:218) modelu. (cid:81) U(cid:285)ywamy CJSON, aby zakodowa(cid:202) tablice i modele do formatu JSON. (cid:81) Yii::app()- end() s(cid:239)u(cid:285)y do zako(cid:241)czenia wykonywania aplikacji ze zwróceniem okre(cid:258)lonego kodu odpowiedzi HTTP. Dodatkowe informacje Dodatkowe informacje o mapie kontrolera mo(cid:285)na znale(cid:283)(cid:202) na nast(cid:218)puj(cid:200)cej stronie API: http://www.yiiframework.com/doc/api/CWebApplication#controllerMap-detail 235 Kup książkęPoleć książkę Tworzenie aplikacji z Yii Zobacz te(cid:285) (cid:81) Receptura „Tworzenie akcji kontrolerów wielokrotnego u(cid:285)ytku”. (cid:81) Receptura „Przygotowywanie rozszerze(cid:241) do dystrybucji”. Tworzenie wid(cid:285)etów Wid(cid:285)et to cz(cid:218)(cid:258)(cid:202) widoku do wielokrotnego u(cid:285)ytku, która nie tylko renderuje pewne dane, ale równie(cid:285) wykonuje to wed(cid:239)ug okre(cid:258)lonej logiki. Mo(cid:285)e nawet pobiera(cid:202) dane z modeli i u(cid:285)ywa(cid:202) w(cid:239)asnych widoków, dlatego przypomina zredukowan(cid:200) u(cid:285)ywaln(cid:200) wersj(cid:218) modu(cid:239)u. Utwórzmy wid(cid:285)et, który narysuje wykres ko(cid:239)owy z wykorzystaniem Google API. Przygotowanie Utwórz now(cid:200) aplikacj(cid:218) Yii, korzystaj(cid:200)c z polecenia yiic webapp. Jak to zrobi(cid:202)… 1. Utwórz plik protected/extensions/chart/EChartWidget.php: ?php class EChartWidget extends CWidget { public $title; public $data=array(); public $labels=array(); public function run() { echo img src=\ http://chart.apis.google.com/chart?chtt= .urlencode( $this- title). cht=pc chs=300x150 chd= .$this- encodeData( $this- data). chl= .implode( | , $this- labels). \ ; } protected function encodeData($data) { $maxValue=max($data); $chars= ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789 ; $chartData= s: ; for($i=0;$i count($data);$i++) { $currentValue=$data[$i]; if($currentValue -1) $chartData.=substr($chars,61*($currentValue/$maxValue),1); 236 Kup książkęPoleć książkę Rozdzia(cid:225) 8. • Rozszerzanie Yii else $chartData.= _ ; } return $chartData. chxt=y chxl=0:|0| .$maxValue; } } 2. Nast(cid:218)pnie utwórz kontroler protected/controllers/ChartController.php i umie(cid:258)(cid:202) w nim nast(cid:218)puj(cid:200)cy kod: ?php class ChartController extends CController { public function actionIndex() { $value = rand(10, 90); $this- widget( ext.chart.EChartWidget , array( title = Lubisz to? , data = array( $value, 100-$value ), labels = array( Nie , Tak , ), )); } } 3. Teraz uruchom akcj(cid:218) index kontrolera. Powiniene(cid:258) ujrze(cid:202) wykres ko(cid:239)owy podobny do poni(cid:285)szego: Opis dzia(cid:239)ania Podobnie jak w ka(cid:285)dym innym rodzaju rozszerzenia tworzymy pewne publiczne w(cid:239)a(cid:258)ciwo(cid:258)ci, które mo(cid:285)na skonfigurowa(cid:202) podczas wywo(cid:239)ywania wid(cid:285)etu metod(cid:200) CController::widget. W tym przypadku konfigurujemy tytu(cid:239), zestaw danych oraz etykiety danych. G(cid:239)ówn(cid:200) metod(cid:200) wid(cid:285)etu jest run(). W naszym wid(cid:285)ecie generujemy URL wskazuj(cid:200)cy na API wykresów Google, a nast(cid:218)pnie wy(cid:258)wietlamy znacznik img . 237 Kup książkęPoleć książkę Tworzenie aplikacji z Yii Dodatkowe informacje Dodatkowe informacje o wid(cid:285)etach mo(cid:285)na znale(cid:283)(cid:202) na nast(cid:218)puj(cid:200)cych stronach API: (cid:81) http://www.yiiframework.com/doc/api/CWidget/ (cid:81) http://www.yiiframework.com/doc/api/CCaptcha/ Zobacz te(cid:285) (cid:81) Receptura „Konfiguracja komponentów” w rozdziale 1. „Dla zaawansowanych”. (cid:81) Receptura „Konfiguracja domy(cid:258)lnych ustawie(cid:241) wid(cid:285)etów” w rozdziale 1. „Dla zaawansowanych”. (cid:81) Receptura „Tworzenie w(cid:239)asnego wid(cid:285)etu do pobierania danych z wykorzystaniem CInputWidget” w rozdziale 4. „U(cid:285)ywanie formularzy”. (cid:81) Receptura „Przygotowywanie rozszerze(cid:241) do dystrybucji”. Tworzenie polece(cid:241) CLI Yii wspiera polecenia wiersza polece(cid:241) i pozwala na tworzenie polece(cid:241) wielokrotnego u(cid:285)ytku. Polecenia konsolowe s(cid:200) szybsze do utworzenia ni(cid:285) graficzny interfejs dla sieci WWW. Je(cid:258)li chcemy utworzy(cid:202) pewien rodzaj u(cid:285)ytecznego narz(cid:218)dzia dla aplikacji, która b(cid:218)dzie u(cid:285)ywana przez deweloperów lub administratorów, polecenia konsolowe s(cid:200) najlepszym wyborem. Aby sprawdzi(cid:202), jak tworzy(cid:202) polecenia konsolowe, utworzymy proste polecenie, które wyczy- (cid:258)ci kilka elementów, takich jak pami(cid:218)(cid:202) podr(cid:218)czna, tymczasowe foldery itd. Przygotowanie Utwórz now(cid:200) aplikacj(cid:218) Yii, korzystaj(cid:200)c z polecenia yiic webapp. Jak to zrobi(cid:202)… 1. Utwórz plik protected/extensions/clean_command/ECleanCommand.php i umie(cid:258)(cid:202) w nim nast(cid:218)puj(cid:200)cy kod: ?php class ECleanCommand extends CConsoleCommand { public $webRoot; public function actionCache() { 238 Kup książkęPoleć książkę Rozdzia(cid:225) 8. • Rozszerzanie Yii $cache=Yii::app()- getComponent( cache ); if($cache!==null){ $cache- flush(); echo Gotowe.\n ; } else { echo Skonfiguruj komponent cache.\n ; } } public function actionAssets() { if(empty($this- webRoot)) { echo Podaj (cid:258)cie(cid:285)k(cid:218) do folderu webRoot w parametrze polecenia.\n ; Yii::app()- end(); } $this- cleanDir($this- webRoot. /assets ); echo Gotowe.\n ; } public function actionRuntime() { $this- cleanDir(Yii::app()- getRuntimePath()); echo Gotowe.\n ; } private function cleanDir($dir) { $di = new DirectoryIterator ($dir); foreach($di as $d) { if(!$d- isDot()) { echo Usuni(cid:218)to .$d- getPathname(). \n ; $this- removeDirRecursive($d- getPathname()); } } } private function removeDirRecursive($dir) { $files = glob($dir.DIRECTORY_SEPARATOR. {,.}* , GLOB_MARK | GLOB_BRACE); foreach ($files as $file) { if(basename($file) == . || basename($file) == .. ) continue; if (substr($file, 239 Kup książkęPoleć książkę Tworzenie aplikacji z Yii - 1) == DIRECTORY_SEPARATOR) $this- removeDirRecursive($file); else unlink($file); } if (is_dir($dir)) rmdir($dir); } } 2. Nast(cid:218)pnie musimy do(cid:239)(cid:200)czy(cid:202) polecenie do aplikacji konsolowej. Domy(cid:258)lnie aplikacja konsolowa korzysta z oddzielnego pliku yiic.php: ?php // change the following paths if necessary $yiic=dirname(__FILE__). /../../framework/yiic.php ; $config=dirname(__FILE__). /config/console.php ; require_once($yiic); 3. Dlatego konfiguracja mie(cid:258)ci si(cid:218) w pliku protected/config/console.php. Dodajmy nasze polecenie konsolowe do w(cid:239)a(cid:258)ciwo(cid:258)ci commandMap: // This is the configuration for yiic console application. // Any writable CConsoleApplication properties can be configured here. return array( basePath = dirname(__FILE__).DIRECTORY_SEPARATOR. .. , name = My Console Application , commandMap = array( clean = array( class = ext.clean_command.ECleanCommand , webRoot = sciezka/do/folderu/webroot/aplikacji , ), ), ); 4. Nie zapomnij zmieni(cid:202) elementu webRoot na rzeczywist(cid:200) (cid:258)cie(cid:285)k(cid:218). To wszystko. Teraz przejd(cid:283) do folderu protected i spróbuj uruchomi(cid:202) poni(cid:285)sze polecenia: yiic clean yiic clean cache yiic clean assets yiic clean runtime Opis dzia(cid:239)ania Wszystkie polecenia konsolowe powinny dziedziczy(cid:202) po klasie CConsoleCommand. Poniewa(cid:285) wszystkie polecenia konsolowe s(cid:200) uruchamiane w klasie CConsoleApplication, a nie w klasie CWebApplication, nie ma sposobu na wyznaczenie g(cid:239)ównego folderu aplikacji sieci WWW. W tym celu tworzymy konfigurowaln(cid:200) w(cid:239)a(cid:258)ciwo(cid:258)(cid:202) publiczn(cid:200) zwan(cid:200) webRoot. 240 Kup książkęPoleć książkę Rozdzia(cid:225) 8. • Rozszerzanie Yii Struktura polecenia konsolowego przypomina typowy kontroler. Definiujemy kilka akcji, które mo(cid:285)na uruchomi(cid:202) poleceniem yiic polecenie konsolowe akcja polecenia . Jak wida(cid:202), nie u(cid:285)ywamy (cid:285)adnego widoku, dlatego mo(cid:285)emy si(cid:218) skupi(cid:202) na zadaniach programi- stycznych zamiast na projekcie graficznym, kodzie itd. Nadal jednak musimy zwróci(cid:202) przydatny wynik, aby u(cid:285)ytkownicy wiedzieli, co si(cid:218) dzieje. Wykonywane jest to poprzez zwyk(cid:239)e instruk- cje PHP echo. Dodatkowe informacje Je(cid:258)li polecenie jest do(cid:258)(cid:202) z(cid:239)o(cid:285)one, podobnie jak message lub migrate, które s(cid:200) wbudowane w Yii, dobr(cid:200) decyzj(cid:200) jest dostarczenie pewnych dodatkowych informacji na temat dost(cid:218)pnych opcji i akcji. Mo(cid:285)na tego dokona(cid:202) poprzez nadpisanie metody getHelp. public function getHelp() { $out = Polecenie clean pozwala wyczy(cid:258)ci(cid:202) ró(cid:285)ne dane tymczasowe Yii oraz wygenerowane przez aplikacj(cid:218).\n\n ; return $out.parent::getHelp(); } Po uruchomieniu samego polecenia yiic clean uzyskamy nast(cid:218)puj(cid:200)cy wynik: Warto przeczyta(cid:202) Dodatkowe informacje o tworzeniu aplikacji i polece(cid:241) konsolowych mo(cid:285)na znale(cid:283)(cid:202) na nast(cid:218)- puj(cid:200)cych stronach: (cid:81) http://www.yiiframework.com/doc/guide/1.1/pl/topics.console (cid:81) http://www.yiiframework.com/doc/api/CConsoleCommand/ (cid:81) http://www.yiiframework.com/doc/api/CConsoleApplication/ Zobacz te(cid:285) (cid:81) Receptura „Przygotowywanie rozszerze(cid:241) do dystrybucji”. 241 Kup książkęPoleć książkę Tworzenie aplikacji z Yii Tworzenie filtrów Filtr to klasa, któr(cid:200) mo(cid:285)na uruchomi(cid:202) przed lub po wykonaniu akcji. Mo(cid:285)na jej u(cid:285)y(cid:202) tak(cid:285)e do zmodyfikowania kontekstu wykonywania lub udekorowania wyniku. W naszym przyk(cid:239)adzie zaimplementujemy prosty filtr wyniku, który skompresuje uzyskany kod HTML, usuwaj(cid:200)c wszystkie opcjonalne elementy formatowania. Nie u(cid:285)ywaj tego filtru w produkcji. GZIP wykona to zadanie lepiej, oszcz(cid:218)dzaj(cid:200)c przepustowo(cid:258)(cid:202). Ponadto usuwanie formatowania obszaru preformatowanego nie jest bezpieczne. Przygotowanie Utwórz now(cid:200) aplikacj(cid:218) Yii, korzystaj(cid:200)c z polecenia yiic webapp. Jak to zrobi(cid:202)… 1. Utwórz plik protected/extensions/compress_html/ECompressHtmlFilter.php i umie(cid:258)(cid:202) w nim nast(cid:218)puj(cid:200)cy kod: ?php class ECompressHtmlFilter extends CFilter { protected function preFilter($filterChain) { ob_start(); return parent::preFilter($filterChain); } protected function postFilter($filterChain) { $out = ob_get_clean(); echo preg_replace( ~ (\s+|\t+|\n+) ~ , , $out); parent::postFilter($filterChain); } } 2. To wszystko. Teraz musimy do(cid:239)(cid:200)czy(cid:202) filtr do aplikacji. Poniewa(cid:285) mamy ju(cid:285) SiteController, dodajmy do niego filtr, nadpisuj(cid:200)c metod(cid:218) filters: public function filters() { return array( array( 242 Kup książkęPoleć książkę Rozdzia(cid:225) 8. • Rozszerzanie Yii ext.compress_html.ECompressHtmlFilter ), ); } 3. Teraz uruchom aplikacj(cid:218) i sprawd(cid:283) kod (cid:283)ród(cid:239)owy HTML. Powinien to by(cid:202) pojedynczy wiersz tekstu, taki jak poni(cid:285)ej: !DOCTYPE html PUBLIC -//W3C//DTD XHTML 1.0 Transitional// EN http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional. dtd html xmlns= http://www.w3.org/1999/xhtml xml:lang= en lang= en head meta http-equiv= Content-Type content= text/ html; charset=utf-8 / meta name= language content= en / !-- blueprint CSS framework -- … Opis dzia(cid:239)ania Filtr powinien implementowa(cid:202) przynajmniej interfejs IFilter, jednak poniewa(cid:285) chcemy doko- na(cid:202) ko(cid:241)cowego i wst(cid:218)pnego filtrowania, mo(cid:285)emy bezpo(cid:258)rednio dziedziczy(cid:202) po klasie CFilter. Planujemy uzyska(cid:202) w pewien sposób zawarto(cid:258)(cid:202) wygenerowan(cid:200) przez akcj(cid:218) i nieco przetworzy(cid:202) wynik przed wys(cid:239)aniem go do przegl(cid:200)darki. Buforowanie danych wyj(cid:258)ciowych PHP (cid:258)wietnie si(cid:218) nadaje do wykonania tego zadania, dlatego nadpisujemy metod(cid:218) preFilter, aby rozpocz(cid:200)(cid:202) buforowanie poprzez wywo(cid:239)anie w niej metody ob_start. Nadpisujemy te(cid:285) metod(cid:218) postFilter, aby uzyska(cid:202) zawarto(cid:258)(cid:202) bufora przy u(cid:285)yciu ob_get_clean, przetworzy(cid:202) wynik z wykorzystaniem wyra(cid:285)e(cid:241) regularnych i go wy(cid:258)wietli(cid:202). Zauwa(cid:285)my, (cid:285)e podczas nadpisywania metod preFilter i postFilter wywo(cid:239)ujemy metody ma- cierzyste. Pozwala to programi(cid:258)cie na utworzenie (cid:239)a(cid:241)cucha filtrów podczas konfigurowania kontrolera. Dodatkowe informacje Dodatkowe informacje o filtrach mo(cid:285)na znale(cid:283)(cid:202) na nast(cid:218)puj(cid:200)cych stronach API: (cid:81) http://www.yiiframework.com/doc/api/CFilter (cid:81) http://www.yiiframework.com/doc/api/IFilter Zobacz te(cid:285) (cid:81) Receptura „Przygotowywanie rozszerze(cid:241) do dystrybucji”. 243 Kup książkęPoleć książkę Tworzenie aplikacji z Yii Tworzenie modu(cid:239)ów Je(cid:258)li utworzy(cid:239)e(cid:258) z(cid:239)o(cid:285)on(cid:200) cz(cid:218)(cid:258)(cid:202) aplikacji i chcesz j(cid:200) wykorzysta(cid:202) po uprzednim dostosowaniu w nast(cid:218)pnym projekcie, prawdopodobnie powiniene(cid:258) utworzy(cid:202) modu(cid:239). W tej recepturze zobaczysz, jak utworzy(cid:202) modu(cid:239) wiki. Dla uproszczenia nie b(cid:218)dziemy si(cid:218) sku- pia(cid:202) na zarz(cid:200)dzaniu u(cid:285)ytkownikami i uprawnieniami, lecz pozwolimy wszystkim na nieogra- niczon(cid:200) edycj(cid:218). Przygotowanie 1. Utwórz now(cid:200) aplikacj(cid:218) Yii, korzystaj(cid:200)c z polecenia yiic webapp. 2. Skonfiguruj baz(cid:218) danych MySQL i wykonaj nast(cid:218)puj(cid:200)ce zapytanie SQL: CREATE TABLE `wiki` ( `id` varchar(255) NOT NULL, `text` text NOT NULL, PRIMARY KEY (`id`) ) 3. Wygeneruj model Wiki, korzystaj(cid:200)c z Gii. 4. Przenie(cid:258) plik protected/models/Wiki.php do folderu protected/modules/ wiki/models/. 5. Dodaj wiki do sekcji modules pliku protected/config/main.php: modules = array( // uncomment the following to enable the Gii tool gii = array( class = system.gii.GiiModule , password = false, ), wiki ), Jak to zrobi(cid:202)… Najpierw zaplanujmy dzia(cid:239)anie: (cid:81) wiki to zestaw stron, na których mo(cid:285)na umieszcza(cid:202) (cid:239)(cid:200)cza do innych stron na podstawie tytu(cid:239)u. (cid:81) Zwykle wiki u(cid:285)ywa prostszej sk(cid:239)adni, (cid:239)atwiejszej do odczytu od kodu HTML. (cid:81) Je(cid:258)li u(cid:285)ytkownik przejdzie do strony, która jeszcze nie istnieje, zostanie zach(cid:218)cony do jej utworzenia. (cid:81) Aby usun(cid:200)(cid:202) stron(cid:218), u(cid:285)ytkownik musi zapisa(cid:202) j(cid:200) wraz z pust(cid:200) zawarto(cid:258)ci(cid:200). 244 Kup książkęPoleć książkę Rozdzia(cid:225) 8. • Rozszerzanie Yii Bazuj(cid:200)c na powy(cid:285)szych wytycznych, za j(cid:218)zyk znaczników przyjmiemy j(cid:218)zyk markdown. Udo- st(cid:218)pnimy sposób tworzenia (cid:239)(cid:200)czy do innych stron na podstawie ich tytu(cid:239)u. Za(cid:239)ó(cid:285)my, (cid:285)e sk(cid:239)adnia b(cid:218)dzie mia(cid:239)a posta(cid:202) [[nazwa strony]] lub [[w(cid:239)asny tytu(cid:239)|nazwa strony]], je(cid:258)li potrzebne b(cid:218)dzie (cid:239)(cid:200)cze o niestandardowym tek(cid:258)cie. 1. Najpierw dodajmy (cid:239)(cid:200)cza wiki do klasy CMarkdownParser. Utwórz plik protected/ modules/wiki/components/WikiMarkdownParser.php: ?php class WikiMarkdownParser extends CMarkdownParser { public function transform($text) { $text = preg_replace_callback( ~\[\[(.*?)(?:\|(.*?))?\]\]~ , array($this, processWikiLinks ), $text); return parent::transform($text); } protected function processWikiLinks($matches) { $page = $matches[1]; $title = isset($matches[2]) ? $matches[2] : $matches[1]; return CHtml::link(CHtml::encode($title), array( view , id = $page, )); } } 2. Nast(cid:218)pnie u(cid:285)yjmy nowej klasy, dodaj(cid:200)c metod(cid:218) getHtml do modelu protected/ modules/wiki/models/Wiki.php: public function getHtml() { $parser = new WikiMarkdownParser(); return $parser- transform($this- text); } Przechodzimy do dostosowania kontrolera protected/modules/wiki/controller/ DefaultController.php. Potrzebne nam b(cid:218)d(cid:200) dwie akcje — view i edit. Ponadto utworzymy akcj(cid:218) index, która po prostu wywo(cid:239)a widok poprzez przypisanie id = index. Poniewa(cid:285) nie potrzebujemy widoku dla akcji index, mo(cid:285)na go bezpiecznie usun(cid:200)(cid:202). 3. Teraz utwórz plik protected/modules/wiki/controller/DefaultController.php: class DefaultController extends Controller { public function actionIndex() { $this- actionView( index ); } public function actionView($id) 245 Kup książkęPoleć książkę Tworzenie aplikacji z Yii { $model = Wiki::model()- findByPk($id); if(!$model) { $this- actionEdit($id); Yii::app()- end(); } $this- render( view , array( model = $model, )); } public function actionEdit($id) { $model = Wiki::model()- findByPk($id); if(!$model) { $model = new Wiki(); $model- id = $id; } if(!empty($_POST[ Wiki ])) { if(!empty($_POST[ Wiki ][ text ])) { $model- text = $_POST[ Wiki ][ text ]; if($model- save()) $this- redirect(array( view , id = $id)); } else { Wiki::model()- deleteByPk($id); } } $this- render( edit , array( model = $model )); } } 4. Potrzebne nam b(cid:218)d(cid:200) dwa widoki. Utwórz plik protected/modules/wiki/views/ default/view.php: h2 ?php echo CHtml::encode($model- id)? [ ?php echo CHtml::link( edit , array( edit , id = $model- id))? ] /h2 ?php echo $model- html ? 5. Utwórz jeszcze jeden plik protected/modules/wiki/views/default/edit.php: 246 Kup książkęPoleć książkę Rozdzia(cid:225) 8. • Rozszerzanie Yii h2 Edycja ?php echo CHtml::encode($model- id)? /h2 ?php echo CHtml::beginForm()? ?php echo CHtml::activeTextArea($model, text , array( cols = 100, rows = 20))? br / br / ?php echo CHtml::submitButton( Gotowe )? ?php echo CHtml::endForm()? 6. To wszystko. Teraz uruchom modu(cid:239) wiki i sprawd(cid:283) go, wpisuj(cid:200)c jaki(cid:258) tekst. Nie zapomnij doda(cid:202) wewn(cid:218)trznego (cid:239)(cid:200)cza, na przyk(cid:239)ad [[rules]]: 7. Powy(cid:285)sza strona podczas edycji b(cid:218)dzie wygl(cid:200)da(cid:202) nast(cid:218)puj(cid:200)co: 8. Poniewa(cid:285) przenie(cid:258)li(cid:258)my model Wiki z aplikacji do modu(cid:239)u, model nie posiada (cid:285)adnych zale(cid:285)no(cid:258)ci zwi(cid:200)zanych z sam(cid:200) aplikacj(cid:200). Dlatego mo(cid:285)emy go przenie(cid:258)(cid:202) 247 Kup książkęPoleć książkę Tworzenie aplikacji z Yii do pakietu rozszerzenia, takiego jak protected/extensions/wiki/, zmieniaj(cid:200)c konfiguracj(cid:218) modu(cid:239)u protected/config/main.php na nast(cid:218)puj(cid:200)c(cid:200): modules = array( // uncomment the following to enable the Gii tool gii = array( class = system.gii.GiiModule , password = false, ), wiki = array( class = ext.wiki.WikiModule ), ), Opis dzia(cid:239)ania Ka(cid:285)dy utworzony modu(cid:239) zawiera g(cid:239)ówn(cid:200) klas(cid:218) modu(cid:239)u, tak(cid:200) jak WikiModule, w której mo(cid:285)na zdefiniowa(cid:202) konfigurowalne w(cid:239)a(cid:258)ciwo(cid:258)ci czy importowane modu(cid:239)y, zmieni(cid:202) (cid:258)cie(cid:285)ki, do(cid:239)(cid:200)czy(cid:202) kontrolery itd. Domy(cid:258)lnie modu(cid:239) wygenerowany przez Gii uruchamia akcj(cid:218) index kontrolera default: public function actionIndex() { $this- actionView( index ); } Na stronie index naszego modu(cid:239)u wiki wywo(cid:239)ujemy akcj(cid:218) view poprzez przekazanie do niej id = index: $model = Wiki::model()- findByPk($id); if(!$model) { $this- actionEdit($id); Yii::app()- end(); } $this- render( view , array( model = $model, )); Je(cid:258)li istnieje model o takim identyfikatorze, wy(cid:258)wietlamy go w widoku. Je(cid:258)li nie istnieje (cid:285)adna strona o takim identyfikatorze, ponownie delegujemy procesowanie do innej akcji. Tym razem jest to akcja edit: $model = Wiki::model()- findByPk($id); if(!$model) { $model = new Wiki(); 248 Kup książkęPoleć książkę Rozdzia(cid:225) 8. • Rozszerzanie Yii $model- id = $id; } if(!empty($_POST[ Wiki ])) { if(!empty($_POST[ Wiki ][ text ])) { $model- text = $_POST[ Wiki ][ text ]; if($model- save()) $this- redirect(array( view , id = $id)); } else { Wiki::model()- deleteByPk($id); } } $this- render( edit , array( model = $model )); Je(cid:258)li nie istnieje model o przekazanym identyfikatorze, tworzymy nowy; je(cid:258)li model istnieje, edytujemy go. Dane formularza edycji pochodz(cid:200) z metody POST i je(cid:258)li pole tekstowe formula- rza jest puste, usuwamy model. Je(cid:258)li tekst istnieje, zapisujemy model. Dodatkowe informacje W Yii dost(cid:218)pny jest bardzo elastyczny i konfigurowalny modu(cid:239) wiki o nazwie Yeeki. Znajduje si(cid:218) nadal w fazie rozwoju i (cid:258)wietnie nadaje si(cid:218) do nauki tworzenia prawdziwie konfigurowal- nych modu(cid:239)ów, które mo(cid:285)na wykorzysta(cid:202) wielokrotnie: https://github.com/samdark/Yeeki Dodatkowe informacje o modu(cid:239)ach mo(cid:285)na znale(cid:283)(cid:202) na nast(cid:218)puj(cid:200)cych stronach API: (cid:81) http://www.yiiframework.com/doc/guide/1.1/pl/basics.module (cid:81) http://www.yiiframework.com/doc/api/CWebModule/ (cid:81) http://www.yiiframework.com/doc/api/CModule/ (cid:81) http://www.yiiframework.com/doc/api/GiiModule/ Zobacz te(cid:285) (cid:81) Receptura „Przygotowywanie rozszerze(cid:241) do dystrybucji”. 249 Kup książkęPoleć książkę Tworzenie aplikacji z Yii Niestandardowe renderowanie widoków Na rynku dost(cid:218)pnych jest wiele silników szablonów PHP. Yii wspiera jedynie dwa rodzaje sza- blonów: natywne PHP i szablony w stylu Prado. Je(cid:258)li chcemy u(cid:285)y(cid:202) jednego z istniej(cid:200)cych sil- ników szablonów lub utworzy(cid:202) w(cid:239)asny, musimy go zaimplementowa(cid:202), o ile nie zosta(cid:239)o to jesz- cze zrobione przez spo(cid:239)eczno(cid:258)(cid:202) Yii. W tej recepturze zaimplementujemy wsparcie dla szablonów Smarty. Przygotowanie 1. Utwórz now(cid:200) aplikacj(cid:218) Yii, korzystaj(cid:200)c z polecenia yiic webapp. 2. Pobierz ostatni(cid:200) wersj(cid:218) Smarty 3 ze strony http://www.smarty.net/. 3. Wyodr(cid:218)bnij zawarto(cid:258)(cid:202) folderu libs do folderu protected/vendors/smarty/. Jak to zrobi(cid:202)… 1. Utwórz plik protected/extensions/smarty/ESmartyViewRenderer.php i umie(cid:258)(cid:202) w nim nast(cid:218)puj(cid:200)cy kod: ?php class ESmartyViewRenderer extends CApplicationComponent implements IViewRenderer { public $fileExtension= .tpl ; public $filePermission=0755; private $smarty; function init() { Yii::import( application.vendors.smarty.* ); spl_autoload_unregister(array( YiiBase , autoload )); require_once( Smarty.class.php ); spl_autoload_register(array( YiiBase , autoload )); $this- smarty = new Smarty(); $this- smarty- template_dir = ; $compileDir = Yii::app()- getRuntimePath(). /smarty/compiled/ ; if(!file_exists($compileDir)){ mkdir($compileDir, $this- filePermission, true); } $this- smarty- compile_dir = $compileDir; 250 Kup książkęPoleć książkę Rozdzia(cid:225) 8. • Rozszerzanie Yii $this- smarty- assign( Yii , Yii::app()); } /** * Renderuje plik widoku. * Ta metoda jest wymagana przez {@link IViewRenderer}. * @param CBaseController kontroler lub wid(cid:298)et, który renderuje plik widoku. * @param string (cid:286)cie(cid:298)ka pliku widoku * @param mieszany, dane przekazywane do widoku * @param boolean, czy nale(cid:298)y zwróci(cid:252) wynik renderowania * @return mieszany wynik renderowania lub null, je(cid:286)li wynik renderowania jest niepotrzebny. */ public function renderFile($context,$sourceFile,$data,$return) { // w(cid:225)a(cid:286)ciwo(cid:286)ci bie(cid:298)(cid:261)cego kontrolera b(cid:266)d(cid:261) dost(cid:266)pne w postaci {this.property} $data[ this ] = $context; if(!is_file($sourceFile) || ($file=realpath($sourceFile))==false) throw new CException(Yii::t( ext , Plik widoku $sourceFile nie istnieje. , array( {file} = $sourceFile))); $this- smarty- assign($data); if($return) return $this- smarty- fetch($sourceFile); else $this- smarty- display($sourceFile); } } 2. Nast(cid:218)pnie musimy do(cid:239)(cid:200)czy(cid:202) do aplikacji now(cid:200) klas(cid:218) renderuj(cid:200)c(cid:200) widok. W tym celu nale(cid:285)y nadpisa(cid:202) komponent viewRenderer w pliku protected/config/main.php: ... // application components components = array( ... viewRenderer = array( class = ext.smarty.ESmartyViewRenderer , ), ), ... 3. Teraz mo(cid:285)emy przetestowa(cid:202) nasze rozwi(cid:200)zanie. Utwórz plik protected/controllers/ SmartyController.php i umie(cid:258)(cid:202) w nim nast(cid:218)puj(cid:200)cy kod: ?php class SmartyController extends Controller { function actionNative() { $this- render( native , array( username = Aleksandrze , )); 251 Kup książkęPoleć książkę Tworzenie aplikacji z Yii } function actionSmarty() { $this- render( smarty , array( username = Aleksandrze , )); } } 4. Potrzebne s(cid:200) równie(cid:285) widoki. Utwórz plik protected/views/smarty/native.php: Witaj, ?php echo $username? ! protected/views/smarty/smarty.tpl: Witaj, {$username}! 5. Spróbujmy teraz uruchomi(cid:202) akcje kontrolera.
Pobierz darmowy fragment (pdf)

Gdzie kupić całą publikację:

Tworzenie aplikacji z Yii. Receptury
Autor:

Opinie na temat publikacji:


Inne popularne pozycje z tej kategorii:


Czytaj również:


Prowadzisz stronę lub blog? Wstaw link do fragmentu tej książki i współpracuj z Cyfroteką: