check_dir = IMAGE_SAVE_REALDIR; // SC_FormParamのフックポイント // TODO: debug_backtrace以外にいい方法があれば良いが、一旦これで $backtraces = debug_backtrace(); // 呼び出し元のクラスを取得 $class = $backtraces[1]['class']; $objPage = $backtraces[1]['object']; $objPlugin = SC_Helper_Plugin_Ex::getSingletonInstance($objPage->plugin_activate_flg); if (is_object($objPlugin)) { $objPlugin->doAction('SC_FormParam_construct', array($class, $this)); } } /** * 前方互換用 * * @deprecated 2.12.0 #1702 */ function initParam() { $this->disp_name = array(); $this->keyname = array(); $this->length = array(); $this->convert = array(); $this->arrCheck = array(); $this->arrDefault = array(); $this->input_db = array(); } // パラメーターの追加 function addParam($disp_name, $keyname, $length = '', $convert = '', $arrCheck = array(), $default = '', $input_db = true) { $this->disp_name[] = $disp_name; $this->keyname[] = $keyname; $this->length[] = $length; $this->convert[] = $convert; $this->arrCheck[] = $arrCheck; // XXX このタイミングで arrValue へ格納するほうがスマートかもしれない。しかし、バリデーションや変換の対象となるので、その良し悪しは気になる。 $this->arrDefault[$keyname] = $default; $this->input_db[] = $input_db; } // パラメーターの入力 // $arrVal :$arrVal['keyname']・・の配列を一致したキーのインスタンスに格納する // $seq :trueの場合、$arrVal[0]~の配列を登録順にインスタンスに格納する function setParam($arrVal, $seq = false) { if (!is_array($arrVal)) return; if (!$seq) { foreach ($arrVal as $key => $val) { $this->setValue($key, $val); } } else { foreach ($this->keyname as $index => $key) { $this->setValue($key, $arrVal[$index]); } } } // 画面表示用タイトル生成 function setHtmlDispNameArray() { foreach ($this->keyname as $index => $key) { $find = false; foreach ($this->arrCheck[$index] as $val) { if ($val == 'EXIST_CHECK') { $find = true; } } if ($find) { $this->html_disp_name[$index] = $this->disp_name[$index] . '(※ 必須)'; } else { $this->html_disp_name[$index] = $this->disp_name[$index]; } if ($this->arrDefault[$key] != '') { $this->html_disp_name[$index] .= ' [省略時初期値: ' . $this->arrDefault[$key] . ']'; } if ($this->input_db[$index] == false) { $this->html_disp_name[$index] .= ' [登録・更新不可] '; } } } // 画面表示用タイトル取得 function getHtmlDispNameArray() { return $this->html_disp_name; } // 複数列パラメーターの取得 function setParamList($arrVal2d, $keyname) { // DBの件数を取得する。 $no = 1; foreach ($arrVal2d as $arrVal) { $key = $keyname . $no; $this->setValue($key, $arrVal[$keyname]); $no++; } } function setDBDate($db_date, $year_key = 'year', $month_key = 'month', $day_key = 'day') { if (empty($db_date)) { return; } list($y, $m, $d) = preg_split('/[- ]/', $db_date); $this->setValue($year_key, $y); $this->setValue($month_key, $m); $this->setValue($day_key, $d); } // キーに対応した値をセットする。 function setValue($key, $value) { if (!in_array($key, $this->keyname)) { // TODO 警告発生 return; } $this->arrValue[$key] = $value; } function toLower($key) { if (isset($this->arrValue[$key])) { $this->arrValue[$key] = strtolower($this->arrValue[$key]); } } // エラーチェック function checkError($br = true) { $arrErr = array(); foreach ($this->keyname as $index => $key) { foreach ($this->arrCheck[$index] as $func) { $value = $this->getValue($key); switch ($func) { case 'EXIST_CHECK': case 'NUM_CHECK': case 'EMAIL_CHECK': case 'EMAIL_CHAR_CHECK': case 'ALNUM_CHECK': case 'GRAPH_CHECK': case 'KANA_CHECK': case 'URL_CHECK': case 'IP_CHECK': case 'SPTAB_CHECK': case 'ZERO_CHECK': case 'ALPHA_CHECK': case 'ZERO_START': case 'FIND_FILE': case 'NO_SPTAB': case 'DIR_CHECK': case 'DOMAIN_CHECK': case 'FILE_NAME_CHECK': case 'MOBILE_EMAIL_CHECK': case 'MAX_LENGTH_CHECK': case 'MIN_LENGTH_CHECK': case 'NUM_COUNT_CHECK': case 'KANABLANK_CHECK': case 'SELECT_CHECK': case 'FILE_NAME_CHECK_BY_NOUPLOAD': case 'NUM_POINT_CHECK': $this->recursionCheck($this->disp_name[$index], $func, $value, $arrErr, $key, $this->length[$index]); break; // 小文字に変換 case 'CHANGE_LOWER': $this->toLower($key); break; // ファイルの存在チェック case 'FILE_EXISTS': if ($value != '' && !file_exists($this->check_dir . $value)) { $arrErr[$key] = '※ ' . $this->disp_name[$index] . 'のファイルが存在しません。
'; } break; // ダウンロード用ファイルの存在チェック case 'DOWN_FILE_EXISTS': if ($value != '' && !file_exists(DOWN_SAVE_REALDIR . $value)) { $arrErr[$key] = '※ ' . $this->disp_name[$index] . 'のファイルが存在しません。
'; } break; default: $arrErr[$key] = "※※ エラーチェック形式($func)には対応していません ※※
"; break; } } if (isset($arrErr[$key]) && !$br) { $arrErr[$key] = preg_replace("//i", '', $arrErr[$key]); } } return $arrErr; } /** * SC_CheckError::doFunc() を再帰的に実行する. * * 再帰実行した場合は, エラーメッセージを多次元配列で格納する * * TODO 二次元以上のエラーメッセージへの対応 * * @param string $disp_name 表示名 * @param string $func チェック種別 * @param mixed $value チェック対象の値. 配列の場合は再帰的にチェックする. * @param array $arrErr エラーメッセージを格納する配列 * @param string $error_key エラーメッセージを格納する配列のキー * @param integer $length チェック対象の値の長さ * @param integer $depth 再帰実行した場合の深度 * @param integer $error_last_key エラーメッセージを格納する配列の末端のキー * @return void */ function recursionCheck($disp_name, $func, $value, &$arrErr, $error_key, $length = 0, $depth = 0, $error_last_key = null ) { if (is_array($value)) { $depth++; foreach ($value as $key => $in) { $this->recursionCheck($disp_name, $func, $in, $arrErr, $error_key, $length, $depth, $key); } } else { $objErr = new SC_CheckError_Ex(array(0 => $value)); $objErr->doFunc(array($disp_name, 0, $length), array($func)); if (!SC_Utils_Ex::isBlank($objErr->arrErr)) { foreach ($objErr->arrErr as $message) { if (!SC_Utils_Ex::isBlank($message)) { // 再帰した場合は多次元配列のエラーメッセージを生成 $error_var = '$arrErr[$error_key]'; for ($i = 0; $i < $depth; $i++) { // FIXME 二次元以上の対応 $error_var .= '[' . $error_last_key . ']'; } eval($error_var . ' = $message;'); } } } } } /** * フォームの入力パラメーターに応じて, 再帰的に mb_convert_kana 関数を実行する. * * @return void * @see mb_convert_kana */ function convParam() { foreach ($this->keyname as $index => $key) { if (isset($this->arrValue[$key])) { $this->recursionConvParam($this->arrValue[$key], $this->convert[$index]); } } } /** * 再帰的に mb_convert_kana を実行する. * * @param mixed $value 変換する値. 配列の場合は再帰的に実行する. * @param string $convert mb_convert_kana の変換オプション */ function recursionConvParam(&$value, $convert) { if (is_array($value)) { foreach ($value as $key => $val) { $this->recursionConvParam($value[$key], $convert); } } else { if (!SC_Utils_Ex::isBlank($value)) { $value = mb_convert_kana($value, $convert); } } } /** * 連想配列で返す * * @param array $arrKey 対象のキー * @return array 連想配列 */ function getHashArray($arrKey = array()) { $arrRet = array(); foreach ($this->keyname as $keyname) { if (empty($arrKey) || in_array($keyname, $arrKey)) { $arrRet[$keyname] = $this->getValue($keyname); } } return $arrRet; } // DB格納用配列の作成 function getDbArray() { $dbArray = array(); foreach ($this->keyname as $index => $key) { if ($this->input_db[$index]) { $dbArray[$key] = $this->getValue($key); } } return $dbArray; } /** * 配列の縦横を入れ替えて返す * * @param array $arrKey 対象のキー * @return array 縦横を入れ替えた配列 */ function getSwapArray($arrKey = array()) { $arrTmp = $this->getHashArray($arrKey); return SC_Utils_Ex::sfSwapArray($arrTmp); } // 項目名一覧の取得 function getTitleArray() { return $this->disp_name; } // 項目数を返す function getCount() { $count = count($this->keyname); return $count; } // フォームに渡す用のパラメーターを返す function getFormParamList() { $formParamList = array(); foreach ($this->keyname as $index => $key) { // キー名 $formParamList[$key]['keyname'] = $key; // 表示名 $formParamList[$key]['disp_name'] = $this->disp_name[$index]; // 文字数制限 $formParamList[$key]['length'] = $this->length[$index]; // 入力値 $formParamList[$key]['value'] = $this->getValue($key); } return $formParamList; } /** * キー名の一覧を返す * * @return array キー名の一覧 */ function getKeyList() { return $this->keyname; } // キー名と一致した値を返す function getValue($keyname, $default = '') { $ret = null; foreach ($this->keyname as $key) { if ($key == $keyname) { $ret = isset($this->arrValue[$key]) ? $this->arrValue[$key] : $this->arrDefault[$key]; break; } } if (is_array($ret)) { foreach ($ret as $key => $value) { if (SC_Utils_Ex::isBlank($ret[$key])) { $ret[$key] = $default; } } } else { if (SC_Utils_Ex::isBlank($ret)) { $ret = $default; } } return $ret; } /** * @deprecated */ function splitParamCheckBoxes($keyname) { foreach ($this->keyname as $key) { if ($key == $keyname) { if (isset($this->arrValue[$key]) && !is_array($this->arrValue[$key])) { $this->arrValue[$key] = explode('-', $this->arrValue[$key]); } } } } /** * 入力パラメーターの先頭及び末尾にある空白文字を削除する. * * @param boolean $has_wide_space 全角空白も削除する場合 true * @return void */ function trimParam($has_wide_space = true) { foreach ($this->arrValue as &$value) { $this->recursionTrim($value, $has_wide_space); } } /** * 再帰的に入力パラメーターの先頭及び末尾にある空白文字を削除する. * * @param mixed $value 変換する値. 配列の場合は再帰的に実行する. * @param boolean $has_wide_space 全角空白も削除する場合 true * @return void */ function recursionTrim(&$value, $has_wide_space = true) { $pattern = '/^[  \r\n\t]*(.*?)[  \r\n\t]*$/u'; if (is_array($value)) { foreach ($value as $key => $val) { $this->recursionTrim($value[$key], $has_wide_space); } } else { if (!SC_Utils_Ex::isBlank($value)) { if ($has_wide_space) { $value = preg_replace($pattern, '$1', $value); } $value = trim($value); } } } /** * 検索結果引き継ぎ用の連想配列を取得する. * * 引数で指定した文字列で始まるパラメーター名の入力値を連想配列で取得する. * * @param string $prefix パラメーター名の接頭辞 * @return array 検索結果引き継ぎ用の連想配列. */ function getSearchArray($prefix = 'search_') { $arrResults = array(); foreach ($this->keyname as $key) { if (preg_match('/^' . $prefix . '/', $key)) { $arrResults[$key] = $this->getValue($key); } } return $arrResults; } /** * 前方互換用 * * 1次キーが添字なのが特徴だったと思われる。 * @deprecated 2.12.0 必要ならば getFormParamList メソッドに引数を追加するなどで実現可能 */ function getFormDispArray() { $formDispArray = array(); foreach ($this->keyname as $index => $key) { // キー名 $formDispArray[$index]['keyname'] = $key; // 表示名 $formDispArray[$index]['disp_name'] = $this->disp_name[$index]; // 文字数制限 $formDispArray[$index]['length'] = $this->length[$index]; // 入力値 $formDispArray[$index]['value'] = $this->getValue($key); } return $formDispArray; } /** * パラメーターの削除 * addParamの逆の関数 * カスタマイズおよびプラグインで使用されるのを想定 */ function removeParam($keyname) { $index = array_search($keyname, $this->keyname); if ($index !== FALSE) { // $this->paramに歯抜けが存在する場合は、NULLで埋めておく。 // 最後に配列を詰める際に、全ての項目が埋まっている必要がある。 foreach ($this->keyname as $key => $value) { if (!isset($this->param[$key])) { $this->param[$key] = NULL; } } // $this->paramがソートされていない時があるのでソート。 ksort($this->param); // 削除 unset($this->disp_name[$index]); unset($this->keyname[$index]); unset($this->length[$index]); unset($this->convert[$index]); unset($this->arrCheck[$index]); unset($this->default[$index]); unset($this->input_db[$index]); unset($this->param[$index]); // 歯抜けになった配列を詰める $this->disp_name = array_merge($this->disp_name); $this->keyname = array_merge($this->keyname); $this->length = array_merge($this->length); $this->convert = array_merge($this->convert); $this->arrCheck = array_merge($this->arrCheck); $this->default = array_merge($this->default); $this->input_db = array_merge($this->input_db); $this->param = array_merge($this->param); } } /** * パラメーター定義の上書き * * @param string $keyname キー名 * @param string $target 上書きしたい項目名(disp_name,length,convert等) * @param mixed $value 指定した内容に上書きする */ function overwriteParam($keyname, $target, $value) { $index = array_search($keyname, $this->keyname); if ($index !== FALSE) { $this->{$target}[$index] = $value; } } }