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 if (!defined('PATH_SEPARATOR')) {
29 if (ETHNA_OS_WINDOWS) {
30 /** include_path separator(Windows) */
31 define('PATH_SEPARATOR', ';');
33 /** include_path separator(Unix) */
34 define('PATH_SEPARATOR', ':');
37 if (!defined('DIRECTORY_SEPARATOR')) {
38 if (ETHNA_OS_WINDOWS) {
39 /** directory separator(Windows) */
40 define('DIRECTORY_SEPARATOR', '\\');
42 /** separator(Unix) */
43 define('DIRECTORY_SEPARATOR', '/');
48 define('ETHNA_VERSION', '2.5.0-preview3');
52 * PEAR非依存、かつ互換性を維持するためのもの
54 define('ETHNA_ERROR_DUMMY', 'dummy');
56 /** Ethnaベースディレクトリ定義 */
57 define('ETHNA_BASE', dirname(__FILE__));
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';
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';
98 define('GATEWAY_WWW', 1);
101 define('GATEWAY_CLI', 2);
103 /** ゲートウェイ: XMLRPC */
104 define('GATEWAY_XMLRPC', 3);
107 define('GATEWAY_SOAP', 4);
111 define('DB_TYPE_RW', 1);
114 define('DB_TYPE_RO', 2);
117 define('DB_TYPE_MISC', 3);
121 define('VAR_TYPE_INT', 1);
124 define('VAR_TYPE_FLOAT', 2);
127 define('VAR_TYPE_STRING', 3);
130 define('VAR_TYPE_DATETIME', 4);
133 define('VAR_TYPE_BOOLEAN', 5);
136 define('VAR_TYPE_FILE', 6);
140 define('FORM_TYPE_TEXT', 1);
142 /** フォーム型: password */
143 define('FORM_TYPE_PASSWORD', 2);
145 /** フォーム型: textarea */
146 define('FORM_TYPE_TEXTAREA', 3);
149 define('FORM_TYPE_SELECT', 4);
152 define('FORM_TYPE_RADIO', 5);
154 /** フォーム型: checkbox */
155 define('FORM_TYPE_CHECKBOX', 6);
158 define('FORM_TYPE_SUBMIT', 7);
161 define('FORM_TYPE_FILE', 8);
164 define('FORM_TYPE_BUTTON', 9);
167 define('FORM_TYPE_HIDDEN', 10);
171 define('E_GENERAL', 1);
173 /** エラーコード: DB接続エラー */
174 define('E_DB_CONNECT', 2);
176 /** エラーコード: DB設定なし */
177 define('E_DB_NODSN', 3);
179 /** エラーコード: DBクエリエラー */
180 define('E_DB_QUERY', 4);
182 /** エラーコード: DBユニークキーエラー */
183 define('E_DB_DUPENT', 5);
185 /** エラーコード: DB種別エラー */
186 define('E_DB_INVALIDTYPE', 6);
188 /** エラーコード: セッションエラー(有効期限切れ) */
189 define('E_SESSION_EXPIRE', 16);
191 /** エラーコード: セッションエラー(IPアドレスチェックエラー) */
192 define('E_SESSION_IPCHECK', 17);
194 /** エラーコード: アクション未定義エラー */
195 define('E_APP_UNDEFINED_ACTION', 32);
197 /** エラーコード: アクションクラス未定義エラー */
198 define('E_APP_UNDEFINED_ACTIONCLASS', 33);
200 /** エラーコード: アプリケーションオブジェクトID重複エラー */
201 define('E_APP_DUPENT', 34);
203 /** エラーコード: アプリケーションメソッドが存在しない */
204 define('E_APP_NOMETHOD', 35);
206 /** エラーコード: ロックエラー */
207 define('E_APP_LOCK', 36);
209 /** エラーコード: 読み込みエラー */
210 define('E_APP_READ', 37);
212 /** エラーコード: 書き込みエラー */
213 define('E_APP_WRITE', 38);
215 /** エラーコード: CSV分割エラー(行継続) */
216 define('E_UTIL_CSV_CONTINUE', 64);
218 /** エラーコード: フォーム値型エラー(スカラー引数に配列指定) */
219 define('E_FORM_WRONGTYPE_SCALAR', 128);
221 /** エラーコード: フォーム値型エラー(配列引数にスカラー指定) */
222 define('E_FORM_WRONGTYPE_ARRAY', 129);
224 /** エラーコード: フォーム値型エラー(整数型) */
225 define('E_FORM_WRONGTYPE_INT', 130);
227 /** エラーコード: フォーム値型エラー(浮動小数点数型) */
228 define('E_FORM_WRONGTYPE_FLOAT', 131);
230 /** エラーコード: フォーム値型エラー(日付型) */
231 define('E_FORM_WRONGTYPE_DATETIME', 132);
233 /** エラーコード: フォーム値型エラー(BOOL型) */
234 define('E_FORM_WRONGTYPE_BOOLEAN', 133);
236 /** エラーコード: フォーム値型エラー(FILE型) */
237 define('E_FORM_WRONGTYPE_FILE', 134);
239 /** エラーコード: フォーム値必須エラー */
240 define('E_FORM_REQUIRED', 135);
242 /** エラーコード: フォーム値最小値エラー(整数型) */
243 define('E_FORM_MIN_INT', 136);
245 /** エラーコード: フォーム値最小値エラー(浮動小数点数型) */
246 define('E_FORM_MIN_FLOAT', 137);
248 /** エラーコード: フォーム値最小値エラー(文字列型) */
249 define('E_FORM_MIN_STRING', 138);
251 /** エラーコード: フォーム値最小値エラー(日付型) */
252 define('E_FORM_MIN_DATETIME', 139);
254 /** エラーコード: フォーム値最小値エラー(ファイル型) */
255 define('E_FORM_MIN_FILE', 140);
257 /** エラーコード: フォーム値最大値エラー(整数型) */
258 define('E_FORM_MAX_INT', 141);
260 /** エラーコード: フォーム値最大値エラー(浮動小数点数型) */
261 define('E_FORM_MAX_FLOAT', 142);
263 /** エラーコード: フォーム値最大値エラー(文字列型) */
264 define('E_FORM_MAX_STRING', 143);
266 /** エラーコード: フォーム値最大値エラー(日付型) */
267 define('E_FORM_MAX_DATETIME', 144);
269 /** エラーコード: フォーム値最大値エラー(ファイル型) */
270 define('E_FORM_MAX_FILE', 145);
272 /** エラーコード: フォーム値文字種(正規表現)エラー */
273 define('E_FORM_REGEXP', 146);
275 /** エラーコード: フォーム値数値(カスタムチェック)エラー */
276 define('E_FORM_INVALIDVALUE', 147);
278 /** エラーコード: フォーム値文字種(カスタムチェック)エラー */
279 define('E_FORM_INVALIDCHAR', 148);
281 /** エラーコード: 確認用エントリ入力エラー */
282 define('E_FORM_CONFIRM', 149);
284 /** エラーコード: キャッシュタイプ不正 */
285 define('E_CACHE_INVALID_TYPE', 192);
287 /** エラーコード: キャッシュ値なし */
288 define('E_CACHE_NO_VALUE', 193);
290 /** エラーコード: キャッシュ有効期限 */
291 define('E_CACHE_EXPIRED', 194);
293 /** エラーコード: キャッシュエラー(その他) */
294 define('E_CACHE_GENERAL', 195);
296 /** エラーコード: プラグインが見つからない */
297 define('E_PLUGIN_NOTFOUND', 196);
299 /** エラーコード: プラグインエラー(その他) */
300 define('E_PLUGIN_GENERAL', 197);
302 if (defined('E_STRICT') == false) {
304 define('E_STRICT', 2048);
307 /** Ethnaグローバル変数: エラーコールバック関数 */
308 $GLOBALS['_Ethna_error_callback_list'] = array();
310 /** Ethnaグローバル変数: エラーメッセージ */
311 $GLOBALS['_Ethna_error_message_list'] = array();
318 * @author Masaki Fujimoto <fujimoto@php.net>
325 * 渡されたオブジェクトが Ethna_Error オブジェクト
326 * またはそのサブクラスのオブジェクトかどうかチェックします。
328 * @param mixed $data チェックする変数
329 * @param mixed $msgcode チェックするエラーメッセージまたはエラーコード
330 * @return mixed 変数が、Ethna_Error の場合に TRUEを返します。
331 * 第2引数が設定された場合は、さらに 所与された $msgcode
335 function isError($data, $msgcode = NULL)
337 if (!is_object($data)) {
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) {
346 } elseif ($data->getCode() == $msgcode) {
355 * Ethna_Errorオブジェクトを生成する(エラーレベル:E_USER_ERROR)
358 * @param string $message エラーメッセージ
359 * @param int $code エラーコード
362 function &raiseError($message, $code = E_GENERAL)
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];
371 $error = new Ethna_Error($message, $code, ETHNA_ERROR_DUMMY, E_USER_ERROR, $userinfo, 'Ethna_Error');
376 * Ethna_Errorオブジェクトを生成する(エラーレベル:E_USER_WARNING)
379 * @param string $message エラーメッセージ
380 * @param int $code エラーコード
383 function &raiseWarning($message, $code = E_GENERAL)
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];
393 $error = new Ethna_Error($message, $code, ETHNA_ERROR_DUMMY, E_USER_WARNING, $userinfo, 'Ethna_Error');
398 * Ethna_Errorオブジェクトを生成する(エラーレベル:E_USER_NOTICE)
401 * @param string $message エラーメッセージ
402 * @param int $code エラーコード
405 function &raiseNotice($message, $code = E_GENERAL)
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];
415 $error = new Ethna_Error($message, $code, ETHNA_ERROR_DUMMY, E_USER_NOTICE, $userinfo, 'Ethna_Error');
420 * エラー発生時の(フレームワークとしての)コールバック関数を設定する
423 * @param mixed string:コールバック関数名 array:コールバッククラス(名|オブジェクト)+メソッド名
426 function setErrorCallback($callback)
428 $GLOBALS['_Ethna_error_callback_list'][] = $callback;
432 * エラー発生時の(フレームワークとしての)コールバック関数をクリアする
437 function clearErrorCallback()
439 $GLOBALS['_Ethna_error_callback_list'] = array();
443 * エラー発生時の処理を行う(コールバック関数/メソッドを呼び出す)
446 * @param object Ethna_Error Ethna_Errorオブジェクト
449 function handleError(&$error)
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];
459 // perform some more checks?
460 $object->$method($error);
463 call_user_func($callback, $error);