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:

internacjonalizacj tekstów w kontrolerach i widokach;

internacjonalizacj komunikatów walidacji w modelach;

tumaczenie tekstów zawierajcych dynamicznie generowan tre;

ekstrakcj i tumaczenie tekstów;

tumaczenie rekordów baz danych za pomoc zachowania 

Translate

;

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:

LC_ALL

0

;

LC_COLLATE

1

;

LC_CTYPE

2

;

LC_MONETARY

3

;

LC_NUMERIC

4

;

LC_TIME

5

;

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

„Internacjonalizacja komunikatów walidacji w modelach”;

„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

„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

„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:

jeli pracujesz w systemach GNU Linux/Mac/Unix:

../cake/console/cake i18n extract

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

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

jeli pracujesz w systemach GNU Linux/Mac/Unix:

../cake/console/cake i18n initdb

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

„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