/** * Validator * * @param array $attr * @param array $item * * @return bool */ function validator(array $attr, array &$item) : bool { if (!in_array('edit', $attr['actions'])) { return true; } $item[$attr['id']] = cast($attr, $item[$attr['id']] ?? null); if ($item[$attr['id']] === null && !empty($attr['nullable'])) { return true; } $attr['opt'] = opt($attr); $valid = true; $callback = fqn('validator_' . $attr['type']); if (is_callable($callback)) { $valid = $callback($attr, $item); } else { // @todo switch ($attr['frontend']) { case 'checkbox': case 'radio': case 'select': $valid = validator_opt($attr, $item); break; case 'password': case 'textarea': $valid = validator_text($attr, $item); break; case 'date': case 'time': $valid = validator_datetime($attr, $item); break; case 'file': $valid = validator_file($attr, $item); break; } } return $valid && validator_uniq($attr, $item) && validator_required($attr, $item) && validator_boundary($attr, $item); }
/** * 名簿の検証 * * @param array $queries * @param array $options * * @return array */ function validate_members($queries, $options = array()) { $messages = array(); // クラス if (isset($queries['class_id'])) { if (!validator_required($queries['class_id'])) { $messages['class_id'] = 'クラスが入力されていません。'; } } // 名前 if (isset($queries['name'])) { if (!validator_required($queries['name'])) { $messages['name'] = '名前が入力されていません。'; } elseif (!validator_max_length($queries['name'], 20)) { $messages['name'] = '名前は20文字以内で入力してください。'; } } // 名前(フリガナ) if (isset($queries['name_kana'])) { if (!validator_required($queries['name_kana'])) { $messages['name_kana'] = '名前(フリガナ)が入力されていません。'; } elseif (!validator_katakana($queries['name_kana'])) { $messages['name_kana'] = '名前(フリガナ)は全角カタカナで入力してください。'; } elseif (!validator_max_length($queries['name_kana'], 20)) { $messages['name_kana'] = '名前(フリガナ)は20文字以内で入力してください。'; } } // 成績 if (isset($queries['grade'])) { if (!validator_required($queries['grade'])) { $messages['grade'] = '成績が入力されていません。'; } elseif (!validator_numeric($queries['grade'])) { $messages['grade'] = '成績は半角数字で入力してください。'; } elseif (!validator_max_length($queries['grade'], 3)) { $messages['grade'] = '成績は3桁以内で入力してください。'; } } // 生年月日 if (isset($queries['birthday'])) { if (!validator_required($queries['birthday'])) { } elseif (!validator_date($queries['birthday'])) { $messages['birthday'] = '生年月日の値が不正です。'; } } // メールアドレス if (isset($queries['email'])) { if (!validator_required($queries['email'])) { } elseif (!validator_email($queries['email'])) { $messages['email'] = 'メールアドレスの入力内容が正しくありません。'; } } // 電話番号 if (isset($queries['tel'])) { if (!validator_required($queries['tel'])) { } elseif (!validator_regexp($queries['tel'], '^\\d+-\\d+-\\d+$')) { $messages['tel'] = '電話番号の書式が不正です。'; } elseif (!validator_max_length($queries['tel'], 20)) { $messages['tel'] = '電話番号は20文字以内で入力してください。'; } } // メモ if (isset($queries['memo'])) { if (!validator_required($queries['memo'])) { } elseif (!validator_max_length($queries['memo'], 1000)) { $messages['memo'] = 'メモは1000文字以内で入力してください。'; } } // 公開 if (isset($queries['public'])) { if (!validator_boolean($queries['public'])) { $messages['public'] = '公開の書式が不正です。'; } } /* // 分類 if (isset($queries['category_sets'])) { if (empty($queries['category_sets'])) { $messages['category_sets'] = '分類が入力されていません。'; } } */ return $messages; }
/** * 教室の検証 * * @param array $queries * @param array $options * * @return array */ function validate_classes($queries, $options = array()) { $options = array('duplicate' => isset($options['duplicate']) ? $options['duplicate'] : true); $messages = array(); // コード if (isset($queries['code'])) { if (!validator_required($queries['code'])) { $messages['code'] = 'コードが入力されていません。'; } elseif (!validator_alpha_dash($queries['code'])) { $messages['code'] = 'コードは半角英数字で入力してください。'; } elseif (!validator_max_length($queries['code'], 20)) { $messages['code'] = 'コードは20文字以内で入力してください。'; } elseif ($options['duplicate'] === true) { if ($queries['id']) { $classes = db_select(array('select' => 'id', 'from' => DATABASE_PREFIX . 'classes', 'where' => array('id != :id AND code = :code', array('id' => $queries['id'], 'code' => $queries['code'])))); } else { $classes = db_select(array('select' => 'id', 'from' => DATABASE_PREFIX . 'classes', 'where' => array('code = :code', array('code' => $queries['code'])))); } if (!empty($classes)) { $messages['code'] = '入力されたコードはすでに使用されています。'; } } } // 名前 if (isset($queries['name'])) { if (!validator_required($queries['name'])) { $messages['name'] = '名前が入力されていません。'; } elseif (!validator_max_length($queries['name'], 20)) { $messages['name'] = '名前は20文字以内で入力してください。'; } } // メモ if (isset($queries['memo'])) { if (!validator_required($queries['memo'])) { } elseif (!validator_max_length($queries['memo'], 1000)) { $messages['memo'] = 'メモは1000文字以内で入力してください。'; } } // 並び順 if (isset($queries['sort'])) { if (!validator_required($queries['sort'])) { $messages['sort'] = '並び順が入力されていません。'; } elseif (!validator_numeric($queries['sort'])) { $messages['sort'] = '並び順は半角数字で入力してください。'; } elseif (!validator_max_length($queries['sort'], 5)) { $messages['sort'] = '並び順は5桁以内で入力してください。'; } } return $messages; }
/** * ユーザの検証 * * @param array $queries * @param array $options * * @return array */ function validate_users($queries, $options = array()) { $options = array('duplicate' => isset($options['duplicate']) ? $options['duplicate'] : true); $messages = array(); // ユーザ名 if (isset($queries['username'])) { if (!validator_required($queries['username'])) { $messages['username'] = '******'; } elseif (!validator_alpha_dash($queries['username'])) { $messages['username'] = '******'; } elseif (!validator_between($queries['username'], 4, 20)) { $messages['username'] = '******'; } elseif (validator_regexp($queries['username'], '(account|admin|alias|api|app|auth|config|contact|debug|default|develop|error|example|guest|help|home|index|info|inquiry|login|logout|master|register|root|sample|setting|signin|signout|signup|staff|status|support|system|test|user|version|www)')) { $messages['username'] = '******'; } elseif ($options['duplicate'] === true) { if ($queries['id']) { $users = db_select(array('select' => 'id', 'from' => DATABASE_PREFIX . 'users', 'where' => array('id != :id AND username = :username', array('id' => $queries['id'], 'username' => $queries['username'])))); } else { $users = db_select(array('select' => 'id', 'from' => DATABASE_PREFIX . 'users', 'where' => array('username = :username', array('username' => $queries['username'])))); } if (!empty($users)) { $messages['username'] = '******'; } } } // パスワード if (isset($queries['password'])) { $flag = false; if ($queries['id']) { if ($queries['password'] !== '') { $flag = true; } } else { if (!validator_required($queries['password'])) { $messages['password'] = '******'; } else { $flag = true; } } if ($flag === true) { if (!validator_regexp($queries['password'], '^[\\w\\!\\"\\#\\$\\%\\&\'\\(\\)\\*\\+\\,\\-\\.\\/\\:\\;\\<\\=\\>\\?\\@\\[\\\\\\]\\^\\_\\`\\{\\|\\}\\~]+$')) { $messages['password'] = '******'; } elseif (validator_regexp($queries['password'], '^([a-zA-Z]+|[0-9]+)$')) { $messages['password'] = '******'; } elseif (!validator_between($queries['password'], 8, 40)) { $messages['password'] = '******'; } elseif (isset($queries['username']) && validator_equals($queries['password'], $queries['username'])) { $messages['password'] = '******'; } elseif (!validator_equals($queries['password'], $queries['password_confirm'])) { $messages['password'] = '******'; } } } // メールアドレス if (isset($queries['email'])) { if (!validator_required($queries['email'])) { $messages['email'] = 'メールアドレスが入力されていません。'; } elseif (!validator_email($queries['email'])) { $messages['email'] = 'メールアドレスの入力内容が正しくありません。'; } elseif (!validator_max_length($queries['email'], 80)) { $messages['email'] = 'メールアドレスは80文字以内で入力してください。'; } elseif ($options['duplicate'] === true) { if ($queries['id']) { $users = db_select(array('select' => 'id', 'from' => DATABASE_PREFIX . 'users', 'where' => array('id != :id AND email = :email', array('id' => $queries['id'], 'email' => $queries['email'])))); } else { $users = db_select(array('select' => 'id', 'from' => DATABASE_PREFIX . 'users', 'where' => array('email = :email', array('email' => $queries['email'])))); } if (!empty($users)) { $messages['email'] = '入力されたメールアドレスはすでに使用されています。'; } } } // メールアドレス認証 if (isset($queries['email_activated'])) { if (!validator_boolean($queries['email_activated'])) { $messages['email_activated'] = 'メールアドレス認証の書式が不正です。'; } } // 暗証コード if (isset($queries['token_code'])) { if (!validator_required($queries['token_code'])) { $messages['token_code'] = '暗証コードが入力されていません。'; } else { $users = db_select(array('select' => 'id', 'from' => DATABASE_PREFIX . 'users', 'where' => array('email = :email AND token_code = :token_code', array('email' => $queries['key'], 'token_code' => $queries['token_code'])))); if (empty($users)) { $messages['token_code'] = '暗証コードが違います。'; } } } // 2段階認証 if (isset($queries['twostep'])) { if (!validator_boolean($queries['twostep'])) { $messages['twostep'] = '2段階認証の書式が不正です。'; } } // 2段階認証用メールアドレス if (isset($queries['twostep_email'])) { if ($queries['twostep'] === 1) { if (!validator_required($queries['twostep_email'])) { $messages['twostep_email'] = '2段階認証用メールアドレスが入力されていません。'; } elseif (!validator_email($queries['twostep_email'])) { $messages['twostep_email'] = '2段階認証用メールアドレスの入力内容が正しくありません。'; } elseif (!validator_regexp($queries['twostep_email'], '@(' . implode('|', array_map('preg_quote', $GLOBALS['config']['carriers'], array('/'))) . ')$')) { $messages['twostep_email'] = '指定されたドメインは使用できません。'; } } } return $messages; }
/** * プロフィールの検証 * * @param array $queries * @param array $options * * @return array */ function validate_profiles($queries, $options = array()) { $options = array('duplicate' => isset($options['duplicate']) ? $options['duplicate'] : true); $messages = array(); // 名前 if (isset($queries['name'])) { if (!validator_required($queries['name'])) { } elseif (!validator_max_length($queries['name'], 20)) { $messages['name'] = '名前は20文字以内で入力してください。'; } } // 紹介文 if (isset($queries['text'])) { if (!validator_required($queries['text'])) { } elseif (!validator_max_length($queries['text'], 1000)) { $messages['text'] = '紹介文は1000文字以内で入力してください。'; } } // メモ if (isset($queries['memo'])) { if (!validator_required($queries['memo'])) { } elseif (!validator_max_length($queries['memo'], 1000)) { $messages['memo'] = 'メモは1000文字以内で入力してください。'; } } return $messages; }
/** * 分類の検証 * * @param array $queries * @param array $options * * @return array */ function validate_categories($queries, $options = array()) { $options = array('duplicate' => isset($options['duplicate']) ? $options['duplicate'] : true); $messages = array(); // 名前 if (isset($queries['name'])) { if (!validator_required($queries['name'])) { $messages['name'] = '名前が入力されていません。'; } elseif (!validator_max_length($queries['name'], 20)) { $messages['name'] = '名前は20文字以内で入力してください。'; } } // 並び順 if (isset($queries['sort'])) { if (!validator_required($queries['sort'])) { $messages['sort'] = '並び順が入力されていません。'; } elseif (!validator_numeric($queries['sort'])) { $messages['sort'] = '並び順は半角数字で入力してください。'; } elseif (!validator_max_length($queries['sort'], 5)) { $messages['sort'] = '並び順は5桁以内で入力してください。'; } } return $messages; }