CakePHP 1 3 Programowanie aplikacji Receptury caph3r

background image
background image

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.

Kup książkę

Poleć książkę

Oceń książkę

Księgarnia internetowa

Lubię to! » Nasza społeczność

background image

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ę

background image

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ę

background image

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ę

background image

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ę

background image

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ę

background image

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

Kup książkę

Poleć książkę

background image

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ę

background image

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)); ?>
&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ów
podobn do przedstawionej na poniszym rysunku.

Kup książkę

Poleć książkę

background image

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ę

background image

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ę

background image

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ę

background image

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ę

background image

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ę

background image

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ę

background image

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

Kup książkę

Poleć książkę

background image

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ę

background image

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ę

background image

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ę

background image

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ę

background image

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ę

background image

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ę

background image

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ę

background image

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ę

background image

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ę

background image

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ę

background image

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ę

background image

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ę

background image

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ę

background image

Skorowidz

326

D

dane testowe, 273, 278, 281
datasources, wtyczka, 134,

136, 139

diff(), 305
Dispatcher, klasa, 294
download(), 317, 318

E

e-mail

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ę

background image

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ę

background image

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ę

background image
background image

Wyszukiwarka

Podobne podstrony:
informatyka cakephp 1 3 programowanie aplikacji receptury mariano iglesias ebook
CakePHP 1 3 Programowanie aplikacji Receptury
Programowanie aplikacji na iPhone
PROGRAMOWANIE APLIKACJI U.- WYKŁAD, PROG. APLIKACJI UŻYTKOWYCH- WYKŁAD 11
PROGRAMOWANIE APLIKACJI U.- WYKŁAD, PROG. APLIKACJI UŻYTKOWYCH- WYKŁAD 9
PROGRAMOWANIE APLIKACJI U.- WYKŁAD, PROG. APLIKACJI UŻYTKOWYCH- WYKŁAD 12
PROGRAMOWANIE APLIKACJI U.- WYKŁAD, PROG. APLIKACJI UŻYTKOWYCH- WYKŁAD 3
PROGRAMOWANIE APLIKACJI U.- WYKŁAD opis kursu PAU
70 251401 programista aplikacji
Programowanie aplikacji na serwisy spolecznosciowe prapse
HTML5 Programowanie aplikacji htm5pa
PROGRAMOWANIE APLIKACJI U.- WYKŁAD, PROG. APLIKACJI UŻYTKOWYCH- WYKŁAD 7
PROGRAMOWANIE APLIKACJI U.- WYKŁAD, PROG. APLIKACJI UŻYTKOWYCH- WYKŁAD 13
PROGRAMOWANIE APLIKACJI U.- WYKŁAD, PROG. APLIKACJI UŻYTKOWYCH- WYKŁAD 4
PROGRAMOWANIE APLIKACJI U.- WYKŁAD, PROG. APLIKACJI UŻYTKOWYCH- WYKŁAD 2
PROGRAMOWANIE APLIKACJI U.- WYKŁAD, PROG. APLIKACJI UŻYTKOWYCH- WYKŁAD 10
PROGRAMOWANIE APLIKACJI U.- WYKŁAD, PROG. APLIKACJI UŻYTKOWYCH- WYKŁAD 1
Java EE 6 Programowanie aplikacji WWW [PL]

więcej podobnych podstron