Tytuł oryginału: CakePHP 1.3 Application Development Cookbook
Tłumaczenie: Przemysław Pietraszek (rozdz.1),Krzysztof Rychlicki-Kicior (wstęp, rozdz. 2 – 11)
ISBN: 978-83-246-3542-9
Copyright © Packt Publishing 2011. First published in the English language under the title „CakePHP 1.3 Application Development Cookbook”
© Helion 2012All 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 biorą jednak żadnej odpowiedzialności ani za ich wykorzystanie, ani za związane z tym ewentualne naruszenie praw patentowych lub autorskich. Autor oraz Wydawnictwo HELION nie ponoszą również żadnej odpowiedzialności za ewentualne szkody wynikłe z wykorzystania informacji zawartych w książce.
Pliki z przykładami omawianymi w książce można znaleźć pod adresem: ftp://ftp.helion.pl/przyklady/ caph3r.zip
Wydawnictwo HELIONul. Kościuszki 1c, 44-100 GLIWICEtel. 32 231 22 19, 32 230 98 63e-mail: [email protected]: http://helion.pl (księgarnia internetowa, katalog książek)
Drogi Czytelniku!Jeżeli chcesz ocenić tę książkę, zajrzyj pod adres http://helion.pl/user/opinie/caph3rMoż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�ci
O autorze 9
O recenzentach 11
Przedmowa 13
O czym jest ta ksi��ka? 13Oprogramowanie wykorzystywane w ksi��ce 16Dla kogo jest ta ksi��ka? 17Konwencje typograficzne 17Materia�y dodatkowe i pomoc 17
Rozdzia� 1. Uwierzytelnianie 19
Wprowadzenie 19Konfiguracja prostego systemu uwierzytelniania 20U�ywanie i konfiguracja komponentu Auth 24Logowanie za pomoc� nazwy u�ytkownika lub adresu e-mail 28Zapisywanie informacji o u�ytkowniku po zalogowaniu 31Pobieranie informacji o zalogowanym u�ytkowniku 33U�ywanie prefiksów do kontroli dost�pu bazuj�cej na rolach 36Autoryzacja wykorzystuj�ca warstw� kontroli dost�pu (ACL) 38Integracja z OpenID 45
Rozdzia� 2. Wi�zania modeli 49
Wprowadzenie 49Dodanie zachowania Containable do wszystkich modeli 50Ograniczanie wi�za� zwracanych przez wyszukiwania 51Modyfikowanie parametrów wi�za� dla wyszukiwa� 59Modyfikowanie warunków wi�za� dla wyszukiwa� 63Zmiana typu z��czenia dla powi�za� jeden-do-jednego 65Tworzenie wielu powi�za� z tym samym modelem 66Dodawanie wi�za� w locie 69
Spis tre�ci
6
Rozdzia� 3. Wszystko o pobieraniu danych 73
Wprowadzenie 73Wykonywanie zapyta� GROUP i COUNT 74Wykorzystywanie pól wirtualnych 80Tworzenie zapyta� z wykorzystaniem z��cze� dora�nych 84Wyszukiwanie elementów spe�niaj�cych okre�lone kryteria 87Implementacja w�asnego typu wyszukiwania 89Stronicowanie wyszukiwa� w�asnych typów 93Implementacja stronicowania na bazie technologii AJAX 96
Rozdzia� 4. Walidacja i zachowania 99
Wprowadzenie 99Dodawanie wielu regu� walidacji 100Tworzenie w�asnych regu� walidacji 104Wykorzystywanie wywo�a� zwrotnych w zachowaniach 109Wykorzystywanie zachowa� do dodawania nowych pól 116Wykorzystywanie zachowania Sluggable 118Geokodowanie adresów przy u�yciu zachowania Geocodable 122
Rozdzia� 5. ród�a danych 127
Wprowadzenie 127Udoskonalanie dziennika zapyta� �ród�a danych SQL 127Parsowanie plików CSV za pomoc� �róde� danych 134Konsumowanie kana�ów RSS za pomoc� �róde� danych 138Tworzenie �ród�a danych przy u�yciu serwisu Twitter 142Dodawanie obs�ugi transakcji i blokad w �ródle danych MySQL 152
Rozdzia� 6. Magia trasowania 161
Wprowadzenie 161Wykorzystywanie parametrów named i GET 162Wykorzystywanie tras z prefiksami 168Praca z elementami tras 172Dodawanie tras typu catch-all dla stron profilowych 175Dodawanie walidacji dla klas typu catch-all 179Tworzenie w�asnych klas trasowania 182
Rozdzia� 7. Tworzenie i wykorzystywanie us�ug sieciowych 187
Wprowadzenie 187Tworzenie kana�u RSS 188Konsumowanie us�ugi JSON 194Tworzenie us�ug REST przy u�yciu formatu JSON 199Dodawanie uwierzytelniania do us�ug REST 208Implementacja autoryzacji dost�pu do API przy u�yciu tokenu 213
Spis tre�ci
7
Rozdzia� 8. Praca z pow�okami 219
Wprowadzenie 219Tworzenie i uruchamianie pow�oki 220Parsowanie parametrów wiersza polece� 224Tworzenie zada� pow�oki wielokrotnego u�ytku 229Wysy�anie wiadomo�ci e-mail z poziomu pow�oki 239Tworzenie automatycznych zada� za pomoc� wtyczki Robot 243
Rozdzia� 9. Internacjonalizacja aplikacji 249
Wprowadzenie 249Internacjonalizacja tekstów w kontrolerach i widokach 250Internacjonalizacja komunikatów walidacji w modelach 256T�umaczenie tekstów zawieraj�cych dynamicznie generowan� tre� 259Ekstrakcja i t�umaczenie tekstów 262T�umaczenie rekordów baz danych za pomoc� zachowania Translate 266Ustawianie i zapami�tywanie j�zyka 270
Rozdzia� 10. Testowanie 273
Wprowadzenie 273Konfiguracja frameworka do testów 274Tworzenie testowych danych i metod modeli 278Testowanie akcji kontrolera i ich widoków 286Wykorzystywanie za�lepek do testowania kontrolerów 290Uruchamianie testów w konsoli 294
Rozdzia� 11. Narz�dzia i klasy pomocnicze 297
Wprowadzenie 297Wykorzystywanie klasy Set 298Operacje na tek�cie przy u�yciu klasy String 305Wysy�anie wiadomo�ci e-mail 308Wykrywanie typów plików za pomoc� MagicDb 314Rzucanie i obs�uga wyj�tków 319
Skorowidz 325
9
Internacjonalizacjaaplikacji
W tym rozdziale omówimy nast�puj�ce zagadnienia:� internacjonalizacj� tekstów w kontrolerach i widokach;� internacjonalizacj� komunikatów walidacji w modelach;� t�umaczenie tekstów zawieraj�cych dynamicznie generowan� tre��;� ekstrakcj� i t�umaczenie tekstów;� t�umaczenie rekordów baz danych za pomoc� zachowania Translate;� ustawianie i zapami�tywanie j�zyka.
WprowadzenieW tym rozdziale zajmiemy si� przyk�adami, które pozwol� na internacjonalizacj� — umi�-dzynarodowienie — wszystkich elementów aplikacji CakePHP, zarówno statycznych (zawartychnp. w widokach), jak i dynamicznych (np. rekordy baz danych).
W pierwszych dwóch przyk�adach poka�emy, jak udost�pni� elementy widoków, a tak�e ko-munikaty walidacji modelu do t�umacze�. W trzecim przyk�adzie b�dziemy t�umaczy� bardziejz�o�one wyra�enia. Czwarty przyk�ad to pokaz mo�liwo�ci wbudowanych narz�dzi CakePHP,które potrafi� wy�uska� statyczn� tre�� aplikacji wymagaj�c� t�umaczenia. Pi�ty przyk�adprzedstawia mechanizm t�umaczenia rekordów baz danych. Na zako�czenie dowiesz si�, jakumo�liwi� u�ytkownikowi zmian� aktywnego j�zyka aplikacji.
CakePHP 1.3. Programowanie aplikacji. Receptury
250
Internacjonalizacja tekstóww kontrolerach i widokachW tym przyk�adzie dowiesz si�, jak zinternacjonalizowa� tekst, który znajduje si� w widokachnaszej aplikacji, a tak�e jak przygotowa� takie teksty do t�umaczenia.
Zanim zacznieszAby wykona� poni�szy przyk�ad, musisz skorzysta� z przyk�adowych danych. Utwórz tabel�articles, korzystaj�c z poni�szego zapytania SQL:
CREATE TABLE 'articles'( 'id' INT UNSIGNED AUTO_INCREMENT NOT NULL, 'title' VARCHAR(255) NOT NULL, 'body' TEXT NOT NULL, 'created' DATETIME NOT NULL, 'modified' DATETIME NOT NULL, PRIMARY KEY('id'));
Teraz dodaj kilka rekordów, korzystaj�c z poni�szych zapyta� SQL:
INSERT INTO 'articles'('title', 'body', 'created', 'modified') VALUES ('First article', 'The body of the first article.', NOW(), NOW()), ('Second article', 'The body of the second article.', NOW(), NOW()), ('Third article', 'The body of the third article.', NOW(), NOW());
Utwórz plik app/controllers/articles_controller.php i umie�� w nim kontroler o nast�puj�cejtre�ci:
<?phpclass ArticlesController extends AppController { public function index() { $this->paginate['limit'] = 2; $articles = $this->paginate(); $this->set(compact('articles')); } public function add() { if (!empty($this->data)) { $this->Article->create(); if ($this->Article->save($this->data)) { $this->Session->setFlash('Article saved!'); $this->redirect(array('action'=>'index')); } else { $this->Session->setFlash('Please correct errors!'); } }
Rozdzia� 9. • Internacjonalizacja aplikacji
251
} public function view($id) { $article = $this->Article->find('first', array( 'conditions' => array('Article.id' => $id) )); if (empty($article)) { $this->cakeError('error404'); } $this->set(compact('article')); }}?>
W dalszej kolejno�ci utwórz plik app/models/article.php o nast�puj�cej tre�ci:
<?phpclass Article extends AppModel { public $validate = array( 'title' => 'notEmpty', 'body' => 'notEmpty' );}?>
Utwórz podkatalog app/views/articles, po czym dodaj do niego plik index.ctp o nast�puj�cejtre�ci:
<h1>Articles</h1><p><?php echo $this->Paginator->counter(); ?> - <?php echo $this->Paginator->prev(); ?> <?php echo $this->Paginator->numbers(); ?> <?php echo $this->Paginator->next(); ?></p><p><?php echo count($articles) . ' articles: '; ?></p><ul><?php foreach($articles as $article) { ?> <li><?php echo $this->Html->link( $article['Article']['title'], array('action'=>'view', $article['Article']['id']) ); ?></li><?php } ?></ul><p><?php echo $this->Html->link('Create article', array('action'=>'add'));?></p>
CakePHP 1.3. Programowanie aplikacji. Receptury
252
Do katalogu app/views/articles dodaj plik add.ctp o nast�puj�cej tre�ci:
<?phpecho $this->Form->create();echo $this->Form->inputs(array( 'legend' => 'Create article', 'title' => array('label' => 'Title'), 'body' => array('label' => 'Body')));echo $this->Form->end('Save');?>
Na zako�czenie dodaj plik app/views/articles/view.ctp o nast�puj�cej tre�ci:
<h1><?php echo $article['Article']['title']; ?></h1><?php echo $article['Article']['body']; ?>
Jak to zrobi� 1. Zmodyfikuj tre�� pliku app/controllers/articles_controller.php, uwzgl�dniaj�czmiany zaznaczone pogrubion� czcionk� w metodzie add():
public function add() {
if (!empty($this->data)) { $this->Article->create(); if ($this->Article->save($this->data)) { $this->Session->setFlash(__('Article saved', true)); $this->redirect(array('action'=>'index')); } else { $this->Session->setFlash(__('Please correct the errors', true)); } }}
2. Otwórz plik app/views/articles/add.ctp i wprowad zaznaczone pogrubion�czcionk� zmiany:
<?phpecho $this->Form->create();echo $this->Form->inputs(array( 'legend' => __('New Article', true), 'title' => array('label' => __('Title:', true)), 'body' => array('label' => __('Body:', true))));echo $this->Form->end(__('Save', true));?>
Rozdzia� 9. • Internacjonalizacja aplikacji
253
3. Otwórz plik app/views/articles/index.ctp i wprowad nast�puj�ce zmiany:
<h1><?php __('Articles'); ?></h1><p><?php echo $this->Paginator->counter(__('Showing records %start%-%end% inpage %page% out of %pages%', true)); ?> - <?php echo $this->Paginator->prev(__('<< Previous', true)); ?> <?php echo $this->Paginator->numbers(); ?> <?php echo $this->Paginator->next(__('Next >>', true)); ?></p><p><?php$count = count($articles);echo $count . ' ' . __n('article', 'articles', $count, true) . ': ';?></p><ul><?php foreach($articles as $article) { ?> <li><?php echo $this->Html->link( $article['Article']['title'], array('action'=>'view', $article['Article']['id']) ); ?></li><?php } ?></ul><p><?php echo $this->Html->link(__('Create article', true),array('action'=>'add')); ?></p>
Przejd na stron� http://localhost/articles. Powiniene� otrzyma� stronicowan� list� artyku�ówpodobn� do przedstawionej na poni�szym rysunku.
CakePHP 1.3. Programowanie aplikacji. Receptury
254
Jak to dzia�aDwie najwa�niejsze metody udost�pniane przez CakePHP do t�umaczenia to __() i __n().Nazwy metod mog� wyda� si� nieco dziwne; ich pochodzenie wywodzi si� od implementacjinarz�dzia gettext w j�zyku Perl — narz�dzie to stanowi element Projektu T�umaczenia GNU(GNU Translation Project).
Metoda __() jest u�ywana do t�umaczenia tekstów statycznych i przyjmuje dwa parametryopisane w poni�szej tabeli.
Parametr Opis
singular Tekst, który ma by� przet�umaczony.return Je�li ten parametr ma warto�� true, przet�umaczony tekst zostanie zwrócony, a nie
przes�any do klienta. Domy�lnie false.
Metoda __n() równie� pozwala na t�umaczenie tekstów statycznych, jednak uwzgl�dnia onatak�e sytuacje, w których konkretna warto�� mo�e zale�e� od liczby — pojedynczej lub mno-giej. W zwi�zku z tym przyjmuje ona cztery parametry wymienione w poni�szej tabeli.
Parametr Opis
singular Tekst, który zostanie przet�umaczony na aktywny j�zyk, je�li parametr count otrzymawarto�� singular.
plural Tekst, który zostanie przet�umaczony na aktywny j�zyk, je�li parametr count otrzymawarto�� plural.
count Zmienna lub warto�� liczbowa, która zostanie wykorzystana do okre�lenia liczby dla danegotekstu (singular lub plural).
return Je�li ten parametr ma warto�� true, przet�umaczony tekst zostanie zwrócony, a nie przes�anydo klienta. Domy�lnie false.
Rozpoczynamy od zmiany komunikatów generowanych przez klas� ArticlesController, wy-korzystuj�c funkcj� __(). Zastrzegamy, �e teksty maj� by� zwracane, a nie przesy�ane do klienta.Nast�pnie modyfikujemy plik add.ctp, dzi�ki czemu wszystkie etykiety formularza (wraz z jegolegend�) zostan� przet�umaczone.
W podobny sposób opakowujemy tytu� w widoku index.ctp za pomoc� funkcji t�umaczenia.Nast�pnie korzystamy z pierwszego parametru metod counter(), next() i prev() (stanowi�-cych sk�adowe klasy PaginatorHelper), aby przekaza� przet�umaczone wersje wszystkich tek-stowych elementów mechanizmu stronicowania. Na zako�czenie korzystamy z funkcji __n(),by wybra� odpowiedni przet�umaczony tekst przy u�yciu warto�ci zmiennej count.
Rozdzia� 9. • Internacjonalizacja aplikacji
255
Je�li korzystasz z funkcji __n(), musisz pami�ta�, �e trzecim argumentem w wywo�aniach tej funkcjipowinna by� zawsze zmienna, a nie wyra�enie (np. zawieraj�ce indeksy tablic). Wyra�enia mog� do-prowadzi� do zwrócenia nieoczekiwanych wyników podczas wywo�ywania pow�oki ekstraktora (por.przyk�ad „Ekstrakcja i t�umaczenie tekstów”).
Domeny i kategorieFunkcje t�umacze� wykorzystywane w tym przyk�adzie opakowuj� funkcj� translate() nale-��c� do klasy I18n frameworka CakePHP. Metoda ta pozwala nie tylko na przeprowadzanieprostych t�umacze�; dzi�ki niej programista mo�e okre�li� domen�, z której s� pozyskiwanet�umaczone teksty, a tak�e kategori�, do której nale�y tekst do t�umaczenia.
Domeny pozwalaj� na wydzielanie grup t�umaczonych tekstów do osobnych plików. Domy�l-nie, gdy domena nie jest okre�lona jawnie, CakePHP korzysta z domeny default (domy�lnej).Je�li chcesz okre�li� domen�, w której CakePHP powinien szuka� t�umaczonego tekstu, sko-rzystaj z funkcji __d() lub __dn(). Wyszukanie t�umaczonego tekstu w domenie moja_wtyczkawygl�da�oby nast�puj�co:
$translated = __d('moja_wtyczka', 'Hello World', true);
Kategorie umo�liwiaj� jeszcze wi�ksz� kontrol� nad zarz�dzaniem t�umaczonymi tekstami.Pozwalaj� one na grupowanie plików t�umacze� w odr�bnych katalogach; mo�na tak�e po-wi�za� t�umaczony tekst z dodatkowymi metadanymi. Domy�lnie CakePHP zak�ada, �e t�u-maczone teksty nale�� do kategorii LC_MESSAGES. Je�li chcesz zmieni� kategori�, skorzystaj z funk-cji t�umaczenia __dc() i __dcn(), ustawiaj�c przedostatni argument — return — na wybran�kategori�. Mo�e ona przyjmowa� jedn� z okre�lonych poni�ej warto�ci:
� LC_ALL: 0;� LC_COLLATE: 1;� LC_CTYPE: 2;� LC_MONETARY: 3;� LC_NUMERIC: 4;� LC_TIME: 5;� LC_MESSAGES: 6.
Próba znalezienia nale��cego do kategorii LC_MESSAGES tekstu Hello World w domenie defaultwygl�da nast�puj�co:
$translated = __dc('default', 'Hello World', 6, true);
Korzystaj�c z kategorii, zawsze podawaj warto�ci liczbowe, a nie nazwy sta�ych. Te ostatnie s� bowiemzale�ne od wykorzystywanej platformy.
CakePHP 1.3. Programowanie aplikacji. Receptury
256
Zobacz równie�� „Internacjonalizacja komunikatów walidacji w modelach”;� „Ekstrakcja i t�umaczenie tekstów”.
Internacjonalizacja komunikatówwalidacji w modelachW tym przyk�adzie wykorzystamy ró�ne sposoby na zrealizowanie tego samego zadania: t�u-maczenia komunikatów walidacji w modelach.
Zanim zacznieszAby wykona� ten przyk�ad, musimy skorzysta� z podstawowego szkieletu aplikacji. W tymcelu musisz wykona� poprzedni przyk�ad.
Jak to zrobi�Zmie� tre�� pliku app/models/article.php, wprowadzaj�c zmiany zaznaczone pogrubion�czcionk� we w�a�ciwo�ci validate:
public $validate = array( 'title' => array( 'required' => 'notEmpty' ), 'body' => array( 'required' => 'notEmpty' ));
Istniej� dwa sposoby t�umaczenia komunikatów walidacji. Pierwszy z nich wymaga przes�o-ni�cia konstruktora modelu. Wystarczy doda� jego poni�sz� implementacj� do klasy Articlew pliku app/models/article.php:
public function __construct($id = false, $table = null, $ds = null) { foreach($this->validate as $field => $rules) { if (!is_array($rules)) { $rules = (array) $rules; } foreach($rules as $key => $rule) {
Rozdzia� 9. • Internacjonalizacja aplikacji
257
if (!is_array($rule)) { $rules[$key] = compact('rule'); } } $this->validate[$field] = $rules; } $this->validate = Set::merge($this->validate, array( 'title' => array( 'required' => array('message' �=> __('A title must be specified', true)) ), 'body' => array( 'required' => array('message' �=> __('You must define the body', true)) ) )); parent::__construct($id, $table, $ds);}
Inn� metod� t�umaczenia komunikatów walidacji jest przeniesienie komunikatów do widoku.W ten sposób zamiast przes�ania� konstruktor i deklarowa� w nim komunikaty, wystarczywprowadzi� zmiany w pliku app/views/articles/add.ctp:
<?phpecho $this->Form->create();echo $this->Form->inputs(array( 'title' => array( 'label' => __('Title:', true), 'error' => array( 'required' => __('A title must be specified', true) ) ), 'body' => array( 'label' => __('Body:', true), 'error' => array( 'required' => __('You must define the body', true) ) )));echo $this->Form->end(__('Save', true));?>
Obie metody doprowadz� do uzyskania takiego samego efektu. Przejd na stron� http://localhost/articles/add i wy�lij formularz bez wprowadzania jakichkolwiek warto�ci. Powiniene�uzyska� efekt jak na poni�szym rysunku.
CakePHP 1.3. Programowanie aplikacji. Receptury
258
Jak to dzia�aPrzed utworzeniem komunikatów o b��dach dla ka�dej z regu� walidacji musimy owe regu�ynazwa�. W tym celu modyfikujemy model Article, dzi�ki czemu ka�da z regu� jest indekso-wana przy u�yciu nazwy. W naszym przypadku wybieramy nazw� required dla regu�y Cake-PHP o nazwie notEmpty.
Pierwsze rozwi�zanie problemu t�umaczenia komunikatów walidacji mo�na okre�li� mianemscentralizowanego — wszystkie komunikaty s� umieszczone w tym samym miejscu, w kon-struktorze modelu. Przes�aniamy konstruktor, dzi�ki czemu mo�emy w jego wn�trzu zadekla-rowa� komunikaty o b��dach, które powinny by� przet�umaczone. Musieli�my skorzysta�z konstruktora, poniewa� w�a�ciwo�ci klas mog� zawiera� tylko statyczne przypisania. Poni�szyblok kodu spowoduje b��d sk�adni PHP:
public $validate = array( 'title' => array( 'required' => array( 'rule' => 'notEmpty', 'message' => __('Nothing defined!', true) // BD SKADNI
Rozdzia� 9. • Internacjonalizacja aplikacji
259
) ));
W implementacji konstruktora rozpoczynamy od sprawdzenia, czy w�a�ciwo�� validate sta-nowi tablic� regu� (indeksowanych przy u�yciu nazw pól). Musimy tak�e sprawdzi�, czy ka�-da regu�a sama w sobie równie� stanowi tablic� (indeksowan� za pomoc� nazw), której warto-�ciami s� ponownie tablice, zawieraj�ce przynajmniej ustawienie rule.
Po zweryfikowaniu formatu w�a�ciwo�ci validate mo�emy po��czy� komunikaty walidacji dlaka�dej z regu�, korzystaj�c z funkcji __() w celu przet�umaczenia komunikatów. Na zako�-czenie wywo�ujemy konstruktor klasy bazowej, aby poprawnie zako�czy� proces tworzeniaca�ego modelu.
Drugie podej�cie do problemu t�umaczenia przedstawione w tym przyk�adzie przesuwa odpo-wiedzialno�� za obs�ug� t�umacze� na widok, korzystaj�c z ustawienia error dost�pnego w meto-dzie input() klasy FormHelper. To ustawienie otrzymuje tablic� indeksowan� za pomoc� nazwregu� walidacji, której warto�ciami s� komunikaty o b��dach wykorzystywane w razie niespe�-nienia poszczególnych regu� walidacji.
Zobacz równie�� „Ekstrakcja i t�umaczenie tekstów”.
T�umaczenie tekstów zawieraj�cychdynamicznie generowan� tre�W tym przyk�adzie dowiesz si�, jak t�umaczy� teksty, które zawieraj� elementy dynamiczne— np. warto�ci zmiennych.
Zanim zacznieszAby wykona� ten przyk�ad, musimy skorzysta� z podstawowego szkieletu aplikacji. W tymcelu musisz wykona� przyk�ad „Internacjonalizacja tekstów w kontrolerach i widokach”.
Jak to zrobi� 1. Otwórz plik app/controllers/articles_controller.php i wprowad zaznaczonepogrubion� czcionk� zmiany w metodzie add():
CakePHP 1.3. Programowanie aplikacji. Receptury
260
public function add() { if (!empty($this->data)) { $this->Article->create(); if ($this->Article->save($this->data)) { $this->Session->setFlash( sprintf(__('Article "%s" saved', true), $this->Article-> �field('title')) ); $this->redirect(array('action'=>'index')); } else { $this->Session->setFlash('Prosz� poprawi� b��dy!'); } }}
2. Otwórz plik app/views/articles/index.ctp i wprowad w nim zaznaczone pogrubion�czcionk� zmiany:
<h1><?php __('Articles'); ?></h1><p><?php echo $this->Paginator->counter(__('Showing records %start%-%end% in page %page% out of %pages%', true)); ?> - <?php echo $this->Paginator->prev(__('<< Previous', true)); ?> <?php echo $this->Paginator->numbers(); ?> <?php echo $this->Paginator->next(__('Next >>', true)); ?></p><p><?php$count = count($articles);printf(__n('%d article', '%d articles', $count, true), $count);?></p><ul><?php foreach($articles as $article) { ?> <li><?php echo $this->Html->link( $article['Article']['title'], array('action'=>'view', $article['Article']['id']) ); ?></li><?php } ?></ul><p><?php echo $this->Html->link(__('Create article', true),array('action'=>'add')); ?></p>
Rozdzia� 9. • Internacjonalizacja aplikacji
261
Jak to zrobi�Gdy podczas tworzenia aplikacji napotyka si� problem t�umaczenia tre�ci zawieraj�cych ele-menty dynamiczne — np. warto�� zmiennej lub warto�� pola z bazy danych — mo�e si� po-jawi� pokusa do��czenia zmiennej do �a�cucha statycznego, a nast�pnie przekazania takiegowyra�enia do funkcji t�umaczenia:
$translated = __('Hello ' . $name, true); // �LE
To wyra�enie nie jest poprawne, poniewa� ekstraktor CakePHP (omówiony w przyk�adzie„Ekstrakcja i t�umaczenie tekstów”) dzia�a poprawnie tylko dla tekstów statycznych. W innych j�-zykach mo�e na przyk�ad wyst�pi� konieczno�� zmiany kolejno�ci s�ów w zdaniu. W zwi�zkuz tym musimy skorzysta� z innej techniki przetwarzania �a�cuchów. Rozwi�zanie jest prostei stosunkowo popularne — funkcje PHP printf() i sprintf().
Obie funkcje przyjmuj� te same argumenty. Pierwszy z nich jest obowi�zkowy i okre�la �a�-cuch znaków do sformatowania. Wszystkie kolejne argumenty przekazane do funkcji zostan�wykorzystane do wygenerowania wynikowego �a�cucha znaków. Jedyna ró�nica pomi�dzyfunkcjami printf() a sprintf() polega na tym, �e pierwsza z nich wy�wietli efekt swojej pra-cy, druga za� — zwróci go.
Przejdmy teraz do kodu naszej aplikacji. Rozpoczynamy od zmiany komunikatu zwracanegoprzez klas� ArticlesController po utworzeniu artyku�u. Korzystamy z funkcji sprintf(), ponie-wa� efekt jej dzia�ania chcemy przekaza� do metody setFlash() komponentu Session. W na-szej sytuacji wyra�enie %s pozwala na wstawienie do �a�cucha znaków tytu�u nowo utworzo-nego artyku�u.
W podobny sposób podstawiamy warto�� zmiennej count pod ci�g %d. Tym razem korzystamyz funkcji printf(), aby wy�wietli� od razu efekt dzia�ania funkcji.
Zmiana kolejno�ci argumentówGdy korzystamy z wyra�e� %s lub %d w funkcjach printf() i sprintf(), nie mamy kontroli nadsposobem pozycjonowania warto�ci; nie mo�emy te� u�y� dwa razy jednej warto�ci, poniewa�ka�de z wyra�e� jest dopasowywane do konkretnego, pojedynczego argumentu. Za�ó�my, �edysponujemy nast�puj�cym wyra�eniem:
printf('Your name is %s and your country is %s', $name, $country);
Pierwsze wyra�enie %s zostanie zast�pione warto�ci� zmiennej name, drugie — warto�ci�zmiennej country. Problem pojawi�by si� w sytuacji, w której chcieliby�my zmieni� kolejno��argumentów w �a�cuchu znaków, zachowuj�c jednocze�nie kolejno�� argumentów w obr�biewywo�ania funkcji printf().
Na szcz��cie do argumentów funkcji printf() mo�emy si� odwo�ywa�, korzystaj�c z ich nu-merów porz�dkowych (okre�laj�cych ich pozycj� w�ród wszystkich argumentów przekaza-nych w danym wywo�aniu). W poni�szym przyk�adzie name jest argumentem 1, a country —argumentem 2:
CakePHP 1.3. Programowanie aplikacji. Receptury
262
printf('You are from %2$s and your name is %1$s', $name, $country);
Takie podej�cie pozwala na ponowne u�ycie argumentu bez konieczno�ci podawania go wie-lokrotnie w wywo�aniu funkcji printf():
printf('You are from %2$s and your name is %1$s . Welcome %1$s!', $name,�$country);
Zobacz równie�� „Ekstrakcja i t�umaczenie tekstów”.
Ekstrakcja i t�umaczenie tekstówW tym przyk�adzie nauczymy si� pozyskiwa� wszystkie �a�cuchy znaków, które podlegaj�t�umaczeniu w naszych aplikacjach CakePHP, a nast�pnie przeprowadzimy proces t�umacze-nia, korzystaj�c z darmowego oprogramowania.
Zanim zacznieszAby wykona� ten przyk�ad, musimy skorzysta� z podstawowego szkieletu aplikacji. W tymcelu musisz wykona� przyk�ad „Internacjonalizacja tekstów w kontrolerach i widokach”.
Musisz tak�e zainstalowa� aplikacj� Poedit w swoim systemie. Przejd na stron� http://www.poedit.net/download.php, a nast�pnie pobierz plik dla swojego systemu operacyjnego.
Jak to zrobi�Przejd do podkatalogu app/ Twojej aplikacji w wierszu polece�, a nast�pnie wykonaj poni�szepolecenie:
� je�li pracujesz w systemach GNU Linux/Mac/Unix:
../cake/console/cake i18n extract
� je�li jeste� u�ytkownikiem systemu Microsoft Windows:
..\cake\console\cake.bat i18n extract
Powiniene� skorzysta� z ustawie� domy�lnych, jak przedstawiono na kolejnym rysunku.
Po udzieleniu odpowiedzi na ostatnie pytanie pow�oka przeszuka wszystkie pliki Twojej apli-kacji i na ich podstawie wygeneruje szablon t�umaczenia. Zostanie on umieszczony w plikuapp/locale/default.pot.
Rozdzia� 9. • Internacjonalizacja aplikacji
263
Otwórz plik Poedit, a nast�pnie wybierz opcj� Nowy katalog z pliku POT z menu Plik. Pro-gram wy�wietli okno wyboru pliku. Przejd do podkatalogu app/locale Twojej aplikacji, za-znacz plik default.pot i kliknij przycisk Otwórz. Zostanie wy�wietlone okno ustawie� przed-stawione na poni�szym rysunku.
CakePHP 1.3. Programowanie aplikacji. Receptury
264
W oknie Ustawienia wprowad nazw� projektu i informacje z nim zwi�zane. W polu Formyliczby mnogiej powiniene� wprowadzi� wyra�enie, przy u�yciu którego Poedit b�dzie w stanierozpozna� t�umaczenia dla liczb mnogich. W wielu j�zykach (np. angielskim, hiszpa�skim,niemieckim i portugalskim) wystarczy wprowadzi� poni�sze wyra�enie:
nplurals=2; plural=(n != 1);
Wi�cej informacji na temat liczb mnogich i warto�ci, które powinno si� wobec nich stosowa� (w zale�-no�ci od t�umaczonego j�zyka) znajdziesz na stronie http://drupal.org/node/17564.
Po wprowadzeniu wszystkich istotnych informacji kliknij przycisk OK. W tym momencie pro-gram zapyta, gdzie chcesz zapisa� przet�umaczony plik. Utwórz katalog o nazwie pol i umie�� gow katalogu app/locale/. Wewn�trz katalogu pol utwórz podkatalog LC_MESSAGES. Nast�pnieprzy u�yciu okna dialogowego programu Poedit wybierz folder app/locale/pol/LC_MESSAGES,po czym kliknij przycisk Zapisz, nie zmieniaj�c przy tym nazwy pliku — powinna mie� war-to�� default.po.
Program Poedit zaprezentuje wszystkie oryginalne �a�cuchy znaków. Do ka�dego z nichmo�na doda� t�umaczenie. Wystarczy wybra� jeden z oryginalnych tekstów, a nast�pniewprowadzi� tre�� t�umaczenia w polu umieszczonym w dolnej cz��ci okna. Po wprowadzeniut�umacze� okno programu Poedit powinno wygl�da� tak, jak na kolejnej rysunku.
Wybierz opcj� Zapisz z menu Plik, aby zapisa� przet�umaczony plik. W katalogu app/locale/pol/LC_MESSAGES powinny by� dost�pne dwa pliki: default.po i default.mo.
Jak to dzia�aNa samym pocz�tku ekstraktor CakePHP musi otrzyma� �cie�ki do katalogów, które maj� by�przez niego przetworzone. Nast�pnie mechanizm rekursywnie przegl�da wszystkie katalogi,próbuj�c znale� wszystkie wywo�ania funkcji t�umaczenia (__(), __n(), __d(), __dn(), __dcn()i __c()) w plikach PHP i plikach widoków. Dla ka�dego znalezionego wywo�ania ekstraktorwy�uska z niego tekst do przet�umaczenia (pierwszy argument wywo�a� funkcji __n() i __c();drugi argument wywo�a� funkcji __d() i __dc(); pierwszy i drugi argument wywo�a� funkcji__n(); drugi i trzeci argument wywo�a� funkcji __dn() i __dcn()).
W argumentach, które s� wy�uskiwane przez ekstraktor, nale�y stosowa� jedynie statyczne �a�cuchyznaków PHP. Nie mo�na w �adnym przypadku u�ywa� wyra�e� PHP. Je�li w t�umaczonych tekstachchcesz stosowa� zmienne lub inne wyra�enia dynamiczne, zapoznaj si� z przyk�adem „T�umaczenie tek-stów zawieraj�cych dynamicznie generowan� tre��”.
Rozdzia� 9. • Internacjonalizacja aplikacji
265
Po pobraniu wszystkich tekstów do t�umaczenia przez ekstraktor zostan� utworzone odpo-wiednie szablony plików t�umacze�. Je�li w swojej aplikacji korzystasz z funkcji t�umacze�,które maj� zwi�zek z domenami (__d(), __dn(), __dc() i __dcn()), mo�esz uwzgl�dni� wszystkie�a�cuchy w jednym pliku szablonu albo umie�ci� ka�d� domen� w odr�bnym pliku szablonu.Pliki szablonów maj� rozszerzenie pot; ich nazwy s� za� nazwami domen (np. default.pot jestdomy�lnym (default) plikiem szablonu).
Je�li otworzysz plik default.pot w zwyk�ym edytorze tekstowym, zauwa�ysz, �e rozpoczyna si�on od nag�ówka zawieraj�cego wiele ró�nych ustawie�, po którym nast�puje w�a�ciwa cz���t�umaczenia. Ka�dy �a�cuch do t�umaczenia jest reprezentowany za pomoc� dwóch linijek —pierwsza z nich zawiera element oznaczony ci�giem msgid (�a�cuch do t�umaczenia), w drugiejza� znajduje si� ci�g msgstr — to w�a�nie tam nale�y wstawia� przet�umaczone �a�cuchy znaków.
Program Poedit umo�liwia wygodn� edycj� plików w formacie pot, a tak�e zapisuje pliki doodpowiedniego katalogu (app/locale/pol/LC_MESSAGES). W katalogu tym znajduj� si� dwapliki — default.po i default.pot. Je�li otworzysz plik .po za pomoc� zwyk�ego edytora, powiniene�natychmiast dostrzec podobie�stwo tego pliku do pliku szablonu. Wyj�tek stanowi� ustawie-
CakePHP 1.3. Programowanie aplikacji. Receptury
266
nia nag�ówka — zawieraj� one warto�ci okre�lone przez nas w programie Poedit — i przedewszystkim tre�� t�umacze� wprowadzonych przez nas w aplikacji Poedit. Plik default.mo stanowibinarn� wersj� pliku default.po, tak�e wygenerowanego przez Poedit. Plik default.mo jestwykorzystywany przez CakePHP w celu szybszego przetwarzania pliku t�umacze�.
T�umaczenie rekordów baz danychza pomoc� zachowania TranslateW tym przyk�adzie nauczymy si� t�umaczy� rekordy z bazy danych za pomoc� zachowaniaTranslate.
Zanim zacznieszAby wykona� ten przyk�ad, musimy skorzysta� z podstawowego szkieletu aplikacji. W tymcelu musisz wykona� przyk�ad „Internacjonalizacja tekstów w kontrolerach i widokach”.
Jak to zrobi�Uruchom wiersz polece�, a nast�pnie przejd do podkatalogu app/ aplikacji i wykonaj poni�szepolecenie.
� je�li pracujesz w systemach GNU Linux/Mac/Unix:
../cake/console/cake i18n initdb
� je�li jeste� u�ytkownikiem systemu Microsoft Windows:
..\cake\console\cake.bat i18n initdb
Zaakceptuj domy�lne opcje. Po wybraniu wszystkich opcji pow�oka utworzy tabel� i18n, coprzedstawiono na kolejnym rysunku.
Zmodyfikuj tre�� pliku app/models/article.php zgodnie z poni�szym listingiem:
<?phpclass Article extends AppModel { public $validate = array( 'title' => 'notEmpty', 'body' => 'notEmpty' ); public $actsAs = array( 'Translate' => array('title', 'body') );}?>
Rozdzia� 9. • Internacjonalizacja aplikacji
267
Teraz musimy przenie�� warto�ci pól title i body z tabeli articles do tabeli i18n, a nast�pnie— usun�� oryginalne kolumny z tabeli articles. Wykonaj poni�sze zapytania SQL:
INSERT INTO 'i18n'('locale', 'model', 'foreign_key', 'field', 'content')SELECT 'eng', 'Article', 'articles'.'id', 'title', 'articles'.'title'FROM 'articles';
INSERT INTO 'i18n'('locale', 'model', 'foreign_key', 'field', 'content')SELECT 'eng', 'Article', 'articles'.'id', 'body', 'articles'.'body'FROM 'articles';
ALTER TABLE 'articles' DROP COLUMN 'title', DROP COLUMN 'body';
Dodaj polskie t�umaczenia naszych artyku�ów, wykonuj�c poni�sze zapytania SQL:
INSERT INTO 'i18n'('locale', 'model', 'foreign_key', 'field', 'content') VALUES ('pol', 'Article', 1, 'title', 'Pierwszy artyku�'), ('pol', 'Article', 1, 'body', 'Tre�� pierwszego artyku�u'), ('pol', 'Article', 2, 'title', 'Drugi artyku�'), ('pol', 'Article', 2, 'body', 'Tre�� drugiego artyku�u'), ('pol', 'Article', 3, 'title', 'Trzeci artyku�'), ('pol', 'Article', 3, 'body', 'Tre�� trzeciego artyku�u');
Na zako�czenie wstaw poni�sz� instrukcj� na ko�cu pliku app/config/bootstrap.php, tu� przedznacznikiem zamykaj�cym PHP:
Configure::write('Config.language', 'eng');
CakePHP 1.3. Programowanie aplikacji. Receptury
268
Przejd na stron� http://localhost/articles. Powiniene� zobaczy� ten sam wykaz artyku�ów, któryprzedstawiono w pierwszym przyk�adzie w tym rozdziale.
Jak to dzia�aRozpoczynamy od utworzenia tabeli wymaganej przez zachowanie Translate, korzystaj�cz pow�oki i18n. Nosi ona tak� sam� nazw� i zawiera (poza kluczem g�ównym) pola opisanew poni�szej tabeli.
Pole Opis
locale J�zyk t�umaczenia danego rekordu.model Model, do którego nale�y t�umaczony rekord.foreign_key ID (klucz g�ówny) w modelu, który identyfikuje t�umaczony rekord.field Nazwa pola, które podlega t�umaczeniu.content Przet�umaczona warto�� dla danego pola.
Nast�pnie mo�emy doda� zachowanie Translate do modelu Article i ustawi� je tak, aby by�yt�umaczone pola title i body. Taki zapis sprawi, �e pola te nie b�d� wchodzi�y w sk�ad tabeliarticles — od tego momentu b�d� one przechowywane w tabeli i18n. Korzystaj�c z warto�cimodel i foreign_key w tabeli i18n, zachowanie Translate pobierze odpowiednie warto�ci dladanych pól przy ka�dym pobraniu rekordu modelu Article (dla aktywnego j�zyka).
Kopiujemy warto�ci pól title i body do tabeli i18n, dzi�ki czemu mo�emy usun�� pola z ta-beli articles. Wywo�anie funkcji call() wykorzystywane w klasie ArticlesController niewymaga �adnych zmian. Co wi�cej, proces tworzenia artyku�ów b�dzie przebiega� bez �ad-nych modyfikacji, poniewa� zachowanie Translate skorzysta z aktywnego j�zyka podczas za-pisywania rekordów modelu Article.
Na zako�czenie musimy wybra� j�zyk domy�lny. W tym celu korzystamy z ustawieniaConfig.language. Pomini�cie tego kroku spowoduje ustawienie j�zyka na podstawie warto�cinag�ówka HTTP_ACCEPT_LANGUAGE wysy�anego przez przegl�darki.
Wykorzystywanie odr�bnych tabel t�umaczeniaWszystkie modele, które korzystaj� z zachowania Translate, b�d� zapisywa� t�umaczeniaswoich pól domy�lnie do tabeli i18n. Takie zachowanie mo�e by� nieco problematyczne, je�lidysponujemy du�� liczb� rekordów lub du�� liczb� t�umaczonych modeli. Na szcz��cie za-chowanie Translate pozwala na skonfigurowanie innego modelu t�umaczenia.
W ramach przyk�adu zapiszemy wszystkie t�umaczenia zwi�zane z artyku�ami do tabeliarticle_translations. Utwórz tabel�, a nast�pnie skopiuj rekordy z tabeli i18n, korzystaj�cz poni�szych zapyta� SQL:
Rozdzia� 9. • Internacjonalizacja aplikacji
269
CREATE TABLE 'article_translations'( 'id' INT UNSIGNED AUTO_INCREMENT NOT NULL, 'model' VARCHAR(255) NOT NULL, 'foreign_key' INT UNSIGNED NOT NULL, 'locale' VARCHAR(6) NOT NULL, 'field' VARCHAR(255) NOT NULL, 'content' TEXT default NULL, KEY 'model__foreign_key'('model', 'foreign_key'), KEY 'model__foreign_key__locale'('model', 'foreign_key', 'locale'), PRIMARY KEY('id'));INSERT INTO 'article_translations'SELECT 'id', 'model', 'foreign_key', 'locale', 'field', 'content'FROM 'i18n';
Utwórz plik app/models/article_translation.php i wstaw do niego poni�szy kod:
<?phpclass ArticleTranslation extends AppModel { public $displayField = 'field';}?>
W�a�ciwo�� displayField w modelu t�umacze� poinformuje zachowanie Translate o tym,które pole tabeli przechowuje nazw� t�umaczonego pola.
Na zako�czenie wprowad zaznaczone pogrubion� czcionk� zmiany w pliku app/models/article.php:
<?phpclass Article extends AppModel { public $validate = array( 'title' => 'notEmpty', 'body' => 'notEmpty' ); public $actsAs = array( 'Translate' => array('title', 'body') ); public $translateModel = 'ArticleTranslation';}?>
Zobacz równie�� „Ustawianie i zapami�tywanie j�zyka”.
CakePHP 1.3. Programowanie aplikacji. Receptury
270
Ustawianie i zapami�tywanie j�zykaW tym przyk�adzie dowiesz si�, jak udost�pni� u�ytkownikom mo�liwo�� zmiany j�zyka apli-kacji, a tak�e jak zapami�ta� ich wybór za pomoc� ciasteczek (ang. cookies).
Zanim zacznieszAby wykona� ten przyk�ad, niezb�dna b�dzie w pe�ni umi�dzynarodowiona aplikacja. W tym celumusisz wykona� ca�y przyk�ad „T�umaczenie rekordów baz danych za pomoc� zachowaniaTranslate”.
Musimy tak�e skorzysta� z uk�adu aplikacji, który mo�emy modyfikowa�. Skopiuj plik default.ctpz katalogu cake/libs/view/layouts do katalogu app/views/layouts.
Jak to zrobi� 1. Dodaj poni�sze instrukcje na ko�cu pliku app/config/bootstrap.php, tu� przedznacznikiem zamykaj�cym PHP:
Configure::write('Config.languages', array( 'eng' => __('English', true), 'pol' => __('Polski', true)));
2. Zmie� uk�ad pliku app/views/layouts/default.ctp, dodaj�c w wybranym przez siebiemiejscu list� j�zyków (np. przed wywo�aniem metody flash() w komponencieSession):
<div style="float: right"><?php$links = array();$currentLanguage = Configure::read('Config.language');foreach(Configure::read('Config.languages') as $code => $language){ if ($code == $currentLanguage) { $links[] = $language; } else { $links[] = $this->Html->link($language, array('lang' => $code)); }}echo implode(' - ', $links);?></div>
Rozdzia� 9. • Internacjonalizacja aplikacji
271
Wykorzystywane w kodzie ustawienie Config.language zosta�o ustawione w pliku app/config/bootstrap.php w ramach przyk�adu „T�umaczenie rekordów baz danych za pomoc� zachowania Translate”.
3. Utwórz plik app/app_controller.php o nast�puj�cej tre�ci:
<?phpclass AppController extends Controller { public $components = array('Language', 'Session');}?>
4. Utwórz plik app/controller/components/language.php o nast�puj�cej tre�ci:
<?phpclass LanguageComponent extends Object { public $controller = null; public $components = array('Cookie'); public $languages = array(); public function initialize($controller) { $this->controller = $controller; if (empty($languages)) { $this->languages = Configure::read('Config.languages'); } $this->set(); } public function set($language = null) { $saveCookie = false; if (empty($language) && isset($this->controller)) { if (!empty($this->controller->params['named']['lang'])) { $language = $this->controller->params['named']['lang']; } elseif (!empty($this->controller->params['url']['lang'])) { $language = $this->controller->params['url']['lang']; } if (!empty($language)) { $saveCookie = true; } } if (empty($language)) { $language = $this->Cookie->read('language'); if (empty($language)) { $saveCookie = true; } } if (empty($language) && !array_key_exists($language, $this-> �languages)) { $language = Configure::read('Config.language'); } Configure::write('Config.language', $language); if ($saveCookie) {
CakePHP 1.3. Programowanie aplikacji. Receptury
272
$this->Cookie->write('language', $language, false, '1 year'); } }}?>
Przejd na stron� http://localhost/articles. Powiniene� zobaczy� list� artyku�ów, a w prawymgórnym rogu powinno si� pojawi� ��cze, które pozwoli na zmian� aktywnego j�zyka na polski.Klikni�cie ��cza spowoduje wy�wietlenie polskich wersji artyku�ów. Efekt zosta� przedsta-wiony na poni�szym rysunku.
Jak to dzia�aZaczynamy od zadeklarowania listy wszystkich dost�pnych j�zyków, dzi�ki czemu mo�emybez problemu umie�ci� ��cze do zmiany aktywnego j�zyka. Lista s�u�y nam do stworzenia li-sty hiper��czy, która nast�pnie jest umieszczana w pliku uk�adu default.ctp. Jednocze�niefaktyczne ��cza (a nie teksty) s� generowane dla wszystkich j�zyków poza aktywnym.
Aktywny j�zyk ustawiamy w zmiennej konfiguracyjnej CakePHP o nazwie Config.language.Otrzymuje ona pewn� warto�� — w naszym przypadku eng — w pliku konfiguracyjnymbootstrap.php. Je�li konieczna jest zmiana j�zyka, warto�� tego ustawienia powinna uleczmianie przed pierwszym u�yciem funkcji t�umaczenia.
Aby zachowa� porz�dek w kontrolerze, postanowili�my utworzy� komponent Language, któryobs�uguje zmian� j�zyka. Komponent ten przeszuka parametry nazwane, a tak�e te przekaza-ne w adresie URL, pod k�tem parametru lang. Je�li j�zyk nie zosta� okre�lony w ten sposób,komponent spróbuje znale� j�zyk, korzystaj�c z ciasteczka.
Je�li nie zosta�o ustawione �adne ciasteczko, a tak�e w sytuacji, gdy nast�pi�o ��danie zmianyj�zyka, komponent zapisze aktywny j�zyk w ciasteczku language, które b�dzie przechowywa-ne przez okres jednego roku.
Skorowidz
__(), 254__n(), 254, 255_authorize(), 151_checkArgs(), 228_findMethods, w�a�ciwo��, 92_help(), 238_helpCommand(), 238_importCSV(), 229_isJSON(), 207_parseCSV(), 228_randomPassword(), 223_restLogin(), 212_stop(), 223, 318_usageCommand(), 238
AAccess Control Layer, Patrz
warstwa kontroli dost�puACL, Patrz warstwa kontroli
dost�puacl_extras, plugin, 45add(), 228afterFind(), 77, 83, 114AJAX, 96, 98allow(), 23allowedActions, parametr, 23analyze(), 318AppController, klasa, 24, 26AppException, klasa, 322, 323ArticlesController, klasa, 196,
254, 261ArticlesController::index(), 191assertEqual(), 283assertFalse(), 283assertIsA(), 283assertNull(), 283
assertPattern(), 283assertTags(), 284, 289assertTrue(), 283Auth, komponent, 23, 24, 26,
30, 33, 212haszowanie hase�, 224schemat autoryzacji, 27u�ywanie i konfiguracja, 24
authorize, parametr, 23automatyzacja zada�, 243autoryzacja
przy u�yciu tokenu, 213schemat, 27wykorzystanie warstwy
kontroli dost�pu, 38
BbackAutoCommit, w�a�ciwo��,
159beforeFilter(), 23, 26beforeFind(), 77, 83, 114beforeRender, wywo�anie
zwrotne, 133beforeSave, wywo�anie zwrotne,
117, 122beforeValidate(), 318bindModel(), 50, 63, 65, 71blackHole(), 213, 217
CCache, klasa, 114CakePHP, 13, 14, 15, 16
ekstraktor, 261konwencja nazewnicza, 68
pow�oki, 219regu�y walidacji, 104t�umaczenia, 254trasy domy�lne, 162wyj�tki, 319wyszukiwanie, 73, 74
CakeTestCase, klasa, 282, 283CakeTestFixture, klasa, 281catch-all, trasy, 175
dodawanie walidacji, 179ciasteczka, 270ClassRegistry::init(), 282cleanInsert(), 306commands, w�a�ciwo��, 237, 238comma-separated values, Patrz
CSVConfig.language, 271, 272Configure, klasa, 292Configure::listObjects(), 182ConnectionManager::getDataSo
urce(), 133contain(), 58contain, parametr, 58
format, 57Containable, zachowanie, 50,
51, 53, 55, 56, 57, 59, 63, 65cookies, Patrz ciasteczkaCOUNT, 74, 83Crookes, Neil, 142CSV, 136
dynamiczne �adowanieplików, 137
parsowanie plików, 134
Skorowidz
326
Ddane testowe, 273, 278, 281datasources, wtyczka, 134,
136, 139diff(), 305Dispatcher, klasa, 294download(), 317, 318
Ee-mail
wysy�anie, 308wysy�anie z poziomu
pow�oki, 239Email, komponent, 239, 308,
311, 312, 313w�a�ciwo�ci, 242
endCase(), 283endTest(), 283error(), 223execute(), 236, 238expectAtLeastOnce(), 293expectException(), 283expectNever(), 293expectOnce(), 293EXPLAIN, 133extract(), 237, 301
Ffclose(), 228fgetcsv(), 228fiksturki, 278, 281, 283, 284filter(), 305fixture, zadanie, 284fixtures, Patrz dane testowefopen(), 228foreignKey, ustawienie, 68
GGeocodable, 15, 100, 122Geocode, wtyczka, 122, 124, 126geokodowanie adresów, 122GET, parametr, 162, 166get_class_vars(), 238getInfo(), 323getLog(), 134
getMagicDb(), 318Google Maps, 122, 124, 126GROUP, 74
Hhas�a
hasz, 20haszowanie, 223, 224szyfrowanie, 24
help(), 228, 236HelpTask, klasa, 236, 238HttpSocket, klasa, 107, 194HttpSocket::get(), 197HttpSocketOauth, klasa, 142
II18n, klasa, 255import(), 228, 237in(), 222, 223index(), 311initialize(), 238INNER JOIN, 66InnoDb, 152inputs, metoda, 23insert(), 306, 307internacjonalizacja, 249
komunikatów walidacjiw modelach, 256
tekstów w kontrolerachi widokach, 250
isAuthorized, metoda, 23isInterfaceSupported(), 133
JJavaScript Object Notation,
Patrz JSONj�zyk
ustawianie, 270zapami�tywanie, 270
JOIN, z��czenia, 66jQuery, 96JSON, 194
konsumowanie us�ugi, 194json_decode(), 151, 198json_encode(), 207JSON-C, 194
KKairys, Donatas, 139konwencja nazewnicza, 68
LLanguage, komponent, 272layout, w�a�ciwo��, 312LEFT JOIN, 66LIKE, 87, 88listSources(), 138lock(), 159lockTimeoutErrorCode,
w�a�ciwo��, 159logException(), 323login(), 22, 23, 30logout(), 22, 23logowanie, 28
pobieranie informacjio zalogowanymu�ytkowniku, 33
zapisanie informacjio u�ytkowniku, 31
��a�cuchy znaków, 305��cza trwa�e, 118
MMagicDb, 314, 317, 318main(), 222, 236mapowanie obiektowo-
relacyjne, Patrz ORMmerge(), 305mocks, Patrz za�lepkiModel, klasa, 50Model-View-Controller,
Patrz MVCmodel-widok-kontroler,
Patrz MVCMVC, 196MyISAM, 152MySQL
blokady w ródle danych, 152transakcje, 152
Skorowidz
327
Nnamed parameters, Patrz
parametry nazwanenamed, parametr, 162, 166numeric(), 305
OOAuth, 142, 149, 151OpenAuth, komponent, 46, 47OpenID, 45
biblioteka, 45integracja, 45, 46plugin, 46, 47
options(), 98optymalizacja dla wyszukiwarek
internetowych, 161ORM, 298
Ppaginate(), 95Paginator, 98pami�� podr�czna, 192parametry nazwane, 164, 166parsowanie
parametrów wierszapolece�, 224
plików CSV, 134partial mocks, Patrz za�lepki
cz��ciowepermanent links,
Patrz ��cza trwa�ePHP OAuth, biblioteka, 142Poedit, 262, 263, 264, 265, 266pola wirtualne, 80, 82, 83PostsController, klasa, 193powi�zania, 49
anulowanie zmian, 58pow�oki, 219
tworzenie, 220tworzenie zada�
wielokrotnego u�ytku, 229uruchamianie, 220, 221, 222wysy�anie wiadomo�ci
e-mail, 239prefiksy, 36, 168, 172printf(), 261, 262
ProfileRoute, klasa, 184ProfilesController, klasa, 172, 217przypadki testowe, 273, 282pushDiff(), 305
QQueryLog, komponent, 133
Rread(), 151readfile(), 318redirect(), 291, 292renderException(), 323Representational State Transfer,
Patrz RESTRequestHandler, komponent,
191, 207requireLogin(), 212reset(), 242resetBindings(), 58REST, 199, 207
dodawanie uwierzytelniania,208
reverse(), 305RIGHT JOIN, 66Robot, wtyczka, 243, 246RobotTask, model, 246Router::connect(), 174Router::connectNamed(), 167Router::parseExtensions(), 190Routing.prefixes, 172RSS, 138, 188
a pami�� podr�czna, 192tworzenie kana�u, 188
RssHelper, klasa, 192RssHelper::item(), 192
Sschedule(), 246schema(), 82Search Engine Optimization,
Patrz SEOSecurity, komponent, 212,
213, 217Security.salt, parametr, 24
Security::hash(), 223, 224send(), 242, 312, 313SEO, 118, 161Session, komponent, 261Set, klasa, 298, 301, 305Set::combine(), 303Set::extract(), 301, 302, 303Set::format(), 304Set::map(), 304Set::matches(), 137setAutoCommit(), 160setConfig(), 138, 141, 151setFlash(), 261setup(), 113Shell, klasa, 222SimpleTest, biblioteka, 276, 278slug, 118, 122Sluggable, 15, 100, 118, 122sort(), 305sprintf(), 261, 304startCase(), 283startTest(), 283startup(), 236Story, Mark, 45, 294String, klasa, 305, 306stronicowanie, 93, 95
AJAX, 96Syrup, wtyczka, 120szperacze sieciowe, 192
TTagsController::view(), 162tekst, manipulacja, 305template, w�a�ciwo��, 313test cases, Patrz przypadki
testowetest jednostkowy, 282test_suite, 282testAction(), 288, 289testowanie, 273
akcji kontrolera i ichwidoków, 286
konfiguracja frameworka, 274tworzenie danych testowych,
278za�lepki, 290
testRedirect, w�a�ciwo��, 292testsuite, pow�oka, 294
Skorowidz
328
testyjednostkowe, 273uruchamianie w konsoli, 294
timeline(), 113, 114t�umaczenie, 254, 262
rekordów baz danych, 266tekstów zawieraj�cych
dynamicznie generowan�tre��, 259
token(), 151tokenize(), 306, 307tokeny, 213, 217transakcje, 152translate(), 255Translate, zachowanie, 266, 268trasowanie, 161, 168, 172
odwrotne, 175tworzenie w�asnych klas, 182
Twitter, rejestracja aplikacji,143, 144
TwitterAccountBehavior,klasa, 113
UunbindModel(), 50, 56, 57uniwersalnie unikalny
identyfikator, Patrz UUIDunlock(), 159, 160UploadsController, klasa, 322User::useToken(), 218UsersController, klasa, 217UserShell, klasa, 222, 237, 238useToken(), 217us�ugi sieciowe, 187UUID, 217, 307uuid(), 307
uwierzytelnianie, 19konfiguracja prostego
systemu, 20u�ytkownik
pobieranie informacji, 33zapisanie informacji po
zalogowaniu, 31zmiana domy�lnego
modelu, 27
Vvalidate, w�a�ciwo��, 102, 259validateTwitter(), 106, 107Validation, klasa, 104Video::search(), 198
Wwalidacja, 99
dodawanie wielu regu�, 100,102
tworzenie w�asnych regu�,104, 107
warstwa kontroli dost�pu, 38web crawlers, Patrz szperacze
siecioweweb services, Patrz us�ugi
sieciowewelcome(), 246wi�zania modeli, 49
modyfikowanieparametrów, 59
modyfikowanie warunków, 63tworzenie wielu powi�za�, 66
wiersz polece�, parsowanieparametrów, 224
wirtualne pola, 80, 82, 83write(), 151wyj�tki, 319wyszukiwanie, 73, 74, 87
stronicowanie, 93, 95w�asne typy, 89, 92, 93
wywo�ania zwrotne, 109
XXdebug, 285XmlHelper, klasa, 192X-Path 2.0, 301, 302
Zzachowania, 99
dodawanie nowych pól, 116zadania, automatyzacja, 243za�lepki, 290, 292, 293
cz��ciowe, 293z��czenia, 65, 66z��czenia dorane, 84
ród�a danych, 127
konsumowanie kana�ów RSS,138
parsowanie plików CSV, 134tworzenie, 142
Top Related