/class/ActionError.php

https://github.com/bobpp/ethna · PHP · 224 lines · 95 code · 19 blank · 110 comment · 9 complexity · a2bf0163a1de27b84752a57e3f60f3b3 MD5 · raw file

  1. <?php
  2. // vim: foldmethod=marker
  3. /**
  4. * ActionError.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: e08ceaf4594b9cf9dd5e38e3ba0997d5d1cc983b $
  10. */
  11. // {{{ Ethna_ActionError
  12. /**
  13. * アプリケーションエラー管理クラス
  14. *
  15. * @access public
  16. * @author Masaki Fujimoto <fujimoto@php.net>
  17. * @package Ethna
  18. * @todo 配列フォームを扱えるようにする
  19. */
  20. class Ethna_ActionError
  21. {
  22. /**#@+
  23. * @access private
  24. */
  25. /** @var array エラーオブジェクトの一覧 */
  26. var $error_list = array();
  27. /** @var object Ethna_ActionForm アクションフォームオブジェクト */
  28. var $action_form = null;
  29. /** @var object Ethna_Logger ログオブジェクト */
  30. var $logger = null;
  31. /**#@-*/
  32. /**
  33. * Ethna_ActionErrorクラスのコンストラクタ
  34. *
  35. * @access public
  36. */
  37. public function Ethna_ActionError()
  38. {
  39. }
  40. /**
  41. * エラーオブジェクトを生成/追加する
  42. *
  43. * @access public
  44. * @param string $name エラーの発生したフォーム項目名(不要ならnull)
  45. * @param string $message エラーメッセージ
  46. * @param int $code エラーコード
  47. * @return Ethna_Error エラーオブジェクト
  48. */
  49. public function add($name, $message, $code = null)
  50. {
  51. if (func_num_args() > 3) {
  52. $userinfo = array_slice(func_get_args(), 3);
  53. $error = Ethna::raiseNotice($message, $code, $userinfo);
  54. } else {
  55. $error = Ethna::raiseNotice($message, $code);
  56. }
  57. $this->addObject($name, $error);
  58. return $error;
  59. }
  60. /**
  61. * Ethna_Errorオブジェクトを追加する
  62. *
  63. * @access public
  64. * @param string $name エラーに対応するフォーム項目名(不要ならnull)
  65. * @param object Ethna_Error $error エラーオブジェクト
  66. */
  67. public function addObject($name, $error)
  68. {
  69. $elt = array();
  70. $elt['name'] = $name;
  71. $elt['object'] = $error;
  72. $this->error_list[] = $elt;
  73. // ログ出力(補足)
  74. $af = $this->_getActionForm();
  75. $logger = $this->_getLogger();
  76. $logger->log(LOG_NOTICE, '{form} -> [%s]', $this->action_form->getName($name));
  77. }
  78. /**
  79. * エラーオブジェクトの数を返す
  80. *
  81. * @access public
  82. * @return int エラーオブジェクトの数
  83. */
  84. public function count()
  85. {
  86. return count($this->error_list);
  87. }
  88. /**
  89. * エラーオブジェクトの数を返す(count()メソッドのエイリアス)
  90. *
  91. * @access public
  92. * @return int エラーオブジェクトの数
  93. */
  94. public function length()
  95. {
  96. return count($this->error_list);
  97. }
  98. /**
  99. * 登録されたエラーオブジェクトを全て削除する
  100. *
  101. * @access public
  102. */
  103. public function clear()
  104. {
  105. $this->error_list = array();
  106. }
  107. /**
  108. * 指定されたフォーム項目にエラーが発生しているかどうかを返す
  109. *
  110. * @access public
  111. * @param string $name フォーム項目名
  112. * @return bool true:エラーが発生している false:エラーが発生していない
  113. */
  114. public function isError($name)
  115. {
  116. foreach ($this->error_list as $error) {
  117. if (strcasecmp($error['name'], $name) == 0) {
  118. return true;
  119. }
  120. }
  121. return false;
  122. }
  123. /**
  124. * 指定されたフォーム項目に対応するエラーメッセージを返す
  125. *
  126. * @access public
  127. * @param string $name フォーム項目名
  128. * @return string エラーメッセージ(エラーが無い場合はnull)
  129. */
  130. function getMessage($name)
  131. {
  132. foreach ($this->error_list as $error) {
  133. if (strcasecmp($error['name'], $name) == 0) {
  134. return $this->_getMessage($error);
  135. }
  136. }
  137. return null;
  138. }
  139. /**
  140. * エラーオブジェクトを配列にして返す
  141. *
  142. * @access public
  143. * @return array エラーオブジェクトの配列
  144. */
  145. function getErrorList()
  146. {
  147. return $this->error_list;
  148. }
  149. /**
  150. * エラーメッセージを配列にして返す
  151. *
  152. * @access public
  153. * @return array エラーメッセージの配列
  154. */
  155. function getMessageList()
  156. {
  157. $message_list = array();
  158. foreach ($this->error_list as $error) {
  159. $message_list[] = $this->_getMessage($error);
  160. }
  161. return $message_list;
  162. }
  163. /**
  164. * アプリケーションエラーメッセージを取得する
  165. *
  166. * @access private
  167. * @param array エラーエントリ
  168. * @return string エラーメッセージ
  169. */
  170. function _getMessage(&$error)
  171. {
  172. $af = $this->_getActionForm();
  173. $form_name = $af->getName($error['name']);
  174. return str_replace("{form}", $form_name, $error['object']->getMessage());
  175. }
  176. /**
  177. * Ethna_ActionFormオブジェクトを取得する
  178. *
  179. * @access private
  180. * @return object Ethna_ActionForm
  181. */
  182. private function _getActionForm()
  183. {
  184. if (isset($this->action_form) == false) {
  185. $controller = Ethna_Controller::getInstance();
  186. $this->action_form = $controller->getActionForm();
  187. }
  188. return $this->action_form;
  189. }
  190. /**
  191. * Ethna_Loggerオブジェクトを取得する
  192. *
  193. * @access private
  194. * @return object Ethna_Logger
  195. */
  196. private function _getLogger()
  197. {
  198. if (is_null($this->logger)) {
  199. $controller = Ethna_Controller::getInstance();
  200. $this->logger = $controller->getLogger();
  201. }
  202. return $this->logger;
  203. }
  204. }
  205. // }}}