source: branches/camp/camp-2_13-plugin/data/class/plugin/SC_Plugin_Util.php @ 22664

Revision 22664, 10.0 KB checked in by Yammy, 11 years ago (diff)

プラグインフックポイントの競合チェクを追加

refs #2179

  • Property svn:eol-style set to LF
  • Property svn:keywords set to Id
  • Property svn:mime-type set to text/x-httpd-php; charset=UTF-8
Line 
1<?php
2/*
3 * This file is part of EC-CUBE
4 *
5 * Copyright(c) 2000-2013 LOCKON CO.,LTD. All Rights Reserved.
6 *
7 * http://www.lockon.co.jp/
8 *
9 * This program is free software; you can redistribute it and/or
10 * modify it under the terms of the GNU General Public License
11 * as published by the Free Software Foundation; either version 2
12 * of the License, or (at your option) any later version.
13 *
14 * This program is distributed in the hope that it will be useful,
15 * but WITHOUT ANY WARRANTY; without even the implied warranty of
16 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
17 * GNU General Public License for more details.
18 *
19 * You should have received a copy of the GNU General Public License
20 * along with this program; if not, write to the Free Software
21 * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
22 */
23
24// プラグインのユーティリティクラス.
25class SC_Plugin_Util
26{
27
28    /**
29     * 稼働中のプラグインを取得する。
30     */
31    function getEnablePlugin()
32    {
33        $objQuery =& SC_Query_Ex::getSingletonInstance();
34        $col = '*';
35        $table = 'dtb_plugin';
36        $where = 'enable = 1';
37        // XXX 2.11.0 互換のため
38        $arrCols = $objQuery->listTableFields($table);
39        if (in_array('priority', $arrCols)) {
40            $objQuery->setOrder('priority DESC, plugin_id ASC');
41        }
42        $arrRet = $objQuery->select($col,$table,$where);
43
44        // プラグインフックポイントを取得.
45        $max = count($arrRet);
46        for ($i = 0; $i < $max; $i++) {
47            $plugin_id = $arrRet[$i]['plugin_id'];
48            $arrHookPoint = SC_Plugin_Util::getPluginHookPoint($plugin_id);
49            $arrRet[$i]['plugin_hook_point'] = $arrHookPoint;
50        }
51        return $arrRet;
52    }
53
54    /**
55     * インストールされているプラグインを取得する。
56     *
57     * @return array $arrRet インストールされているプラグイン.
58     */
59    function getAllPlugin()
60    {
61        $objQuery =& SC_Query_Ex::getSingletonInstance();
62        $col = '*';
63        $table = 'dtb_plugin';
64        // XXX 2.11.0 互換のため
65        $arrCols = $objQuery->listTableFields($table);
66        if (in_array('priority', $arrCols)) {
67            $objQuery->setOrder('plugin_id ASC');
68        }
69        $arrRet = $objQuery->select($col,$table);
70        return $arrRet;
71    }
72
73    /**
74     * プラグインIDをキーにプラグインを取得する。
75     *
76     * @param int $plugin_id プラグインID.
77     * @return array プラグインの基本情報.
78     */
79    function getPluginByPluginId($plugin_id)
80    {
81        $objQuery =& SC_Query_Ex::getSingletonInstance();
82        $col = '*';
83        $table = 'dtb_plugin';
84        $where = 'plugin_id = ?';
85        $plugin = $objQuery->getRow($col, $table, $where, array($plugin_id));
86        return $plugin;
87    }
88
89
90    /**
91     * プラグインコードをキーにプラグインを取得する。
92     *
93     * @param string $plugin_code プラグインコード.
94     * @return array プラグインの基本情報.
95     */
96    function getPluginByPluginCode($plugin_code)
97    {
98        $objQuery =& SC_Query_Ex::getSingletonInstance();
99        $col = '*';
100        $table = 'dtb_plugin';
101        $where = 'plugin_code = ?';
102        $plugin = $objQuery->getRow($col, $table, $where, array($plugin_code));
103        return $plugin;
104    }
105
106    /**
107     * プラグインIDをキーにプラグインを削除する。
108     *
109     * @param string $plugin_id プラグインID.
110     * @return array プラグインの基本情報.
111     */
112    function deletePluginByPluginId($plugin_id)
113    {
114        $objQuery =& SC_Query_Ex::getSingletonInstance();
115        $where = 'plugin_id = ?';
116        $objQuery->delete('dtb_plugin', $where, array($plugin_id));
117        $objQuery->delete('dtb_plugin_hookpoint', $where, array($plugin_id));
118    }
119
120    /**
121     * プラグインディレクトリの取得
122     *
123     * @return array $arrPluginDirectory
124     */
125    function getPluginDirectory()
126    {
127        $arrPluginDirectory = array();
128        if (is_dir(PLUGIN_UPLOAD_REALDIR)) {
129            if ($dh = opendir(PLUGIN_UPLOAD_REALDIR)) {
130                while (($pluginDirectory = readdir($dh)) !== false) {
131                    $arrPluginDirectory[] = $pluginDirectory;
132                }
133                closedir($dh);
134            }
135        }
136        return $arrPluginDirectory;
137    }
138
139    /**
140     * プラグインIDをキーに, プラグインフックポイントを取得する.
141     *
142     * @param integer $plugin_id
143     * @return array フックポイントの一覧
144     */
145    function getPluginHookPoint($plugin_id)
146    {
147        $objQuery =& SC_Query_Ex::getSingletonInstance();
148        $cols = '*';
149        $from = 'dtb_plugin_hookpoint';
150        $where = 'plugin_id = ? AND use_flg = true';
151        return $objQuery->select($cols, $from, $where, array($plugin_id));
152    }
153
154    /**
155     *  プラグインフックポイントを取得する.
156     *
157     * @param integer $use_type 1=有効のみ 2=無効のみ 3=全て
158     * @return array フックポイントの一覧
159     */
160    function getPluginHookPointList($use_type = 3)
161    {
162        $objQuery =& SC_Query_Ex::getSingletonInstance();
163        $objQuery->setOrder('hook_point ASC, priority DESC');
164        $cols = 'dtb_plugin_hookpoint.*, dtb_plugin.priority, dtb_plugin.plugin_name';
165        $from = 'dtb_plugin_hookpoint LEFT JOIN dtb_plugin USING(plugin_id)';
166        switch ($use_type) {
167            case 1:
168                $where = 'enable = 1 AND use_flg = true';
169            break;
170
171            case 2:
172                $where = 'enable = 1 AND use_flg = false';
173            break;
174
175            case 3:
176            default:
177                $where = '';
178            break;
179        }
180        return $objQuery->select($cols, $from, $where);
181        //$arrList = array();
182        //foreach ($arrRet AS $key=>$val) {
183        //    $arrList[$val['hook_point']][$val['plugin_id']] = $val;
184        //}
185        //return $arrList;
186    }
187
188    /**
189     * プラグイン利用に必須のモジュールチェック
190     *
191     * @param string $key  エラー情報を格納するキー
192     * @return array $arrErr エラー情報を格納した連想配列.
193     */
194    function checkExtension($key)
195    {
196        // プラグイン利用に必須のモジュール
197        // 'EC-CUBEバージョン' => array('モジュール名')
198        $arrRequireExtension = array(
199                                     '2.12.0' => array('dom'),
200                                     '2.12.1' => array('dom'),
201                                     '2.12.2' => array('dom')
202                                    );
203        // 必須拡張モジュールのチェック
204        $arrErr = array();
205        if (is_array($arrRequireExtension[ECCUBE_VERSION])) {
206            foreach ($arrRequireExtension[ECCUBE_VERSION] AS $val) {
207                if (!extension_loaded($val)) {
208                    $arrErr[$key] .= "※ プラグインを利用するには、拡張モジュール「${val}」が必要です。<br />";
209                }
210            }
211        }
212        return $arrErr;
213    }
214
215    /**
216     * フックポイントのON/OFF変更
217     *
218     * @param intger $plugin_hookpoint_id  フックポイントID
219     * @return bolean $use_flg:ture=ON、false=OFF
220     */
221    function setPluginHookPointChangeUse($plugin_hookpoint_id, $use_flg = false) {
222        $objQuery =& SC_Query_Ex::getSingletonInstance();
223        $sqlval['use_flg'] = $use_flg;
224        $objQuery->update('dtb_plugin_hookpoint', $sqlval, 'plugin_hookpoint_id = ?', array($plugin_hookpoint_id));
225    }
226
227    /**
228     * フックポイントで衝突する可能性のあるプラグインを判定.メッセージを返します.
229     *
230     * @param int $plugin_id プラグインID
231     * @return string $conflict_alert_message メッセージ
232     */
233    function checkConflictPlugin($plugin_id = '')
234    {
235        // フックポイントを取得します.
236        $where = 'T1.hook_point = ? AND NOT T1.plugin_id = ? AND T2.enable = ?';
237        if ($plugin_id > 0) {
238            $hookPoints = SC_Plugin_Util::getPluginHookPoint($plugin_id);
239        } else {
240            $hookPoints = SC_Plugin_Util::getPluginHookPointList(1);
241            $where .= ' AND T1.use_flg = true';
242        }
243
244        $conflict_alert_message = '';
245        $arrConflictPluginName = array();
246        $arrConflictHookPoint = array();
247        $objQuery =& SC_Query_Ex::getSingletonInstance();
248        $objQuery->setGroupBy('T1.hook_point, T1.plugin_id, T2.plugin_name');
249        $table = 'dtb_plugin_hookpoint AS T1 LEFT JOIN dtb_plugin AS T2 ON T1.plugin_id = T2.plugin_id';
250        foreach ($hookPoints as $hookPoint) {
251            // 競合するプラグインを取得する,
252            $conflictPlugins = $objQuery->select('T1.hook_point, T1.plugin_id, T2.plugin_name', $table, $where, array($hookPoint['hook_point'], $hookPoint['plugin_id'], PLUGIN_ENABLE_TRUE));
253
254            // プラグイン名重複を削除する為、専用の配列に格納し直す.
255            foreach ($conflictPlugins as $conflictPlugin) {
256                // プラグイン名が見つからなければ配列に格納
257                if (!in_array($conflictPlugin['plugin_name'], $arrConflictPluginName)) {
258                    $arrConflictPluginName[] = $conflictPlugin['plugin_name'];
259                }
260                // プラグイン名が見つからなければ配列に格納
261                if (!in_array($conflictPlugin['hook_point'], $arrConflictHookPoint)) {
262                    $arrConflictHookPoint[] = $conflictPlugin['hook_point'];
263                }
264            }
265        }
266
267        if ($plugin_id > 0) {
268            // メッセージをセットします.
269            foreach ($arrConflictPluginName as $conflictPluginName) {
270                $conflict_alert_message .= '* ' .  $conflictPluginName . 'と競合する可能性があります。<br/>';
271            }
272            return $conflict_alert_message;
273        } else {
274            return $arrConflictHookPoint;
275        }
276    }
277
278}
Note: See TracBrowser for help on using the repository browser.