イテレーション@wikiホットワード(α)


イテレーション@wiki ホットワード検索結果

  • ツクリ隊 - 作りたいものがある個人と小企業のための開発サークル - お仕事のレシピサービス  
    担当別) 4/28~ 第一イテレーション開発行為(担当別) 5/16 進捗報告・実装済部分の内部公開(担当別) 5/17~ 第二イテレーション開発行為(担当別) 5/30 進捗報告・
    http://www39.atwiki.jp/webdevcircle/pages/19.html
  • agilephp @ ウィキ - 9.1イテレーションD1:注文情報の取得  
    確定した注文を格納するテーブルがまだ無いので作成します。テーブル名はordersとします。 drop table if exists orders; create table orders ( id int not null auto_increment, name varchar(100) not null, email varchar(255) not null, address text not null, pay_type char(10) not null, primary key(id) ); 注文は一つ以上の品目と関係づけられます。よって、line_itemsテーブルからordersテーブルへの外部キーを追加することになります。 drop table if exists line_items; create table line_items ( id int not null auto_increment, product_id int not null, order_id int not null, quantity int not null default 0, unit_price decimal(10,2) not null, constraint fk_items_product foreign key (product_id) references products (id), constraint fk_items_order foreign key (order_id) references orders (id), primary key(id) ); これらの変更を app/db/create.sql に適応してスキーマを更新します。 % mysql -u root dept_develop < app/db/create.sql 次にordersテーブルに対応するOrderモデルを生成します。いままでと同様に bake をつかって生成してください。line_itemsテーブルとの関係、hasMany の指定を行ってください。バリデーションの定義も行うと最終的には以下のようになります。 static 変数のPAYMENT_TYPESは支払い方法の選択肢のリストで、後ほどStoreコントローラで使用します。railsとはkeyとvalueが逆になっていますので注意してください。。続いて line_item.phpのbelongs_toにOrderを追加します。 class LineItem extends AppModel { var $name = 'LineItem'; var $belongsTo = array( 'Product' => array( 'className' => 'Product', 'foreignKey' => 'product_id', 'conditions' => '', 'fields' => '', 'order' => '' ), 'Order' => array( 'className' => 'Order', 'foreignKey' => 'ordert_id', 'conditions' => '', 'fields' => '', 'order' => '' ) ); : : 次に、お客さんから商品発送に必要な情報を取得するためのアクション checkout()をStoreコントローラに実装します。実は、すでにcheckoutはカートのビューを作成したときにリンクを作成していました。 新たに作成したOrderモデルをStoreコントローラで使用しますので$usesに'Order'を追加する必要があります。 var $uses = array('Product','Cart','Order'); function checkout(){ $this->pageTitle = 'チェックアウト'; $cart = $this->find_cart(); $items = $cart->items(); if( count($cart->items()) == 0 ){ $this->redirect_to_index('カートには商品が入っていません'); }else{ $this->set('payment_types',Order::$PAYMENT_TYPES); } } checkout()メソッドではOrder::$PAYMENT_TYPESをビューに渡すためにset()をコールしています。 **cakePHP フォームヘルパー cakePHPはRailsを意識して作られていますが、ヘルパーの仕様はかなり違います。cakePHPでは、Formヘルパーを使うことでフォームの入力フィールドとともにエラーメッセージの機能も同時に提供されます。 app/views/store ディレクトリに次の checkout.ctpを作成します。 select を生成させる方法がいくつかあるようで悩みました。DBに入っている項目を表示する方法はネットで出てきたのですが、ここではクラスに定義したスタティックなリストを使用します。$form->inputで生成させるのが一番分かり易かったのでinput()を採用しました。あと、Formヘルパーのinputを使うと各要素が自動でで囲まれて出てきます。labelで指定した文字はタグで囲まれて表示されますので、デザインはスタイルシートで行う必要があります。(Railsのほうはtableで整形しています)以下のスタイルシートを定義します。 app/webroot/css/depot.css #OrderAddForm label { display: block; float:left; width: 6em; } これでcheckoutアクションができましたが、フォームに入力された値を格納するためのアクションの実装がまだです。 storeコントローラに save_orderメソッドを実装します。 app/controllers/store_controller.php var $uses = array('Product','Cart','Order'); function save_order(){ $cart = $this->find_cart(); $error = true; if( !empty($this->data)){ $data = $this->data; $data['LineItem'] = $cart->items(); $order = $this->Order->saveAll($data); if( !empty($order)){ $error = false; $cart->do_empty(); $this->Session->write('cart',$cart); $this->redirect_to_index('ご注文ありがとうございました'); }else{ $this->Session->setFlash('チェックアウトに失敗しました'); } } if($error){ $this->set('payment_types',Order::$PAYMENT_TYPES); $this->render('/store/checkout'); } } ここでもRailsと大きく違うところがあるので注意してください。railsではOrderモデルのオブジェクトを生成してLineItemのオブジェクトを追加することで関連づけを気にすること無くDBに保存することが出来ました。cakePHPではフォームからの入力データをDBに保存することがモデルのメインの役割になっているので、セッションに保存されているLineItemのオブジェクトはこのままだと一緒に保存されません。 セッションにあるLineItemのオブジェクトをあたかもフォームからのデータのように見せかけて配列に入れ直して保存しています。 注:このままではline_itemsにproduct_id がセットされないことが分かりました。対策としてLineItemモデルのfor_productメソッドでproduct_idをセットするように修正を施します。 app/models/line_item.php class LineItem extends AppModel { var $name = 'LineItem'; var $belongsTo = array( 'Product' => array( 'className' => 'Product', 'foreignKey' => 'product_id', 'conditions' => '', 'fields' => '', 'order' => '' ), 'Order' => array( 'className' => 'Order', 'foreignKey' => 'ordert_id', 'conditions' => '', 'fields' => '', 'order' => '' ) ); static function for_product($product){ $item = array(); $item['quantity'] = 1; $item['product_id'] = $product['id']; # 2009/10/21 追加 $item['product'] = $product; $item['unit_price'] = $product['price']; return $item; } } ?> これにより、saveAll()メソッドをコールするだけでbelongs_toの関係による外部キーのセットが自動でおこなわれ、ordersテーブルにもline_itemsテーブルにもデーターが保存されます。 データベース周りの仕様はRailsの方が洗練されていると思います。RubyとPHPの言語仕様の違いが出ているのでしょうか? 先に、データーのバリデーションの設定も実装してしまっていますので、エラーメッセージ表示に適応するスタイルシートを設定すればカートの実装はエラー処理も含めて完成です。cakePHPのFormヘルパーによるエラーメッセージ表示ではで自動的にエラーメッセージが囲まれますので、スタイルシートには error-messageクラスを定義します。 app/webroot/css/depot.css .error-message{ margin-left:6em; color:red; } これでチェックアウト処理の実装は完了です。実際にテストしてデータベース内のデータをみて外部キーがただしくセットされているか、確認してください。 mysql> select * from line_items; ---- ------------ ---------- ---------- ------------ | id | product_id | order_id | quantity | unit_price | ---- ------------ ---------- ---------- ------------ | 6 | 1 | 22 | 1 | 1000.00 | | 7 | 2 | 23 | 1 | 1680.00 | | 8 | 1 | 23 | 1 | 1000.00 | ---- ------------ ---------- ---------- ------------ 3 rows in set (0.01 sec) mysql> select * from orders; ---- ------------------ ---------------------------- -------------- ---------- | id | name | email | address | pay_type | ---- ------------------ ---------------------------- -------------- ---------- | 22 | 111 | takeshi.fujisawa@gmail.com | 222 | check | | 23 | takeshi fujisawa | takeshi.fujisawa@gmail.com | Toyama Japan | po | ---- ------------------ ---------------------------- -------------- ---------- 2 rows in set (0.00 sec) mysql>
    http://www21.atwiki.jp/agilephp/pages/28.html
  • agilephp @ ウィキ - 11.3イテレーションF3:アクセス制限  
    Authコンポーネントは認証とアクセス制限の両方が同時に実現できてしまいます。そのために複数のコントローラで共有するコントローラの親クラスにAuthコンポーネントの設定を行いました。 loginコントローラはすでにAuthコンポーネントが適応されていますので、残るはproductsコントローラです。productsコントローラにアクセス制限をつけるには loginコントローラ同様にbeforeFilterを定義します。 app/controllers/product_controller.php var $components = array('Auth'); function beforeFilter(){ parent::beforeFilter(); } 以上でアクセス制限が実現できました。 **管理者が一人残らずいなくなると。。。 このままでは管理者をすべて削除できてしまいます。これを防ぐためにモデルないにbeforeDeleteコールバックを定義してdaveというユーザを削除しようとすると例外が発生するようにします。 app/models/user.php function beforeDelete(){ $this->data = $this->find('first', array( 'recursive' => 0, 'conditions' => array($this->name . '.id' => $this->id) )); if( $this->data['User']['name'] == 'dave' ){ throw new Exception("dave を削除することはできません"); return false; }else{ return true; } } ユーザを削除するアクションdelete_userは例外をキャッチしてユーザに知らせます。 app/controlers/login_controller.php function admin_list_users(){ $this->pageTitle = 'ユーザ一覧'; $this->set('lists',$this->User->find('all')); } function admin_delete_user($id){ $rslt = $this->User->find('first',array('conditions' => array('User.id' => $id))); //debug($rslt); try{ $this->User->del($rslt['User']['id']); $this->Session->setFlash(sprintf("ユーザ %s が削除されました",$rslt['User']['name'])); }catch(Exception $e){ $this->Session->setFlash($e->getMessage()); } $this->redirect(array('action' => 'list_users')); } app/views/login/admin_list_users.ctp ユーザ一覧 **サイドバーの更新 サイドバーにこれまでに追加したアクションへのリンクを追加し、ログインしているときのみ表示されるようにします。 app/controllers/login_controller.php function beforeFilter(){ parent::beforeFilter(); $this->set('user',$this->Auth->user()); } beforeFilterで user属性をセットしたので、ビューのなかでuserが定義されていればアクションへのリンクを表示するif文を追加します。 app/views/layout/default.ctp **ログアウト ログアウトアクションの実装も簡単です。 app/controllers/login_controller.php function admin_logout() { $this->Session->setFlash('ログアウトしました'); $this->redirect($this->Auth->logout()); } これでdepotアプリの実装は完了しました。最後の最後にstoreコントローラのリファクタリングをやってみます。 storeコントローラでは indexアクション以外ですべて find_cart()メソッドを呼び出しています。これをbeforeFilterをつかってメソッドからfind_cartの呼び出しを追い出します。 注:いままで$cartで参照してたカートですが、$this->cartに変更する必要があります。(かえってコーディング量が増えているという話もありますが、オリジナルのrails本に従いました。) app/controllers/store_controller.php
    http://www21.atwiki.jp/agilephp/pages/35.html
  • agilephp @ ウィキ - イテレーションA4:もっと美しく  
    ここでビューを変更する必要ができてきました。scaffoldのままでビューをカスタマイズするのは現実的ではなさそうなのでbakeを使用してファイルを生成することにします。 adminコントローラーに変わってProductsコントローラを生成します。管理用のコントローラなので一般用のcrudメソッドは作成せず、admin用のメソッドを生成していることに注目してください。 コントローラを生成するまえにapp/config/core.phpにある次の一行のコメントを外して有効にしてください。 Configure::write('Routing.admin', 'admin') これにより、Productsコントローラーは /admin/product/ というパスでアクセスできるようになります。ちなみに、/products/というパスからはbakeの指定でcrudに対応するメソッド、ビューを生成しないのでアクセスできません。ちなみに、/admin/products/からアクセスされるコントローラ内のメソッドは admin_ から名前が始まり、/products/からアクセスされるメソッドとは区別されています。 pot/cake/console/cake -app ./app bake controller Welcome to CakePHP v1.3.0.0 Console --------------------------------------------------------------- App : app Path: /Users/fujisawatakeshi/opt/apache2/htdocs/depot/./app --------------------------------------------------------------- --------------------------------------------------------------- Bake Controller Path: /Users/fujisawatakeshi/opt/apache2/htdocs/depot/./app/controllers/ --------------------------------------------------------------- Use Database Config: (default/test) [default] > Possible Controllers based on your current database: 1. Products Enter a number from the list above, type in the name of another controller, or 'q' to exit [q] > 1 --------------------------------------------------------------- Baking ProductsController --------------------------------------------------------------- Would you like to build your controller interactively? (y/n) [y] > Would you like to use dynamic scaffolding? (y/n) [n] > n Would you like to create some basic class methods (index(), add(), view(), edit())? (y/n) [n] > n Would you like to create the basic class methods for admin routing? (y/n) [n] > y Would you like this controller to use other helpers besides HtmlHelper and FormHelper? (y/n) [n] > Would you like this controller to use any components? (y/n) [n] > Would you like to use Session flash messages? (y/n) [y] > --------------------------------------------------------------- The following controller will be created: --------------------------------------------------------------- Controller Name: Products --------------------------------------------------------------- Look okay? (y/n) [y] > y Creating file /Users/fujisawatakeshi/opt/apache2/htdocs/depot/./app/controllers/products_controller.php Wrote /Users/fujisawatakeshi/opt/apache2/htdocs/depot/./app/controllers/products_controller.php SimpleTest is not installed. Do you want to bake unit test files anyway? (y/n) [y] > y You can download SimpleTest from http://simpletest.org Bake is detecting possible fixtures.. Creating file /Users/fujisawatakeshi/opt/apache2/htdocs/depot/./app/tests/cases/controllers /products_controller.test.php Wrote /Users/fujisawatakeshi/opt/apache2/htdocs/depot/./app/tests/cases/controllers/products_ controller.test.php つぎに viewを生成します。ここでもadminようのビューのみを生成し、一般のCRUD向けビューは生成しないことに注意してください。 pot/cake/console/cake -app ./app bake view Welcome to CakePHP v1.3.0.0 Console --------------------------------------------------------------- App : app Path: /Users/fujisawatakeshi/opt/apache2/htdocs/depot/./app --------------------------------------------------------------- --------------------------------------------------------------- Bake View Path: /Users/fujisawatakeshi/opt/apache2/htdocs/depot/./app/views/ --------------------------------------------------------------- Use Database Config: (default/test) [default] > Possible Controllers based on your current database: 1. Products Enter a number from the list above, type in the name of another controller, or 'q' to exit [q] > 1 Would you like bake to build your views interactively? Warning: Choosing no will overwrite Products views if it exist. (y/n) [n] > y Would you like to create some CRUD views (index, add, view, edit) for this controller? NOTE: Before doing so, you'll need to create your controller and model classes (including associated models). (y/n) [y] > n Would you like to create the views for admin routing? (y/n) [n] > y Creating file /Users/fujisawatakeshi/opt/apache2/htdocs/depot/./app/views/products/admin_index.ctp Wrote /Users/fujisawatakeshi/opt/apache2/htdocs/depot/./app/views/products/admin_index.ctp Creating file /Users/fujisawatakeshi/opt/apache2/htdocs/depot/./app/views/products/admin_view.ctp Wrote /Users/fujisawatakeshi/opt/apache2/htdocs/depot/./app/views/products/admin_view.ctp Creating file /Users/fujisawatakeshi/opt/apache2/htdocs/depot/./app/views/products/admin_add.ctp Wrote /Users/fujisawatakeshi/opt/apache2/htdocs/depot/./app/views/products/admin_add.ctp Creating file /Users/fujisawatakeshi/opt/apache2/htdocs/depot/./app/views/products/admin_edit.ctp Wrote /Users/fujisawatakeshi/opt/apache2/htdocs/depot/./app/views/products/admin_edit.ctp --------------------------------------------------------------- View Scaffolding Complete. /admin/products/で以前と同じビューが表示されれば成功です。 adminコントローラはこれで不要になりますので削除しておきましょう。 デフォルトのテンプレートは cake/libs/view/layouts/default.ctp になります。これを自分のアプリケーションのディクレクトリ app/views/layouts/にコピーして修正を行います。 app/webroot/css/scaffold.cssを作成してスタイルの定義を行います。 .products table{ border: none; } .products table tr td { text-align:left; border: none; background: none; } .ListTitle { color: #244; font-weight: bold; font-size: large; } .ListActions { font-size: x-small; text-align: right; padding-left: 1em; } .ListLine0 { background: #e0f8f8; } .ListLine1 { background: #f8b0f8; } default.ctpの中ののなかに echo $html->css('cake.generic');という記述がありますので、その下に今作成したscaffold.cssを読み込ませるためのコードを追加します。 echo $html->css('scaffold'); コントローラにビューで使用するヘルパーを定義ます。Productsコントローラーに$helpersが定義されていますので、これに Text,Number,Timeを追加します。 app/controllers/products_controller.php var $helpers = array('Html', 'Form','Text','Number','Time'); P70 ,P71のデザイン、レイアウトのあわせて修正するとビュー(app/views/products/admin_index.ctp)はこうなります。 商品一覧
    http://www21.atwiki.jp/agilephp/pages/17.html
  • agilephp @ ウィキ - 11.2イテレーションF2:ログイン|Authコンポーネント  
    ユーザ登録機能が実装できたところでログイン機能を追加します。cakePHPには認証用の[[Authコンポーネント>>http://book.cakephp.org/ja/view/172/Authentication]]が最初からありますのでこれを使用します。Authコンポーネントでは users テーブルの列名にルールがあるなどrails本とは異なる規約に従うほうがスムーズにいくのですが、あえてオリジナル本のアプリの実装を再現する方向で試みます。 管理者向けに提供されている機能のコントローラーはproductsとloginの二つあります。両方にAuthコンポーネントが適応されるように スパークラスであるapp/app_controler.phpを作成し、beforeFilter()に共通の設定を行います。 app/app_controller.php 共通の設定ができたところでloginコントローラーにloginアクションを定義します。Authコンポーネントをつかうと非常に簡単でただメソッドを追加するだけです。 app/controllers/login_controller.php var $components = array('Auth'); function beforeFilter(){ parent::beforeFilter(); // 暫定 //$this->Auth->allow('*'); } function admin_login(){ } このままだと add_userアクションに最初から認証がかかってしまいユーザ登録する前にユーザ認証をおこなってしまうので暫定的に $this->Auth->allow("*")で認証を外しておき、add_userでユーザ登録を行った上で$this->Auth->allow("*")をコメントアウトしてください。ちなみにAuthコンポーネントでは login,logoutアクションは最初からアクセス制限はかからないように設定されています。 対応するビューapp/views/login/admin_login.ctp は以下のようになります。 app/views/login/admin_login.ctp 加えてapp_controller.php内でログイン後のリダイレクト先である"/admin/login/login/に対応するadmin_index()メソッドも作成します。loginコントローラにadmin_index()メソッドを以下のように定義します。 app/controllers/login_controller.php function admin_index(){ $this->pageTitle = 'ストア管理'; $this->set('total_orders',$this->Order->count()); $this->set('pending_orders',$this->Order->count_pending()); } Orderモデルのcount()とcount_pending()を使用していますがまだ実装されていませんのでメソッドを追加します。 app/models/order.php function count(){ return $this->find('count'); } function count_pending(){ return $this->find('count', array('conditions' => array('Order.shipped_at' => null))); } そういえば10章でOrderモデルへのpending_shipping()メソッドの実装ができないと書きましたが、$this->find()を知らなかっただけのようです。pending_shipping()を実装すると以下のようになります。 function pending_shipping(){ return $this->findAllByShippedAt(NULL); } 話がそれました。admin_indexアクションで注文数と発送待ちの注文を表示します。 app/views/login/admin_index.ctp Depot ストアの現状 システム内の注文の総数: 発送待ちの注文の件数: これでログイン処理の実装が完了しました。
    http://www21.atwiki.jp/agilephp/pages/34.html
  • agilephp @ ウィキ - 11.1イテレーションF1:ユーザーの追加  
    まずは、ユーザを登録するデータベーステーブルを作成します。 app/db/create.spl drop table if exists users ; create table users( id int not null auto_increment, name varchar(100) not null, hashed_password char(40) null, primary key (id) ); %mysql -u root -p depot_development < app/db/create.sql 次に対応するモデルを作成します。今回はbakeを使わない方が簡単なので、手入力で作成します。 app/models/user.php **コントローラーの作成 新規にloginコントローラをつくってユーザ管理に関する機能を集約します。 % cake/console/cake -app ./app bake controller Notice: Undefined offset: 0 in /Applications/MAMP/htdocs/depot/cake/console/libs/shell.php on line 156 Welcome to CakePHP v1.2.4.8284 Console --------------------------------------------------------------- App : app Path: /Users/fujisawa/MAMP/htdocs/depot/./app --------------------------------------------------------------- --------------------------------------------------------------- Bake Controller Path: /Users/fujisawa/MAMP/htdocs/depot/./app/controllers/ --------------------------------------------------------------- Possible Controllers based on your current database: 1. LineItems 2. Orders 3. Products 4. Users Enter a number from the list above, type in the name of another controller, or 'q' to exit [q] > Login --------------------------------------------------------------- Baking LoginController --------------------------------------------------------------- Would you like to build your controller interactively? (y/n) [y] > n Would you like to include some basic class methods (index(), add(), view(), edit())? (y/n) [y] > n --------------------------------------------------------------- The following controller will be created: --------------------------------------------------------------- Controller Name: Login --------------------------------------------------------------- Look okay? (y/n) [y] > Creating file /Users/fujisawa/MAMP/htdocs/depot/./app/controllers/login_controller.php Wrote /Users/fujisawa/MAMP/htdocs/depot/./app/controllers/login_controller.php Baking unit test for Login... Creating file /Users/fujisawa/MAMP/htdocs/depot/./app/tests/cases/controllers/login_controller.test.php Wrote /Users/fujisawa/MAMP/htdocs/depot/./app/tests/cases/controllers/login_controller.test.php login コントローラにはユーザ管理に必要なアクション(ログイン、ユーザ一覧、削除、追加)を実装します **ユーザの追加 ユーザを追加する機能(add_userアクション)はadd_user()メソッドで実装します。add_userメソッドでは入力パラメータの有無でフォームの表示なのかデータの追加なのかを判断します。 app/controllers/login_controller.php class LoginController extends AppController { var $name = 'Login'; var $uses = array('User'); var $helpers = array('Html', 'Form'); function admin_add_user(){ $this->pageTitle = 'ユーザの追加'; if (empty($this->data)){ // フォームを表示 }else{ if( $this->User->save($this->data) ){ $this->Session->setFlash("ユーザ $this->data['User']['name'] が作成されました"); $this->redirect('/admin/login/add_user'); } } } } 対応するビュー app/views/login/admin_add_user.ctp を作成します。 app/views/login/admin_add_user.ctp $form->password() を使うとinput()で出力されるが出力されません。ここではinput()で統一することにします。 **モデルの修正 usersテーブルにデータを格納するまえにユーザが入力したパスワードをハッシュ文字列に変換しなくてはいけませんし、入力チェクも必要です。ハッシュへの変換は beforeSave() コールバックを使います。 app/modesl/user.php これでデータベースに追加される前にパスワードがハッシュ値に変換されます。実際にデータを追加してデータベースにユーザが追加されていれば正常動作しています。
    http://www21.atwiki.jp/agilephp/pages/33.html
  • agilephp @ ウィキ - 10.1イテレーションE1:基本的な発送処理  
    発送日がセットされているかどうかでその商品の発送ステータスを判断するので、ordersテーブルに発送日を格納する列 shipped_atを追加します。 app/db/create.sql create table orders ( id int not null auto_increment, name varchar(100) not null, email varchar(255) not null, address text not null, pay_type char(10) not null, shipped_at datetime null, primary key(id) ); % mysql -u root -p depot_development < app/db/create.sql **OrderとProductのリレーションの設定 発送処理ではリクエストがあったらまずオーダーごとに発送待ちの注文の商品の商品タイトルの一覧を表示します。そのためにはProductモデルの属性であるタイトルをしゅとくするひつようがあります。ただ、railsでは li.product.title をLineItem経由で取得できていますが、cakePHPでは line_items belongs to product の関係では LineItemモデル経由でProductモデルの属性は取得できないようです。したがって、OrderモデルとProductモデルをHABTMで関連づけます。(ほかにいい方法があるかも。。) app/modesl/order.php var $hasAndBelongsToMany = array( 'Products' => array( 'className' => 'Products', 'joinTable' => 'line_items', 'foreignKey' => 'order_id', 'associationForeignKey' => 'product_id', ) ); **shipメソッドの作成 まずは発送待ちの注文の一覧を表示するためのアクションshipを実装します。 products コントローラにadmin_ship()メソッドを実装します。(ship()ではないので注意してください) app/controllers/product_controller.php function admin_ship(){ $pending_orders = $this->Order->findAllByShippedAt(NULL); $this->set('pending_orders',$pending_orders); } rails のほうではモデルに pending_shippingというメソッドを追加して shipped_atがNULLのデータのみ返すようにしていますが、cakeではコントローラー内で
    http://www21.atwiki.jp/agilephp/pages/31.html
  • agilephp @ ウィキ - 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 数量 説明 価格 単価 合計 総計: checkout アクションからこのエレメントが呼ばれたときに不要なリンクを表示しないように4行目にif文で制御しています。$contextは呼び出し側のビューでセットします。 app/views/store/display_cart.ctpから重複するコードを削除してエレメントをコールするようにします。 app/views/store/display_cart.ctp カートの表示 app/views/store/checkout.ctp にもエレメントを追加します。このとき変数$contextをセットしてエレメントに渡しています。 app/views/store/checkout.ctp お客様の連絡先と支払い方法をご指定ください
    http://www21.atwiki.jp/agilephp/pages/29.html
  • agilephp @ ウィキ - 8.5イテレーションC3:カートの仕上げ  
    カートを空にするアクションをstoreコントローラに実装します。 store コントローラにempty_cart() メソッドを実装します。実際に空にする処理はCartクラスに任せます。オリジナル本ではempty!メソッドをCartクラスに定義していますが、PHPではこの名前は使えませんのでdo_empty()とします。 app/contorller/store_controller.php function empty_cart(){ $cart = $this->find_cart(); $cart->do_empty(); $this->Session->write('cart',$cart);; $this->redirect_to_index('カートが空になりました'); } private function redirect_to_index($msg = null){ if($msg != null){ $this->Session->setFlash($msg); } $this->redirect('/store/'); } フラッシュにメッセージを格納してindexページにリダイレクトする処理が他にも2カ所ありますのでここはredirect_to_index()というプライベートメソッド作ってまとめてみましょう。 empty_cart() メソッド内でCartクラスのdo_empty()メソッドをコールしていますが、これもまだ未実装ですのでCartモデルにdo_empty()メソッドを実装します。 app/models/cart.php function do_empty(){ $this->items = array(); $this->total_price = 0.0; } この処理はCartモデルの $items,$total_priceを初期化する手続きと同じです。重複したロジックですのでCartモデルのコンストラクター内でdo_empty()メソッドを呼ぶことで共通化をおこないます。 app/models/cart.php var $items,$total_price; function __construct(){ $this->do_empty(); } **ヘルパー つぎにカートページの金額表示を$表記に修正します。cakePHPにはもともと通貨フォーマットで表示するヘルパー Numberがあるのですが、勉強のためにここでは独自にヘルパーをつくることにします。 app/views/helpers/ディレクトリにファイル common.php を作成します。 app/views/helpers/common.php そして、storeコントローラにこのヘルパーを登録します。 app/controllers/store_controller.php var $helpers = array('Html','Form','Number','Common'); 最後に、カート表示用のビュー app/views/store/display_cart.php を編集してこのヘルパーを適応します。 app/views/store/display_cart.php カートの表示 数量 説明 価格 単価 合計 総計: 以上、でカート表示のときに金額がドル表記されるようになりました。(円表記にしようかとなやみましたがオリジナル本に従いドル表記にしました。)
    http://www21.atwiki.jp/agilephp/pages/26.html
  • agilephp @ ウィキ - 7.2イテレーションB2:ページに装飾を追加  
    いままではcakePHPのデフォルトのレイアウトを使っていましたが、お客様に見せるページは奇麗な体裁にしなくてはいけません。本来はデザイナーの仕事ですがオリジナル本でもやっているようにとりあえずのプレースホルダーとして新しくレイアウトを作ってみることにします。 そのまえに app/webroot/css/dept.cssを作成します。dept.cssのなかみはオリジナル本のP521に記載されている内容です。 オリジナルのCSSファイルはネットからダウンロードできます。URLは以下になります。(2009/10/26) http://media.pragprog.com/titles/rails/code/rails-code.zip depot.cssのソースは[[こちら>http://code.google.com/p/agile-with-cakephp/source/browse/trunk/app/webroot/css/depot.css]]。 depot.cssが用意できたらapp/views/layouts/store.ctpを作成します。
    http://www21.atwiki.jp/agilephp/pages/20.html
[PR]

イテレーション関連

新着ワード

素手(13時50分10秒)
福耳(13時50分10秒)
帯-桜市松 bk11L(13時50分10秒)
ワンピース(13時50分09秒)
映画(13時50分09秒)
タイラント(13時50分08秒)
プレート(13時50分08秒)
エントリーシート(13時50分08秒)
天テレ(13時50分07秒)
え?あぁ、そう。(13時50分07秒)
メイドに微笑んで欲しいなら銭を積め(13時50分07秒)
数独(13時50分07秒)
こざとへん の漢字一覧(13時50分07秒)
メイドに微笑んで欲しいなら銭を積め(13時50分07秒)
やっとこ(13時50分06秒)
煌黒龍の天鱗(13時50分06秒)
家電(13時50分05秒)
自分(13時50分05秒)
パイレーツ(13時50分05秒)
澪ママ(13時50分04秒)
日本ダービー(13時50分03秒)
修正依頼(13時50分03秒)
クリストフ(13時50分02秒)
ハンディキャップ(13時50分01秒)
エクセル(13時50分01秒)
大阪(13時50分01秒)
煌黒龍の天鱗(13時50分01秒)
三瓶由布子(13時49分59秒)
オク 落札品は保証なし(13時49分59秒)
投げナイフ(13時49分59秒)
極彩(13時49分59秒)
オク 落札品は保証なし(13時49分58秒)
簡単な攻略(13時49分58秒)
ドラゴンストーン(13時49分58秒)
編集履歴(13時49分58秒)
ポケモン(13時49分58秒)
放置(13時49分57秒)
SAI 無料ダウンロード(13時49分57秒)
結果(13時49分57秒)
ヴェスペ(13時49分57秒)
澪ママ(13時49分57秒)
学園(13時49分57秒)
黄祖(13時49分57秒)
坂本(13時49分56秒)
継続(13時49分56秒)
ミリオン(13時49分56秒)
浪人生(13時49分55秒)
不具合(13時49分55秒)
ヨーロッパ(13時49分55秒)

オススメ価格情報

Webサービス by Yahoo! JAPAN