SOY Shopプラグインの解説 拡張ポイントについて
前回まででextensionsにあったsoyshop.***.phpを継承したファイルについてでしたが、
このファイルがどのように読み込まれているか?の説明をしていきます。
たとえば、soyshop.item.option.phpを見るとして、
/src/logic/plugin/logic/soyshop.item.option.phpを開くと、
SOYShopItemOptionBaseクラスとSOYShopItemOptionDeletageActionクラスがあって、
ファイルの末尾に
SOYShopPlugin::registerExtension("soyshop.item.option", "SOYShopItemOptionDeletageAction");
と書いて、インターフェースと拡張ポイントでの処理を決めています。
SOY Shop本体にある拡張ポイントの方を見ます。
今回はsoyshop.item.optionの拡張ポイントを見るとして、
/soyshop/webapp/src/base/cart/cart.phpを開くと、
SOYShopPlugin::load("soyshop.item.option");
と
SOYShopPlugin::invoke("soyshop.item.option", array(
"mode" => "post",
"index" => max(array_keys($cart->getItems())),
"cart" => $cart
));
といった処理があります。
load→invokeとすることで拡張ポイントが用意されており、
invokeの第二引数の配列で処理についてを渡します。
今回はモードがpostでindexとcartの値を渡しています。
/soyshop/webapp/src/logic/plugin/extensions/soyshop.item.option.phpを開いて、
SOYShopItemOptionDeletageActionクラスのrun関数の処理を見ると
function run($extetensionId, $moduleId, SOY2PluginAction $action){
switch($this->mode){
case "clear":
$action->clear($this->index, $this->cart);
break;
case "compare":
$this->_id = $action->compare($this->option, $this->cart);
break;
case "post":
$action->doPost($this->index, $this->cart);
break;
case "item":
$this->_htmls = $action->onOutput($this->htmlObj, $this->index);
break;
case "order":
$this->_attributes = $action->order($this->index);
break;
case "addition":
$this->_addition = $action->addition($this->index);
break;
case "display":
$this->_htmls = $action->display($this->item);
break;
case "edit":
default:
$this->_label = $action->edit($this->key);
break;
}
}
渡したモードでswitch文があります。
今回はmodeにpostを入れたからcase "post"を見ると、
$action->doPost($this->index, $this->cart);
となっているので
class SOYShopItemOptionBase implements SOY2PluginAction{
function clear($index, CartLogic $cart){}
function compare($index, CartLogic $cart){}
function doPost($index, CartLogic $cart){
//この関数が呼び出される
}
/**
* onOutput
*/
function onOutput($htmlObj, $index){}
function order($index){}
function display($item){}
function edit($key){}
function addition($index){}
}
SOYShopItemOptionBaseクラスのdoPost関数が呼び出される
ということになります。
商品オプションプラグインでこのクラスが継承されたファイルは
/soyshop/webapp/src/module/plugins/common_item_option/soyshop.item.option.php
になり、
soyshop.item.option.phpのdoPost関数内のスクリプトが読まれることになります。
SOYShop_Plugin::load関数の第二引数で特定のプラグインを指定しなければ、
拡張ポイントでインストールしているプラグインでsoyshop.item.option.phpを持つプラグインはすべて読み込まれます。
追記
load関数でプラグインが指定されている例
/soyshop/webapp/src/logic/CartLogic.class.phpの292行目付近の
$pluginDao = SOY2DAOFactory::create("plugin.SOYShop_PluginConfigDAO");
try{
$plugin = $pluginDao->getByPluginId($pluginId);
}catch(Exception $e){
return false;
}
if($plugin->getIsActive() == SOYShop_PluginConfig::PLUGIN_INACTIVE) return false;
SOYShopPlugin::load("soyshop.tax.calculation", $plugin);
SOYShopPlugin::invoke("soyshop.tax.calculation", array(
"mode" => "post",
"cart" => $this
));
/soyshop/webapp/src/module/plugins/common_item_option/soyshop.item.option.php
最後に各プラグインのディレクトリにあるファイルを開くと
末尾に
SOYShopPlugin::extension("soyshop.item.option", "common_item_option", "CommonItemOption");
という記述があります。
extension関数の第一引数にどの拡張ポイントを利用するか?
第二引数にプラグインIDを入れ、
第三引数に実行したいクラス名を入れます。
これでこのファイルが拡張ポイントで実行されるようになります。
2014.02.13 | Comments(0) | Trackback(0)
トラックバック -