Source for file Ethna.php

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

Documentation generated on Fri, 11 Nov 2011 03:58:04 +0900 by phpDocumentor 1.4.3