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ヘルパーメソッド

CakePHP View操作 Formヘルパー」参照

Htmlヘルパーメソッド

CakePHP View操作 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; ?>