第4回magento cafe plus〜rewriteと独自テーブル

28
Magento-JP User Group 西 宏和 モジュール開発入門2

Upload: hirokazu-nishi

Post on 04-Jul-2015

221 views

Category:

Technology


0 download

DESCRIPTION

第4回Magento Cafe Plusで使用した資料です。 Rewriteと独自テーブルを使う方法について説明しています。

TRANSCRIPT

Page 1: 第4回Magento Cafe Plus〜Rewriteと独自テーブル

Magento-JP User Group 西 宏和

モジュール開発入門2

Page 2: 第4回Magento Cafe Plus〜Rewriteと独自テーブル

Agenda

• Rewriteの仕組み

• 独自テーブルを使うエクステンション

Page 3: 第4回Magento Cafe Plus〜Rewriteと独自テーブル

Rewriteの仕組み

Page 4: 第4回Magento Cafe Plus〜Rewriteと独自テーブル

普通にPHPでクラスを呼び出すときは・・・

$foo = new Foo(引数何か);

Page 5: 第4回Magento Cafe Plus〜Rewriteと独自テーブル

Magentoのクラス呼び出し

$block = Mage::getBlock(‘catalog/product_view’);

$model = Mage::getModel(‘catalog/product’);

$helper = Mage::helper(‘catalog/output’);

Page 6: 第4回Magento Cafe Plus〜Rewriteと独自テーブル

Magentoのクラス呼び出し

• newを使ってインスタンス作成することはあまりない

• Mageクラスのメソッドまたはそれをラップしたメソッドを使うのが一般的

• 完全なクラス名を指定することはしない

• 常にクラスの別名を使用する

• そもそもPHP5.2時代の設計なので名前空間の概念がない

Page 7: 第4回Magento Cafe Plus〜Rewriteと独自テーブル

Rewriteとは?

• Magento上のクラス呼び出しを置き換える仕組み

• クラスAのインスタンスを呼び出す際に、実際はクラスBのものが返る

Page 8: 第4回Magento Cafe Plus〜Rewriteと独自テーブル

Rewriteを使うメリット

• 呼び出し側のクラスを変更する必要がない

• RewriteしたクラスはRewrite元クラスを継承することで実装量を減らすことができる

Page 9: 第4回Magento Cafe Plus〜Rewriteと独自テーブル

Rewriteの制限とデメリット

• Rewriteは1クラス1回しかできない

• Rewriteの定義は後から定義したものが有効になる

• 同じクラスをRewriteしようとしてエクステンション同士が衝突するのは日常茶飯事

• AbstractクラスはRewriteできない

• なぜなら呼び出しメソッドで使用しないから

Page 10: 第4回Magento Cafe Plus〜Rewriteと独自テーブル

Rewriteの基本的な仕組み

1.呼び出しメソッドのコール

2.設定データからRewrite定義判定

3.Rewrite定義がある場合は定義されているクラスのインスタンスを作成

4.ない場合は標準の定義クラスのインスタンスを作成

Page 11: 第4回Magento Cafe Plus〜Rewriteと独自テーブル

Model/Block/HelperのRewrite<config> <global> <blocks> <catalog> <rewrite> <product_view> Mymodule_Sample_Block_Catalog_Product_View </product_view> </rewrite> </catalog> </blocks> </global> </config>

Page 12: 第4回Magento Cafe Plus〜Rewriteと独自テーブル

ControllerのRewrite(その1)

<config> <global> <rewrite> <Mymodule_Example_ExampleController> <from><![CDATA[#/\w+/sales_order/print/#]]></from> <to>/example/example/print/</to> </Mymodule_Example_ExampleController> </rewrite> </global> </config>

Page 13: 第4回Magento Cafe Plus〜Rewriteと独自テーブル

ControllerのRewrite(その2)<config> <frontend> <routers> <example> <use>standard</use> <args> <module>Mymodule_Example</module> <frontName>example</frontName> </args> </example> <contacts> <args> <modules> <Mymodule_Example before="Mage_Contacts">Mymodule_Example</Mymodule_Example> </modules> </args> </contacts> </routers> </frontend> </config>

Page 14: 第4回Magento Cafe Plus〜Rewriteと独自テーブル

Rewriteでバージョン違いを考慮する必要

• 基本、Rewriteは1クラスにつき1回

• クラス・メソッドによってはバージョンで実装が全く異なる物がある

• 引数が違うものはバージョンが違うと致命的

• つまり、Magentoのバージョン違いを考慮しないと危険なことがある

Page 15: 第4回Magento Cafe Plus〜Rewriteと独自テーブル

バージョン別Rewriteをするには

• Observerでバージョンを判定して振り分ける

• Mage::getConfig()->setNode(‘global/models/catalog/rewrite/product_view’, ‘Myextension_Sample_Model_Catalog_Product_View’);のように書く

Page 16: 第4回Magento Cafe Plus〜Rewriteと独自テーブル

独自テーブルを使うエクステンション

Page 17: 第4回Magento Cafe Plus〜Rewriteと独自テーブル

独自テーブルを使うために必要なこと

• ResourceModelの作成

• config.xmlの定義追加

• セットアップSQLスクリプトの記述

Page 18: 第4回Magento Cafe Plus〜Rewriteと独自テーブル

ResourceModelの作成

• Modelディレクトリ下にResourceディレクトリを作る

• Mage_Core_Model_Resource_Db_Abstractを継承したクラスを定義する

• _constructメソッドにマッピングするテーブル名と主キー列を書く

Page 19: 第4回Magento Cafe Plus〜Rewriteと独自テーブル

サンプルコード

class Myextension_Sample_Model_Resource_Sample extends Mage_Core_Model_Resource_Db_Abstract { protected function _construct() { $this->_init('sample/sample', 'sample_id'); } !

~以下略~ }

Page 20: 第4回Magento Cafe Plus〜Rewriteと独自テーブル

Collectionクラスの作成

• Collectionクラスは結果セットを取得するために使用する

• Collectionクラスを定義したいResourceクラスのファイル名(拡張子除く)でディレクトリを作り、その中にCollection.phpを作る

Page 21: 第4回Magento Cafe Plus〜Rewriteと独自テーブル

サンプルコード

class Myextension_Sample_Model_Resource_Sample_Collection extends Mage_Core_Model_Resource_Db_Collection_Abstract { protected function _construct() { $this->_init('sample/sample'); } !

~以下略~ !

}

Page 22: 第4回Magento Cafe Plus〜Rewriteと独自テーブル

config.xmlへの定義追加<config> <global> <models> <sample> <class>Myextension_Sample_Model</class> <resourceModel>sample_resource</resourceModel> </sample> <sample_resource> <class>Myextension_Sample_Model_Resource</class> <deprecatedNode>sample_mysql4</deprecatedNode> <entities> <sample> <table>myext_sample</table> </sample> </entities> </sample_resource> </models> <resources> <sample_setup> <setup> <module>Myextension_Sample</module> <class>Mage_Eav_Model_Entity_Setup</class> </setup> <connection><use>core_setup</use></connection> </sample_setup> </resources> </global> </config>

Page 23: 第4回Magento Cafe Plus〜Rewriteと独自テーブル

セットアップSQLスクリプトの作成

• エクステンションのディレクトリにsql(またはdata)ディレクトリを作る

• 「<エクステンション別名>_setup」というディレクトリをその中に作る

• install-x.x.x.phpは最初に実行されるスクリプト

• upgrade-x.x.x-y.y.y.phpはエクステンションのアップデート時に実行される

• x.x.xやy.y.yはエクステンションのバージョン番号と連動する

Page 24: 第4回Magento Cafe Plus〜Rewriteと独自テーブル

サンプルスクリプト$installer = $this; $installer->startSetup(); !

$installer->run( "CREATE TABLE `{$this->getTable(‘sample/sample')}` ( `sample_id` int(10) unsigned NOT NULL AUTO_INCREMENT, `store_id` int(10) unsigned NOT NULL, `comment` text, `created_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, `update_time` timestamp NOT NULL DEFAULT '0000-00-00 00:00:00', `status` int(10) unsigned NOT NULL PRIMARY KEY (`sample_id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8; "); !

$installer->endSetup();

Page 25: 第4回Magento Cafe Plus〜Rewriteと独自テーブル

またはOOP的に・・・$installer = $this; $installer->startSetup(); !$table = $installer->getConnection() ->newTable($installer->getTable('sample/sample')) ->addColumn('sample_id', Varien_Db_Ddl_Table::TYPE_INTEGER, null, array( 'identity' => true, 'unsigned' => true, 'nullable' => false, 'primary' => true, ), 'Sample ID') ->addColumn('store_id', Varien_Db_Ddl_Table::TYPE_SMALLINT, null, array( 'unsigned' => true, 'nullable' => false, 'default' => '0', ), 'Store ID') ->addColumn('comment', Varien_Db_Ddl_Table::TYPE_TEXT, 65536, array( 'nullable' => false, 'default' = “”, ), ’Comment’) ->addColumn('created_at', Varien_Db_Ddl_Table::TYPE_TIMESTAMP, null, array( ), 'Creation Time') ->addColumn('updated_at', Varien_Db_Ddl_Table::TYPE_TIMESTAMP, null, array( ), 'Update Time') ->addIndex($installer->getIdxName('sample/sample', array(‘sample_id'))) ->setComment('Sample Table'); $installer->getConnection()->createTable($table); !$installer->endSetup();

Page 26: 第4回Magento Cafe Plus〜Rewriteと独自テーブル

画面の作成

• 管理画面を作る際は、GirdとFormを理解することが必要

• Magentoの管理画面フォームなどは比較的テンプレートレスで書ける

• 場合によってはレイアウトXMLも不要

• フロントエンドの場合はマークアップも含めて開発者が実装(これが割とめんどくさい)

Page 27: 第4回Magento Cafe Plus〜Rewriteと独自テーブル

実演

Page 28: 第4回Magento Cafe Plus〜Rewriteと独自テーブル

おわり