※2011年6月14日 値のクリアについて追記しました
Magentoの「レジに進む」(checkout)に、タブを追加するTipsです。
Onepage checkout の場合です。
Magento のバージョンは、1.4.2 です。
手順は次の通りです。
- Heared4usを導入
- 1.4.2 でデータベースに書き込めるように修正
- 入力フィールドを変更
- 新規注文メールに値が反映されるように修正
それでは順を追って説明していきます。
### 1. Heared4usを導入
Heared4usは、checkoutにタブを追加するエクステンションです。
まず、下記のページからエクステンションをダウンロードします。
(Magentoコネクトには対応していませんので、手動インストールになります)
Adding a new tab under one page checkout – full working module
画像の下にある、「Here is the module itself Inchoo_Heared4us.」の文字をクリックするとZIPファイルがダウンロードできます。
これを展開し、ディレクトリ構造に従ってファイルをアップロードします。
frontendディレクトリは、frontend/(ストア名)/(テーマ名) というふうに、テーマに合わせてアップロードしてください。
本当なら、これだけで終わりになるはずなのですが、残念ながらこのエクステンションは 1.4.2 に対応しておらず、フロントエンドから入力した値がデータベースに書き込まれません。
また、新規注文メールに内容が反映されません。
そこで、修正を加えます。
### 2. 1.4.2 でデータベースに書き込めるように修正
Heared4usのセットアップファイルを下記のように修正します。
app/code/local/Inchoo/Heared4us/sql/mysql4-install-0.1.0.php
<?php $setup = new Mage_Eav_Model_Entity_Setup('core_setup'); $setup->addAttribute('order', 'heared4us', array( 'type' => 'text', 'label' => 'Heared4us', 'visible' => false, 'required' => false, 'user_defined' => false, 'searchable' => false, 'filterable' => false, 'comparable' => false, )); $eavConfig = Mage::getSingleton('eav/config'); $attribute = $eavConfig->getAttribute('order', 'heared4us'); $attribute->setData('used_in_forms', array('checkout_onepage_index')); $attribute->save();
これでデータベースに値が書き込まれるようになるはずなのですが、私が仕組みをよくわかっていないせいか、うまく行きませんでした。
うまく行かなかった場合は、次の2つの作業を行います。
+ MySQLにフィールドを追加
手動でデータベースにフィールドを追加します。コマンドラインでもいいし、phpMyAdmin を使ってもいいでしょう。
対象テーブル:sales_flat_order 追加するフィールド名:heared4us データのタイプ:TEXT
+ app/design/frontend/(ストア名)/(テーマ名)/template/checkout/onepage/heared4us.phtml の先頭に下記を追加
<?php $eavConfig = Mage::getSingleton('eav/config'); $attribute = $eavConfig->getAttribute('order', 'heared4us'); $attribute->setData('used_in_forms', array('checkout_onepage_index')); $attribute->save(); ?>
この2つの作業を行ったら、フロントエンド画面で買い物をしてレジに進みます。
もしかしたら表示がおかしくなるかもしれません。
おかしくなったら、heared4us.phtml に追加した行を削除して元に戻します。
ページをリロードすると、追加タブで入力した値がデータベースに書き込まれるようになります。
(参考:1.4.2.0でフリガナ(カナ)が登録できていないとき
これで、レジに新規タブが追加され、入力した値を管理画面で確認することができるようになります。
### 3. 入力フィールドを変更
変更するのは、次の部分になります。
Heared4us の入力フィールドは、デフォルトでSELECTタグが設定されています。
これは、TEXTで保存されるものであれば他のタグに変更できます。
(INPUT、TEXTAREA など)
テキスト部分は、__(‘text’) の ‘text’ の部分に英文を入れて翻訳ファイルで日本語を設定します。
(__( ) を使用せず、いきなり日本語を設定してもかまいません)
+ フォームの内容
app/design/frontend/(ストア名)/(テーマ名)/template/checkout/onepage/heared4us.phtml
<?php $_options = array( $this->__('Unterwasserwelt.de'), $this->__('Sea Star Online'), $this->__('Sea Star Magazine'), $this->__('Google'), $this->__('YouTube'), $this->__('Referral') ); ?> <select id="getvoice" name="getvoice"> <?php foreach($_options as $_option): ?> <option value="<?php echo $_option ?>"><?php echo $_option ?></option> <?php endforeach; ?> <option id="getvoice-other" value="<?php echo $this->__('Other') ?>"> <?php echo $this->__('Other') ?></option> </select>
SELECTタグを、好きなものに変更してください。
先頭の配列はSELECTタグのオプションの値ですから、不要なら削除してかまいません。
id=’getvoice’ を設定したタグの値が、データベースに設定されます。
id名は、関連するプログラムのあちこちで直に指定されているので、変えてはいけません。
+ タブのタイトル
app/code/local/Inchoo/Heared4us/Block/Onepage/Heared4us.php
'label' => Mage::helper('checkout')->__('xxxx'),
xxxx の部分を任意のものにします。
### 4. 新規注文メールに値が反映されるように修正
Heared4us で入力した値は、注文確定時に自動送信されるメールに反映されません。
理由は、Heared4usがデータベースに値を書き込むタイミングが、メールを自動送信した後になっているからです。
そこで、次のように修正をします。
+ app/code/local/Inchoo/Heared4us/etc/config.xml
checkout_onepage_controller_success_action を、checkout_type_onepage_save_order_after に置換します。
<checkout_type_onepage_save_order_after> <observers> <hooksystem_order_success> <type>singleton</type> <class>heared4us/observer</class> <method>hookToOrderSaveEvent</method> </hooksystem_order_success> </observers> </checkout_type_onepage_save_order_after>
+ app/code/local/Inchoo/Heared4us/Model/observer.php
データベースへの書き込み処理を変更します。
public function hookToOrderSaveEvent($observer) ・・・ // $order = new Mage_Sales_Model_Order(); // $incrementId = Mage::getSingleton('checkout/session')->getLastRealOrderId(); // $order->loadByIncrementId($incrementId); $order = $observer->getEvent()->getOrder();
メールでは、次のようにして、値を取り出すことができます。
{{var order.getHeared4us()}}
**※ 表示の際は、かならずエスケープ処理をしてください。**
(解説)
元のファイルでは、Heared4usがデータベースに値を書き込むのは、「checkout_onepage_controller_success_action」イベントが発生したときです。
このイベントは、注文処理が完了した後に発生するので、すでにメールの自動送信は終わってしまっています。
ところが、Heared4us//observer.php のコード内にあるコメントを見てみると、「checkout_type_onepage_save_order_after」イベントを捕らえると書いてあります。
もしかすると、旧バージョンで何か不具合があって、捕らえるイベントを変更したのかもしれません。
### 5. 注文確定後、値がクリアされるように修正
注文が完了した後続けて次の注文を行うと、Heared4us で入力した値は前回入力した値が残ってしまいます。
他の入力値はクリアされるのですが、Heared4usは他と値の持ち方が違うので、個別にクリアする必要があります。
+ app/code/local/Inchoo/Heared4us/Model/observer.php
空の値をセットします。
public function hookToOrderSaveEvent($observer) ・・・ $order->save(); Mage::getSingleton('core/session')->setInchooHeared4us(); ←空の値をセット }
これで、ひととおりの作業は完了です。
### 6. 残る課題について
これで、通常の流れではうまく動作すると思います。
しかし、実はまだ問題が残っています。
管理画面での注文の新規作成や修正に、Heared4usが表示されないのです。
運用でカバーすることもできるとは思いますが、やはり、他の項目を同じように操作できるのが望ましいと思います。
こちら、解決したら追記させていただきます。
この記事を書いた人
-
FAシステムメーカー、国内最大手印刷会社製版部、印刷・ウェブ制作会社を経て、家庭の事情で実家に帰省して独立
現在はフリーランスと制作会社シニアディレクターのマルチワーク
ウェブ制作のほぼ全般を見渡せるディレクター業務が主だが、デザイン・コーディングも好き
1997年ブログ開設
WordPressコミュニティには2011年から参加
WordCamp Kansai 2016 セッションスピーカー
WordCamp Tokyo 2023 パネルディスカッションパネラー
WordBench京都、WordBench神戸、WordPress Meetup八王子など登壇多数
最新の投稿
ご質問・ご相談などありましたら
お気軽にお問い合わせください
資料請求・お問い合わせにはメールアドレスが必要です
コメントを残す