arrPluginInstances[$arrPluginData['plugin_id']] = $objPlugin; $this->arrPluginIds[] = $arrPluginData['plugin_id']; // ローカルフックポイントの登録. $this->registerLocalHookPoint($objPlugin, $arrPluginData['priority']); // スーパーフックポイントの登録. $this->registerSuperHookPoint($objPlugin, HOOK_POINT_PREPROCESS, 'preProcess', $arrPluginData['priority']); $this->registerSuperHookPoint($objPlugin, HOOK_POINT_PROCESS, 'process', $arrPluginData['priority']); } } } /** * SC_Helper_Plugin オブジェクトを返す(Singletonパターン) * * @return object SC_Helper_Pluginオブジェクト */ static function getSingletonInstance($plugin_activate_flg = true) { if (!isset($GLOBALS['_SC_Helper_Plugin_instance'])) { $GLOBALS['_SC_Helper_Plugin_instance'] = new SC_Helper_Plugin_Ex(); $GLOBALS['_SC_Helper_Plugin_instance']->load($plugin_activate_flg); } return $GLOBALS['_SC_Helper_Plugin_instance']; } /** * プラグイン実行 * * @param string $hook_point フックポイント * @param array $arrArgs コールバック関数へ渡す引数 * @return void */ function doAction($hook_point, $arrArgs = array()) { if (is_array($arrArgs) === false) { array(&$arrArgs); } if ($hook_point == 'loadClassFileChange') { $arrSaveArgs = $arrArgs; $arrClassName = array(); $arrClassPath = array(); } if (array_key_exists($hook_point, $this->arrRegistedPluginActions) && is_array($this->arrRegistedPluginActions[$hook_point])) { krsort($this->arrRegistedPluginActions[$hook_point]); foreach ($this->arrRegistedPluginActions[$hook_point] as $arrFuncs) { foreach ($arrFuncs as $func) { if (!is_null($func['function'])) { if ($hook_point == 'loadClassFileChange') { $classname = $arrSaveArgs[0]; $classpath = $arrSaveArgs[1]; $arrTempArgs = array(&$classname, &$classpath); call_user_func_array($func['function'], $arrTempArgs); if ($classname !== $arrSaveArgs[0]) { $arrClassName[] = $classname; $arrClassPath[] = $classpath; } } else { call_user_func_array($func['function'], $arrArgs); } } } } if ($hook_point == 'loadClassFileChange') { if (count($arrClassName) > 0) { $arrArgs[0] = $arrClassName; $arrArgs[1] = $arrClassPath; } } } } /** * スーパーフックポイントを登録します. * * @param Object $objPlugin プラグインのインスタンス * @param string $hook_point スーパーフックポイント * @param string $function_name 実行する関数名 * @param string $priority 実行順 */ function registerSuperHookPoint($objPlugin, $hook_point, $function_name, $priority) { // スーパープラグイン関数を定義しているかを検証. if (method_exists($objPlugin, $function_name) === true) { // アクションの登録 $this->addAction($hook_point, array($objPlugin, $function_name), $priority); } } /** * ローカルフックポイントを登録します. * * @param Object $objPlugin プラグインのインスタンス * @param string $priority 実行順 */ function registerLocalHookPoint($objPlugin, $priority) { // ローカルプラグイン関数を定義しているかを検証. if (method_exists($objPlugin, 'register') === true) { // アクションの登録(プラグイン側に記述) $objPluginHelper =& SC_Helper_Plugin::getSingletonInstance(); $objPlugin->register($objPluginHelper, $priority); } } /** * プラグイン コールバック関数を追加する * * @param string $hook_point フックポイント名 * @param callback $function コールバック関数名 * @param string $priority 同一フックポイント内での実行優先度 * @return boolean 成功すればtrue */ function addAction($hook_point, $function, $priority = 0) { if (!is_callable($function)) { // TODO エラー処理; コール可能な形式ではありません } $idx = $this->makeActionUniqueId($hook_point, $function, $priority); $this->arrRegistedPluginActions[$hook_point][$priority][$idx] = array('function' => $function); return true; } /** * コールバック関数を一意に識別するIDの生成 * * @param string $hook_point フックポイント名 * @param callback $function コールバック関数名 * @param integer $priority 同一フックポイント内での実行優先度 * @return string コールバック関数を一意に識別するID */ function makeActionUniqueId($hook_point, $function, $priority) { static $filter_id_count = 0; if (is_string($function)) { return $function; } if (is_object($function)) { $function = array($function, ''); } else { $function = (array) $function; } if (is_object($function[0])) { if (function_exists('spl_object_hash')) { return spl_object_hash($function[0]) . $function[1]; } else { $obj_idx = get_class($function[0]).$function[1]; if ( false === $priority) return false; $obj_idx .= isset($this->arrRegistedPluginActions[$hook_point][$priority]) ? count((array)$this->arrRegistedPluginActions[$hook_point][$priority]) : $filter_id_count; $function[0]->wp_filter_id = $filter_id_count; ++$filter_id_count; return $obj_idx; } } else if (is_string($function[0])) { return $function[0].$function[1]; } } /** * ブロックの配列から有効でないpluginのブロックを除外して返します. * * @param array $arrBlocs プラグインのインストールディレクトリ * @return array $arrBlocsサイトルートからメディアディレクトリへの相対パス */ function getEnableBlocs($arrBlocs) { foreach ($arrBlocs as $key => $value) { // 有効なpluginのブロック以外. if (!in_array($value['plugin_id'] , $this->arrPluginIds)) { // 通常ブロック以外. if ($value['plugin_id'] != '') { // ブロック配列から削除する unset ($arrBlocs[$key]); } } } return $arrBlocs; } /** * テンプレートのヘッダに追加するPHPのURLをセットする * * @param string $url PHPファイルのURL * @return void */ function setHeadNavi($url) { $this->arrHeadNaviBlocsByPlugin[$url] = TARGET_ID_HEAD; } /** * PHPのURLをテンプレートのヘッダに追加する * * @param array|null $arrBlocs 配置情報を含めたブロックの配列 * @return void */ function setHeadNaviBlocs(&$arrBlocs) { foreach ($this->arrHeadNaviBlocsByPlugin as $key => $value) { $arrBlocs[] = array( 'target_id' =>$value, 'php_path' => $key ); } } /** * Utility function to set a hook point. * * @param string $hook_point hook point * @param array $arrArgs argument passing to callback function * @param boolean $plugin_activate_flg * @return void */ public static function hook($hook_point, $arrArgs = array(), $plugin_activate_flg = PLUGIN_ACTIVATE_FLAG) { $objPlugin = SC_Helper_Plugin::getSingletonInstance($plugin_activate_flg); $objPlugin->doAction($hook_point, $arrArgs); } }