CakePHP3(3.0.0-beta1)でとりあえずHelperを作ってみる
CakePHP3(3.0.0-beta1)でとりあえずHelperを作ってみる
①ColorHelper.phpを作成
<?php
namespace App\View\Helper;
use Cake\View\Helper;
class ColorHelper extends Helper {
public function red($string) {
return '<span style="color:red">' . $string . '</span>';
}
}②ArticlesControllerを下記のように変更
public $helpers = ['Paginator' => ['templates' => 'paginator-templates.php'],'Color'];
③index.ctpを下記のように変更
<th><?= $this->Color->red('Id') ?></th>
<th><?= $this->Color->red('Title') ?></th>
<th><?= $this->Color->red('Created') ?></th>
<th><?= $this->Color->red('Action') ?></th>
CakePHP3(3.0.0-beta1)でコメントが書き込まれたらメール送信されるようにしてみる
ぼんやりしている間にCakePHP 3.0.0-beta1がリリースされていました。
ブログチュートリアルにコメント機能を追加したので、コメントが書き込まれたらメール送信されるようにしてみます。
①ArticlesControllerを下記のように変更。
・ライブラリの読み込み
use Cake\Network\Email\Email;
・comment()にメール送信処理追加
public function comment() {
$this->loadModel('Comments');
$comment = $this->Comments->newEntity($this->request->data);
if ($this->request->is('post')) {
if ($this->Comments->save($comment)) {
$email = new Email('dev');
$email->to('送信先のメールアドレス')
->subject($this->request->data['title'])
->send($this->request->data['body']);
$this->Flash->success(__('Your comment has been saved.'));
//return $this->redirect(['action' => 'index']);
}else{
$this->Flash->error(__('Unable to add your comment.'));
}
}
return $this->redirect('/articles/view/'.$this->request->data['article_id']);
}②config/app.phpを下記のように変更(devを追加)
'EmailTransport' => [ 'default' => [ 'className' => 'Mail', // The following keys are used in SMTP transports 'host' => 'localhost', 'port' => 25, 'timeout' => 30, 'username' => 'user', 'password' => 'secret', 'client' => null, 'tls' => null, ], 'dev' => [ 'className' => 'Smtp', // The following keys are used in SMTP transports 'host' => 'localhost', 'port' => 25, 'timeout' => 30, 'client' => null, 'tls' => null, ], ], 'Email' => [ 'default' => [ 'transport' => 'default', 'from' => 'you@localhost', //'charset' => 'utf-8', //'headerCharset' => 'utf-8', ], 'dev' => [ 'transport' => 'dev', 'from' => ['差出人のメールアドレス'=>'差出人名'], //'charset' => 'utf-8', //'headerCharset' => 'utf-8', ], ],
差出人情報は送信時に都度指定することも可能。
CakePHP3(3.0.0-alpha1)のブログチュートリアルで記事一覧にページネーションを追加してみる2
PaginatorのHelperが出力するタグからリストタグを削ってみる。
①ArticlesControllerを下記のように変更。
public $helpers = ['Paginator' => ['templates' => 'paginator-templates.php']];
②paginator-templates.phpというファイルをsrc/Config/下に作る。中身は下記の通り。(変更したのは一部のみ)
※2014/08/12追記:src/Config/は3.0.0-alpha2でconfigに変更になった様子。
<?php
$config =[
'nextActive' => '<a rel="next" href="{{url}}">{{text}}</a>',
'nextDisabled' => '<span>{{text}}</span>',
'prevActive' => '<a rel="prev" href="{{url}}">{{text}}</a>',
'prevDisabled' => '<span>{{text}}</span>',
'number' => '<a href="{{url}}">{{text}}</a>',
'current' => '<span>{{text}}</span>'
];paginator-templates.phpの中に何を書いていいのかわからなくてしばらく悩んでしまった。
PaginatorHelper — CakePHP Cookbook 3.x documentation
CakePHP3(3.0.0-alpha1)のブログチュートリアルで記事一覧にページネーションを追加してみる
CakePHP3(3.0.0-alpha1)のブログチュートリアルで記事一覧にページネーションを追加してみる
①ArticlesControllerに下記を追加
public $helpers = ['Paginator']; public $components = ['Paginator']; public $paginate = ['limit' => '5', 'order' => ['Article.id' => 'asc']];
②ArticlesControllerのindexアクションを変更
public function index() {
$articles = $this->Articles->find('all');
//$this->set(compact('articles'));
$this->set('articles', $this->paginate());
}
③index.ctpに下記を追加
<?php echo $this->Paginator->prev('<<' . __('previous')); ?> <?php echo $this->Paginator->numbers(['modulus' => 9]); ?> <?php echo $this->Paginator->next(__('next') . '>>'); ?>
デフォルトだとリストタグが付いてくるっぽい。
CakePHP3(3.0.0-alpha1)のブログチュートリアルで記事にコメント機能を追加する3
①ArticlesControllerにactionを追加
addをベースにしながら、色々試したかったのでaddの流れから少しだけ変更してある。
public function comment() {
$this->loadModel('Comments');
$comment = $this->Comments->newEntity($this->request->data);
if ($this->request->is('post')) {
if ($this->Comments->save($comment)) {
$this->Flash->success(__('Your comment has been saved.'));
//return $this->redirect(['action' => 'index']);
}else{
$this->Flash->error(__('Unable to add your comment.'));
}
}
return $this->redirect('/articles/view/'.$this->request->data['article_id']);
}
前の記事でも$this->loadModel('Comments');でモデルを読み込むと書いたけれど、pdf版のドキュメントを見ると
Note: CakePHP merges the following variables from the AppController into your application’s controllers:
・$components
・$helpers
・$uses
と書いてあり、$usesだけリンクがない状態。この後のバージョンで追加されるのかも?
CakePHP3(3.0.0-alpha1)のブログチュートリアルで記事にコメント機能を追加する2
view.ctpにコメント一覧を表示したのでコメント入力欄を足してみる
①ArticlesControllerのview()を編集
public function view($id = null) {
if (!$id) {
throw new NotFoundException(__('Invalid article'));
}
//$article = $this->Articles->get($id);
$article = $this->Articles->find('all')->contain(['Comments'])->where(['id'=>$id])->first();
$this->set(compact('article'));
$this->loadModel('Comments');
$comment_entity = $this->Comments->newEntity($this->request->data);
$this->set('comment_entity', $comment_entity);
}$this->loadModel('Comments');
を省いて
$this->Articles->Comments->newEntity($this->request->data)
でも。
2.Xは$usesで使うモデルを指定していたけれど3.Xでは違うっぽい?
http://book.cakephp.org/3.0/en/controllers.html#Controller::loadModel
※2014/07/16追記:pdf版のドキュメントには
Note: CakePHP merges the following variables from the AppController into your application’s controllers:
・$components
・$helpers
・$uses
と書かれていて、$usesだけリンクがない状態。様子見。
②view.ctpに入力欄を追加する
<h1>Comment</h1>
<?php
echo $this->Form->create($comment_entity,['action'=>'comment']);
echo $this->Form->input('title');
echo $this->Form->input('body', ['rows' => '3']);
echo $this->Form->button(__('Save Comment'));
echo $this->Form->hidden('article_id',array('value'=>$article->id));
echo $this->Form->end();
?>add.ctpみたいに入力欄が空だとメッセージが出る。
CakePHP3(3.0.0-alpha1)のブログチュートリアルで記事にコメント機能を追加する
①comentsテーブルを作る
CREATE TABLE comments ( id INT UNSIGNED AUTO_INCREMENT PRIMARY KEY, title VARCHAR(50), body TEXT, article_id int(10), created DATETIME DEFAULT NULL, modified DATETIME DEFAULT NULL ); INSERT INTO comments (title,body,article_idcreated) VALUES ('test', 'comment', 1, NOW());
②CommentsTable.phpを作る
<?php
namespace App\Model\Table;
use Cake\ORM\Table;
use Cake\Validation\Validator;
class CommentsTable extends Table {
public function initialize(array $config) {
$this->addBehavior('Timestamp');
}
public function validationDefault(Validator $validator) {
$validator
->notEmpty('title')
->notEmpty('body');
return $validator;
}
}
③ArticleTable.phpでhasManyの設定
public function initialize(array $config) {
$this->addBehavior('Timestamp');
$this->hasMany('Comments', [
'className' => 'Comments'
]);
}
④ArticlesController.phpを書き換える
public function view($id = null) {
if (!$id) {
throw new NotFoundException(__('Invalid article'));
}
//$article = $this->Articles->get($id);
$article = $this->Articles->find('all')->contain(['Comments'])->where(['id'=>$id])->first();
$this->set(compact('article'));
}
⑤view.ctpを書き換える(下記を追加)
<h1>Comment</h1> <table> <tr> <th>Id</th> <th>Title</th> <th>Created</th> </tr> <?php foreach ($article->comments as $comment): ?> <tr> <td><?= $comment->id ?></td> <td><?= $comment->title ?></td> <td><?= $comment->created->format(DATE_RFC850) ?></td> </tr> <?php endforeach; ?> </table>
【備考】
viewで呼び出すときは$article->Commentsじゃなくて$article->commentsみたい