OSDN Git Service

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