/class/Plugin/Validator/Required.php

https://github.com/bobpp/ethna · PHP · 132 lines · 83 code · 10 blank · 39 comment · 40 complexity · 78df085e100d087638a5ac0501b17543 MD5 · raw file

  1. <?php
  2. // vim: foldmethod=marker
  3. /**
  4. * Required.php
  5. *
  6. * @author ICHII Takashi <ichii386@schweetheart.jp>
  7. * @license http://www.opensource.org/licenses/bsd-license.php The BSD License
  8. * @package Ethna
  9. * @version $Id: a23d6eb526d5ddd41bc70fb505e1b8869204a332 $
  10. */
  11. // {{{ Ethna_Plugin_Validator_Required
  12. /**
  13. * 必須フォームの検証プラグイン
  14. *
  15. * @author ICHII Takashi <ichii386@schweetheart.jp>
  16. * @access public
  17. * @package Ethna
  18. */
  19. class Ethna_Plugin_Validator_Required extends Ethna_Plugin_Validator
  20. {
  21. /** @var bool 配列を受け取るかフラグ */
  22. var $accept_array = true;
  23. /**
  24. * フォームに値が入力されているかを検証する
  25. *
  26. * 配列の場合は、入力されるべき key のリスト、
  27. * あるいは key の数を指定できます
  28. *
  29. * @access public
  30. * @param string $name フォームの名前
  31. * @param mixed $var フォームの値
  32. * @param array $params プラグインのパラメータ
  33. */
  34. function validate($name, $var, $params)
  35. {
  36. $true = true;
  37. if (isset($params['required']) && $params['required'] == false) {
  38. return $true;
  39. }
  40. $form_def = $this->getFormDef($name);
  41. // 選択型のフォームかどうか
  42. switch ($form_def['form_type']) {
  43. case FORM_TYPE_SELECT:
  44. case FORM_TYPE_RADIO:
  45. case FORM_TYPE_CHECKBOX:
  46. case FORM_TYPE_FILE:
  47. $choice = true;
  48. break;
  49. default:
  50. $choice = false;
  51. }
  52. // スカラーの場合
  53. if (is_array($form_def['type']) == false) {
  54. if ($this->isEmpty($var, $this->getFormType($name))) {
  55. if (isset($params['error'])) {
  56. $msg = $params['error'];
  57. } else if ($choice) {
  58. $msg = _et('{form} was not selected.');
  59. } else {
  60. $msg = _et('no input to {form}.');
  61. }
  62. return Ethna::raiseNotice($msg, E_FORM_REQUIRED);
  63. } else {
  64. return $true;
  65. }
  66. }
  67. // 配列の場合
  68. $valid_keys = array();
  69. if ($var != null) {
  70. foreach (array_keys($var) as $key) {
  71. if ($this->isEmpty($var[$key], $this->getFormType($name)) == false) {
  72. $valid_keys[] = $key;
  73. }
  74. }
  75. }
  76. // 配列の required_key のチェック
  77. // 'required_key' => array(xx) に設定された配列の要素値がなければエラー。
  78. if (isset($params['key'])) {
  79. $invalid_keys = array_diff(to_array($params['key']), $valid_keys);
  80. if (count($invalid_keys) > 0) {
  81. if (isset($params['error'])) {
  82. $msg = $params['error'];
  83. } else if ($choice) {
  84. $msg = _et('Required item of {form} was not selected.');
  85. } else {
  86. $msg = _et('Required item of {form} was not submitted.');
  87. }
  88. return Ethna::raiseNotice($msg, E_FORM_REQUIRED);
  89. }
  90. }
  91. // 配列の required_num のチェック
  92. // 'required_num' => xx に設定された数より、validな値の数が少なければエラー。
  93. if (isset($params['num'])) {
  94. if (count($valid_keys) < intval($params['num'])) {
  95. if (isset($params['error'])) {
  96. $msg = $params['error'];
  97. } else if ($choice) {
  98. $msg = _et('Required numbers of {form} was not selected.');
  99. } else {
  100. $msg = _et('Required numbers of {form} was not submitted.');
  101. }
  102. return Ethna::raiseNotice($msg, E_FORM_REQUIRED);
  103. }
  104. }
  105. // とくに指定がないとき: フォームに与えられた全要素に
  106. // valid な値が入っていなければならない
  107. if (isset($params['key']) == false && isset($params['num']) == false) {
  108. if (count($valid_keys) == 0 || count($valid_keys) != count($var)) {
  109. if (isset($params['error'])) {
  110. $msg = $params['error'];
  111. } else if ($choice) {
  112. $msg = _et('Please select {form}.');
  113. } else {
  114. $msg = _et('Please input {form}.');
  115. }
  116. return Ethna::raiseNotice($msg, E_FORM_REQUIRED);
  117. }
  118. }
  119. return $true;
  120. }
  121. }
  122. // }}}