SOY CMS / SOY Shop

ブログトップ

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を入れ、

第三引数に実行したいクラス名を入れます。


これでこのファイルが拡張ポイントで実行されるようになります。