ROUTE 3390

備忘録的な用途で書いていますが、どなたかの役に立つ事があれば嬉しいです。

モジュールを作ってみた

ためしにMagentoのカスタムモジュールを作成しました。
モジュールの動作は「とあるURLが叩かれた時に、DBのデータを呼び出す」です。

実行するURLはこれです。
[サイトURL]/mymodule/test
MagentoはこういったURLが来たとき、mymoduleをモジュール名
testはコントローラ名と判断します。

もし、[サイトURL]/mymodule/test/aaa というURLだった場合
aaaはアクション名と判断します。


それではまずはコントローラーを作りました。

▼Controller
## app/code/local/Sasakure/Mymodule/controllers/TestController.php ##
<?php
class Sasakure_Mymodule_TestController extends Mage_Core_Controller_Front_Action
{
  function indexAction()
  {
    $test = Mage::getModel('mymodule/test');
    $test->load(1);
  }
}

コントローラーはMage_Core_Controller_Front_Actionを継承するのがお約束です。
今回はアクション名の指定がありません。そんな時はindexAction()が実行されます。
getModelで設定ファイルを読み込み、そこに指定してある通りにモデルオブジェクトを取得しています。
設定ファイルはModelと同じモジュールディレクトリのconfig.xmlです。
パラメータのmymodule/testは後で説明します。

▼config.xml (globalタグだけ抜粋)
## app/code/local/Sasakure/Mymodule/etc/config.xml ##
<global>
  <models>
    <mymodule>
      <class>Sasakure_Mymodule_Model</class>
      <resourceModel>mymodule_mysql4</resourceModel>
    </mymodule>
    <mymodule_mysql4>
      <class>Sasakure_Mymodule_Model_Mysql4</class>
      <entities>
        <test><table>sasakure_test</table></test>
      </entities>
    </mymodule_mysql4>
  </models>
</global>

の中にModel設定を記載します。
今回指定したモデル名であるを作ります。
これがコントローラーでgetModel('mymodule/test')のスラッシュの左側です。
はこの後作成するModelの基底名みたいな感じでしょうか。
このクラス名 + スラッシュの右側のtestが利用するクラス名になっています。
、、、たぶん

なのでこんな感じに作ります。

▼Model
## app/code/local/Sasakure/Mymodule/Model/Test.php ##
class Sasakure_Mymodule_Model_Test extends Mage_Core_Model_Abstract
{
    protected function _construct()
    {
        $this->_init('mymodule/test');
    }
}

ModelはMage_Core_Model_Abstractを継承するのがお約束です。
initで指定しているのは、このModelで使用するリソースです。
スラッシュの左側がconfig.xmlのモデル名、右側がエンティティ名です。
これもお約束として覚えておきます。


それではまた、config.xmlの説明に戻ります。
タグでリソースを指定しています。
の中身がリソース情報です。
今回使用するリソースはデータベース(MySQL)にあるため、Mysqlを操作するためのクラスも必要なんです。

タグには使用するテーブル名を記載しています。


忘れないうちにテーブルを作ってしまいます。

CREATE TABLE `sasakure_test` (
  `sasakure_id` int(10) unsigned NOT NULL AUTO_INCREMENT COMMENT 'Sasakure Id',
  `memo` varchar(255) NOT NULL COMMENT 'Memo',
  PRIMARY KEY (`sasakure_id`)
);
INSERT INTO sasakure_test (memo) VALUES ('KKKKKK');

あとでloadするように1件インサートしておきました。
本来はsqlディレクトリにmysql4-install-0.1.0.phpを作成してテーブルを作ったりするみたいですが、
まだよくわかっていないので、直接SQLを実行して作りました。



ではconfig.xmlで指定したようにMySQLを操作するためのモデルを設けます。

▼Model/Mysql4
## app/code/local/Sasakure/Mymodule/Model/Mysql4/Test.php ##
<?php
class Sasakure_Mymodule_Model_Mysql4_Test extends Mage_Core_Model_Mysql4_Abstract
{
    protected function _construct() {
        $this->_init('mymodule/test', 'sasakure_id');
    }
}

MySQLを操作するためにはMage_Core_Model_Mysql4_Abstractを継承するのがお約束です。
initではModelの時と同じようにリソースを指定します。更にプライマリーキーも指定します。


データの取得方法にはCollectionクラスを用意する方法もあります。
僕はまだよくわかっていませんが、いくつかのテーブルをjoinしたりする際に使う、、、ぽいです、、


最後にモジュールを有効にすればOKです。

▼モジュールを有効に
app/etc/modules/Sasakure_Mymodule.xml
<?xml version="1.0"?>
<config>
  <modules>
    <Sasakure_Mymodule>
      <active>true</active>
      <codePool>local</codePool>
    </Sasakure_Mymodule>
  </modules>
</config>

覚える事が色々とあります。
こういったルールを覚えるまでは大変ですが、PHPの基礎やMVCモデル、データモデルについて
ちゃんと学んできた人には普通の事なのかもしれませんね。


正直、僕みたいにテキトーな開発をしてきた人間にはカスタマイズ出来ません。
ここまで理解するのに数ヶ月かかった(T_T)


このエントリを見て、そんな時間の無駄が少しでもなくなれば幸いです。
でも、間違っていたらご指摘お願いしますw