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 2012
All rights reserved
All rights reserved. No part of this book may be reproduced or transmitted in any form or by any means,
electronic or mechanical, including photocopying, recording or by any information storage retrieval system,
without permission from the Publisher.
Wszelkie prawa zastrzeżone. Nieautoryzowane rozpowszechnianie całości lub fragmentu niniejszej
publikacji w jakiejkolwiek postaci jest zabronione. Wykonywanie kopii metodą kserograficzną,
fotograficzną, a także kopiowanie książki na nośniku filmowym, magnetycznym lub innym powoduje
naruszenie praw autorskich niniejszej publikacji.
Wszystkie znaki występujące w tekście są zastrzeżonymi znakami firmowymi bądź towarowymi ich
właścicieli.
Autor oraz Wydawnictwo HELION dołożyli wszelkich starań, by zawarte w tej książce informacje były
kompletne i rzetelne. Nie 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 HELION
ul. Kościuszki 1c, 44-100 GLIWICE
tel. 32 231 22 19, 32 230 98 63
e-mail: helion@helion.pl
WWW: http://helion.pl (księgarnia internetowa, katalog książek)
Drogi Czytelniku!
Jeżeli chcesz ocenić tę książkę, zajrzyj pod adres
http://helion.pl/user/opinie/caph3r
Możesz tam wpisać swoje uwagi, spostrzeżenia, recenzję.
Printed in Poland.
Spis treci
O autorze
9
O recenzentach
11
Przedmowa
13
O czym jest ta ksika?
13
Oprogramowanie wykorzystywane w ksice
16
Dla kogo jest ta ksika?
17
Konwencje typograficzne
17
Materiay dodatkowe i pomoc
17
Rozdzia 1. Uwierzytelnianie
19
Wprowadzenie
19
Konfiguracja prostego systemu uwierzytelniania
20
Uywanie i konfiguracja komponentu Auth
24
Logowanie za pomoc nazwy uytkownika lub adresu e-mail
28
Zapisywanie informacji o uytkowniku po zalogowaniu
31
Pobieranie informacji o zalogowanym uytkowniku
33
Uywanie prefiksów do kontroli dostpu bazujcej na rolach
36
Autoryzacja wykorzystujca warstw kontroli dostpu (ACL)
38
Integracja z OpenID
45
Rozdzia 2. Wizania modeli
49
Wprowadzenie
49
Dodanie zachowania Containable do wszystkich modeli
50
Ograniczanie wiza zwracanych przez wyszukiwania
51
Modyfikowanie parametrów wiza dla wyszukiwa
59
Modyfikowanie warunków wiza dla wyszukiwa
63
Zmiana typu zczenia dla powiza jeden-do-jednego
65
Tworzenie wielu powiza z tym samym modelem
66
Dodawanie wiza w locie
69
Kup książkę
Poleć książkę
Spis
treci
6
Rozdzia 3. Wszystko o pobieraniu danych
73
Wprowadzenie
73
Wykonywanie zapyta GROUP i COUNT
74
Wykorzystywanie pól wirtualnych
80
Tworzenie zapyta z wykorzystaniem zcze doranych
84
Wyszukiwanie elementów speniajcych okrelone kryteria
87
Implementacja wasnego typu wyszukiwania
89
Stronicowanie wyszukiwa wasnych typów
93
Implementacja stronicowania na bazie technologii AJAX
96
Rozdzia 4. Walidacja i zachowania
99
Wprowadzenie
99
Dodawanie wielu regu walidacji
100
Tworzenie wasnych regu walidacji
104
Wykorzystywanie wywoa zwrotnych w zachowaniach
109
Wykorzystywanie zachowa do dodawania nowych pól
116
Wykorzystywanie zachowania Sluggable
118
Geokodowanie adresów przy uyciu zachowania Geocodable
122
Rozdzia 5. róda danych
127
Wprowadzenie
127
Udoskonalanie dziennika zapyta róda danych SQL
127
Parsowanie plików CSV za pomoc róde danych
134
Konsumowanie kanaów RSS za pomoc róde danych
138
Tworzenie róda danych przy uyciu serwisu Twitter
142
Dodawanie obsugi transakcji i blokad w ródle danych MySQL
152
Rozdzia 6. Magia trasowania
161
Wprowadzenie
161
Wykorzystywanie parametrów named i GET
162
Wykorzystywanie tras z prefiksami
168
Praca z elementami tras
172
Dodawanie tras typu catch-all dla stron profilowych
175
Dodawanie walidacji dla klas typu catch-all
179
Tworzenie wasnych klas trasowania
182
Rozdzia 7. Tworzenie i wykorzystywanie usug sieciowych
187
Wprowadzenie
187
Tworzenie kanau RSS
188
Konsumowanie usugi JSON
194
Tworzenie usug REST przy uyciu formatu JSON
199
Dodawanie uwierzytelniania do usug REST
208
Implementacja autoryzacji dostpu do API przy uyciu tokenu
213
Kup książkę
Poleć książkę
Spis treci
7
Rozdzia 8. Praca z powokami
219
Wprowadzenie
219
Tworzenie i uruchamianie powoki
220
Parsowanie parametrów wiersza polece
224
Tworzenie zada powoki wielokrotnego uytku
229
Wysyanie wiadomoci e-mail z poziomu powoki
239
Tworzenie automatycznych zada za pomoc wtyczki Robot
243
Rozdzia 9. Internacjonalizacja aplikacji
249
Wprowadzenie
249
Internacjonalizacja tekstów w kontrolerach i widokach
250
Internacjonalizacja komunikatów walidacji w modelach
256
Tumaczenie tekstów zawierajcych dynamicznie generowan tre
259
Ekstrakcja i tumaczenie tekstów
262
Tumaczenie rekordów baz danych za pomoc zachowania Translate
266
Ustawianie i zapamitywanie jzyka
270
Rozdzia 10. Testowanie
273
Wprowadzenie
273
Konfiguracja frameworka do testów
274
Tworzenie testowych danych i metod modeli
278
Testowanie akcji kontrolera i ich widoków
286
Wykorzystywanie zalepek do testowania kontrolerów
290
Uruchamianie testów w konsoli
294
Rozdzia 11. Narzdzia i klasy pomocnicze
297
Wprowadzenie
297
Wykorzystywanie klasy Set
298
Operacje na tekcie przy uyciu klasy String
305
Wysyanie wiadomoci e-mail
308
Wykrywanie typów plików za pomoc MagicDb
314
Rzucanie i obsuga wyjtków
319
Skorowidz
325
Kup książkę
Poleć książkę
9
Internacjonalizacja
aplikacji
W tym rozdziale omówimy nastpujce zagadnienia:
Q
internacjonalizacj tekstów w kontrolerach i widokach;
Q
internacjonalizacj komunikatów walidacji w modelach;
Q
tumaczenie tekstów zawierajcych dynamicznie generowan tre;
Q
ekstrakcj i tumaczenie tekstów;
Q
tumaczenie rekordów baz danych za pomoc zachowania
Translate
;
Q
ustawianie i zapamitywanie jzyka.
Wprowadzenie
W tym rozdziale zajmiemy si przykadami, które pozwol na internacjonalizacj — umi-
dzynarodowienie — wszystkich elementów aplikacji CakePHP, zarówno statycznych (zawartych
np. w widokach), jak i dynamicznych (np. rekordy baz danych).
W pierwszych dwóch przykadach pokaemy, jak udostpni elementy widoków, a take ko-
munikaty walidacji modelu do tumacze. W trzecim przykadzie bdziemy tumaczy bardziej
zoone wyraenia. Czwarty przykad to pokaz moliwoci wbudowanych narzdzi CakePHP,
które potrafi wyuska statyczn tre aplikacji wymagajc tumaczenia. Pity przykad
przedstawia mechanizm tumaczenia rekordów baz danych. Na zakoczenie dowiesz si, jak
umoliwi uytkownikowi zmian aktywnego jzyka aplikacji.
Kup książkę
Poleć książkę
CakePHP 1.3. Programowanie aplikacji. Receptury
250
Internacjonalizacja tekstów
w kontrolerach i widokach
W tym przykadzie dowiesz si, jak zinternacjonalizowa tekst, który znajduje si w widokach
naszej aplikacji, a take jak przygotowa takie teksty do tumaczenia.
Zanim zaczniesz
Aby wykona poniszy przykad, musisz skorzysta z przykadowych danych. Utwórz tabel
articles
, korzystajc z poniszego 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, korzystajc z poniszych 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 nastpujcej
treci:
<?php
class 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!');
}
}
Kup książkę
Poleć książkę
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 kolejnoci utwórz plik app/models/article.php o nastpujcej treci:
<?php
class 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 nastpujcej
treci:
<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>
Kup książkę
Poleć książkę
CakePHP 1.3. Programowanie aplikacji. Receptury
252
Do katalogu app/views/articles dodaj plik add.ctp o nastpujcej treci:
<?php
echo $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 zakoczenie dodaj plik app/views/articles/view.ctp o nastpujcej treci:
<h1><?php echo $article['Article']['title']; ?></h1>
<?php echo $article['Article']['body']; ?>
Jak to zrobi
1.
Zmodyfikuj tre pliku app/controllers/articles_controller.php, uwzgldniajc
zmiany 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:
<?php
echo $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));
?>
Kup książkę
Poleć książkę
Rozdzia 9. • Internacjonalizacja aplikacji
253
3.
Otwórz plik app/views/articles/index.ctp i wprowad nastpujce 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);
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ów
podobn do przedstawionej na poniszym rysunku.
Kup książkę
Poleć książkę
CakePHP 1.3. Programowanie aplikacji. Receptury
254
Jak to dziaa
Dwie najwaniejsze metody udostpniane przez CakePHP do tumaczenia to
__()
i
__n()
.
Nazwy metod mog wyda si nieco dziwne; ich pochodzenie wywodzi si od implementacji
narzdzia gettext w jzyku Perl — narzdzie to stanowi element Projektu Tumaczenia GNU
(GNU Translation Project).
Metoda
__()
jest uywana do tumaczenia tekstów statycznych i przyjmuje dwa parametry
opisane w poniszej tabeli.
Parametr
Opis
singular
Tekst, który ma by przetumaczony.
return
Jeli ten parametr ma warto
true
, przetumaczony tekst zostanie zwrócony, a nie
przesany do klienta. Domylnie
false
.
Metoda
__n()
równie pozwala na tumaczenie tekstów statycznych, jednak uwzgldnia ona
take sytuacje, w których konkretna warto moe zalee od liczby — pojedynczej lub mno-
giej. W zwizku z tym przyjmuje ona cztery parametry wymienione w poniszej tabeli.
Parametr
Opis
singular
Tekst, który zostanie przetumaczony na aktywny jzyk, jeli parametr count otrzyma
warto
singular
.
plural
Tekst, który zostanie przetumaczony na aktywny jzyk, jeli parametr count otrzyma
warto
plural
.
count
Zmienna lub warto liczbowa, która zostanie wykorzystana do okrelenia liczby dla danego
tekstu (
singular
lub
plural
).
return
Jeli ten parametr ma warto true, przetumaczony tekst zostanie zwrócony, a nie przesany
do klienta. Domylnie
false
.
Rozpoczynamy od zmiany komunikatów generowanych przez klas
ArticlesController
, wy-
korzystujc funkcj
__()
. Zastrzegamy, e teksty maj by zwracane, a nie przesyane do klienta.
Nastpnie modyfikujemy plik add.ctp, dziki czemu wszystkie etykiety formularza (wraz z jego
legend) zostan przetumaczone.
W podobny sposób opakowujemy tytu w widoku index.ctp za pomoc funkcji tumaczenia.
Nastpnie korzystamy z pierwszego parametru metod
counter()
,
next()
i
prev()
(stanowi-
cych skadowe klasy
PaginatorHelper
), aby przekaza przetumaczone wersje wszystkich tek-
stowych elementów mechanizmu stronicowania. Na zakoczenie korzystamy z funkcji
__n()
,
by wybra odpowiedni przetumaczony tekst przy uyciu wartoci zmiennej
count
.
Kup książkę
Poleć książkę
Rozdzia 9. • Internacjonalizacja aplikacji
255
Jeli korzystasz z funkcji __n(), musisz pamita, e trzecim argumentem w wywoaniach tej funkcji
powinna by zawsze zmienna, a nie wyraenie (np. zawierajce indeksy tablic). Wyraenia mog do-
prowadzi do zwrócenia nieoczekiwanych wyników podczas wywoywania powoki ekstraktora (por.
przykad „Ekstrakcja i tumaczenie tekstów”).
Domeny i kategorie
Funkcje tumacze wykorzystywane w tym przykadzie opakowuj funkcj
translate()
nale-
c do klasy
I18n
frameworka CakePHP. Metoda ta pozwala nie tylko na przeprowadzanie
prostych tumacze; dziki niej programista moe okreli domen, z której s pozyskiwane
tumaczone teksty, a take kategori, do której naley tekst do tumaczenia.
Domeny pozwalaj na wydzielanie grup tumaczonych tekstów do osobnych plików. Domyl-
nie, gdy domena nie jest okrelona jawnie, CakePHP korzysta z domeny
default
(domylnej).
Jeli chcesz okreli domen, w której CakePHP powinien szuka tumaczonego tekstu, sko-
rzystaj z funkcji
__d()
lub
__dn()
. Wyszukanie tumaczonego tekstu w domenie
moja_wtyczka
wygldaoby nastpujco:
$translated = __d('moja_wtyczka', 'Hello World', true);
Kategorie umoliwiaj jeszcze wiksz kontrol nad zarzdzaniem tumaczonymi tekstami.
Pozwalaj one na grupowanie plików tumacze w odrbnych katalogach; mona take po-
wiza tumaczony tekst z dodatkowymi metadanymi. Domylnie CakePHP zakada, e tu-
maczone teksty nale do kategorii
LC_MESSAGES
. Jeli chcesz zmieni kategori, skorzystaj z funk-
cji tumaczenia
__dc()
i
__dcn()
, ustawiajc przedostatni argument —
return
— na wybran
kategori. Moe ona przyjmowa jedn z okrelonych poniej wartoci:
Q
LC_ALL
:
0
;
Q
LC_COLLATE
:
1
;
Q
LC_CTYPE
:
2
;
Q
LC_MONETARY
:
3
;
Q
LC_NUMERIC
:
4
;
Q
LC_TIME
:
5
;
Q
LC_MESSAGES
:
6
.
Próba znalezienia nalecego do kategorii
LC_MESSAGES
tekstu Hello World w domenie
default
wyglda nastpujco:
$translated = __dc('default', 'Hello World', 6, true);
Korzystajc z kategorii, zawsze podawaj wartoci liczbowe, a nie nazwy staych. Te ostatnie s bowiem
zalene od wykorzystywanej platformy.
Kup książkę
Poleć książkę
CakePHP 1.3. Programowanie aplikacji. Receptury
256
Zobacz równie
Q
„Internacjonalizacja komunikatów walidacji w modelach”;
Q
„Ekstrakcja i tumaczenie tekstów”.
Internacjonalizacja komunikatów
walidacji w modelach
W tym przykadzie wykorzystamy róne sposoby na zrealizowanie tego samego zadania: tu-
maczenia komunikatów walidacji w modelach.
Zanim zaczniesz
Aby wykona ten przykad, musimy skorzysta z podstawowego szkieletu aplikacji. W tym
celu musisz wykona poprzedni przykad.
Jak to zrobi
Zmie tre pliku app/models/article.php, wprowadzajc zmiany zaznaczone pogrubion
czcionk we waciwoci
validate
:
public $validate = array(
'title' => array(
'required' => 'notEmpty'
),
'body' => array(
'required' => 'notEmpty'
)
);
Istniej dwa sposoby tumaczenia komunikatów walidacji. Pierwszy z nich wymaga przeso-
nicia konstruktora modelu. Wystarczy doda jego ponisz implementacj do klasy
Article
w 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) {
Kup książkę
Poleć książkę
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 tumaczenia komunikatów walidacji jest przeniesienie komunikatów do widoku.
W ten sposób zamiast przesania konstruktor i deklarowa w nim komunikaty, wystarczy
wprowadzi zmiany w pliku app/views/articles/add.ctp:
<?php
echo $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 wylij formularz bez wprowadzania jakichkolwiek wartoci. Powiniene
uzyska efekt jak na poniszym rysunku.
Kup książkę
Poleć książkę
CakePHP 1.3. Programowanie aplikacji. Receptury
258
Jak to dziaa
Przed utworzeniem komunikatów o bdach dla kadej z regu walidacji musimy owe reguy
nazwa. W tym celu modyfikujemy model
Article
, dziki czemu kada z regu jest indekso-
wana przy uyciu nazwy. W naszym przypadku wybieramy nazw
required
dla reguy Cake-
PHP o nazwie
notEmpty
.
Pierwsze rozwizanie problemu tumaczenia komunikatów walidacji mona okreli mianem
scentralizowanego — wszystkie komunikaty s umieszczone w tym samym miejscu, w kon-
struktorze modelu. Przesaniamy konstruktor, dziki czemu moemy w jego wntrzu zadekla-
rowa komunikaty o bdach, które powinny by przetumaczone. Musielimy skorzysta
z konstruktora, poniewa waciwoci klas mog zawiera tylko statyczne przypisania. Poniszy
blok kodu spowoduje bd skadni PHP:
public $validate = array(
'title' => array(
'required' => array(
'rule' => 'notEmpty',
'message' => __('Nothing defined!', true)
// BD SKADNI
Kup książkę
Poleć książkę
Rozdzia 9. • Internacjonalizacja aplikacji
259
)
)
);
W implementacji konstruktora rozpoczynamy od sprawdzenia, czy waciwo
validate
sta-
nowi tablic regu (indeksowanych przy uyciu nazw pól). Musimy take sprawdzi, czy ka-
da regua sama w sobie równie stanowi tablic (indeksowan za pomoc nazw), której warto-
ciami s ponownie tablice, zawierajce przynajmniej ustawienie
rule
.
Po zweryfikowaniu formatu waciwoci
validate
moemy poczy komunikaty walidacji dla
kadej z regu, korzystajc z funkcji
__()
w celu przetumaczenia komunikatów. Na zako-
czenie wywoujemy konstruktor klasy bazowej, aby poprawnie zakoczy proces tworzenia
caego modelu.
Drugie podejcie do problemu tumaczenia przedstawione w tym przykadzie przesuwa odpo-
wiedzialno za obsug tumacze na widok, korzystajc z ustawienia
error
dostpnego w meto-
dzie
input()
klasy
FormHelper
. To ustawienie otrzymuje tablic indeksowan za pomoc nazw
regu walidacji, której wartociami s komunikaty o bdach wykorzystywane w razie niespe-
nienia poszczególnych regu walidacji.
Zobacz równie
Q
„Ekstrakcja i tumaczenie tekstów”.
Tumaczenie tekstów zawierajcych
dynamicznie generowan tre
W tym przykadzie dowiesz si, jak tumaczy teksty, które zawieraj elementy dynamiczne
— np. wartoci zmiennych.
Zanim zaczniesz
Aby wykona ten przykad, musimy skorzysta z podstawowego szkieletu aplikacji. W tym
celu musisz wykona przykad „Internacjonalizacja tekstów w kontrolerach i widokach”.
Jak to zrobi
1.
Otwórz plik app/controllers/articles_controller.php i wprowad zaznaczone
pogrubion czcionk zmiany w metodzie
add()
:
Kup książkę
Poleć książkę
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 bdy!');
}
}
}
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>
Kup książkę
Poleć książkę
Rozdzia 9. • Internacjonalizacja aplikacji
261
Jak to zrobi
Gdy podczas tworzenia aplikacji napotyka si problem tumaczenia treci zawierajcych ele-
menty dynamiczne — np. warto zmiennej lub warto pola z bazy danych — moe si po-
jawi pokusa doczenia zmiennej do acucha statycznego, a nastpnie przekazania takiego
wyraenia do funkcji tumaczenia:
$translated = __('Hello ' . $name, true);
// LE
To wyraenie nie jest poprawne, poniewa ekstraktor CakePHP (omówiony w przykadzie
„Ekstrakcja i tumaczenie tekstów”) dziaa poprawnie tylko dla tekstów statycznych. W innych j-
zykach moe na przykad wystpi konieczno zmiany kolejnoci sów w zdaniu. W zwizku
z tym musimy skorzysta z innej techniki przetwarzania acuchów. Rozwizanie jest proste
i stosunkowo popularne — funkcje PHP
printf()
i
sprintf()
.
Obie funkcje przyjmuj te same argumenty. Pierwszy z nich jest obowizkowy i okrela a-
cuch znaków do sformatowania. Wszystkie kolejne argumenty przekazane do funkcji zostan
wykorzystane do wygenerowania wynikowego acucha znaków. Jedyna rónica pomidzy
funkcjami
printf()
a
sprintf()
polega na tym, e pierwsza z nich wywietli efekt swojej pra-
cy, druga za — zwróci go.
Przejdmy teraz do kodu naszej aplikacji. Rozpoczynamy od zmiany komunikatu zwracanego
przez klas
ArticlesController
po utworzeniu artykuu. Korzystamy z funkcji
sprintf()
, ponie-
wa efekt jej dziaania chcemy przekaza do metody
setFlash()
komponentu
Session
. W na-
szej sytuacji wyraenie
%s
pozwala na wstawienie do acucha znaków tytuu nowo utworzo-
nego artykuu.
W podobny sposób podstawiamy warto zmiennej
count
pod cig
%d
. Tym razem korzystamy
z funkcji
printf()
, aby wywietli od razu efekt dziaania funkcji.
Zmiana kolejnoci argumentów
Gdy korzystamy z wyrae
%s
lub
%d
w funkcjach
printf()
i
sprintf()
, nie mamy kontroli nad
sposobem pozycjonowania wartoci; nie moemy te uy dwa razy jednej wartoci, poniewa
kade z wyrae jest dopasowywane do konkretnego, pojedynczego argumentu. Zaómy, e
dysponujemy nastpujcym wyraeniem:
printf('Your name is %s and your country is %s', $name, $country);
Pierwsze wyraenie
%s
zostanie zastpione wartoci zmiennej
name
, drugie — wartoci
zmiennej
country
. Problem pojawiby si w sytuacji, w której chcielibymy zmieni kolejno
argumentów w acuchu znaków, zachowujc jednoczenie kolejno argumentów w obrbie
wywoania funkcji
printf()
.
Na szczcie do argumentów funkcji
printf()
moemy si odwoywa, korzystajc z ich nu-
merów porzdkowych (okrelajcych ich pozycj wród wszystkich argumentów przekaza-
nych w danym wywoaniu). W poniszym przykadzie
name
jest argumentem
1
, a
country
—
argumentem
2
:
Kup książkę
Poleć książkę
CakePHP 1.3. Programowanie aplikacji. Receptury
262
printf('You are from %2$s and your name is %1$s', $name, $country);
Takie podejcie pozwala na ponowne uycie argumentu bez koniecznoci podawania go wie-
lokrotnie w wywoaniu funkcji
printf()
:
printf('You are from %2$s and your name is %1$s . Welcome %1$s!', $name,
´$country);
Zobacz równie
Q
„Ekstrakcja i tumaczenie tekstów”.
Ekstrakcja i tumaczenie tekstów
W tym przykadzie nauczymy si pozyskiwa wszystkie acuchy znaków, które podlegaj
tumaczeniu w naszych aplikacjach CakePHP, a nastpnie przeprowadzimy proces tumacze-
nia, korzystajc z darmowego oprogramowania.
Zanim zaczniesz
Aby wykona ten przykad, musimy skorzysta z podstawowego szkieletu aplikacji. W tym
celu musisz wykona przykad „Internacjonalizacja tekstów w kontrolerach i widokach”.
Musisz take zainstalowa aplikacj Poedit w swoim systemie. Przejd na stron http://www.
poedit.net/download.php, a nastpnie pobierz plik dla swojego systemu operacyjnego.
Jak to zrobi
Przejd do podkatalogu app/ Twojej aplikacji w wierszu polece, a nastpnie wykonaj ponisze
polecenie:
Q
jeli pracujesz w systemach GNU Linux/Mac/Unix:
../cake/console/cake i18n extract
Q
jeli jeste uytkownikiem systemu Microsoft Windows:
..\cake\console\cake.bat i18n extract
Powiniene skorzysta z ustawie domylnych, jak przedstawiono na kolejnym rysunku.
Po udzieleniu odpowiedzi na ostatnie pytanie powoka przeszuka wszystkie pliki Twojej apli-
kacji i na ich podstawie wygeneruje szablon tumaczenia. Zostanie on umieszczony w pliku
app/locale/default.pot.
Kup książkę
Poleć książkę
Rozdzia 9. • Internacjonalizacja aplikacji
263
Otwórz plik Poedit, a nastpnie wybierz opcj Nowy katalog z pliku POT z menu Plik. Pro-
gram wywietli okno wyboru pliku. Przejd do podkatalogu app/locale Twojej aplikacji, za-
znacz plik default.pot i kliknij przycisk Otwórz. Zostanie wywietlone okno ustawie przed-
stawione na poniszym rysunku.
Kup książkę
Poleć książkę
CakePHP 1.3. Programowanie aplikacji. Receptury
264
W oknie Ustawienia wprowad nazw projektu i informacje z nim zwizane. W polu Formy
liczby mnogiej powiniene wprowadzi wyraenie, przy uyciu którego Poedit bdzie w stanie
rozpozna tumaczenia dla liczb mnogich. W wielu jzykach (np. angielskim, hiszpaskim,
niemieckim i portugalskim) wystarczy wprowadzi ponisze wyraenie:
nplurals=2; plural=(n != 1);
Wicej informacji na temat liczb mnogich i wartoci, które powinno si wobec nich stosowa (w zale-
noci od tumaczonego jzyka) 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 przetumaczony plik. Utwórz katalog o nazwie pol i umie go
w katalogu app/locale/. Wewntrz katalogu pol utwórz podkatalog LC_MESSAGES. Nastpnie
przy uyciu okna dialogowego programu Poedit wybierz folder app/locale/pol/LC_MESSAGES,
po czym kliknij przycisk Zapisz, nie zmieniajc przy tym nazwy pliku — powinna mie war-
to default.po.
Program Poedit zaprezentuje wszystkie oryginalne acuchy znaków. Do kadego z nich
mona doda tumaczenie. Wystarczy wybra jeden z oryginalnych tekstów, a nastpnie
wprowadzi tre tumaczenia w polu umieszczonym w dolnej czci okna. Po wprowadzeniu
tumacze okno programu Poedit powinno wyglda tak, jak na kolejnej rysunku.
Wybierz opcj Zapisz z menu Plik, aby zapisa przetumaczony plik. W katalogu app/locale/
pol/LC_MESSAGES powinny by dostpne dwa pliki: default.po i default.mo.
Jak to dziaa
Na samym pocztku ekstraktor CakePHP musi otrzyma cieki do katalogów, które maj by
przez niego przetworzone. Nastpnie mechanizm rekursywnie przeglda wszystkie katalogi,
próbujc znale wszystkie wywoania funkcji tumaczenia (
__()
,
__n()
,
__d()
,
__dn()
,
__dcn()
i
__c()
) w plikach PHP i plikach widoków. Dla kadego znalezionego wywoania ekstraktor
wyuska z niego tekst do przetumaczenia (pierwszy argument wywoa funkcji
__n()
i
__c()
;
drugi argument wywoa funkcji
__d()
i
__dc()
; pierwszy i drugi argument wywoa funkcji
__n()
; drugi i trzeci argument wywoa funkcji
__dn()
i
__dcn()
).
W argumentach, które s wyuskiwane przez ekstraktor, naley stosowa jedynie statyczne acuchy
znaków PHP. Nie mona w adnym przypadku uywa wyrae PHP. Jeli w tumaczonych tekstach
chcesz stosowa zmienne lub inne wyraenia dynamiczne, zapoznaj si z przykadem „Tumaczenie tek-
stów zawierajcych dynamicznie generowan tre”.
Kup książkę
Poleć książkę
Rozdzia 9. • Internacjonalizacja aplikacji
265
Po pobraniu wszystkich tekstów do tumaczenia przez ekstraktor zostan utworzone odpo-
wiednie szablony plików tumacze. Jeli w swojej aplikacji korzystasz z funkcji tumacze,
które maj zwizek z domenami (
__d()
,
__dn()
,
__dc()
i
__dcn()
), moesz uwzgldni wszystkie
acuchy w jednym pliku szablonu albo umieci kad domen w odrbnym pliku szablonu.
Pliki szablonów maj rozszerzenie pot; ich nazwy s za nazwami domen (np. default.pot jest
domylnym (default) plikiem szablonu).
Jeli otworzysz plik default.pot w zwykym edytorze tekstowym, zauwaysz, e rozpoczyna si
on od nagówka zawierajcego wiele rónych ustawie, po którym nastpuje waciwa cz
tumaczenia. Kady acuch do tumaczenia jest reprezentowany za pomoc dwóch linijek —
pierwsza z nich zawiera element oznaczony cigiem
msgid
(acuch do tumaczenia), w drugiej
za znajduje si cig
msgstr
— to wanie tam naley wstawia przetumaczone acuchy znaków.
Program Poedit umoliwia wygodn edycj plików w formacie pot, a take zapisuje pliki do
odpowiedniego katalogu (app/locale/pol/LC_MESSAGES). W katalogu tym znajduj si dwa
pliki — default.po i default.pot. Jeli otworzysz plik .po za pomoc zwykego edytora, powiniene
natychmiast dostrzec podobiestwo tego pliku do pliku szablonu. Wyjtek stanowi ustawie-
Kup książkę
Poleć książkę
CakePHP 1.3. Programowanie aplikacji. Receptury
266
nia nagówka — zawieraj one wartoci okrelone przez nas w programie Poedit — i przede
wszystkim tre tumacze wprowadzonych przez nas w aplikacji Poedit. Plik default.mo stanowi
binarn wersj pliku default.po, take wygenerowanego przez Poedit. Plik default.mo jest
wykorzystywany przez CakePHP w celu szybszego przetwarzania pliku tumacze.
Tumaczenie rekordów baz danych
za pomoc zachowania Translate
W tym przykadzie nauczymy si tumaczy rekordy z bazy danych za pomoc zachowania
Translate
.
Zanim zaczniesz
Aby wykona ten przykad, musimy skorzysta z podstawowego szkieletu aplikacji. W tym
celu musisz wykona przykad „Internacjonalizacja tekstów w kontrolerach i widokach”.
Jak to zrobi
Uruchom wiersz polece, a nastpnie przejd do podkatalogu app/ aplikacji i wykonaj ponisze
polecenie.
Q
jeli pracujesz w systemach GNU Linux/Mac/Unix:
../cake/console/cake i18n initdb
Q
jeli jeste uytkownikiem systemu Microsoft Windows:
..\cake\console\cake.bat i18n initdb
Zaakceptuj domylne opcje. Po wybraniu wszystkich opcji powoka utworzy tabel
i18n
, co
przedstawiono na kolejnym rysunku.
Zmodyfikuj tre pliku app/models/article.php zgodnie z poniszym listingiem:
<?php
class Article extends AppModel {
public $validate = array(
'title' => 'notEmpty',
'body' => 'notEmpty'
);
public $actsAs = array(
'Translate' => array('title', 'body')
);
}
?>
Kup książkę
Poleć książkę
Rozdzia 9. • Internacjonalizacja aplikacji
267
Teraz musimy przenie wartoci pól
title
i
body
z tabeli
articles
do tabeli
i18n
, a nastpnie
— usun oryginalne kolumny z tabeli
articles
. Wykonaj ponisze 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 tumaczenia naszych artykuów, wykonujc ponisze zapytania SQL:
INSERT INTO 'i18n'('locale', 'model', 'foreign_key', 'field', 'content') VALUES
('pol', 'Article', 1, 'title', 'Pierwszy artyku'),
('pol', 'Article', 1, 'body', 'Tre pierwszego artykuu'),
('pol', 'Article', 2, 'title', 'Drugi artyku'),
('pol', 'Article', 2, 'body', 'Tre drugiego artykuu'),
('pol', 'Article', 3, 'title', 'Trzeci artyku'),
('pol', 'Article', 3, 'body', 'Tre trzeciego artykuu');
Na zakoczenie wstaw ponisz instrukcj na kocu pliku app/config/bootstrap.php, tu przed
znacznikiem zamykajcym PHP:
Configure::write('Config.language', 'eng');
Kup książkę
Poleć książkę
CakePHP 1.3. Programowanie aplikacji. Receptury
268
Przejd na stron http://localhost/articles. Powiniene zobaczy ten sam wykaz artykuów, który
przedstawiono w pierwszym przykadzie w tym rozdziale.
Jak to dziaa
Rozpoczynamy od utworzenia tabeli wymaganej przez zachowanie
Translate
, korzystajc
z powoki
i18n
. Nosi ona tak sam nazw i zawiera (poza kluczem gównym) pola opisane
w poniszej tabeli.
Pole
Opis
locale
Jzyk tumaczenia danego rekordu.
model
Model, do którego naley tumaczony rekord.
foreign_key
ID (klucz gówny) w modelu, który identyfikuje tumaczony rekord.
field
Nazwa pola, które podlega tumaczeniu.
content
Przetumaczona warto dla danego pola.
Nastpnie moemy doda zachowanie
Translate
do modelu
Article
i ustawi je tak, aby byy
tumaczone pola
title
i
body
. Taki zapis sprawi, e pola te nie bd wchodziy w skad tabeli
articles
— od tego momentu bd one przechowywane w tabeli
i18n
. Korzystajc z wartoci
model
i
foreign_key
w tabeli
i18n
, zachowanie
Translate
pobierze odpowiednie wartoci dla
danych pól przy kadym pobraniu rekordu modelu
Article
(dla aktywnego jzyka).
Kopiujemy wartoci pól
title
i
body
do tabeli
i18n
, dziki czemu moemy usun pola z ta-
beli
articles
. Wywoanie funkcji
call()
wykorzystywane w klasie
ArticlesController
nie
wymaga adnych zmian. Co wicej, proces tworzenia artykuów bdzie przebiega bez ad-
nych modyfikacji, poniewa zachowanie
Translate
skorzysta z aktywnego jzyka podczas za-
pisywania rekordów modelu
Article
.
Na zakoczenie musimy wybra jzyk domylny. W tym celu korzystamy z ustawienia
Config.language
. Pominicie tego kroku spowoduje ustawienie jzyka na podstawie wartoci
nagówka
HTTP_ACCEPT_LANGUAGE
wysyanego przez przegldarki.
Wykorzystywanie odrbnych tabel tumaczenia
Wszystkie modele, które korzystaj z zachowania
Translate
, bd zapisywa tumaczenia
swoich pól domylnie do tabeli
i18n
. Takie zachowanie moe by nieco problematyczne, jeli
dysponujemy du liczb rekordów lub du liczb tumaczonych modeli. Na szczcie za-
chowanie
Translate
pozwala na skonfigurowanie innego modelu tumaczenia.
W ramach przykadu zapiszemy wszystkie tumaczenia zwizane z artykuami do tabeli
article_translations
. Utwórz tabel, a nastpnie skopiuj rekordy z tabeli
i18n
, korzystajc
z poniszych zapyta SQL:
Kup książkę
Poleć książkę
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 poniszy kod:
<?php
class ArticleTranslation extends AppModel {
public $displayField = 'field';
}
?>
Waciwo
displayField
w modelu tumacze poinformuje zachowanie
Translate
o tym,
które pole tabeli przechowuje nazw tumaczonego pola.
Na zakoczenie wprowad zaznaczone pogrubion czcionk zmiany w pliku app/models/
article.php:
<?php
class Article extends AppModel {
public $validate = array(
'title' => 'notEmpty',
'body' => 'notEmpty'
);
public $actsAs = array(
'Translate' => array('title', 'body')
);
public $translateModel = 'ArticleTranslation';
}
?>
Zobacz równie
Q
„Ustawianie i zapamitywanie jzyka”.
Kup książkę
Poleć książkę
CakePHP 1.3. Programowanie aplikacji. Receptury
270
Ustawianie i zapamitywanie jzyka
W tym przykadzie dowiesz si, jak udostpni uytkownikom moliwo zmiany jzyka apli-
kacji, a take jak zapamita ich wybór za pomoc ciasteczek (ang. cookies).
Zanim zaczniesz
Aby wykona ten przykad, niezbdna bdzie w peni umidzynarodowiona aplikacja. W tym celu
musisz wykona cay przykad „Tumaczenie rekordów baz danych za pomoc zachowania
Translate”.
Musimy take skorzysta z ukadu aplikacji, który moemy modyfikowa. Skopiuj plik default.ctp
z katalogu cake/libs/view/layouts do katalogu app/views/layouts.
Jak to zrobi
1.
Dodaj ponisze instrukcje na kocu pliku app/config/bootstrap.php, tu przed
znacznikiem zamykajcym PHP:
Configure::write('Config.languages', array(
'eng' => __('English', true),
'pol' => __('Polski', true)
));
2.
Zmie ukad pliku app/views/layouts/default.ctp, dodajc w wybranym przez siebie
miejscu list jzyków (np. przed wywoaniem metody
flash()
w komponencie
Session
):
<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>
Kup książkę
Poleć książkę
Rozdzia 9. • Internacjonalizacja aplikacji
271
Wykorzystywane w kodzie ustawienie Config.language zostao ustawione w pliku
app/config/
bootstrap.php
w ramach przykadu „Tumaczenie rekordów baz danych za pomoc zachowania Translate”.
3.
Utwórz plik app/app_controller.php o nastpujcej treci:
<?php
class AppController extends Controller {
public $components = array('Language', 'Session');
}
?>
4.
Utwórz plik app/controller/components/language.php o nastpujcej treci:
<?php
class 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) {
Kup książkę
Poleć książkę
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 prawym
górnym rogu powinno si pojawi cze, które pozwoli na zmian aktywnego jzyka na polski.
Kliknicie cza spowoduje wywietlenie polskich wersji artykuów. Efekt zosta przedsta-
wiony na poniszym rysunku.
Jak to dziaa
Zaczynamy od zadeklarowania listy wszystkich dostpnych jzyków, dziki czemu moemy
bez problemu umieci cze do zmiany aktywnego jzyka. Lista suy nam do stworzenia li-
sty hiperczy, która nastpnie jest umieszczana w pliku ukadu default.ctp. Jednoczenie
faktyczne cza (a nie teksty) s generowane dla wszystkich jzyków poza aktywnym.
Aktywny jzyk ustawiamy w zmiennej konfiguracyjnej CakePHP o nazwie
Config.language
.
Otrzymuje ona pewn warto — w naszym przypadku eng — w pliku konfiguracyjnym
bootstrap.php. Jeli konieczna jest zmiana jzyka, warto tego ustawienia powinna ulec
zmianie przed pierwszym uyciem funkcji tumaczenia.
Aby zachowa porzdek w kontrolerze, postanowilimy utworzy komponent
Language
, który
obsuguje zmian jzyka. Komponent ten przeszuka parametry nazwane, a take te przekaza-
ne w adresie URL, pod ktem parametru
lang
. Jeli jzyk nie zosta okrelony w ten sposób,
komponent spróbuje znale jzyk, korzystajc z ciasteczka.
Jeli nie zostao ustawione adne ciasteczko, a take w sytuacji, gdy nastpio danie zmiany
jzyka, komponent zapisze aktywny jzyk w ciasteczku
language
, które bdzie przechowywa-
ne przez okres jednego roku.
Kup książkę
Poleć książkę
Skorowidz
__(), 254
__n(), 254, 255
_authorize(), 151
_checkArgs(), 228
_findMethods, waciwo, 92
_help(), 238
_helpCommand(), 238
_importCSV(), 229
_isJSON(), 207
_parseCSV(), 228
_randomPassword(), 223
_restLogin(), 212
_stop(), 223, 318
_usageCommand(), 238
A
Access Control Layer, Patrz
warstwa kontroli dostpu
ACL, Patrz warstwa kontroli
dostpu
acl_extras, plugin, 45
add(), 228
afterFind(), 77, 83, 114
AJAX, 96, 98
allow(), 23
allowedActions, parametr, 23
analyze(), 318
AppController, klasa, 24, 26
AppException, klasa, 322, 323
ArticlesController, klasa, 196,
254, 261
ArticlesController::index(), 191
assertEqual(), 283
assertFalse(), 283
assertIsA(), 283
assertNull(), 283
assertPattern(), 283
assertTags(), 284, 289
assertTrue(), 283
Auth, komponent, 23, 24, 26,
30, 33, 212
haszowanie hase, 224
schemat autoryzacji, 27
uywanie i konfiguracja, 24
authorize, parametr, 23
automatyzacja zada, 243
autoryzacja
przy uyciu tokenu, 213
schemat, 27
wykorzystanie warstwy
kontroli dostpu, 38
B
backAutoCommit, waciwo,
159
beforeFilter(), 23, 26
beforeFind(), 77, 83, 114
beforeRender, wywoanie
zwrotne, 133
beforeSave, wywoanie zwrotne,
117, 122
beforeValidate(), 318
bindModel(), 50, 63, 65, 71
blackHole(), 213, 217
C
Cache, klasa, 114
CakePHP, 13, 14, 15, 16
ekstraktor, 261
konwencja nazewnicza, 68
powoki, 219
reguy walidacji, 104
tumaczenia, 254
trasy domylne, 162
wyjtki, 319
wyszukiwanie, 73, 74
CakeTestCase, klasa, 282, 283
CakeTestFixture, klasa, 281
catch-all, trasy, 175
dodawanie walidacji, 179
ciasteczka, 270
ClassRegistry::init(), 282
cleanInsert(), 306
commands, waciwo, 237, 238
comma-separated values, Patrz
CSV
Config.language, 271, 272
Configure, klasa, 292
Configure::listObjects(), 182
ConnectionManager::getDataSo
urce(), 133
contain(), 58
contain, parametr, 58
format, 57
Containable, zachowanie, 50,
51, 53, 55, 56, 57, 59, 63, 65
cookies, Patrz ciasteczka
COUNT, 74, 83
Crookes, Neil, 142
CSV, 136
dynamiczne adowanie
plików, 137
parsowanie plików, 134
Kup książkę
Poleć książkę
Skorowidz
326
D
dane testowe, 273, 278, 281
datasources, wtyczka, 134,
136, 139
diff(), 305
Dispatcher, klasa, 294
download(), 317, 318
E
wysyanie, 308
wysyanie z poziomu
powoki, 239
Email, komponent, 239, 308,
311, 312, 313
waciwoci, 242
endCase(), 283
endTest(), 283
error(), 223
execute(), 236, 238
expectAtLeastOnce(), 293
expectException(), 283
expectNever(), 293
expectOnce(), 293
EXPLAIN, 133
extract(), 237, 301
F
fclose(), 228
fgetcsv(), 228
fiksturki, 278, 281, 283, 284
filter(), 305
fixture, zadanie, 284
fixtures, Patrz dane testowe
fopen(), 228
foreignKey, ustawienie, 68
G
Geocodable, 15, 100, 122
Geocode, wtyczka, 122, 124, 126
geokodowanie adresów, 122
GET, parametr, 162, 166
get_class_vars(), 238
getInfo(), 323
getLog(), 134
getMagicDb(), 318
Google Maps, 122, 124, 126
GROUP, 74
H
hasa
hasz, 20
haszowanie, 223, 224
szyfrowanie, 24
help(), 228, 236
HelpTask, klasa, 236, 238
HttpSocket, klasa, 107, 194
HttpSocket::get(), 197
HttpSocketOauth, klasa, 142
I
I18n, klasa, 255
import(), 228, 237
in(), 222, 223
index(), 311
initialize(), 238
INNER JOIN, 66
InnoDb, 152
inputs, metoda, 23
insert(), 306, 307
internacjonalizacja, 249
komunikatów walidacji
w modelach, 256
tekstów w kontrolerach
i widokach, 250
isAuthorized, metoda, 23
isInterfaceSupported(), 133
J
JavaScript Object Notation,
Patrz JSON
jzyk
ustawianie, 270
zapamitywanie, 270
JOIN, zczenia, 66
jQuery, 96
JSON, 194
konsumowanie usugi, 194
json_decode(), 151, 198
json_encode(), 207
JSON-C, 194
K
Kairys, Donatas, 139
konwencja nazewnicza, 68
L
Language, komponent, 272
layout, waciwo, 312
LEFT JOIN, 66
LIKE, 87, 88
listSources(), 138
lock(), 159
lockTimeoutErrorCode,
waciwo, 159
logException(), 323
login(), 22, 23, 30
logout(), 22, 23
logowanie, 28
pobieranie informacji
o zalogowanym
uytkowniku, 33
zapisanie informacji
o uytkowniku, 31
acuchy znaków, 305
cza trwae, 118
M
MagicDb, 314, 317, 318
main(), 222, 236
mapowanie obiektowo-
relacyjne, Patrz ORM
merge(), 305
mocks, Patrz zalepki
Model, klasa, 50
Model-View-Controller,
Patrz MVC
model-widok-kontroler,
Patrz MVC
MVC, 196
MyISAM, 152
MySQL
blokady w ródle danych, 152
transakcje, 152
Kup książkę
Poleć książkę
Skorowidz
327
N
named parameters, Patrz
parametry nazwane
named, parametr, 162, 166
numeric(), 305
O
OAuth, 142, 149, 151
OpenAuth, komponent, 46, 47
OpenID, 45
biblioteka, 45
integracja, 45, 46
plugin, 46, 47
options(), 98
optymalizacja dla wyszukiwarek
internetowych, 161
ORM, 298
P
paginate(), 95
Paginator, 98
pami podrczna, 192
parametry nazwane, 164, 166
parsowanie
parametrów wiersza
polece, 224
plików CSV, 134
partial mocks, Patrz zalepki
czciowe
permanent links,
Patrz cza trwae
PHP OAuth, biblioteka, 142
Poedit, 262, 263, 264, 265, 266
pola wirtualne, 80, 82, 83
PostsController, klasa, 193
powizania, 49
anulowanie zmian, 58
powoki, 219
tworzenie, 220
tworzenie zada
wielokrotnego uytku, 229
uruchamianie, 220, 221, 222
wysyanie wiadomoci
e-mail, 239
prefiksy, 36, 168, 172
printf(), 261, 262
ProfileRoute, klasa, 184
ProfilesController, klasa, 172, 217
przypadki testowe, 273, 282
pushDiff(), 305
Q
QueryLog, komponent, 133
R
read(), 151
readfile(), 318
redirect(), 291, 292
renderException(), 323
Representational State Transfer,
Patrz REST
RequestHandler, komponent,
191, 207
requireLogin(), 212
reset(), 242
resetBindings(), 58
REST, 199, 207
dodawanie uwierzytelniania,
208
reverse(), 305
RIGHT JOIN, 66
Robot, wtyczka, 243, 246
RobotTask, model, 246
Router::connect(), 174
Router::connectNamed(), 167
Router::parseExtensions(), 190
Routing.prefixes, 172
RSS, 138, 188
a pami podrczna, 192
tworzenie kanau, 188
RssHelper, klasa, 192
RssHelper::item(), 192
S
schedule(), 246
schema(), 82
Search Engine Optimization,
Patrz SEO
Security, komponent, 212,
213, 217
Security.salt, parametr, 24
Security::hash(), 223, 224
send(), 242, 312, 313
SEO, 118, 161
Session, komponent, 261
Set, klasa, 298, 301, 305
Set::combine(), 303
Set::extract(), 301, 302, 303
Set::format(), 304
Set::map(), 304
Set::matches(), 137
setAutoCommit(), 160
setConfig(), 138, 141, 151
setFlash(), 261
setup(), 113
Shell, klasa, 222
SimpleTest, biblioteka, 276, 278
slug, 118, 122
Sluggable, 15, 100, 118, 122
sort(), 305
sprintf(), 261, 304
startCase(), 283
startTest(), 283
startup(), 236
Story, Mark, 45, 294
String, klasa, 305, 306
stronicowanie, 93, 95
AJAX, 96
Syrup, wtyczka, 120
szperacze sieciowe, 192
T
TagsController::view(), 162
tekst, manipulacja, 305
template, waciwo, 313
test cases, Patrz przypadki
testowe
test jednostkowy, 282
test_suite, 282
testAction(), 288, 289
testowanie, 273
akcji kontrolera i ich
widoków, 286
konfiguracja frameworka, 274
tworzenie danych testowych,
278
zalepki, 290
testRedirect, waciwo, 292
testsuite, powoka, 294
Kup książkę
Poleć książkę
Skorowidz
328
testy
jednostkowe, 273
uruchamianie w konsoli, 294
timeline(), 113, 114
tumaczenie, 254, 262
rekordów baz danych, 266
tekstów zawierajcych
dynamicznie generowan
tre, 259
token(), 151
tokenize(), 306, 307
tokeny, 213, 217
transakcje, 152
translate(), 255
Translate, zachowanie, 266, 268
trasowanie, 161, 168, 172
odwrotne, 175
tworzenie wasnych klas, 182
Twitter, rejestracja aplikacji,
143, 144
TwitterAccountBehavior,
klasa, 113
U
unbindModel(), 50, 56, 57
uniwersalnie unikalny
identyfikator, Patrz UUID
unlock(), 159, 160
UploadsController, klasa, 322
User::useToken(), 218
UsersController, klasa, 217
UserShell, klasa, 222, 237, 238
useToken(), 217
usugi sieciowe, 187
UUID, 217, 307
uuid(), 307
uwierzytelnianie, 19
konfiguracja prostego
systemu, 20
uytkownik
pobieranie informacji, 33
zapisanie informacji po
zalogowaniu, 31
zmiana domylnego
modelu, 27
V
validate, waciwo, 102, 259
validateTwitter(), 106, 107
Validation, klasa, 104
Video::search(), 198
W
walidacja, 99
dodawanie wielu regu, 100,
102
tworzenie wasnych regu,
104, 107
warstwa kontroli dostpu, 38
web crawlers, Patrz szperacze
sieciowe
web services, Patrz usugi
sieciowe
welcome(), 246
wizania modeli, 49
modyfikowanie
parametrów, 59
modyfikowanie warunków, 63
tworzenie wielu powiza, 66
wiersz polece, parsowanie
parametrów, 224
wirtualne pola, 80, 82, 83
write(), 151
wyjtki, 319
wyszukiwanie, 73, 74, 87
stronicowanie, 93, 95
wasne typy, 89, 92, 93
wywoania zwrotne, 109
X
Xdebug, 285
XmlHelper, klasa, 192
X-Path 2.0, 301, 302
Z
zachowania, 99
dodawanie nowych pól, 116
zadania, automatyzacja, 243
zalepki, 290, 292, 293
czciowe, 293
zczenia, 65, 66
zczenia dorane, 84
róda danych, 127
konsumowanie kanaów RSS,
138
parsowanie plików CSV, 134
tworzenie, 142
Kup książkę
Poleć książkę