CompZone.Org :: Artykuły :: PHP
Pytania w drugiej edycji Testu PHP powinny być:
Trudniejsze
Łatwiejsze
Skomplikowane
Na myślenie
Do liczenia
Sonda Wyniki

Add to Google

Tutorial do frameworka Cake PHP

CakePHP, to ciekawy framework dla jęyka PHP, wzorujący się na systemie Ruby on Rails (RoR) i modelu MVC. Działa narazie pod php4 jak i 5, ale przyszłości kompatybilność z php4 może zostać porzucona. Pozwala na bardzo szybkie uruchomienie projektu i przyjemne jego ukończenie.

Konwencje nazw i projekty tabeli

Pisząc dla CakePHP potrzeba jak w przypadku RoR przyjąć pewne konwencje nazw. Wszystko nazywamy po angielsku. Nazwy tabel zaczynają się małą literą i są w liczbie mnogiej. Klasy modeli mają liczbę pojedynczą i zaczynają się dużą literą. Kontroler nazywamy z dużej litery i liczbą mnogą. Przykład:

  • tabela - posts
  • model - Post
  • kontroler - PostsController

Każda tabela, której używamy w projekcie musi zawierać 3 pola:

  • id auto_increment
  • added datetime default null
  • modified datetime default null

Jeśli występuje w tabeli indeks z innej tabeli, to dodajemy do jej nazwy '_id', np. w pole w tabeli comments - 'post_id'.

Zaczynamy - instalacja

Żeby zainstalować CakePHP wystarczy ściągnąć odpowiednie pliki z http://cakephp.org -> dział Downloads / Release. Rozpakowujemy go tak, żeby katalog, gdzie user zaczyna przeglądanie strony zawierał główne katalogi - cake, app, ...

Własne pliki wkładamy właściwie tylko do podkatalogów app.

Konfiguracja bazy i serwera.

Co do serwera - cake używa mod_rewrite'a, więc powinien on działać na serwerze, gdzie piszemy kod. Można użyć też innego mechanizmu wpisanego w Cake, ale zwykle powoduje to dużo dodatkowej pracy i nie zawsze chce działać jak trzeba.

Co do bazy - zwykle wystarczy skopiować plik app/config/database.php.default jako app/config/database.php i zmienić tylko nazwe bazy (database), użytkownika (login) i hasło (password). Możemy też zmienić rodzaj bazy danych i sposób połączenia.

Robimy prostego bloga, czyli standardowy tutorial CakePHP.

Najpierw potrzebujemy tabel - dla postów i dla komentarzy. Załatwiamy to przez:

 CREATE TABLE posts (id INT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
title VARCHAR(50), body TEXT, created DATETIME DEFAULT NULL,
modified DATETIME DEFAULT NULL);
CREATE TABLE comments (id INT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
post_id INT UNSIGNED, author VARCHAR(50), body TEXT,
created DATETIME DEFAULT NULL, modified DATETIME DEFAULT NULL);

i wkładamy troche przykładowych danych:

 INSERT INTO posts VALUES (0, 'Pierwszy wpis blogowy',
'Jakastam tresc dziwna', NOW(), NULL);
INSERT INTO posts VALUES (0, 'Drugi wpis blogowy',
'Jeszcze troche tekstu', NOW(), NULL);
INSERT INTO comments VALUES (0, 1, 'ktos',
'komentarz do pierwszego', NOW(), NULL);
INSERT INTO comments VALUES (0, 1, 'ktos inny',
'nastepny komentarz', NOW(), NULL);

Reprezentacja tabel w PHP

Musimy poinformować CakePHP, że te tablice istnieją, więc dodajemy pliki z klasami modeli danych (``M'' w MVC). Po kolei tworzymy app/models/post.php:

 <?php
class Post extends AppModel {
var $displayField = 'title';
var $hasMany = 'Comment';
var $name = 'Post';
}
?>

i app/models/comment.php:

 <?php
class Comment extends AppModel {
var $displayField = 'id';
var $belongsTo = 'Post';
var $name = 'Comment';
}
?>

Zmienna displayField oznacza pole, którego używamy przy ``wyświetlaniu'' danego modelu.

Zmienne hasMany i belongsTo oznaczają relacje między tabelami. Można je tłumaczyć dosłownie i taki mają właśnie sens. Klasa Post ``ma wiele'' klas Comment, a klasa Comment ``należy do jednej'' klasy Post. To wystarczy, żeby CakePHP wiedział, że istnieją te tabele, klasy i jakie są między nimi zależności.

Szybko zobaczyć efekt

Teraz wykorzystamy ``scaffold'', czyli po naszemu rusztowanie, żeby szybko zobaczyć efekt funkcji, które później sami dostosujemy do własnych potrzeb. Chodzi o funkcje CRUD, czyli operacje na rekordach tabel - dodawanie (Create), oglądanie (Read), edycje (Update), kasowanie (Delete).

Tworzymy kontrolery do modeli (``C'' w MVC). Będą one automatycznie przez scaffolding tworzyć widoki (``V'' w MVC). Wpisujemy do

app/controllers/posts_controller.php:

 <?php
class PostsController extends AppController {
var $scaffold;
}
?>

i do app/controllers/comments_controller.php:

 <?php
class CommentsController extends AppController {
var $scaffold;
}
?>

Teraz można zaglądnąć pod http://gdziestam/katalog/posts/ zakładając, że pod http://gdziestam/katalog leżyą katalogi app, cake i inne. Widać, że po kliknięciu na View przy pierwszym poście widać powiązane z nim komentarze. Inne funkcje też działają, więc można zmieniać już bazę wedle uznania.

Pisanie własnych kontrolerów i widoków

Teraz, kiedy już ludzie nie znający wcześniej możliwości scaffoldingu i automatycznych frameworków MVC pozbierali szczęki z ziemi, możemy napisać własną obsługę danych z bazy. Musimy obsłużyć akcje 'view', 'add', 'delete', 'edit', ... Jeśli będziemy obsługiwać jakąś akcje, którą może też wziąść scaffolding, to zawsze obsługa zostanie przekazana do akcji użytkownika.

Template i akcje 'index', 'view'

Żeby samemu oskryptować te akcje wystarczy dodać funkcje PostsController->index i ->view. Do app/controller/posts_controller.php dodajemy wewnątrz klasy:

 var $name='Posts';
function index() {
$this->set('data',$this->Post->findAll());
}
function view($id) {
$this->Post->id = $id;
$this->set('data', $this->Post->read());
}

Te dane które wstawiliśmy (findAll - wyszukanie wszystkich rekordów, read - przeczytanie informacji z danego rekordu) wystarczą do stworzenia widoku tych akcji. Następny krok to sam kod html. Dla każdej akcji tworzymy plik app/views/<model>/<akcja>.thtml, więc teraz wpisujemy po kolei do app/views/posts/index.thtml:

 <?php foreach ($data as $post): ?>
<div>
<b>Tytuł</b>:
<?php echo $post['Post']['title'];
if(isset($post['Comment']))
echo ' ('.sizeof($post['Comment']).')';
else echo ' (0)'; ?><br>
<b>Treść</b>:
<?php echo $post['Post']['body']; ?><br>

<?php echo $html->link('Zobacz',
'/posts/view/'.$post['Post']['id']); ?>
<hr>
</div>
<?php endforeach; ?>

i do app/views/posts/view.thtml:

 <div>
<h1>
<?php echo $data['Post']['title']?></h1>
<p><small>Utworzony:
<?php echo $data['Post']['created']?></small></p>
<p>
<?php echo $data['Post']['body']?></p>

</div>
<?php echo $html->link('Edytuj post',
'/posts/edit/'.$data['Post']['id']); ?>
<hr>
<h1>Komentarze</h1>
<?php foreach ($data['Comment'] as $comm): ?>
<div>
<b>Autor</b>:
<?php echo $comm['author']; ?><br>

<b>Treść</b>:
<?php echo $comm['body']; ?><br>
</div>
<hr>
<?php endforeach; ?>

Funkcje użyte wyżej są praktycznie samokomentujące i wystarczy kilka chwil przy CakePHP, żeby załapać ``co i jak''. Żeby wstawić na resztę strony własny layout trzeba stworzyć plik app/views/layouts/default.thtml zawierający w treści np.:

 <html>
<body>
<?php echo $content_for_layout; ?>
</body>
</html>

Treść wygenerowana przez kontrolery znajdzie się we wiadomym miejscu.

Co dalej?

Widać już, że dalej też będzie szybko i przyjemnie. Wystarczy kilka chwil, żeby dodać edycję i dodawanie rekordów. Więcej informacji, dużo tutoriali i pełny opis CakePHP znajduje się na www.cakephp.org. Projekt jest narazie we wczesnej fazie rozwoju i układ funkcji / zmienne mogą się drastycznie zmieniać, ale już kilka porządnych werji CakePHP powstało i jak narazie jest tylko lepiej. Niedługo można spodziewać się wielu udogodnień (m.in. podział wyników na strony), a za jakiś czas v1.0.

A więc dalej -> bawić się i używać sobie cake'a, bo korzyści z tego sę duże.

viraptor @ 09-07-2006 23:39
Brak komentarzy...
Copyright © 2005-2006 Compzone.Org. Kopiowanie i wykorzystywanie materiałów zawartych na tej stronie bez zgody autora zabronione!