2 // vim: foldmethod=marker
6 * @author Masaki Fujimoto <fujimoto@php.net>
7 * @license http://www.opensource.org/licenses/bsd-license.php The BSD License
13 // PEAR OS_WINDOWS constant replacement.
15 // PEAR の OS_WINDOWS 定数は、defined関数で
16 // 既に定義されているかをチェックしていない。
17 // よって require_once 'PEAR.php' とすると
18 // E_NOTICEが出ることから、Windows環境判定用
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);
28 // date.timezone が設定されていないと
29 // E_STRICT|WARNING が発生する
30 if (!ini_get('date.timezone')) {
31 ini_set('date.timezone', 'Asia/Tokyo');
34 if (!defined('PATH_SEPARATOR')) {
35 if (ETHNA_OS_WINDOWS) {
36 /** include_path separator(Windows) */
37 define('PATH_SEPARATOR', ';');
39 /** include_path separator(Unix) */
40 define('PATH_SEPARATOR', ':');
43 if (!defined('DIRECTORY_SEPARATOR')) {
44 if (ETHNA_OS_WINDOWS) {
45 /** directory separator(Windows) */
46 define('DIRECTORY_SEPARATOR', '\\');
48 /** separator(Unix) */
49 define('DIRECTORY_SEPARATOR', '/');
54 define('ETHNA_VERSION', '2.6.0-beta1');
58 * PEAR非依存、かつ互換性を維持するためのもの
60 define('ETHNA_ERROR_DUMMY', 'dummy');
62 /** Ethnaベースディレクトリ定義 */
63 define('ETHNA_BASE', dirname(__FILE__));
65 require_once ETHNA_BASE . '/class/ActionClass.php';
66 require_once ETHNA_BASE . '/class/ActionError.php';
67 require_once ETHNA_BASE . '/class/ActionForm.php';
68 require_once ETHNA_BASE . '/class/AppManager.php';
69 require_once ETHNA_BASE . '/class/AppObject.php';
70 require_once ETHNA_BASE . '/class/AppSQL.php';
71 require_once ETHNA_BASE . '/class/AppSearchObject.php';
72 require_once ETHNA_BASE . '/class/Backend.php';
73 require_once ETHNA_BASE . '/class/CacheManager.php';
74 require_once ETHNA_BASE . '/class/Config.php';
75 require_once ETHNA_BASE . '/class/Controller.php';
76 require_once ETHNA_BASE . '/class/ClassFactory.php';
77 require_once ETHNA_BASE . '/class/DB.php';
78 require_once ETHNA_BASE . '/class/Error.php';
79 require_once ETHNA_BASE . '/class/Filter.php';
80 require_once ETHNA_BASE . '/class/Handle.php';
81 require_once ETHNA_BASE . '/class/I18N.php';
82 require_once ETHNA_BASE . '/class/Logger.php';
83 require_once ETHNA_BASE . '/class/MailSender.php';
84 require_once ETHNA_BASE . '/class/Session.php';
85 require_once ETHNA_BASE . '/class/Generator.php';
86 require_once ETHNA_BASE . '/class/UrlHandler.php';
87 require_once ETHNA_BASE . '/class/Util.php';
88 require_once ETHNA_BASE . '/class/ViewClass.php';
89 require_once ETHNA_BASE . '/class/View/Json.php';
90 require_once ETHNA_BASE . '/class/View/Redirect.php';
91 require_once ETHNA_BASE . '/class/View/403.php';
92 require_once ETHNA_BASE . '/class/View/404.php';
93 require_once ETHNA_BASE . '/class/View/500.php';
94 require_once ETHNA_BASE . '/class/View/List.php';
95 require_once ETHNA_BASE . '/class/Plugin.php';
96 require_once ETHNA_BASE . '/class/Renderer.php';
97 require_once ETHNA_BASE . '/class/CLI/ActionClass.php';
99 if (extension_loaded('soap')) {
100 require_once ETHNA_BASE . '/class/SOAP/ActionForm.php';
101 require_once ETHNA_BASE . '/class/SOAP/Gateway.php';
102 require_once ETHNA_BASE . '/class/SOAP/GatewayGenerator.php';
103 require_once ETHNA_BASE . '/class/SOAP/Util.php';
104 require_once ETHNA_BASE . '/class/SOAP/WsdlGenerator.php';
108 define('GATEWAY_WWW', 1);
111 define('GATEWAY_CLI', 2);
113 /** ゲートウェイ: XMLRPC */
114 define('GATEWAY_XMLRPC', 3);
117 define('GATEWAY_SOAP', 4);
121 define('DB_TYPE_RW', 1);
124 define('DB_TYPE_RO', 2);
127 define('DB_TYPE_MISC', 3);
131 define('VAR_TYPE_INT', 1);
134 define('VAR_TYPE_FLOAT', 2);
137 define('VAR_TYPE_STRING', 3);
140 define('VAR_TYPE_DATETIME', 4);
143 define('VAR_TYPE_BOOLEAN', 5);
146 define('VAR_TYPE_FILE', 6);
150 define('FORM_TYPE_TEXT', 1);
152 /** フォーム型: password */
153 define('FORM_TYPE_PASSWORD', 2);
155 /** フォーム型: textarea */
156 define('FORM_TYPE_TEXTAREA', 3);
159 define('FORM_TYPE_SELECT', 4);
162 define('FORM_TYPE_RADIO', 5);
164 /** フォーム型: checkbox */
165 define('FORM_TYPE_CHECKBOX', 6);
168 define('FORM_TYPE_SUBMIT', 7);
171 define('FORM_TYPE_FILE', 8);
174 define('FORM_TYPE_BUTTON', 9);
177 define('FORM_TYPE_HIDDEN', 10);
181 define('E_GENERAL', 1);
183 /** エラーコード: DB接続エラー */
184 define('E_DB_CONNECT', 2);
186 /** エラーコード: DB設定なし */
187 define('E_DB_NODSN', 3);
189 /** エラーコード: DBクエリエラー */
190 define('E_DB_QUERY', 4);
192 /** エラーコード: DBユニークキーエラー */
193 define('E_DB_DUPENT', 5);
195 /** エラーコード: DB種別エラー */
196 define('E_DB_INVALIDTYPE', 6);
198 /** エラーコード: セッションエラー(有効期限切れ) */
199 define('E_SESSION_EXPIRE', 16);
201 /** エラーコード: セッションエラー(IPアドレスチェックエラー) */
202 define('E_SESSION_IPCHECK', 17);
204 /** エラーコード: アクション未定義エラー */
205 define('E_APP_UNDEFINED_ACTION', 32);
207 /** エラーコード: アクションクラス未定義エラー */
208 define('E_APP_UNDEFINED_ACTIONCLASS', 33);
210 /** エラーコード: アプリケーションオブジェクトID重複エラー */
211 define('E_APP_DUPENT', 34);
213 /** エラーコード: アプリケーションメソッドが存在しない */
214 define('E_APP_NOMETHOD', 35);
216 /** エラーコード: ロックエラー */
217 define('E_APP_LOCK', 36);
219 /** エラーコード: 読み込みエラー */
220 define('E_APP_READ', 37);
222 /** エラーコード: 書き込みエラー */
223 define('E_APP_WRITE', 38);
225 /** エラーコード: CSV分割エラー(行継続) */
226 define('E_UTIL_CSV_CONTINUE', 64);
228 /** エラーコード: フォーム値型エラー(スカラー引数に配列指定) */
229 define('E_FORM_WRONGTYPE_SCALAR', 128);
231 /** エラーコード: フォーム値型エラー(配列引数にスカラー指定) */
232 define('E_FORM_WRONGTYPE_ARRAY', 129);
234 /** エラーコード: フォーム値型エラー(整数型) */
235 define('E_FORM_WRONGTYPE_INT', 130);
237 /** エラーコード: フォーム値型エラー(浮動小数点数型) */
238 define('E_FORM_WRONGTYPE_FLOAT', 131);
240 /** エラーコード: フォーム値型エラー(日付型) */
241 define('E_FORM_WRONGTYPE_DATETIME', 132);
243 /** エラーコード: フォーム値型エラー(BOOL型) */
244 define('E_FORM_WRONGTYPE_BOOLEAN', 133);
246 /** エラーコード: フォーム値型エラー(FILE型) */
247 define('E_FORM_WRONGTYPE_FILE', 134);
249 /** エラーコード: フォーム値必須エラー */
250 define('E_FORM_REQUIRED', 135);
252 /** エラーコード: フォーム値最小値エラー(整数型) */
253 define('E_FORM_MIN_INT', 136);
255 /** エラーコード: フォーム値最小値エラー(浮動小数点数型) */
256 define('E_FORM_MIN_FLOAT', 137);
258 /** エラーコード: フォーム値最小値エラー(文字列型) */
259 define('E_FORM_MIN_STRING', 138);
261 /** エラーコード: フォーム値最小値エラー(日付型) */
262 define('E_FORM_MIN_DATETIME', 139);
264 /** エラーコード: フォーム値最小値エラー(ファイル型) */
265 define('E_FORM_MIN_FILE', 140);
267 /** エラーコード: フォーム値最大値エラー(整数型) */
268 define('E_FORM_MAX_INT', 141);
270 /** エラーコード: フォーム値最大値エラー(浮動小数点数型) */
271 define('E_FORM_MAX_FLOAT', 142);
273 /** エラーコード: フォーム値最大値エラー(文字列型) */
274 define('E_FORM_MAX_STRING', 143);
276 /** エラーコード: フォーム値最大値エラー(日付型) */
277 define('E_FORM_MAX_DATETIME', 144);
279 /** エラーコード: フォーム値最大値エラー(ファイル型) */
280 define('E_FORM_MAX_FILE', 145);
282 /** エラーコード: フォーム値文字種(正規表現)エラー */
283 define('E_FORM_REGEXP', 146);
285 /** エラーコード: フォーム値数値(カスタムチェック)エラー */
286 define('E_FORM_INVALIDVALUE', 147);
288 /** エラーコード: フォーム値文字種(カスタムチェック)エラー */
289 define('E_FORM_INVALIDCHAR', 148);
291 /** エラーコード: 確認用エントリ入力エラー */
292 define('E_FORM_CONFIRM', 149);
294 /** エラーコード: キャッシュタイプ不正 */
295 define('E_CACHE_INVALID_TYPE', 192);
297 /** エラーコード: キャッシュ値なし */
298 define('E_CACHE_NO_VALUE', 193);
300 /** エラーコード: キャッシュ有効期限 */
301 define('E_CACHE_EXPIRED', 194);
303 /** エラーコード: キャッシュエラー(その他) */
304 define('E_CACHE_GENERAL', 195);
306 /** エラーコード: プラグインが見つからない */
307 define('E_PLUGIN_NOTFOUND', 196);
309 /** エラーコード: プラグインエラー(その他) */
310 define('E_PLUGIN_GENERAL', 197);
313 if (defined('E_STRICT') == false) {
314 define('E_STRICT', 2048);
316 if (defined('E_DEPRECATED') == false) {
317 define('E_DEPRECATED', 8192);
320 /** Ethnaグローバル変数: エラーコールバック関数 */
321 $GLOBALS['_Ethna_error_callback_list'] = array();
323 /** Ethnaグローバル変数: エラーメッセージ */
324 $GLOBALS['_Ethna_error_message_list'] = array();
331 * @author Masaki Fujimoto <fujimoto@php.net>
338 * 渡されたオブジェクトが Ethna_Error オブジェクト
339 * またはそのサブクラスのオブジェクトかどうかチェックします。
341 * @param mixed $data チェックする変数
342 * @param mixed $msgcode チェックするエラーメッセージまたはエラーコード
343 * @return mixed 変数が、Ethna_Error の場合に TRUEを返します。
344 * 第2引数が設定された場合は、さらに 所与された $msgcode
348 public static function isError($data, $msgcode = NULL)
350 if (!is_object($data)) {
354 $class_name = get_class($data);
355 if (strcasecmp($class_name, 'Ethna_Error') === 0
356 || is_subclass_of($data, 'Ethna_Error')) {
357 if ($msgcode == NULL) {
359 } elseif ($data->getCode() == $msgcode) {
368 * Ethna_Errorオブジェクトを生成する(エラーレベル:E_USER_ERROR)
371 * @param string $message エラーメッセージ
372 * @param int $code エラーコード
375 public static function raiseError($message, $code = E_GENERAL)
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];
384 $error = new Ethna_Error($message, $code, ETHNA_ERROR_DUMMY, E_USER_ERROR, $userinfo, 'Ethna_Error');
389 * Ethna_Errorオブジェクトを生成する(エラーレベル:E_USER_WARNING)
392 * @param string $message エラーメッセージ
393 * @param int $code エラーコード
396 public static function raiseWarning($message, $code = E_GENERAL)
399 if (func_num_args() > 2) {
400 $userinfo = array_slice(func_get_args(), 2);
401 if (count($userinfo) == 1 && is_array($userinfo[0])) {
402 $userinfo = $userinfo[0];
406 $error = new Ethna_Error($message, $code, ETHNA_ERROR_DUMMY, E_USER_WARNING, $userinfo, 'Ethna_Error');
411 * Ethna_Errorオブジェクトを生成する(エラーレベル:E_USER_NOTICE)
414 * @param string $message エラーメッセージ
415 * @param int $code エラーコード
418 public static function raiseNotice($message, $code = E_GENERAL)
421 if (func_num_args() > 2) {
422 $userinfo = array_slice(func_get_args(), 2);
423 if (count($userinfo) == 1 && is_array($userinfo[0])) {
424 $userinfo = $userinfo[0];
428 $error = new Ethna_Error($message, $code, ETHNA_ERROR_DUMMY, E_USER_NOTICE, $userinfo, 'Ethna_Error');
433 * エラー発生時の(フレームワークとしての)コールバック関数を設定する
436 * @param mixed string:コールバック関数名 array:コールバッククラス(名|オブジェクト)+メソッド名
439 public static function setErrorCallback($callback)
441 $GLOBALS['_Ethna_error_callback_list'][] = $callback;
445 * エラー発生時の(フレームワークとしての)コールバック関数をクリアする
450 public static function clearErrorCallback()
452 $GLOBALS['_Ethna_error_callback_list'] = array();
456 * エラー発生時の処理を行う(コールバック関数/メソッドを呼び出す)
459 * @param object Ethna_Error Ethna_Errorオブジェクト
462 public static function handleError(&$error)
464 for ($i = 0; $i < count($GLOBALS['_Ethna_error_callback_list']); $i++) {
465 $callback =& $GLOBALS['_Ethna_error_callback_list'][$i];
466 if (is_array($callback) == false) {
467 call_user_func($callback, $error);
468 } else if (is_object($callback[0])) {
469 $object =& $callback[0];
470 $method = $callback[1];
472 // perform some more checks?
473 $object->$method($error);
476 call_user_func($callback, $error);