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

この記事を書いた人

川井 昌彦
川井 昌彦
FAシステムメーカー、国内最大手印刷会社製版部、印刷・ウェブ制作会社を経て、家庭の事情で実家に帰省して独立
現在はフリーランスと制作会社シニアディレクターのマルチワーク
ウェブ制作のほぼ全般を見渡せるディレクター業務が主だが、デザイン・コーディングも好き

1997年ブログ開設
WordPressコミュニティには2011年から参加
WordCamp Kansai 2016 セッションスピーカー
WordCamp Tokyo 2023 パネルディスカッションパネラー
WordBench京都、WordBench神戸、WordPress Meetup八王子など登壇多数

ご質問・ご相談などありましたら
お気軽にお問い合わせください


コメントを残す

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

Vektor Passport(ライセンス期間1年)
VK Filter Search Pro
Vektor WordPress Solutions
PAGE TOP