– Make sure to get PHP version.
$ php -v
PHP 7.4.3 (cli) (built: Mar 2 2022 15:36:52) ( NTS )
$ php composer.phar create-project –prefer-dist cakephp/app:4.* cms
$ bin/cake server -H 0.0.0.0
# create database cake_cms;
# \c cake_cms;
CREATE TABLE users(
id SERIAL PRIMARY KEY,
email VARCHAR(255) NOT NULL,
password VARCHAR(255) NOT NULL,
created TIMESTAMP,
modified TIMESTAMP
);
CREATE TABLE articles(
id SERIAL PRIMARY KEY,
user_id INT NOT NULL,
title VARCHAR(255) NOT NULL,
slug VARCHAR(191) NOT NULL,
body TEXT,
published BOOLEAN DEFAULT FALSE,
created TIMESTAMP,
modified TIMESTAMP,
UNIQUE (slug),
FOREIGN KEY (user_id) REFERENCES users(id)
);
CREATE TABLE tags(
id SERIAL PRIMARY KEY,
title VARCHAR(191),
created TIMESTAMP,
modified TIMESTAMP,
UNIQUE (title)
);
CREATE TABLE articles_tags(
article_id INT NOT NULL,
tag_id INT NOT NULL,
PRIMARY KEY (article_id, tag_id),
FOREIGN KEY (tag_id) REFERENCES tags(id),
FOREIGN KEY (article_id) REFERENCES articles(id)
);
INSERT INTO users (email, password, created, modified) VALUES
('cakephp@example.com', 'secret', NOW(), NOW());
INSERT INTO articles(user_id, title, slug, body, published, created, modified)
VALUES
(1, 'first post', 'first-post', 'This is the first post.', TRUE, NOW(), NOW());
cake_cms=# select * from users;
cake_cms=# select * from articles;
Database Configuration
L app_local.php
'default' => [
'className' => 'Cake\Database\Connection',
'driver' => 'Cake\Database\Driver\Postgres',
'persistent' => false,
'host' => 'localhost',
//'port' => 'non_standard_port_number',
'username' => 'hoge',
'password' => 'hoge',
'database' => 'cake_cms',
// 'encoding' => 'utf8mb4',
'timezone' => 'UTC',
'cacheMetadata' => true,
'url' => env('DATABASE_URL', null),
],
Creating our first model
src/Model/Table/ArticlesTable.php
namespace App\Model\Table;
use Cake\ORM\Table;
class ArticlesTable extends Table {
public function initialize(array $config): void {
$this->addBehavior('Timestamp');
}
}
src/Model/Entity/Article.php
namespace App\Model\Entity;
use Cake\ORM\Entity;
class Article extends Entity {
protected $_accessible = [
'*' => true,
'id' => false,
'slug' => false
];
}
Creating the Articles Controller
src/Controller/ArticlesController.php
namespace App\Controller;
class ArticlesController extends AppController {
public function index() {
$this->loadComponent('Paginator');
$articles = $this->Paginator->paginate($this->Articles->find());
$this->set(compact('articles'));
}
}
Create the Article List Template
templates/Articles/index.php
<h1>Articles</h1> <table> <tr> <th>Title</th> <th>Created</th> </tr> <?php foreach ($articles as $article): ?> <tr> <td> <?= $this->Html->link($article->title, ['action' => 'view', $article->slug]) ?> </td> <td> <?= $article->created->format(DATE_RFC850) ?> </td> </tr> <?php endforeach; ?> </table>
Create the View Action
src/Controller/ArticlesController.php
public function view($slug = null){
$article = $this->Articles->findBySlug($slug)->firstOrFail();
$this->set(compact('article'));
}
Create the view Template
templates/Articles/view.php
<h1><?= h($article->title) ?></h1>
<p><?= h($article->body) ?></p>
<p><small>Created: <?= $article->created->format(DATE_RFC850) ?></small></p>
<p><?= $this->Html->link('Edit', ['action' => 'edit', $article->slug]) ?></p>
Adding Articles
class ArticlesController extends AppController {
public function initialize(): void {
parent::initialize();
$this->loadComponent('Paginator');
$this->loadComponent('Flash');
}
public function index() {
$articles = $this->Paginator->paginate($this->Articles->find());
$this->set(compact('articles'));
}
public function view($slug = null){
$article = $this->Articles->findBySlug($slug)->firstOrFail();
$this->set(compact('article'));
}
public function add(){
$article = $this->Articles->newEmptyEntity();
if($this->request->is('post')){
$article = $this->Articles->patchEntity($article, $this->request->getData());
$article->user_id = 1;
if ($this->Articles->save($article)){
$this->Flash->success(__('Your article has been saved.'));
return $this->redirect(['action' => 'index']);
}
$this->Flash->error(__('Unable to add your article.'));
}
$this->set('article', $article);
}
}
Create Add Template
templates/Articles/add.php
<h1>Add Article</h1>
<?php
echo $this->Form->create($article);
echo $this->Form->control('user_id', ['type'=> 'hidden', 'value' => 1]);
echo $this->Form->control('title');
echo $this->Form->control('body', ['rows' => '3']);
echo $this->Form->button(__('Save Article'));
echo $this->Form->end();
?>
templates/Articles/index.php
<?= $this->Html->link('Add Article', ['action' => 'add']) ?>
Adding Simple Slug Generation
src/Model/Table/ArticlesTable.php
namespace App\Model\Table;
use Cake\ORM\Table;
use Cake\Utility\Text;
use Cake\Event\EventInterface;
public function beforeSave(EventInterface $event, $entity, $options){
if($entity->isNew() && !$entity->slug){
$sluggedTitle = Text::slug($entity->title);
$entity->slug = substr($sluggedTitle, 0, 191);
}
}
Add Edit Action
public function edit($slug) {
$article = $this->Articles
->findBySlug($slug)
->firstOrFail();
if($this->request->is(['post', 'put'])){
$this->Articles->patchEntity($article, $this->request->getData());
if ($this->Articles->save($article)){
$this->Flash->success(__('Your article has been updated.'));
return $this->redirect(['action' => 'index']);
}
$this->Flash->error(__('Unable to update your article.'));
}
$this->set('article', $article);
}
Create Edit Template
<h1>Edit Article</h1>
<?php
echo $this->Form->create($article);
echo $this->Form->control('user_id', ['type'=> 'hidden']);
echo $this->Form->control('title');
echo $this->Form->control('body', ['rows' => '3']);
echo $this->Form->button(__('Save Article'));
echo $this->Form->end();
?>
templates/Articles/index.php
<h1>Articles</h1>
<?= $this->Html->link('Add Article', ['action' => 'add']) ?>
<table>
<tr>
<th>Title</th>
<th>Created</th>
<th>Action</th>
</tr>
<?php foreach ($articles as $article): ?>
<tr>
<td>
<?= $this->Html->link($article->title, ['action' => 'view', $article->slug]) ?>
</td>
<td>
<?= $article->created->format(DATE_RFC850) ?>
</td>
<td>
<?= $this->Html->link('Edit', ['action' => 'edit', $article->slug]) ?>
</td>
</tr>
<?php endforeach; ?>
</table>