Andiamo avanti con la realizzazione del blog scritto con CakePHP.
Devo creare il meccanismo la creazione, modifica e eliminzaione dei post.
Aggiungere i Post
/app/controllers/posts_controller.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());
}
function add()
{
if (!empty($this->data))
{
if ($this->Post->save($this->data))
{
$this->flash(’Your post has been saved.’,'/posts’);
}
}
}
}
?>
Il controller guarda che i dati inviati via POST non siano vuoti, se non lo sono utilizza il metodo per salvare i dati. Con il metodo flash è possibile visualizzare un messaggio che dice se i dati sono stati salvati.
Creo la vista add
/app/views/posts/add.thtml
<<h1>Add Post</h1>
<form method="post" action="url(’/posts/add’)?>”>
<p>
Title:
input(’Post/title’, array(’size’ => ‘40′))?>
tagErrorMsg(’Post/title’, ‘Title is required.’) ?>
</p>
<p>
Body:
textarea(’Post/body’, array(’rows’=>’10′)) ?>
tagErrorMsg(’Post/body’, ‘Body is required.’) ?>
</p>
<p>
submit(’Save’) ?>
</p>
</form>
ecco come si visualizza la pagina:
http://localhost/cake/posts/add

Modifico il modello Post
/app/models/post.php
aggiungo la validazione dei dati.
class Post extends AppModel
{
var $name = 'Post';
var $validate = array(
'title' => VALID_NOT_EMPTY,
‘body’ => VALID_NOT_EMPTY
);
}
?>
L’array $validate dice a Cake come validare i dati quando è chiamato il metodo save(). I valori per queste chiave si possono vedere in /cake/libs/validators.php.
/**
* Not empty.
*/
define('VALID_NOT_EMPTY', '/.+/');
/**
* Numbers [0-9] only.
*/
define('VALID_NUMBER', '/^[-+]?\\b[0-9]*\\.?[0-9]+\\b$/');
/**
* A valid email address.
*/
define('VALID_EMAIL', '/\\A(?:^([a-z0-9][a-z0-9_\\-\\.\\+]*)@([a-z0-9][a-z0-9\\.\\-]{0,63}\\.(com|org|net|biz|info|name|net|pro|aero|coop|museum|[a-z]{2,4}))$)\\z/i');
/**
* A valid year (1000-2999).
*/
define('VALID_YEAR', '/^[12][0-9]{3}$/');
Ecco cosa succede se si prova ad inserire un post senza il titolo:

Cancellare i post, azione delete
/app/controllers/posts_controller.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());
}
function add()
{
if (!empty($this->data))
{
if ($this->Post->save($this->data))
{
$this->flash(’Your post has been saved.’,'/posts’);
}
}
}
function delete($id)
{
$this->Post->del($id);
$this->flash(’The post with id: ‘.$id.’ has been deleted.’, ‘/posts’);
}
}
?>
Aggiungo il link delete nella vista index
/app/views/posts/index.thtml
echo $html->link(
‘Delete’,
“/posts/delete/{$post[’Post’][’id’]}”,
null,
‘Are you sure?’
)
?>
se clicco mi si apre un alert javascript che mi chiede se sono sicuro.
Se disabilito javascript nel browser il post viene cancellato senza richiesta di conferma.
Modificare i post, azione edit
/app/controllers/posts_controller.php
function edit($id = null)
{
if (empty($this->data))
{
$this->Post->id = $id;
$this->data = $this->Post->read();
}
else
{
if ($this->Post->save($this->data['Post']))
{
$this->flash('Your post has been updated.','/posts');
}
}
}
Creo la vista edit
/app/views/posts/edit.thtml
<h1>Edit Post</h1>
<form method="post" action="url(’/posts/edit’)?>”>
hidden(’Post/id’); ?>
<p>
Title:
input(’Post/title’, array(’size’ => ‘40′))?>
tagErrorMsg(’Post/title’, ‘Title is required.’) ?>
</p>
<p>
Body:
textarea(’Post/body’, array(’rows’=>’10′)) ?>
tagErrorMsg(’Post/body’, ‘Body is required.’) ?>
</p>
<p>
submit(’Save’) ?>
</p>
</form>
aggiungo il link edit nella vista index
/app/views/posts/index.thtml
link(’Edit’, ‘/posts/edit/’.$post[’Post’][’id’]);?>
Modifica pagina di home
/app/config/routes.php
Nel file routes.php ci sono le configurazioni per i controller e le relative viste che si devono aprire per i vari indirizzi.
Modifico commentando
//$Route->connect('/', array('controller' => 'pages', 'action' => 'display', 'home'));
e settando:
/**
* Collegamento alla pagina index
*
*/
$Route->connect ('/', array('controller'=>'posts', 'action'=>'index'));
Così andando a http://localhost/cake mi apre direttamente la vista index del controller posts.
Ecco fatto, ora il sistema di gestione dei Post è finito, il prossimo obbiettivo è implementare un sistema di gestione degli utenti che possono inviare i post.
Gabba Gabba Hey
Bonzo