CakePHP View操作
目次
テンプレート
テンプレートファイル
~
└src
└Template
└Hello
└auto_layout_false.ctp
└auto_layout_true.ctp
└Layout
└default.ctp
└hello.ctp
※ファイル名はスネーク式で記述する
ビューテンプレート
※コントローラ
class HelloController extends AppController {
public function autoLayoutFalse(){
ビューテンプレート(Template\(クラス名)\(アクション名).ctp)使用:有
$this->autoRender = true;
ビューへ値を連携(「Controler→Viewデータ連携」参照)
$this->set('cakeDescription', 'autoLayout:False');
レイアウト(Template\Layout\default.ctp)使用:無
$this->viewBuilder()->autoLayout(false);
}
}
※auto_layout_false.ctp
<!DOCTYPE html>
<html>
<head>
<?= $this->Html->charset() ?>
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title><?= $cakeDescription ?></title>
<?= $this->Html->meta('icon') ?>
<?= $this->Html->css('base.css') ?>
<?= $this->Html->css('cake.css') ?>
<?= $this->Html->css('home.css') ?>
</head>
<body>
<footer>autoLayoutFalse</footer>
</body>
</html>
※実行結果(~/hello/autoLayoutFalse)
レイアウト
※コントローラ
class HelloController extends AppController {
public function beforeFilter(Event $event){
parent::beforeFilter($event);
ビューテンプレート(Template\(クラス名)\(アクション名).ctp)使用:有
$this->autoRender = true;
レイアウトファイル(Template\Layout\hello.ctp)指定
$this->viewBuilder()->layout("Hello");
レイアウトファイル未指定時はdefault.ctpが使用される
レイアウト(Template\Layout\~.ctp)使用:有
$this->viewBuilder()->autoLayout(true);
}
↓と同じ
public function autoLayoutTrue(){}
}
※auto_layout_true.ctp
autoLayoutTrue
※↑ 非html
※hello.ctp
<!DOCTYPE html>
<html>
<head>
<?= $this->Html->charset() ?>
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>
<?= $cakeDescription ?>:
<?= $this->fetch('title') ?>
</title>
<?= $this->Html->meta('icon') ?>
<?= $this->Html->css('base.css') ?>
<?= $this->Html->css('cake.css') ?>
<?= $this->fetch('meta') ?>
<?= $this->fetch('css') ?>
<?= $this->fetch('script') ?>
</head>
<body>
<div>
autoLayout部分
</div>
↓ ここにauto_layout_true.ctpの内容が埋め込まれる
<div class="container clearfix">
<?= $this->fetch('content') ?>
</div>
</body>
</html>
※実行結果(~/hello/autoLayoutTrue)
レイアウトファイル変数へのデータ連携
public function beforeRender($view = null, $layout = null) {
$this->set('point', 1000);
$this->set('user_name', 'aaa');
return parent::beforeRender($view, $layout);
}
ヘルパーメソッド
Formヘルパーメソッド
Htmlヘルパーメソッド
Numberヘルパーメソッド
<?= $this->Number->format(10000); ?>
→10,000
Controler→Viewデータ連携
通常
※Controler
$this->set('data', 'aaa');
変数名が同じの場合
$this->set('val1'), $val1);
$this->set('val2'), $val2);
$this->set('val3'), $val3);
↓
$this->set(compact('val1', 'val2', 'val3'));
※view(test.ctp)
<php? echo $data; ?>
→aaa
ページジング処理
$this->モデル名 = array(
モデル名 => array(
'fields' => ~,
'conditions' => ~,
'order' => ~,
)
);
データの取得方法については「プログラム言語 データベース操作/配列への一括取得」参照
Viewへデータ連携
$this->set('data', $this->paginate('モデル名'));
View側
<table class="list">
<thead>
<tr>
表示ラベル:「商品名」押下でソート
<th scope="col"><?= $this->Paginator->sort('product_name', '商品名') ?></th>
<th scope="col"><?= $this->Paginator->sort('genre', 'ジャンル') ?></th>
<th scope="col"><?= $this->Paginator->sort('created', '登録日') ?></th>
</tr>
</thead>
<tbody>
<?php foreach ($products as $product): ?>
<tr>
<td>
<?= $this->Html->link($product->product_name, ['action' => 'movie_detail', $product->id]) ?>
</td>
<td><?= $this->Number->format($product->genre) ?></td>
<td><?= h($product->created->i18nFormat('YYYY/MM/dd')) ?></td>
</tr>
<?php endforeach; ?>
</tbody>
</table>
<div class="paginator">
<ul class="pagination">
<?= $this->Paginator->first('<< ' . __('first')) ?>
<?= $this->Paginator->prev('< ' . __('previous')) ?>
<?= $this->Paginator->numbers() ?>
<?= $this->Paginator->next(__('next') . ' >') ?>
<?= $this->Paginator->last(__('last') . ' >>') ?>
</ul>
<p><?= $this->Paginator->counter(['format' => __('Page {{page}} of {{pages}}, showing {{current}} record(s) out of {{count}} total')]) ?></p>
</div>
モデル操作
【select有り】
※コントローラ
$this->モデル1
->find()
->contain(['seconds'])
->where(~)
->select([
'id',
'col1',
'col2',
'seconds.col1',
'seconds.col2',
]);
※ビュー
<?php foreach ($models as $model): ?>
<tr>
<td><?= $model->id) ?></td>
<td><?= $model->col1 ?></td>
<td><?= $model->col2 ?></td>
↓モデル名から「s」を除去する必要がある
<td><?= $model->second->col1 ?></td>
<td><?= $model->second->col1 ?></td>
</tr>
<?php endforeach; ?>
【select無し】
※コントローラ
$this->モデル1
->find()
->contain(['seconds'])
->where(~)
;
※ビュー
<?php foreach ($models as $model): ?>
<tr>
<td><?= $model->id) ?></td>
<td><?= $model->col1 ?></td>
<td><?= $model->col2 ?></td>
↓モデル名の配列
<td><?= $model->seconds['col1'] ?></td>
<td><?= $model->seconds['col1'] ?></td>
</tr>
<?php endforeach; ?>