CakePHP, Blog [1]

Comincio a fare “sul serio” con l’uso di CAkePHP, ora proverò a creare un blog.

Creazione database

Per prima cosa
Ecco alcuni accorgimenti sulle regole che devono seguire le tabelle (naming convention):

  • I nomi devono essere in plurale inglese (posts ad esempio), in modo che i modelli corrispondenti abbiano nomi in singolare;
  • tutte le tabelle devono avere una chiave primaria chiamata id;
  • le chiavi esterne utilizzate per costruire le relazioni tra le tabelle devono essere nomiate utilizzando il singolare della tabella a cui fanno riferimento seguito da _id (post_id per esempio);
  • è possibile includere i campi created e modified che verranno automaticamente aggiornati da CakePHP quando si opererà sui record.

Cake contiente una classe inflections che si occupa di ottenere i plurali dei vari nomi.

Creo il database blog_cake.

Creo la tabella posts.

/* First, create our posts table: */
CREATE TABLE posts (
id INT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
title VARCHAR(50),
body TEXT,
created DATETIME DEFAULT NULL,
modified DATETIME DEFAULT NULL
);


/* Then insert some posts for testing: */
INSERT INTO posts (title,body,created)
VALUES ('il titolo', 'Questo è il contenuto di un post.', NOW());
INSERT INTO posts (title,body,created)
VALUES ('secondo titolo', 'Altro contenuto di un post.', NOW());
INSERT INTO posts (title,body,created)
VALUES ('Divetimento', 'Divertiamoci.', NOW());

Imposto i dati di connessione al database nel file /app/config/database.php

var $default = array('driver' => 'mysql',
'connect' => 'mysql_pconnect',
'host' => 'localhost',
'login' => '‘,
‘password’ => ‘ ‘,
‘database’ => ‘blog_cakel’ );

Cake contiene una Classe AppModel da cui si parte per ottenere i nuovi modelli, estendendo tale classe di partenza.

Creo il modello Post:

/app/models/post.php


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

Creo il controller Post
Dato che abbiamo deciso di seguire le convenzioni sui nomi sarà possibile accedere ai modelli implementati direttamente attraverso $this->NOME_MODELLO.
/app/controllers/posts_controller.php

< ?php
class PostsController extends AppController
{
var $name = 'Posts';
}
?>

Ci aggiungo l’azione index


< ?php
class PostsController extends AppController
{
var $name = 'Posts';
function index()
{
$this->set(’posts’, $this->Post->findAll());
}
}
?>

Il metodo index registra un array con tutti i post inseriti utilizzando il metodo set, che rende disponibile questo array alla vista.

Creo la vista index

/app/views/posts/index.thtml


<h1>Blog</h1>
< ?php foreach ($posts as $post): ?>
<dl>
<dt>
<h3>< ?php echo $html->link($post['Post']['title'], “/posts/view/”.$post['Post']['id']); ?></h3>
< ?php
echo $post['Post']['id'];
echo '<br/>';
echo $post['Post']['created'];
echo '<br/&gt';
echo '<br/>';
?>
</dt>
<dd>
< ?php
echo $post['Post']['body'];
?>
</dd>
</dl>
< ?php endforeach; ?>

Vado con il browser all’indirizzo:
http://localhost/cake/posts/
ed ecco il risultato:

cakePHP blog

Ora aggiungo l’azione view al controller, per gestire la visualizzazione di un singolo post.


< ?php
class PostsController extends AppController
{
var $name = 'Posts';
function index()
{
$this->set(’posts’, $this->Post->findAll());
}
function view($id = null)
{
$this->Post->id = $id;
$this->set(’post’, $this->Post->read());
}
}
?>

Creo la vista view
/app/views/posts/view.thtml


<h2>< ?php echo $post['Post']['title']?></h2>
<p><small>Created: < ?php echo $post['Post']['created']?></small></p>
<p>< ?php echo $post['Post']['body']?></p>

Ora se clicco sul titolo del primo post, mi sposto all’indirizzo:
http://localhost/cake/posts/view/1

e vedo la vista view di questo post.

post singolo

Così ho completato tutte le pagine per visualizzare il blog, la prossima volta passo alle pagine per inserimento, modifica e cancellazione dei post.

Gabba Gabba Hey
Bonzo

6 Commenti a “CakePHP, Blog [1]”

  1. Laburno scrive:

    Bel tutorial! Non ce ne sono mai abbastanza in italiano!
    Ti “bookmarko” subito :)

  2. Michele scrive:

    A me l’esempio così non va…
    Ho cercato di correggere anche gli errori,ma non ce l’ho fatta.
    Errore:
    Undefined variable: post [APP\views\posts\index.thtml, line 16]
    Si può avere uno zip con i 3 file giusti? (il config database funziona già)

  3. Bonzo scrive:

    il database.php dipende dai dati di accesso del tuo db.

    Scarica i file da qui:
    http://svn.ilbonzo.org/pepe

    hai creato il Model?

  4. ZioTano scrive:

    Ci sono un paio di errori.
    intanto nel controller sostituite le virgolette nelle assegnazioni con quelle classiche >>’<<
    poi nel view sostituite body con “message”

  5. tommaso massimo salvatore scrive:

    Salve a tutti!
    Purtroppo a me non potrebbe andar peggio nel senso che non mi funziona l’esempio.
    Ciò che penso è che vi sia un problema di configurazione che se non risolvo a breve mi porterà saggiamente ad abbandonare il proposito di studiarmi un framework in php.

    Io lascio il file index.php sotto webroot così come è, metto tutti i file dell’esempio come indicato, compreso database.php (tanto che se carico http://localhost mi dice che cake si connette al db).
    Ma poi non funziona nulla caricando i vari http://localhost/cake/posts/ ohttp://localhost/cake/posts/view/ o http://localhost/cake/posts/index.thtml che mi appaiono, quest’ultimi nel browser come txt.
    Mi aiutate?
    Mi ero indirizzato a cakephp in alternativa a symphony dato che quest’ultimo oltre a non funzionarmi per problematiche PHP-CLI non mi piaceva… insomma cakephp mi sembrava più intuitivo.
    Cosa è dato per scontato che per me, evidentemente non è… Oppure: dove è il problema…
    Sono disorientato!
    Grazie

  6. Bonzo scrive:

    il post l’ho scritto tanto tempo fa, ora Cake è alla versione 1.2, quindi ci sono sicuramente dei cambiamenti.

    Prova a scaricare da qui la mia versione:
    http://svn.ilbonzo.org/pepe/branches/pepe_cake/

    però ti consiglio di guardare bene sul sito
    http://book.cakephp.org/view/219/Blog
    perché la versione 1.2 introduce cambiamenti, tra cui chiamare i file delle view .ctp

Scrivi un commento

-----------