Ticket #1603 (closed 新規開発: 修正済)

Opened 12 years ago

Last modified 12 years ago

プラグイン機能(エンジン部分)

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

TopicPath.tar.gz Download (8.6 KB) - added by h_yoshimoto 12 years ago.
サンプルプラグイン(パンくず)

Change History

comment:1 Changed 12 years ago by h_yoshimoto

  • Owner changed from somebody to h_yoshimoto

comment:2 Changed 12 years ago by h_yoshimoto

  • Status changed from new to assigned

comment:3 Changed 12 years ago by Seasoft

r21395 につきまして、/data/mtb_constants_init.php に対応する SQL の更新が漏れていないでしょうか?

comment:4 Changed 12 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:5 Changed 12 years ago by h_yoshimoto

  • Priority changed from to

comment:6 Changed 12 years ago by h_yoshimoto

Seasoft様

ご指摘ありがとうございます。 修正いたしました。 r21416 r21417 r21455 r21458

comment:7 Changed 12 years ago by h_yoshimoto

  • Description modified (diff)

comment:8 Changed 12 years ago by Seasoft

再インストールをできない不具合を修正。r21472

comment:9 Changed 12 years ago by Seasoft

シーケンステーブルコミット漏れしていませんか?

comment:10 follow-up: ↓ 11 Changed 12 years ago by h_yoshimoto

Seasoft様

ご報告ありがとうございます。
r21473 にて対応いたしました。
よろしくお願いいたします。

comment:11 in reply to: ↑ 10 ; follow-up: ↓ 13 Changed 12 years ago by Seasoft

インデックスを追加していませんか?
インデックスではなく、シーケンスです。

むしろ、インデックスは不要かと。

comment:12 Changed 12 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 12 years ago by h_yoshimoto

Seasoft への返信

インデックスを追加していませんか?
インデックスではなく、シーケンスです。

むしろ、インデックスは不要かと。

失礼しました。
r21491 にてコミットさせて頂きました!
ありがとうございます

comment:14 follow-up: ↓ 15 Changed 12 years ago by Seasoft

dtb_plugin_hookpoint のキーが PostgreSQL と MySQL で違います。

comment:15 in reply to: ↑ 14 Changed 12 years ago by h_yoshimoto

Seasoft への返信

dtb_plugin_hookpoint のキーが PostgreSQL と MySQL で違います。

r21561 にて修正いたしました。よろしくお願いいたします。

Changed 12 years ago by h_yoshimoto

サンプルプラグイン(パンくず)

comment:16 follow-up: ↓ 18 Changed 12 years ago by Seasoft

過去の実装を見ますと、dtb_* テーブルでは「id」という列名を使用しない (言い方を変えれば、アプリケーションで固有の ID 列名で命名する) という法則で一貫してあるように思います。

実際にその法則のお陰で、コミッターやカスタマイズプログラマーは楽をできている面も大きいと感じていますので、dtb_plugin_hookpoint でも、これを維持するのが良いのではないかと感じます。

comment:17 follow-up: ↓ 19 Changed 12 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 12 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 12 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 12 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 12 years ago by h_yoshimoto

  • Status changed from assigned to closed
  • 修正済み set
  • Resolution set to 修正済

#1692 と統合させて頂きますのでクローズします。

Note: See TracTickets for help on using tickets.