OSDN Git Service

7698a7b56296af7e2d24e3cc56807a4f912cceb1
[ethna/ethna.git] / Ethna.php
1 <?php
2 // vim: foldmethod=marker
3 /**
4  *  Ethna.php
5  *
6  *  @author     Masaki Fujimoto <fujimoto@php.net>
7  *  @license    http://www.opensource.org/licenses/bsd-license.php The BSD License
8  *  @package    Ethna
9  *  @version    $Id$
10  */
11
12 //
13 //  PEAR OS_WINDOWS constant replacement.
14 //
15 //  PEAR の OS_WINDOWS 定数は、defined関数で
16 //  既に定義されているかをチェックしていない。
17 //  よって require_once 'PEAR.php' とすると
18 //  E_NOTICEが出ることから、Windows環境判定用
19 //  として独自の定数を定義する
20 //
21 if (substr(PHP_OS, 0, 3) == 'WIN'
22  && !defined('ETHNA_OS_WINDOWS')) {
23     define('ETHNA_OS_WINDOWS', true);
24 } elseif (!defined('ETHNA_OS_WINDOWS')) {
25     define('ETHNA_OS_WINDOWS', false);
26 }
27
28 if (!defined('PATH_SEPARATOR')) {
29     if (ETHNA_OS_WINDOWS) {
30         /** include_path separator(Windows) */
31         define('PATH_SEPARATOR', ';');
32     } else {
33         /** include_path separator(Unix) */
34         define('PATH_SEPARATOR', ':');
35     }
36 }
37 if (!defined('DIRECTORY_SEPARATOR')) {
38     if (ETHNA_OS_WINDOWS) {
39         /** directory separator(Windows) */
40         define('DIRECTORY_SEPARATOR', '\\');
41     } else {
42         /** separator(Unix) */
43         define('DIRECTORY_SEPARATOR', '/');
44     }
45 }
46
47 /** バージョン定義 */
48 define('ETHNA_VERSION', '2.5.0-preview2');
49
50 /**
51  * ダミーのエラーモード
52  * PEAR非依存、かつ互換性を維持するためのもの
53  */
54 define('ETHNA_ERROR_DUMMY', 'dummy');
55
56 /** Ethnaベースディレクトリ定義 */
57 define('ETHNA_BASE', dirname(__FILE__));
58
59 require_once ETHNA_BASE . '/class/Ethna_ActionClass.php';
60 require_once ETHNA_BASE . '/class/Ethna_ActionError.php';
61 require_once ETHNA_BASE . '/class/Ethna_ActionForm.php';
62 require_once ETHNA_BASE . '/class/Ethna_AppManager.php';
63 require_once ETHNA_BASE . '/class/Ethna_AppObject.php';
64 require_once ETHNA_BASE . '/class/Ethna_AppSQL.php';
65 require_once ETHNA_BASE . '/class/Ethna_AppSearchObject.php';
66 require_once ETHNA_BASE . '/class/Ethna_Backend.php';
67 require_once ETHNA_BASE . '/class/Ethna_CacheManager.php';
68 require_once ETHNA_BASE . '/class/Ethna_Config.php';
69 require_once ETHNA_BASE . '/class/Ethna_Controller.php';
70 require_once ETHNA_BASE . '/class/Ethna_ClassFactory.php';
71 require_once ETHNA_BASE . '/class/Ethna_DB.php';
72 require_once ETHNA_BASE . '/class/Ethna_Error.php';
73 require_once ETHNA_BASE . '/class/Ethna_Filter.php';
74 require_once ETHNA_BASE . '/class/Ethna_Handle.php';
75 require_once ETHNA_BASE . '/class/Ethna_I18N.php';
76 require_once ETHNA_BASE . '/class/Ethna_Logger.php';
77 require_once ETHNA_BASE . '/class/Ethna_MailSender.php';
78 require_once ETHNA_BASE . '/class/Ethna_Session.php';
79 require_once ETHNA_BASE . '/class/Ethna_Generator.php';
80 require_once ETHNA_BASE . '/class/Ethna_UrlHandler.php';
81 require_once ETHNA_BASE . '/class/Ethna_Util.php';
82 require_once ETHNA_BASE . '/class/Ethna_ViewClass.php';
83 require_once ETHNA_BASE . '/class/View/Ethna_View_List.php';
84 require_once ETHNA_BASE . '/class/Ethna_Plugin.php';
85 require_once ETHNA_BASE . '/class/Ethna_Renderer.php';
86 require_once ETHNA_BASE . '/class/CLI/Ethna_CLI_ActionClass.php';
87
88 if (extension_loaded('soap')) {
89     require_once ETHNA_BASE . '/class/SOAP/Ethna_SOAP_ActionForm.php';
90     require_once ETHNA_BASE . '/class/SOAP/Ethna_SOAP_Gateway.php';
91     require_once ETHNA_BASE . '/class/SOAP/Ethna_SOAP_GatewayGenerator.php';
92     require_once ETHNA_BASE . '/class/SOAP/Ethna_SOAP_Util.php';
93     require_once ETHNA_BASE . '/class/SOAP/Ethna_SOAP_WsdlGenerator.php';
94 }
95
96 /** ゲートウェイ: WWW */
97 define('GATEWAY_WWW', 1);
98
99 /** ゲートウェイ: CLI */
100 define('GATEWAY_CLI', 2);
101
102 /** ゲートウェイ: XMLRPC */
103 define('GATEWAY_XMLRPC', 3);
104
105 /** ゲートウェイ: SOAP */
106 define('GATEWAY_SOAP', 4);
107
108
109 /** DB種別定義: R/W */
110 define('DB_TYPE_RW', 1);
111
112 /** DB種別定義: R/O */
113 define('DB_TYPE_RO', 2);
114
115 /** DB種別定義: Misc  */
116 define('DB_TYPE_MISC', 3);
117
118
119 /** 要素型: 整数 */
120 define('VAR_TYPE_INT', 1);
121
122 /** 要素型: 浮動小数点数 */
123 define('VAR_TYPE_FLOAT', 2);
124
125 /** 要素型: 文字列 */
126 define('VAR_TYPE_STRING', 3);
127
128 /** 要素型: 日付 */
129 define('VAR_TYPE_DATETIME', 4);
130
131 /** 要素型: 真偽値 */
132 define('VAR_TYPE_BOOLEAN', 5);
133
134 /** 要素型: ファイル */
135 define('VAR_TYPE_FILE', 6);
136
137
138 /** フォーム型: text */
139 define('FORM_TYPE_TEXT', 1);
140
141 /** フォーム型: password */
142 define('FORM_TYPE_PASSWORD', 2);
143
144 /** フォーム型: textarea */
145 define('FORM_TYPE_TEXTAREA', 3);
146
147 /** フォーム型: select */
148 define('FORM_TYPE_SELECT', 4);
149
150 /** フォーム型: radio */
151 define('FORM_TYPE_RADIO', 5);
152
153 /** フォーム型: checkbox */
154 define('FORM_TYPE_CHECKBOX', 6);
155
156 /** フォーム型: button */
157 define('FORM_TYPE_SUBMIT', 7);
158
159 /** フォーム型: file */
160 define('FORM_TYPE_FILE', 8);
161
162 /** フォーム型: button */
163 define('FORM_TYPE_BUTTON', 9);
164
165 /** フォーム型: hidden */
166 define('FORM_TYPE_HIDDEN', 10);
167
168
169 /** エラーコード: 一般エラー */
170 define('E_GENERAL', 1);
171
172 /** エラーコード: DB接続エラー */
173 define('E_DB_CONNECT', 2);
174
175 /** エラーコード: DB設定なし */
176 define('E_DB_NODSN', 3);
177
178 /** エラーコード: DBクエリエラー */
179 define('E_DB_QUERY', 4);
180
181 /** エラーコード: DBユニークキーエラー */
182 define('E_DB_DUPENT', 5);
183
184 /** エラーコード: DB種別エラー */
185 define('E_DB_INVALIDTYPE', 6);
186
187 /** エラーコード: セッションエラー(有効期限切れ) */
188 define('E_SESSION_EXPIRE', 16);
189
190 /** エラーコード: セッションエラー(IPアドレスチェックエラー) */
191 define('E_SESSION_IPCHECK', 17);
192
193 /** エラーコード: アクション未定義エラー */
194 define('E_APP_UNDEFINED_ACTION', 32);
195
196 /** エラーコード: アクションクラス未定義エラー */
197 define('E_APP_UNDEFINED_ACTIONCLASS', 33);
198
199 /** エラーコード: アプリケーションオブジェクトID重複エラー */
200 define('E_APP_DUPENT', 34);
201
202 /** エラーコード: アプリケーションメソッドが存在しない */
203 define('E_APP_NOMETHOD', 35);
204
205 /** エラーコード: ロックエラー */
206 define('E_APP_LOCK', 36);
207
208 /** エラーコード: 読み込みエラー */
209 define('E_APP_READ', 37);
210
211 /** エラーコード: 書き込みエラー */
212 define('E_APP_WRITE', 38);
213
214 /** エラーコード: CSV分割エラー(行継続) */
215 define('E_UTIL_CSV_CONTINUE', 64);
216
217 /** エラーコード: フォーム値型エラー(スカラー引数に配列指定) */
218 define('E_FORM_WRONGTYPE_SCALAR', 128);
219
220 /** エラーコード: フォーム値型エラー(配列引数にスカラー指定) */
221 define('E_FORM_WRONGTYPE_ARRAY', 129);
222
223 /** エラーコード: フォーム値型エラー(整数型) */
224 define('E_FORM_WRONGTYPE_INT', 130);
225
226 /** エラーコード: フォーム値型エラー(浮動小数点数型) */
227 define('E_FORM_WRONGTYPE_FLOAT', 131);
228
229 /** エラーコード: フォーム値型エラー(日付型) */
230 define('E_FORM_WRONGTYPE_DATETIME', 132);
231
232 /** エラーコード: フォーム値型エラー(BOOL型) */
233 define('E_FORM_WRONGTYPE_BOOLEAN', 133);
234
235 /** エラーコード: フォーム値型エラー(FILE型) */
236 define('E_FORM_WRONGTYPE_FILE', 134);
237
238 /** エラーコード: フォーム値必須エラー */
239 define('E_FORM_REQUIRED', 135);
240
241 /** エラーコード: フォーム値最小値エラー(整数型) */
242 define('E_FORM_MIN_INT', 136);
243
244 /** エラーコード: フォーム値最小値エラー(浮動小数点数型) */
245 define('E_FORM_MIN_FLOAT', 137);
246
247 /** エラーコード: フォーム値最小値エラー(文字列型) */
248 define('E_FORM_MIN_STRING', 138);
249
250 /** エラーコード: フォーム値最小値エラー(日付型) */
251 define('E_FORM_MIN_DATETIME', 139);
252
253 /** エラーコード: フォーム値最小値エラー(ファイル型) */
254 define('E_FORM_MIN_FILE', 140);
255
256 /** エラーコード: フォーム値最大値エラー(整数型) */
257 define('E_FORM_MAX_INT', 141);
258
259 /** エラーコード: フォーム値最大値エラー(浮動小数点数型) */
260 define('E_FORM_MAX_FLOAT', 142);
261
262 /** エラーコード: フォーム値最大値エラー(文字列型) */
263 define('E_FORM_MAX_STRING', 143);
264
265 /** エラーコード: フォーム値最大値エラー(日付型) */
266 define('E_FORM_MAX_DATETIME', 144);
267
268 /** エラーコード: フォーム値最大値エラー(ファイル型) */
269 define('E_FORM_MAX_FILE', 145);
270
271 /** エラーコード: フォーム値文字種(正規表現)エラー */
272 define('E_FORM_REGEXP', 146);
273
274 /** エラーコード: フォーム値数値(カスタムチェック)エラー */
275 define('E_FORM_INVALIDVALUE', 147);
276
277 /** エラーコード: フォーム値文字種(カスタムチェック)エラー */
278 define('E_FORM_INVALIDCHAR', 148);
279
280 /** エラーコード: 確認用エントリ入力エラー */
281 define('E_FORM_CONFIRM', 149);
282
283 /** エラーコード: キャッシュタイプ不正 */
284 define('E_CACHE_INVALID_TYPE', 192);
285
286 /** エラーコード: キャッシュ値なし */
287 define('E_CACHE_NO_VALUE', 193);
288
289 /** エラーコード: キャッシュ有効期限 */
290 define('E_CACHE_EXPIRED', 194);
291
292 /** エラーコード: キャッシュエラー(その他) */
293 define('E_CACHE_GENERAL', 195);
294
295 /** エラーコード: プラグインが見つからない */
296 define('E_PLUGIN_NOTFOUND', 196);
297
298 /** エラーコード: プラグインエラー(その他) */
299 define('E_PLUGIN_GENERAL', 197);
300
301 if (defined('E_STRICT') == false) {
302     /** PHP 5との互換保持定義 */
303     define('E_STRICT', 2048);
304 }
305
306 /** Ethnaグローバル変数: エラーコールバック関数 */
307 $GLOBALS['_Ethna_error_callback_list'] = array();
308
309 /** Ethnaグローバル変数: エラーメッセージ */
310 $GLOBALS['_Ethna_error_message_list'] = array();
311
312
313 // {{{ Ethna
314 /**
315  *  Ethnaフレームワーククラス
316  *
317  *  @author     Masaki Fujimoto <fujimoto@php.net>
318  *  @access     public
319  *  @package    Ethna
320  */
321 class Ethna
322 {
323     /**
324      *  渡されたオブジェクトが Ethna_Error オブジェクト
325      *  またはそのサブクラスのオブジェクトかどうかチェックします。
326      *
327      *  @param mixed  $data    チェックする変数
328      *  @param mixed  $msgcode チェックするエラーメッセージまたはエラーコード  
329      *  @return mixed 変数が、Ethna_Error の場合に TRUEを返します。
330      *                第2引数が設定された場合は、さらに 所与された $msgcode
331      *                を含む場合のみ TRUEを返します。
332      *  @static
333      */
334     function isError($data, $msgcode = NULL)
335     {
336         if (!is_object($data)) {
337             return false;
338         }
339
340         $class_name = get_class($data);
341         if (strcasecmp($class_name, 'Ethna_Error') === 0
342          || is_subclass_of($data, 'Ethna_Error')) {
343             if ($msgcode == NULL) {
344                 return true;
345             } elseif ($data->getCode() == $msgcode) {
346                 return true;
347             }
348         }
349
350         return false;
351     }
352
353     /**
354      *  Ethna_Errorオブジェクトを生成する(エラーレベル:E_USER_ERROR)
355      *
356      *  @access public
357      *  @param  string  $message            エラーメッセージ
358      *  @param  int     $code               エラーコード
359      *  @static
360      */
361     function &raiseError($message, $code = E_GENERAL)
362     {
363         $userinfo = null;
364         if (func_num_args() > 2) {
365             $userinfo = array_slice(func_get_args(), 2);
366             if (count($userinfo) == 1 && is_array($userinfo[0])) {
367                 $userinfo = $userinfo[0];
368             }
369         }
370         $error = new Ethna_Error($message, $code, ETHNA_ERROR_DUMMY, E_USER_ERROR, $userinfo, 'Ethna_Error');
371         return $error;
372     }
373
374     /**
375      *  Ethna_Errorオブジェクトを生成する(エラーレベル:E_USER_WARNING)
376      *
377      *  @access public
378      *  @param  string  $message            エラーメッセージ
379      *  @param  int     $code               エラーコード
380      *  @static
381      */
382     function &raiseWarning($message, $code = E_GENERAL)
383     {
384         $userinfo = null;
385         if (func_num_args() > 2) {
386             $userinfo = array_slice(func_get_args(), 2);
387             if (count($userinfo) == 1 && is_array($userinfo[0])) {
388                 $userinfo = $userinfo[0];
389             }
390         }
391
392         $error = new Ethna_Error($message, $code, ETHNA_ERROR_DUMMY, E_USER_WARNING, $userinfo, 'Ethna_Error');
393         return $error;
394     }
395
396     /**
397      *  Ethna_Errorオブジェクトを生成する(エラーレベル:E_USER_NOTICE)
398      *
399      *  @access public
400      *  @param  string  $message            エラーメッセージ
401      *  @param  int     $code               エラーコード
402      *  @static
403      */
404     function &raiseNotice($message, $code = E_GENERAL)
405     {
406         $userinfo = null;
407         if (func_num_args() > 2) {
408             $userinfo = array_slice(func_get_args(), 2);
409             if (count($userinfo) == 1 && is_array($userinfo[0])) {
410                 $userinfo = $userinfo[0];
411             }
412         }
413
414         $error = new Ethna_Error($message, $code, ETHNA_ERROR_DUMMY, E_USER_NOTICE, $userinfo, 'Ethna_Error');
415         return $error;
416     }
417
418     /**
419      *  エラー発生時の(フレームワークとしての)コールバック関数を設定する
420      *
421      *  @access public
422      *  @param  mixed   string:コールバック関数名 array:コールバッククラス(名|オブジェクト)+メソッド名
423      *  @static
424      */
425     function setErrorCallback($callback)
426     {
427         $GLOBALS['_Ethna_error_callback_list'][] = $callback;
428     }
429
430     /**
431      *  エラー発生時の(フレームワークとしての)コールバック関数をクリアする
432      *
433      *  @access public
434      *  @static
435      */
436     function clearErrorCallback()
437     {
438         $GLOBALS['_Ethna_error_callback_list'] = array();
439     }
440
441     /**
442      *  エラー発生時の処理を行う(コールバック関数/メソッドを呼び出す)
443      *  
444      *  @access public
445      *  @param  object  Ethna_Error     Ethna_Errorオブジェクト
446      *  @static
447      */
448     function handleError(&$error)
449     {
450         for ($i = 0; $i < count($GLOBALS['_Ethna_error_callback_list']); $i++) {
451             $callback =& $GLOBALS['_Ethna_error_callback_list'][$i];
452             if (is_array($callback) == false) {
453                 call_user_func($callback, $error);
454             } else if (is_object($callback[0])) {
455                 $object =& $callback[0];
456                 $method = $callback[1];
457
458                 // perform some more checks?
459                 $object->$method($error);
460             } else {  
461                 //  call statically
462                 call_user_func($callback, $error);
463             }
464         }
465     }
466 }
467 // }}}
468
469 ?>