agilephp @ ウィキ

メニュー



目次

第5章 Depotアプリケーション

  • 5.1インクリメンタル開発
  • 5.2Depot基本仕様
  • 5.3コーディング開始

第6章タスクA:商品の管理

第7章タスクB:カタログの表示

第8章タスクC:カートの作成

第9章タスクD:チェックアウト!

第10章タスクE:発送

第11章タスクF:ユーザ管理

第12章タスクT:テスト



リンク



9.2イテレーションD2:チェックアウトページでのカート内容の表示

チェックアウトページにカートの内容一覧を表示します。これはカート内容を表示する 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);
               }
       }

これでカートのイテレーションが完了しました。カートが表示されることを動作確認してみてください。