Ticket #1603 (closed 新規開発: 修正済)
プラグイン機能(エンジン部分)
| Reported by: | kotani | Owned by: | h_yoshimoto |
|---|---|---|---|
| Priority: | 高 | Milestone: | EC-CUBE2.12.0beta |
| Component: | その他 | Version: | 2.12.0 α |
| Keywords: | Cc: | ||
| 修正済み: | yes |
Description (last modified by h_yoshimoto) (diff)
プラグイン機能開発のうち、エンジン部分の開発。
親チケット #494 プラグイン機能
開発機能一覧
- 各プラグインから各フックポイントに対して処理を登録する機能
- 各プラグインが各フックポイントに登録した処理を実行するディスパッチャ機能
- 各プラグインに用意する差し込みテンプレートを標準テンプレートに差し込んで生成するトランスフォーマー機能
簡易仕様
■ プラグイン機能 ■
★簡単なサンプルのプラグインを添付しておりますので、実際に処理を追って頂ければと思います。
▼ 処理の介入
・処理への介入はフックポイント(ローカルフックポイント、スーパーフックポイント)を使用します。
・プラグインにregist()関数を定義し、介入したい箇所のフックポイントと、コールバック関数をセットします。
▽実行タイミング
・フックポイント通過時にSC_Helper_Pluginが呼ばれ、有効なプラグインのシングルトンインスタンを生成します
・SC_Helper_Pluginは全ての有効なプラグインのインスタンを生成し、フックポイントに応じてセットされているコールバック関数を実行します。
▽フックポイント
- スーパーフックポイント
・全てのページクラスで実行されます。
・使用する際は、関数(preProcess, process)を定義します。
・LC_Page、LC_Page_AdminのpreProcess, process通過時に実行されます。
- ローカルフックポイント
・特定のページの特定箇所で呼び出されるフックポイントでです。使用するにはregist関数を定義します。
・regist関数にフックポイント、コールバック関数を指定します。
・指定したフックポイント通過時に指定のコールバック関数が実行されます。
▼ テンプレートの変更
・テンプレートファイルを解析し、プラグイン側の処理に従って要素を追加、削除し、再度テンプレートを生成します。
・生成されたテンプレートはキャッシュファイルとして配置されます
・ページを読み込む際に、該当ページにキャッシュファイルがある場合、キャッシュファイルを表示します。
・テンプレートに変更を加える場合はplugin側にsetTemplateTransformer関数を定義します。
- setTemplateTransformer関数内には変更するテンプレートの指定、変更箇所(要素)の指定、変更内容を記述したテンプレートの指定を記述します。
・インストール/アンインストール(テンプレート再生成)時に、有効なプラグインのsetTemplateTransformer関数が実行されます。
・変更処理の加わったテンプレートがtemplates_cache/に生成されます。
・Pageクラスはtemplates_cache/以下にキャッシュファイルがある場合はそちらを優先して表示します。
■ ディレクトリ構成 ■
- data/ -+- class/ -+- helper/ -+- SC_Helper_Plugin.php (プラグインヘルパークラス)
|
+- plugin/ -+- SC_Plugin_Template_Selector.php (DOMを使用してテンプレートを生成するセレクタクラス)
| +- SC_Plugin_Template_Transform_List.php (トランスフォーマーを管理するクラス)
| +- SC_Plugin_Template_Transformer.php (トランスフォーマー)
|
+- downloads/ -+- plugin/ -+- 【各プラグインディレクトリ】 -+- プラグインコード.php (プラグインのメインクラスファイル)
+- config.php (設定画面)
+- logo.png (プラグインロゴ)
+- templates_cache/ (キャッシュ格納用ディレクトリ)
+- SC_Plugin_Base.php (プラグイン用基底クラス)
+- tmp/ (プラグインアップデート時のファイル展開用の一時ディレクトリ)
- html/ -+- plugin/ -+- 【各プラグインhtmlディレクトリ】 -+- メディアファイル(js、css等)
+- config.php (設定画面)
+- logo.png (プラグインロゴ)
+- upload/ -+- temp_plugin/ -+- temp_plugin/ (プラグインファイルの一時ディレクトリ)
▼ プラグインファイル
- Sample.tar.gz/ -+- Samlpe/ -+- Sample.php (プラグインメインクラス)
+- config.php (設定クラス)
+- logo.png
▽プラグインメインクラス [必須]
-各処理を定義するプラグインの本体クラス
□定数定義
PLUGIN_NAME :プラグイン名 [必須]
PLUGIN_VERSION :プラグインバージョン
COMPLIANT_VERSION:本体対応バージョン
AUTHOR :作者
DESCRIPTION :説明
PLUGIN_SITE_URL :プラグイン用のサイトURL
AUTHOR_SITE_URL :作者用のサイトURL
FOOK_POINTS :使用するフックポイント
□関数
各関数はそれぞれの(インストール、アップデート等)処理で実行される。プラグイン側で必要に応じた処理を記述する。
install()
インストール時に実行される。
ファイルのコピー、DB更新などをプラグインが必要とする場合は、この処理で行う。
uninstall()
削除時に実行される。
インストール時に作成したファイル、データ等を削除する。
update()
アップデート時に実行される。
enable()
有効へ更新時に実行される。
disable()
無効へ更新時に実行される。
setTemplateTransformer()
テンプレート生成時に実行される。
regist()
SC_Helper_Plugin初期化(ロード)時に実行される。
▽設定クラス(config.php)
config.phpがhtml/plugin/プラグインディレクトリ以下に存在する場合、config.phpへのリンクをプラグイン一覧に表示します.
プラグインに設定画面が必要な場合はconfig.phpを作成し、インストール時にhtml/plugin/プラグインディレクトリ以下に保存して下さい。
▽ロゴファイル(logo.png)
一覧にプラグインロゴを表示させる場合は、logo.pngファイルをインストール時にhtml/plugin/プラグインディレクトリ以下に保存して下さい。
サイズは(65x65)とします。
*ロゴファイルが無い場合はnoimageを表示.
Attachments
Change History
comment:3 Changed 14 years ago by Seasoft
r21395 につきまして、/data/mtb_constants_init.php に対応する SQL の更新が漏れていないでしょうか?
comment:4 Changed 14 years ago by Seasoft
非ログイン状態で /html/admin/home.php へアクセスすると、PHP の致命的エラーで落ちるようです。
Fatal error: Class 'SC_Plugin_Template_Transform_List' not found in ****\data\class\pages\admin\LC_Page_Admin.php on line 92
comment:10 follow-up: ↓ 11 Changed 14 years ago by h_yoshimoto
Seasoft様
ご報告ありがとうございます。
r21473 にて対応いたしました。
よろしくお願いいたします。
comment:11 in reply to: ↑ 10 ; follow-up: ↓ 13 Changed 14 years ago by Seasoft
インデックスを追加していませんか?
インデックスではなく、シーケンスです。
むしろ、インデックスは不要かと。
comment:12 Changed 14 years ago by Seasoft
クラス名とパスの関係が他と相違するようです。
正しいであろう例
SC_Plugin_Template_Selector の場合 /data/class/plugin/Template/SC_Plugin_Template_Selector.php に配置する SC_Plugin_TemplateSelector の場合 /data/class/plugin/SC_Plugin_TemplateSelector.php に配置する
現状
SC_Plugin_Template_Selector を /data/class/plugin/SC_Plugin_Template_Selector.php に配置している
comment:13 in reply to: ↑ 11 Changed 14 years ago by h_yoshimoto
comment:14 follow-up: ↓ 15 Changed 14 years ago by Seasoft
dtb_plugin_hookpoint のキーが PostgreSQL と MySQL で違います。
comment:15 in reply to: ↑ 14 Changed 14 years ago by h_yoshimoto
comment:16 follow-up: ↓ 18 Changed 14 years ago by Seasoft
過去の実装を見ますと、dtb_* テーブルでは「id」という列名を使用しない (言い方を変えれば、アプリケーションで固有の ID 列名で命名する) という法則で一貫してあるように思います。
実際にその法則のお陰で、コミッターやカスタマイズプログラマーは楽をできている面も大きいと感じていますので、dtb_plugin_hookpoint でも、これを維持するのが良いのではないかと感じます。
comment:17 follow-up: ↓ 19 Changed 14 years ago by sunat134
create_table_pgsql.sql について、下記2点確認お願いします。
- dtb_bloc.plugin_id が PostgreSQL のみ NOT NULL になっています。
- dtb_products_class.product_id が PRIMARY KEY になっているにもかかわらず、再度 CREATE INDEX をしているため、エラーになるようです。
comment:18 in reply to: ↑ 16 Changed 14 years ago by h_yoshimoto
Seasoft への返信
過去の実装を見ますと、dtb_* テーブルでは「id」という列名を使用しない (言い方を変えれば、アプリケーションで固有の ID 列名で命名する) という法則で一貫してあるように思います。
実際にその法則のお陰で、コミッターやカスタマイズプログラマーは楽をできている面も大きいと感じていますので、dtb_plugin_hookpoint でも、これを維持するのが良いのではないかと感じます。
ご指摘ありがとうございます。
plugin_hookpoint_idとさせて頂きました
comment:19 in reply to: ↑ 17 ; follow-up: ↓ 20 Changed 14 years ago by sunat134
- dtb_products_class.product_id が PRIMARY KEY になっているにもかかわらず、再度 CREATE INDEX をしているため、エラーになるようです。
すみません、PRIMARY KEY は product_id ではなく product_class_id ですね。
再度確認したところ、UNIQUE 制約に暗黙的に付けられる名前と衝突しているようです。
NOTICE: CREATE TABLE / UNIQUE will create implicit index "dtb_products_class_product_id_key" for table "dtb_products_class"
PostgreSQL 8.3.16
FreeBSD 8.2
comment:20 in reply to: ↑ 19 Changed 14 years ago by h_yoshimoto
sunat134 への返信
- dtb_products_class.product_id が PRIMARY KEY になっているにもかかわらず、再度 CREATE INDEX をしているため、エラーになるようです。
すみません、PRIMARY KEY は product_id ではなく product_class_id ですね。
再度確認したところ、UNIQUE 制約に暗黙的に付けられる名前と衝突しているようです。
NOTICE: CREATE TABLE / UNIQUE will create implicit index "dtb_products_class_product_id_key" for table "dtb_products_class"
PostgreSQL 8.3.16
FreeBSD 8.2
ご報告ありがとうございます!
こちらseasoft様に r21574 にてご対応いただきました。
ご確認よろしくお願いいたします。
comment:21 Changed 14 years ago by h_yoshimoto
- Status changed from assigned to closed
- 修正済み set
- Resolution set to 修正済
#1692 と統合させて頂きますのでクローズします。

