Magentoの「レジ」にタブを追加する

※2011年6月14日 値のクリアについて追記しました
Magentoの「レジに進む」(checkout)に、タブを追加するTipsです。
Onepage checkout の場合です。
Magento のバージョンは、1.4.2 です。
手順は次の通りです。

  1. Heared4usを導入
  2. 1.4.2 でデータベースに書き込めるように修正
  3. 入力フィールドを変更
  4. 新規注文メールに値が反映されるように修正

それでは順を追って説明していきます。
### 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が表示されないのです。
運用でカバーすることもできるとは思いますが、やはり、他の項目を同じように操作できるのが望ましいと思います。
こちら、解決したら追記させていただきます。

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です