第3回 magento cafe plus モジュール開発入門
DESCRIPTION
第3回 Magento Cafe Plus モジュール開発入門で使用した資料です。 Magentoのエクステンション開発の基礎的な内容を扱っています。TRANSCRIPT
Magento-JP User Group 西 宏和
モジュール開発入門
Agenda
• エクステンション開発の難易度
• あると便利なツール
• エクステンションの構成要素
• 簡単なエクステンションの作成
あると便利なツール
• PHPStorm / NetBeans / Eclipse / ZendStudio
• あるいは魔改造されたVimやEmacsなど
• MySQLWorkBench
• Xdebugなどのデバッガ
• VMWareやVirtualBoxのような仮想環境(Windowsの場合)
• Git / SVNのようなバージョン管理システム
デバッグに欠かせないツール
Mage::log() !
m9っ`Д́) ビシッ!!
エクステンション開発の難易度
1. 単にテンプレートの内容を出すもの
2. システム設定を使うもの
3. rewriteを使うもの
4. オリジナルテーブルのデータを扱うもの
5. 決済や物流、外部システムと連携するもの
6. コアの機能をまるごとリプレースするもの
エクステンションの構成要素
• グローバル設定ファイル
• エクステンション設定ファイル
• Block / Helper / Model / Controller
• テンプレート / レイアウトXML / ロケールCSV
• スキンファイル一式(CSS / JS / 画像など)
• PHPライブラリ / JSライブラリ
グローバル設定ファイル
• app/etc/ または app/etc/modulesに配置
• 基本はapp/etc/modulesに配置
• app/etc/ に配置するものは特殊用途
• フルページキャッシュとかVarnish連携とか・・・
例1
<?xml version=“1.0” ?> <config> <modules> <My_Module> <active>true | false</active> <codePool>core | community | local</codePool> <depends> <Mage_Sales/> <Mage_Customer/> </depends> </My_Module> </modules> </config>
エクステンション設定ファイル
• config.xml
• system.xml
• adminhtml.xml
• jstranslator.xml
• 他は次回以降
config.xml
• エクステンション開発時に必ず必要なファイル
• modules / global / frontend / admin / adminhtml / default / crontabセクションから構成
• modulesとglobal以外はなくても可
例2<?xml version=“1.0” ?> <config> <modules> <My_Module> <version>1.0.0</version> </My_Module> </modules> <global> <models> <mymodule><class>My_Module_Model</class></mymodule> </models> <helpers> <mymodule><class>My_Module_Helper</class></mymodule> </helpers> <blocks> <mymodule><class>My_Module_Block</class></mymodule> </blocks> </global> </config>
例2の続き<?xml version=“1.0” ?> <config> <global> <models> <mymodule> <class>My_Module_Model</class> <resourceModel>mymodule_resource</resourceModel> </mymodule> <mymodule_resource> <class>My_Module_Model_Resource</class> <depricatedNode>mymodule_resource_mysql4</depricatedNode> </mymodule_resource> </models> <resources> <mymodule_setup> <setup> <module>My_Module</module> <class>My_Module_Model_Resource_Setup</class> </setup> </mymodule_setup> </resources> </global> </config>
さらに続き<?xml version=“1.0” ?> <config> <adminhtml> <translate> <modules> <My_Module> <files> <default>My_Module.csv</default> </files> </My_Module> </modules> </translate> <layout> <updates> <mymodule> <file>my_module.xml</file> </mymodule> </updates> </layout> </adminhtml> </config>
まだまだ続く<?xml version=“1.0” ?> <config> <frontend> <routers> <mymodule> <use>standard</use> <args> <module>My_Module</module> <frontName>mymodule</frontName> </args> </mymodule> </routers> <layout> <updates> <mymodule> <file>my_module.xml</file> </mymodule> </updates> </layout> </frontend> </config>
system.xml
• システム>設定 の中にあるフォームを定義するXML
• config.xmlに比べると、タグは決まっている
例3
<?xml version="1.0"?> <config> <tabs> <mymodule translate="label" module="mymodule"> <label>MyModule Configuration</label> <sort_order>401</sort_order> </mymodule> </tabs> </config>
例3の続き<sections> <mymodule translate="label" module="mymodule"> <groups> <mymodule translate="label"> <label>MyModule Configuration</label> <frontend_type>text</frontend_type> <sort_order>10</sort_order> <show_in_default>1</show_in_default> <show_in_website>1</show_in_website> <show_in_store>1</show_in_store> <fields> <myparam translate="label"> <label>My Param config</label> <frontend_type>text</frontend_type> <sort_order>10</sort_order> <show_in_default>1</show_in_default> <show_in_website>1</show_in_website> <show_in_store>1</show_in_store> </myparam> </fields> </mymodule> </groups> </mymodule> </sections>
adminhtml.xml
• 管理画面の権限リソースを定義するためのXML
• 実はconfig.xmlに書いても可
• ただし、分けておかないとごちゃごちゃして管理に困る
例4<?xml version="1.0" encoding="UTF-8"?> <config> <menu> <system> <children> <mymodule module="mymodule"> <title>Manage My Module</title> <sort_order>60</sort_order> <children> <mymodule> <title>My Module</title> <sort_order>10</sort_order> <action>adminhtml/mymodule</action> </mymodule> </children> </mymodule> </children> </system> </menu> </config>
続き <acl> <resources> <all> <title>Allow Everything</title> </all> <admin> <children> <mymodule> <children> <mymodule><title>Manage My Module</title></mymodule> </children> </mymodule> </children> </admin> </resources> </acl>
jstranslator.xml
• フロントエンドの入力フォームで使用
• JSによるバリデーションのメッセージ翻訳用
• 1.7以降で利用可能
例5<?xml version="1.0"?> !
<jstranslator> <validate-katakana translate="message" module="validator"> <message>Please use full width Katakana only in this field.</message> </validate-katakana> <validate-hiragana translate="message" module="validator"> <message>Please use Hiragana only in this field.</message> </validate-hiragana> <validate-post translate="message" module="validator"> <message>The length of Zip/Postalcode is %d digits and only numbers are allowed.</message> </validate-post> <validate-post2 translate="message" module="validator"> <message>The length of Zip/Postalcode is %d digits and only numbers and %s are allowed.</message> </validate-post2> </jstranslator>
Block/Model/Helper/Controller
Block/Model/Helper/Controller
• 以下のクラスをベースにして実装
• Mage_Core_Block_Abstract
• Mage_Core_Model_Abstract
• Mage_Core_Helper_Abstract
• Mage_Core_Controller_Front_Action
Blockの実装
• Mage_Core_Block_Abstractにはテンプレートを処理する機能がない
• Mage_Core_Block_Templateはテンプレートを処理できる
• テンプレートを使いたいならTemplate
• ダイレクトにHTMLパーツを出力したいならAbstract
Blockの派生系(一部)
用途 子要素の自動表示
Mage_Core_Block_Template 一般的なテンプレート用 ☓
Mage_Core_Block_Text_List 子要素のリスト表示用 ◯
Mage_Core_Block_Text_Tag タグ生成用 ☓
Mage_Core_Block_Text_Link リンクリスト生成用 (ログインナビとか) ☓
Mage_Core_Block_Text テキスト表示用 ☓
Modelの実装
• Modelには主にビジネスロジックを書く
• DBやファイルのデータを処理するならResourceを定義する
• 外部APIとのやりとりも基本はModelが担当
• Eavとオリジナルテーブルの場合で実装が異なるので注意
• 継承元のクラスも当然異なる
Helperの実装
• My_Module_Helper_Dataは必須
• Mage::helper(‘mymodule’)で暗黙的に呼ばれる
• ロケール変換やsystem.xml, config.xmlの処理でも使用する
• その他、Model/Block/Controllerで共用する処理を書く
Controllerの実装
• controllersディレクトリに配置
• Controllerを使う場合は、config.xmlの定義に注意
• クラス名は、My_Module_controllers_Indexではなく、 My_Module_IndexController
• レイアウトXMLが必要な場合は、loadLayout()やrenderLayout()の呼び出しが必須
簡単なエクステンションの作成
概要
• システム設定データを使うエクステンション
• Modelは使わず、HelperとBlockのみ
実演