$width) { $pos = $len - ($len % $width); while ($pos > 0) { $encoded = substr_replace($encoded, "\r\n", $pos, 0); $pos -= $width; } } return $encoded; } /** * * */ class Controller { /** フォームオブジェクト */ var $form; /** 設定ファイルconfig.iniの内容 */ var $ini; /** グループ化する際の各部品 */ var $parts; /** グループ化する際に設定するルール(入力チェック)*/ var $rule; /** どのフォームを出力するか判定する変数 */ var $situation; /** 各項目名(ラベル)の文字列で最長のもの */ var $label_max; /** 必須項目でないグループで、1つ以上入力がなされている要素の配列 */ var $fill_group = array(); /** * 機種依存文字対策 * @var array */ var $change_str = array( "①" => "(1)", "②" => "(2)", "③" => "(3)", "④" => '(4)', "⑤" => "(5)", "⑥" => "(6)", "⑦" => "(7)", "⑧" => "(8)", "⑨" => "(9)", "⑩" => "(10)", "⑪" => "(11)", "⑫" => "(12)", "⑬" => "(13)", "⑭" => "(14)", "⑮" => "(15)", "⑯" => "(16)", "⑰" => "(17)", "⑱" => "(18)", "⑲" => "(19)", "⑳" => "(20)", "Ⅰ" => "I", "Ⅱ" => "II", "Ⅲ" => "III", "Ⅳ" => "IV", "Ⅴ" => "V", "Ⅵ" => "VI", "Ⅶ" => "VII", "Ⅷ" => "VIII", "Ⅸ" => "IX", "Ⅹ" => "X", "㈱" => "(株)", "㈲" => "(有)" ); /** * コンストラクタ * パラメータのチェックを行い、不正だった場合Internal Server Errorを返す */ function Controller() { /** パラメータ(situation)のチェック */ if(!is_dir(CONF_DIR . $_REQUEST['situation']) or $_REQUEST['situation'] == "") { header('HTTP/1.0 500 Internal Server Error', FALSE); die("Internal Server Error"); } else { $this->situation = $_REQUEST['situation']; } $cnfname = "config_".$this->situation; if($_SESSION[$cnfname] == "") { $_SESSION[$cnfname] = parse_ini_file(CONF_DIR . $this->situation . '/config.ini',true); } /** codeのチェック */ if($_SESSION[$cnfname]['code']['required'] and $_REQUEST['code'] == "") { header('HTTP/1.0 500 Internal Server Error', FALSE); die("コードが指定されていません"); } $ini = $_SESSION[$cnfname]; foreach($ini as $key => $value) { if(is_array($_POST[$key])) { if($ini[$key]['type'] == 'text') { foreach($_POST[$key] as $keys => $values) { // 機種依存文字対策 (対象文字は空文字に置換する) $values = $this->strChange($values); // 半角カタカナを全角カタカナに変換する $values = mb_convert_kana($values, 'KV', 'UTF-8'); $_POST[$keys] = $values; } } }else{ if(($ini[$key]['type'] == 'text')||($ini[$key]['type'] == 'textarea')) { $values = $_POST[$key]; // 機種依存文字対策 (対象文字は空文字に置換する) $values = $this->strChange($values); // 半角カタカナを全角カタカナに変換する $values = mb_convert_kana($values, 'KV', 'UTF-8'); $_POST[$key] = $values; } } } } /** * modeの値によって異なる処理にわける * */ function process() { switch ($_REQUEST['mode']) { case "inquiry" : $this->inquiry(); break; case "confirm" : $this->confirm(); break; case "finish" : $this->finish(); break; default : $this->inquiry(); break; } } /** 入力画面処理 */ function inquiry() { $cnfname = "config_".$this->situation; $form =& $this->createForm($_SESSION[$cnfname], 'get'); $form->updateAttributes(array('method' => 'post')); $form->addElement('hidden','mode','confirm'); $form->addElement('hidden','page','entry'); $this->setSubmit(); /** 画面表示 */ $this->smartyDisp($form, $this->situation . "/" . $this->situation . ".html"); } /** 確認画面処理 */ function confirm() { /** 入力画面でセットしたmodeをunsetする(そのままだと新しくmodeを設定できないため) */ unset($_POST['mode']); unset($_POST['page']); $cnfname = "config_".$this->situation; $form =& $this->createForm($_SESSION[$cnfname]); if($form->validate() and $_REQUEST['mode'] != 'finish') { $form->addElement('hidden','mode','finish'); $form->addElement('hidden','page','confirm'); $this->setReturnSubmit(); for($i = 0; $i < count($this->fill_group); $i++) { $cnfname = "config_".$this->situation; $form->addGroup($this->temp_parts[$i], $this->fill_group[$i], $_SESSION[$cnfname][$this->fill_group[$i]]['name']); } $this->freezeForm(); $vldname = "valid_".$this->situation; $_SESSION[$vldname] = true; } else { $form->addElement('hidden','mode','confirm'); $form->addElement('hidden','page',$_REQUEST['mode'] != 'finish' ? 'error' : 'reentry'); $this->setSubmit(); } $this->smartyDisp($form ,$this->situation . "/" . $this->situation . ".html"); } /** 完了画面処理 */ function finish() { $vldname = "valid_".$this->situation; if(!$_SESSION[$vldname]){ $protocol = "http"; if($_SERVER['HTTPS'] != "") { $protocol = "https"; } session_destroy(); header("Location: " . $protocol . "://" . $_SERVER['HTTP_HOST'] . $_SERVER['SCRIPT_NAME'] . "?situation=" . $this->situation . ($_POST['code'] != "" ? "&code=" . $_POST['code'] : "")); return; } if(isset($_REQUEST['button']['return'])) { $this->confirm(); return; } /** iniファイルからメールの設定を読み込む */ $mail = parse_ini_file(CONF_DIR . $this->situation .'/mail.ini',true); $cnfname = "config_".$this->situation; $ini = $_SESSION[$cnfname]; $smtname = "smarty_".$this->situation; $smarty = $_SESSION[$smtname]; $smarty->assign('date',date("Y年m月d日 H時i分s秒")); // foreach($ini as $key => $value) // { // if($this->label_max < strlen(mb_convert_encoding($ini[$key]['name'],"SJIS","UTF-8"))) // { // $this->label_max = strlen(mb_convert_encoding($ini[$key]['name'],"SJIS","UTF-8")); // } // if($this->label_max < mb_strlen($ini[$key]['name'],"UTF-8")) // { // $this->label_max = mb_strlen($ini[$key]['name'],"UTF-8"); // } // } /** メールテンプレートにPOSTデータを埋め込む */ foreach($ini as $key => $value) { if(is_array($_POST[$key])) { if($ini[$key]['type'] == 'text') { foreach($_POST[$key] as $keys => $values) { // 機種依存文字対策 (対象文字は空文字に置換する) // $values = $this->strChange($values); // $values = $this->replaceDependChars($values, ''); // 半角カタカナを全角カタカナに変換する $values = mb_convert_kana($values, 'KV', 'UTF-8'); $smarty->assign($keys, $values); } } elseif($ini[$key]['type'] == 'date') { foreach($_POST[$key] as $keys => $values) { $smarty->assign($key."_".$keys, $values); } } elseif($ini[$key]['type'] == 'checkbox') { $item = explode(',', $ini[$key]['item']); $contents = explode(',',$ini[$key]['contents']); foreach($_POST[$key] as $keys => $values) { if(in_array($keys,$contents)) { $i = array_search($keys,$contents); $smarty->assign($keys, $item[$i]); } } } else { $smarty->assign($key, $_POST[$key]); } } else { // 機種依存文字対策 (対象文字は空文字に置換する) // $_POST[$key] = $this->strChange($_POST[$key]); // $_POST[$key] = $this->replaceDependChars($_POST[$key], ''); // 半角カタカナを全角カタカナに変換する $_POST[$key] = mb_convert_kana($_POST[$key], 'KV', 'UTF-8'); if($ini[$key]['type'] == 'select') { $item = explode(',',$ini[$key]['item']); $item[0] = ""; $smarty->assign($key, $item[$_POST[$key]]); } elseif($ini[$key]['type'] == 'radio') { $item = explode(',',$ini[$key]['item']); $smarty->assign($key, $item[$_POST[$key] - 1]); } elseif($ini[$key]['type'] == 'textarea' or $ini[$key]['type'] == 'text') { $wrap = $ini[$key]['textwrap']; if (is_null($wrap)) { $wrap = 36; } elseif ($wrap <= 0) { $wrap = PHP_INT_MAX; } $wrapchar = $ini[$key]['textwrap.char']; if (is_null($wrapchar)) $wrapchar = ' '; $wrapmargin = $ini[$key]['textwrap.margin']; if (is_null($wrapmargin)) $wrapmargin = 1; $lines = explode("\n", $_POST[$key]); $textarea = ""; $space = ""; for($i =0; $i < $wrapmargin; $i++) { $space .= $wrapchar; } foreach($lines as $values) { while(mb_strlen($values,"UTF-8") > $wrap) { if($textarea == "") { $textarea .= mb_substr($values, 0, $wrap) . "\n"; $values = mb_substr($values, $wrap); } else { $textarea .= $space . mb_substr($values, 0, $wrap) . "\n"; $values = mb_substr($values, $wrap); } } if($textarea == "") { $textarea .= "$values\n"; } else { $textarea .= $space . "$values\n"; } } $smarty->assign($key, trim($textarea)); } else { $smarty->assign($key, $_POST[$key]); } } $space = ""; // for($i = 0; $i < $this->label_max - strlen(mb_convert_encoding($ini[$key]['name'],"SJIS","UTF-8")); $i++) for($i = 0; $i < $this->label_max - mb_strlen($ini[$key]['name'],"UTF-8"); $i++) { $space .= " "; } $smarty->assign("form_" . $key, $ini[$key]['name'] . $space); } //2009.03.09 Insert R.Nakano Start $smarty->assign("mailadm", $mail['mail']['To']); //2009.03.09 Insert R.Nakano End //2019.06.12 県央福祉会様向けカスタマイズ。加工したIPのメールへの埋め込み $client_ip = $_SERVER["REMOTE_ADDR"]; $ip_nums = explode('.', $client_ip); $ip_hexes = array(); foreach ($ip_nums as $ip_num) { $ip_hex = dechex(intval($ip_num)); if (strlen($ip_hex) == 1) $ip_hex = '0' . $ip_hex; $ip_hexes[] = $ip_hex; } $smarty->assign("client_ip", $ip_hexes[2] . $ip_hexes[0] . $ip_hexes[1] . $ip_hexes[3]); //2019.06.12 県央福祉会様向けカスタマイズここまで。 /** メール送信 (宛先などの設定) */ $recieve = $mail['mail']['To']; $headers['MIME-Version'] = "1.0"; $headers['Content-type'] = "text/plain; charset=UTF-8"; $headers['Content-Transfer-Encoding'] = "base64"; $headers['From'] = $_POST['mail']; // $headers['To'] = $mail['mail']['To']; $headers['Return-Path'] = $mail['mail']['Return-Path']; $headers['Subject'] = mb_encode_mimeheader($mail['mail']['Subject'],'UTF-8','B',"\n"); if ($mail['mail']['Cc']) { $headers['Cc'] = $mail['mail']['Cc']; } $body = $smarty->fetch($this->situation . '/mail.txt'); // 本番用 $mail_object =& Mail::factory("mail", "-f" . $mail['mail']['Return-Path']); $result =& $mail_object->send($recieve, $headers, mime_base64($body)); if (PEAR::isError($result)) { die($result->getMessage()); } unset($headers); //2009.03.09 Thanks メール送信機能 Insert R.Nakano start if($mail['mail']['Subject2']){ if($_POST['mail']){ /** メール送信 (宛先などの設定) */ $recieve = $_POST['mail']; $headers['MIME-Version'] = "1.0"; $headers['Content-type'] = "text/plain; charset=UTF-8"; $headers['Content-Transfer-Encoding'] = "base64"; $headers['From'] = $mail['mail']['To']; // $headers['To'] = $mail['mail']['To']; $headers['Return-Path'] = $mail['mail']['Return-Path']; $headers['Subject'] = mb_encode_mimeheader($mail['mail']['Subject2'],'UTF-8','B',"\n"); $body = $smarty->fetch($this->situation . '/usr_mail.txt'); $mail_object =& Mail::factory("mail", "-f" . $mail['mail']['Return-Path']); $result =& $mail_object->send($recieve, $headers, mime_base64($body)); if (PEAR::isError($result)) { die($result->getMessage()); } } } //2009.03.09 Thanks メール送信機能 Insert R.Nakano End /** ブラウザ表示 */ $smarty->display($this->situation . "/" . $mail['template']['finish']); /** セッション破棄 */ $cnfname = "config_".$this->situation; unset($_SESSION[$cnfname]); $vldname = "valid_".$this->situation; unset($_SESSION[$vldname]); $smtname = "smarty_".$this->situation; unset($_SESSION[$smtname]); session_destroy(); } /** * ブラウザ表示 */ function smartyDisp($form, $template) { $smarty = new Smarty; $smarty->template_dir = TEMPLATE_DIR; $smarty->compile_dir = TEMPLATE_C_DIR; $smarty->cache_dir = CACHE_DIR; $smarty->left_delimiter = "{%"; $smarty->right_delimiter = "%}"; /** renderer for Smarty templates の取得 */ $renderer =& new HTML_QuickForm_Renderer_ArraySmarty($smarty); $form->accept($renderer); $smarty->assign('form', $renderer->toArray()); /** charset指定 */ $cnfname = "config_".$this->situation; $smarty->assign('charset', $_SESSION[$cnfname]['encode']['charset']); if($form->isFrozen()) { $smarty->assign('mode', 'confirm'); } /** 表示 */ $smarty->display($template); $smtname = "smarty_".$this->situation; $_SESSION[$smtname] = $smarty; } /** *フォームを生成し、フォームオブジェクトを返す */ function &createForm($ini, $method='post') { $this->form = new HTML_QuickForm( $this->situation . '_form', $method, basename($_SERVER['PHP_SELF']) . '?situation=' . $this->situation); $this->form->applyFilter('__ALL__', 'trim'); foreach($ini as $key => $value) { /** グループ化するものはグループ化する */ if(isset($ini[$key]['group'])) { $this->createGroup($key,$ini); } /** テキストボックス */ elseif($ini[$key]['type'] == 'text') { $this->form->addElement( $ini[$key]['type'], $key, $ini[$key]['name'], array('size' => $ini[$key]['size'],'maxlength' => $ini[$key]['maxlength'],'onchange' => $ini[$key]['onchange'])); } /** テキストエリア */ elseif($ini[$key]['type'] == 'textarea') { $this->form->addElement( $ini[$key]['type'], $key, $ini[$key]['name'], array('cols' => $ini[$key]['cols'], 'rows' => $ini[$key]['rows'])); } /** 日付(セレクトボックス) */ elseif($ini[$key]['type'] == 'date') { //表示開始年を設定 if($ini[$key]['minYear'] == ''){ $__minYear = date("Y"); }else{ $__minYear = (int)$ini[$key]['minYear']; } if($ini[$key]['minYearOffset'] != ''){ if(is_numeric($ini[$key]['minYearOffset']) == true){ $__minYear += (int)$ini[$key]['minYearOffset']; } } //表示終了年を設定 if($ini[$key]['maxYear'] == ''){ $__maxYear = date("Y"); }else{ $__maxYear = (int)$ini[$key]['maxYear']; } if($ini[$key]['maxYearOffset'] != ''){ if(is_numeric($ini[$key]['maxYearOffset']) == true){ $__maxYear += (int)$ini[$key]['maxYearOffset']; } } $options = array( 'language' => $ini[$key]['language'], 'format' => $ini[$key]['format'], 'minYear' => $__minYear, 'maxYear' => $__maxYear); $this->form->addElement($ini[$key]['type'], $key, $ini[$key]['name'], $options); } /** hidden要素 */ elseif($ini[$key]['type'] == 'hidden'){ $this->form->addElement($ini[$key]['type'], $key); } /** itemを持っている要素は以下で処理 */ else { $item = explode(',',$ini[$key]['item']); $array = ""; /** セレクトボックス */ if($ini[$key]['type'] == 'select') { if($_REQUEST['mode'] == 'confirm'){ $item[0] = ""; } $this->form->addElement($ini[$key]['type'], $key, $ini[$key]['name'], $item); } /** ラジオボタン */ if($ini[$key]['type'] == 'radio') { $afterbr = explode(',', $ini[$key]['afterbr']); for($i = 0; $i < count($item); $i++) { $sep1 = ''; $sep2 = ''; if($i == 0){ $sep1 = '
'; } for($j = 0; $j < count($afterbr); $j++) { if($afterbr[$j] != '') { if($i == $afterbr[$j]) { $sep2 = '
'; break; } } } if($i == (count($item) - 1)){ $sep2 = '
'; } if($sep1 != ""){ $array[] = &HTML_QuickForm::createElement( 'static','divbefore',null,$sep1); } $array[] = &HTML_QuickForm::createElement( $ini[$key]['type'], null, null, $item[$i], ($i + 1)); if($sep2 != ""){ $array[] = &HTML_QuickForm::createElement( 'static','divafter',null,$sep2); } } $this->form->addGroup($array, $key, $ini[$key]['name'],' '); } /** チェックボックス */ if($ini[$key]['type'] == 'checkbox') { $contents = explode(',', $ini[$key]['contents']); $afterbr = explode(',', $ini[$key]['afterbr']); for($i = 0; $i < count($item); $i++) { $sep1 = ""; $sep2 = ""; if($i == 0){ $sep1 = '
'; } for($j = 0; $j < count($afterbr); $j++) { if($contents[$i] == $afterbr[$j]) { $sep2 = '
'; break; } } if($i == (count($item) - 1)){ $sep2 = '
'; } if($sep1 != ""){ $array[] = &HTML_QuickForm::createElement( 'static','divbefore',null,$sep1); } $array[] = &HTML_QuickForm::createElement( $ini[$key]['type'], $contents[$i], null,$item[$i]); if($sep2 != ""){ $array[] = &HTML_QuickForm::createElement( 'static','divafter',null,$sep2); } } $this->form->addGroup($array, $key, $ini[$key]['name'],' '); } } $this->defineRule($key,$ini); } return $this->form; } /** * 各要素(グループ化されたもの以外)のルールを定義する */ function defineRule($key,$ini) { $from = ''; $end = ''; if($ini[$key]['compare']) { if($_POST[$ini[$key]['compare.target']] != '') { $this->form->addRule($key, $from . $ini[$key]['error.required'] . $end, 'required'); } $this->form->addRule(array($key,$ini[$key]['compare.target']), $from . $ini[$key]['error.compare'] . $end,'compare',$ini[$key]['compare.operator']); } else { if($ini[$key]['required']) { $this->form->addRule($key, $from . $ini[$key]['error.required'] . $end, 'required'); } } if(isset($ini[$key]['regex'])) { $this->form->addRule($key, $from . $ini[$key]['error.regex'] . $end, 'regex', $ini[$key]['regex']); } if($ini[$key]['numeric']) { $this->form->addRule($key, $from . $ini[$key]['error.numeric'] . $end, 'numeric'); } if($ini[$key]['nonzero']) { $this->form->addRule($key, $from . $ini[$key]['error.nonzero'] . $end, 'nonzero'); } if($ini[$key]['isdate']) { $this->form->addRule($key, $from . $ini[$key]['error.isdate'] . $end, 'date'); } } /* *グループ化する必要のあるものをグループ化し、ルールを定義する */ function createGroup($key,$ini) { $from = ''; $end = ''; if($ini[$key]['group'] != 'parent') { $this->parts[] = &HTML_QuickForm::createElement( $ini[$key]['type'], $key, $ini[$key]['name'], array('size' => $ini[$key]['size'], 'maxlength' => $ini[$key]['maxlength'], 'onchange' => $ini[$key]['onchange'])); if($ini[$key]['required']) { $this->rule[$key][] = array($from . $ini[$key]['error.required'] . $end, 'required'); } if(isset($ini[$key]['regex'])) { $this->rule[$key][] = array($from . $ini[$key]['error.regex'] . $end, 'regex',$ini[$key]['regex']); } if($ini[$key]['numeric']) { $this->rule[$key][] = array($from . $ini[$key]['error.numeric'] . $end, 'numeric'); } } else { $this->form->addGroup($this->parts, $key, $ini[$key]['name'], $ini[$key]['separater']); $this->form->addGroupRule($key,$this->rule); if(!$ini[$key]['required']) { $temp = ""; if($_POST[$key] != null) { foreach($_POST[$key] as $keys => $values) { $temp .= $values; } if($temp != "") { /**グループ化された要素で、どれか一つでも入力がされていたら そのグループは条件つきの必須項目になる */ $this->form->addGroupRule( $key, $from . $ini[$key]['error.not_fill'] . $end, 'required', null, $ini[$key]['howmany']); } else { $this->fill_group[] = $key; $this->temp_parts[] = $this->parts; } } } $this->parts = ""; $this->rule = ""; } } /* * 確認ボタンとリセットボタンをつくる(入力画面) */ function setSubmit() { $buttons[] = &HTML_QuickForm::createElement('submit', 'forward', '確認'); $this->form->addGroup($buttons, 'button', null, " "); $this->form->addElement('reset','reset','リセット'); } /* * 戻るボタンと送信ボタンをつくる(確認画面) */ function setReturnSubmit() { $buttons[] = &HTML_QuickForm::createElement('submit', 'forward', '送信'); $buttons[] = &HTML_QuickForm::createElement('submit', 'return', '戻る'); $this->form->addGroup($buttons, 'button', null, " "); } /* * フォームをフリーズさせる */ function freezeForm() { $this->form->freeze(); } /** * POSTデータの中に指定の機種依存文字があれば置換する * * @param string POSTデータ * @return POSTの値(機種依存文字を任意の文字に変換したもの) */ function strChange($param){ foreach ($this->change_str as $keys => $values) { $param = mb_ereg_replace($keys, $values, $param); } return $param; } } $controller =& new Controller(); $controller->process(); ?>