チェックアウトページにカートの内容一覧を表示します。これはカート内容を表示する display_cartアクションと同じ処理になります。Rails本では render_component が使われていますが、Rails2.Xでは非推奨になってますし、cakePHPに同様の機能もなさそうなのでビューのエレメント機能をつかって実装します。
まずは、display_cartアクションのビューから共通のコードを切り出してエレメント化します。エレメントはapp/views/elements/ディレクトリに ファイルdisplay_cart.ctpで保存。
app/views/elements/display_cart.ctp
<div id="cartmenu">
<ul>
<li><?php echo $html->link(__('ショッピングを続ける', true), array('action' => 'index')); ?></li>
<?php if( ! isset($context) || $context != 'checkout' ){ ?>
<li><?php echo $html->link(__('カートを空にする', true), array('action' => 'empty_cart')); ?></li>
<li><?php echo $html->link(__('チェックアウトする', true), array('action' => 'checkout')); ?></li>
<?php } ?>
</ul>
</div>
<table cellpadding="10" cellspaceing="10">
<tr class="carttitle">
<td rowspan="2">数量</td>
<td rowspan="2">説明</td>
<td colspan="2">価格</td>
</tr>
<tr class="carttitle">
<td>単価</td>
<td>合計</td>
</tr>
<?php foreach( $items as $item ):
$product = $item['product']
?>
<tr>
<td><?php echo $item['quantity'] ?></td>
<td><?php echo __($product['title']) ?></td>
<td align="right"><?php echo $common->fmt_dollars($item['unit_price']) ?></td>
<td align="right"><?php echo $common->fmt_dollars($item['unit_price'] * $item['quantity']) ?></td>
</tr>
<?php endforeach ?>
<tr>
<td colspan="3" align="right"><strong>総計:</strong></td>
<td id="totalcell"><?php echo $common->fmt_dollars($cart->total_price) ?></td>
</tr>
</table>
checkout アクションからこのエレメントが呼ばれたときに不要なリンクを表示しないように4行目にif文で制御しています。$contextは呼び出し側のビューでセットします。
app/views/store/display_cart.ctpから重複するコードを削除してエレメントをコールするようにします。
app/views/store/display_cart.ctp
<h1>カートの表示</h1>
<?php echo $this->element('display_cart'); ?>
app/views/store/checkout.ctp にもエレメントを追加します。このとき変数$contextをセットしてエレメントに渡しています。
app/views/store/checkout.ctp
<?php echo $this->element('display_cart',array('context' => 'checkout')); ?>
<h3>お客様の連絡先と支払い方法をご指定ください</h3>
<?php echo $form->create('Order',array('url'=>'/store/save_order')); ?>
<?php
echo $form->input('name',array('label' => '氏名:','size' => 40));
echo $form->input('email',array('label' => '電子メール:','size' => 40));
echo $form->input('address',array('label' => '住所:','cols'=>40,'rows'=>5));
echo $form->input('pay_type',array('label' => '支払い方法:','empty'=>'支払い方法を指定してください','type'=>'select','options'=& gt;$payment_types ));
?>
<?php echo $form->end('チェックアウト'); ?>
次にstoreコントローラのcheckout()メソッドにエレメントで使用する変数をセットする処理を追加します。
function checkout(){
$this->pageTitle = 'チェックアウト';
$cart = $this->find_cart();
if( count($cart->items()) == 0 ){
$this->redirect_to_index('カートには商品が入っていません');
}else{
$this->set('payment_types',Order::$PAYMENT_TYPES);
$this->set('items', $cart->items());
$this->set('cart', $cart);
}
}
これでカートのイテレーションが完了しました。カートが表示されることを動作確認してみてください。
このwikiの更新情報RSS