ブログトップ
SOY Shopプラグインの解説 拡張ポイントについて
2014年02月13日
前回までで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を入れ、
第三引数に実行したいクラス名を入れます。
これでこのファイルが拡張ポイントで実行されるようになります。