OSDN Git Service

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