CakePHP 1.3. Programowanie aplikacji. RecepturyCakePHP 1.3. Programowanie aplikacji. Receptury 250...

35

Transcript of CakePHP 1.3. Programowanie aplikacji. RecepturyCakePHP 1.3. Programowanie aplikacji. Receptury 250...

Page 1: CakePHP 1.3. Programowanie aplikacji. RecepturyCakePHP 1.3. Programowanie aplikacji. Receptury 250 Internacjonalizacja tekstów w kontrolerach i widokach W tym przykadzie dowiesz si,
Page 2: CakePHP 1.3. Programowanie aplikacji. RecepturyCakePHP 1.3. Programowanie aplikacji. Receptury 250 Internacjonalizacja tekstów w kontrolerach i widokach W tym przykadzie dowiesz si,

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ść

Page 3: CakePHP 1.3. Programowanie aplikacji. RecepturyCakePHP 1.3. Programowanie aplikacji. Receptury 250 Internacjonalizacja tekstów w kontrolerach i widokach W tym przykadzie dowiesz si,

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

Page 4: CakePHP 1.3. Programowanie aplikacji. RecepturyCakePHP 1.3. Programowanie aplikacji. Receptury 250 Internacjonalizacja tekstów w kontrolerach i widokach W tym przykadzie dowiesz si,

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

Page 5: CakePHP 1.3. Programowanie aplikacji. RecepturyCakePHP 1.3. Programowanie aplikacji. Receptury 250 Internacjonalizacja tekstów w kontrolerach i widokach W tym przykadzie dowiesz si,

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

Page 6: CakePHP 1.3. Programowanie aplikacji. RecepturyCakePHP 1.3. Programowanie aplikacji. Receptury 250 Internacjonalizacja tekstów w kontrolerach i widokach W tym przykadzie dowiesz si,

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.

Page 7: CakePHP 1.3. Programowanie aplikacji. RecepturyCakePHP 1.3. Programowanie aplikacji. Receptury 250 Internacjonalizacja tekstów w kontrolerach i widokach W tym przykadzie dowiesz si,

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!'); } }

Page 8: CakePHP 1.3. Programowanie aplikacji. RecepturyCakePHP 1.3. Programowanie aplikacji. Receptury 250 Internacjonalizacja tekstów w kontrolerach i widokach W tym przykadzie dowiesz si,

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(); ?>&nbsp;-&nbsp;<?php echo $this->Paginator->prev(); ?>&nbsp;<?php echo $this->Paginator->numbers(); ?>&nbsp;<?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>

Page 9: CakePHP 1.3. Programowanie aplikacji. RecepturyCakePHP 1.3. Programowanie aplikacji. Receptury 250 Internacjonalizacja tekstów w kontrolerach i widokach W tym przykadzie dowiesz si,

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));?>

Page 10: CakePHP 1.3. Programowanie aplikacji. RecepturyCakePHP 1.3. Programowanie aplikacji. Receptury 250 Internacjonalizacja tekstów w kontrolerach i widokach W tym przykadzie dowiesz si,

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)); ?>&nbsp;-&nbsp;<?php echo $this->Paginator->prev(__('<< Previous', true)); ?>&nbsp;<?php echo $this->Paginator->numbers(); ?>&nbsp;<?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.

Page 11: CakePHP 1.3. Programowanie aplikacji. RecepturyCakePHP 1.3. Programowanie aplikacji. Receptury 250 Internacjonalizacja tekstów w kontrolerach i widokach W tym przykadzie dowiesz si,

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.

Page 12: CakePHP 1.3. Programowanie aplikacji. RecepturyCakePHP 1.3. Programowanie aplikacji. Receptury 250 Internacjonalizacja tekstów w kontrolerach i widokach W tym przykadzie dowiesz si,

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.

Page 13: CakePHP 1.3. Programowanie aplikacji. RecepturyCakePHP 1.3. Programowanie aplikacji. Receptury 250 Internacjonalizacja tekstów w kontrolerach i widokach W tym przykadzie dowiesz si,

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) {

Page 14: CakePHP 1.3. Programowanie aplikacji. RecepturyCakePHP 1.3. Programowanie aplikacji. Receptury 250 Internacjonalizacja tekstów w kontrolerach i widokach W tym przykadzie dowiesz si,

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.

Page 15: CakePHP 1.3. Programowanie aplikacji. RecepturyCakePHP 1.3. Programowanie aplikacji. Receptury 250 Internacjonalizacja tekstów w kontrolerach i widokach W tym przykadzie dowiesz si,

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

Page 16: CakePHP 1.3. Programowanie aplikacji. RecepturyCakePHP 1.3. Programowanie aplikacji. Receptury 250 Internacjonalizacja tekstów w kontrolerach i widokach W tym przykadzie dowiesz si,

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():

Page 17: CakePHP 1.3. Programowanie aplikacji. RecepturyCakePHP 1.3. Programowanie aplikacji. Receptury 250 Internacjonalizacja tekstów w kontrolerach i widokach W tym przykadzie dowiesz si,

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)); ?>&nbsp;-&nbsp;<?php echo $this->Paginator->prev(__('<< Previous', true)); ?>&nbsp;<?php echo $this->Paginator->numbers(); ?>&nbsp;<?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>

Page 18: CakePHP 1.3. Programowanie aplikacji. RecepturyCakePHP 1.3. Programowanie aplikacji. Receptury 250 Internacjonalizacja tekstów w kontrolerach i widokach W tym przykadzie dowiesz si,

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:

Page 19: CakePHP 1.3. Programowanie aplikacji. RecepturyCakePHP 1.3. Programowanie aplikacji. Receptury 250 Internacjonalizacja tekstów w kontrolerach i widokach W tym przykadzie dowiesz si,

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.

Page 20: CakePHP 1.3. Programowanie aplikacji. RecepturyCakePHP 1.3. Programowanie aplikacji. Receptury 250 Internacjonalizacja tekstów w kontrolerach i widokach W tym przykadzie dowiesz si,

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.

Page 21: CakePHP 1.3. Programowanie aplikacji. RecepturyCakePHP 1.3. Programowanie aplikacji. Receptury 250 Internacjonalizacja tekstów w kontrolerach i widokach W tym przykadzie dowiesz si,

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��”.

Page 22: CakePHP 1.3. Programowanie aplikacji. RecepturyCakePHP 1.3. Programowanie aplikacji. Receptury 250 Internacjonalizacja tekstów w kontrolerach i widokach W tym przykadzie dowiesz si,

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-

Page 23: CakePHP 1.3. Programowanie aplikacji. RecepturyCakePHP 1.3. Programowanie aplikacji. Receptury 250 Internacjonalizacja tekstów w kontrolerach i widokach W tym przykadzie dowiesz si,

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') );}?>

Page 24: CakePHP 1.3. Programowanie aplikacji. RecepturyCakePHP 1.3. Programowanie aplikacji. Receptury 250 Internacjonalizacja tekstów w kontrolerach i widokach W tym przykadzie dowiesz si,

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');

Page 25: CakePHP 1.3. Programowanie aplikacji. RecepturyCakePHP 1.3. Programowanie aplikacji. Receptury 250 Internacjonalizacja tekstów w kontrolerach i widokach W tym przykadzie dowiesz si,

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:

Page 26: CakePHP 1.3. Programowanie aplikacji. RecepturyCakePHP 1.3. Programowanie aplikacji. Receptury 250 Internacjonalizacja tekstów w kontrolerach i widokach W tym przykadzie dowiesz si,

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”.

Page 27: CakePHP 1.3. Programowanie aplikacji. RecepturyCakePHP 1.3. Programowanie aplikacji. Receptury 250 Internacjonalizacja tekstów w kontrolerach i widokach W tym przykadzie dowiesz si,

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>

Page 28: CakePHP 1.3. Programowanie aplikacji. RecepturyCakePHP 1.3. Programowanie aplikacji. Receptury 250 Internacjonalizacja tekstów w kontrolerach i widokach W tym przykadzie dowiesz si,

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) {

Page 29: CakePHP 1.3. Programowanie aplikacji. RecepturyCakePHP 1.3. Programowanie aplikacji. Receptury 250 Internacjonalizacja tekstów w kontrolerach i widokach W tym przykadzie dowiesz si,

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.

Page 30: CakePHP 1.3. Programowanie aplikacji. RecepturyCakePHP 1.3. Programowanie aplikacji. Receptury 250 Internacjonalizacja tekstów w kontrolerach i widokach W tym przykadzie dowiesz si,

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

Page 31: CakePHP 1.3. Programowanie aplikacji. RecepturyCakePHP 1.3. Programowanie aplikacji. Receptury 250 Internacjonalizacja tekstów w kontrolerach i widokach W tym przykadzie dowiesz si,

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

Page 32: CakePHP 1.3. Programowanie aplikacji. RecepturyCakePHP 1.3. Programowanie aplikacji. Receptury 250 Internacjonalizacja tekstów w kontrolerach i widokach W tym przykadzie dowiesz si,

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

Page 33: CakePHP 1.3. Programowanie aplikacji. RecepturyCakePHP 1.3. Programowanie aplikacji. Receptury 250 Internacjonalizacja tekstów w kontrolerach i widokach W tym przykadzie dowiesz si,

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

Page 34: CakePHP 1.3. Programowanie aplikacji. RecepturyCakePHP 1.3. Programowanie aplikacji. Receptury 250 Internacjonalizacja tekstów w kontrolerach i widokach W tym przykadzie dowiesz si,
Page 35: CakePHP 1.3. Programowanie aplikacji. RecepturyCakePHP 1.3. Programowanie aplikacji. Receptury 250 Internacjonalizacja tekstów w kontrolerach i widokach W tym przykadzie dowiesz si,