前回はPHPのコードをまったく書かずに、「あとxx円で送料無料」とカートページに表示する仕組みを準備する例を紹介した。
さすがに「xx円」ではプログラムとは言えないので、今回はこの部分を調整しながらMagento 1のプログラミングを見てみることにしよう。
前回(連載第2回)のコードは eczine-2 のタグを打ってあるので、その段階のものをチェックアウトしてもらえると参照可能だ(本記事執筆時点で、すでにコード自体は先に進んでしまっているので、eczine-2の段階のものを起点として見て欲しい)。
作成しているプログラム自体は、筆者のgithubに公開しておいたので参照願いたい。
ブロッククラスファイルの探索
まずは、前回のコードの中で、テンプレート用に準備した
app/design/frontend/base/default/template/ecgiken/freeshippingby/message.phtml
のファイルを見ていこう。
<div class="ecgiken-freeshippingby-message"> <p>あと<span>xx</span>円で送料無料!!</p> </div>
非常にシンプルなHTMLのコードであり、spanタグで囲まれたxxの部分をPHPのコードで置き換え、動的に表示してやればよいことはすぐにわかってもらえるだろう。
とはいえ、ここがMagento 1での開発でいきなり詰まってしまう部分でもある。たとえば、Magentoのコアファイルのひとつで、カート画面用のテンプレートファイルである
app/design/frontend/base/default/template/checkout/cart.phtml
を眺めてみてほしい。このファイルの中でPHPのコードで置き換えられている部分の大半が、こんな感じのコードになっていることがわかるだろう。
<?php echo $this->... ?>
実際にMagento 1.9.2.4のcart.phtmlで調べてみると、echo ... のパターンとなっている28行中、実に23行(82.1%)が、echo $this->... のパターンとなっているのだ。
つまり、テンプレートファイルをいじろうにも、この $this がいったい何者であるかがわからないと手も足も出ない状態におちいってしまう。
実はこの $this が何者であるかは、前回作成したファイルのひとつ、
app/design/frontend/base/default/layout/ecgiken/freeshippingby.xml
に書いてある。
前回はこのファイルについて簡単な説明を行ったが、今回発生している疑問である $this について書かれている部分はすっとばしていた。
もう一度、内容を確認してみよう。
<?xml version="1.0"?> <layout version="0.1.0"> <checkout_cart_index> <reference name="head"> <action method="addItem"><type>skin_css</type><name>css/ecgiken/freeshippingby.css</name></action> </reference> <reference name="content"> <block type="core/template" name="ecgiken.freeshippingby.checkout.cart" before="-" template="ecgiken/freeshippingby/message.phtml"/> </reference> </checkout_cart_index> </layout>
この中のtemplate="ecgiken/freeshippingby/message.phtml"としている部分が、先ほど出てきたテンプレートファイルであるmessage.phtmlを示している部分だ。そして、$thisを示しているのが、type="core/template"としている部分になるのだ。
core/template と記述があるので、ファイルシステム中から core ディレクトリの直下に template というフォルダがないかを探したあなたは、なかなかいい勘をしている。が、残念ながらMagento 1はそこまで素直ではない。
正解を示す前に、一度 $this が何者かを以下のようにテンプレートファイルを書き換えて調べてみることにしよう。
<div class="ecgiken-freeshippingby-message"> <p>あと<span>xx(を処理するのは<?php echo get_class($this) ?>)</span>円で送料無料!!</p> </div>
この修正を行ったうえで、ブラウザでカートページを表示させてみると(/checkout/cart/)以下のように表示されるはずだ。
これで、$thisは、Mage_Core_Block_Templateというクラスであることがわかった。これとcore/templateという記述を比較すると、なんとなく Block というのが区切りになっていて、後半はTemplateと大文字始まりになっているものを小文字にしたらしいと感じられるかもしれない。
しかし、ここで、Mage_Coreがcoreになるのだと安易に理解してしまうと、理解が中途半端になってしまうので注意しよう。
では、このcoreというのはどこから出てきたのか?