• ベストアンサー

HTML_QuickFormでの日本語の扱い・・・

HTML_QuickFormで $form->addRule("name", "名前は10字以内でお願いします", "maxlength", 10, "client"); などと指定して フォームに「あいうえおかきくけこ」などと入力すると、 クライアント側では通るのですが、 どうやらvalidate(サーバー側?)でひっかかってしまうようなのですが・・・ どこに原因があるのでしょうか? どうか教えてください。

  • PHP
  • 回答数2
  • ありがとう数0

質問者が選んだベストアンサー

  • ベストアンサー
回答No.2

> PEARの該当箇所を開いて、 > $length = strlen($value); > を > $length = mb_strlen($value); > > のように書き換えることでひとまず解決したのですが、 バグでもない箇所を書き換えるのはお勧めしません。 エラーメッセージを変更するのではダメなのでしょうか? 例えば、「名前は半角10文字、または全角5文字以内でお願いします」など それがダメなら、独自ルールを作るのが一番だと思います。 > ここらへん、どの参考書もまったく触れていないのが不思議です・・・ 文字数チェックはバイト単位でのチェック方法が一般的だからだと思います。

madman666
質問者

補足

あれからいろいろと考えてみたのですが、 なるべくスマートにしようと思って $form->addRule("name", "名前は10文字以内で入力してください", "regex", '/^.{1,10}$/', "client"); という、正規表現を使った方法を思いついたのですが、 このような方法はあまり良くないのでしょうか? ぜひアドバイスをお願いします。

その他の回答 (1)

回答No.1

maxlengthに指定する10というのは 10文字ではなく、10byteです。 print strlen('あいうえおかきくけこ'); とした場合に出力される値以上の数値を指定しなくては エラーになるはずです。

madman666
質問者

補足

すみません。質問がすこし変でした; 文字数ではなくバイト数で数えていることはわかったので、 PEARの該当箇所を開いて、 $length = strlen($value); を $length = mb_strlen($value); のように書き換えることでひとまず解決したのですが、 PEARの内容を書き換えることに少し抵抗があるので、 他になにか良い解決方法はないでしょうか? 自分で思いついたものは、 自分で新しいルールを作ることぐらいです; もっとスマートな方法はないでしょうか? ここらへん、どの参考書もまったく触れていないのが不思議です・・・ よろしくお願いします。

関連するQ&A

  • PEAR::HTML_QuickFormのfreezeについて

    PEAR::HTML_QuickFormのfreezeを使って、特定の項目だけフリーズさせたいと考えてます。 全体をフリーズさせるときは、 $this -> freeze(); としてますが、項目のみの場合も出来るような事が書いてありました。 下記のソースの場合は、どのように設定すればよいかおしえてもらえますでしょうか? <?php require_once "HTML/QuickForm.php"; $form = new HTML_QuickForm('frmTest', 'get'); $form->addElement('header', 'MyHeader', 'Testing QuickForm'); $form->addElement('text', 'MyTextBox', 'What is your name?'); $form->addElement('reset', 'btnClear', 'Clear'); $form->addElement('submit', 'btnSubmit', 'Submit'); if ($form->validate()) { # If the form validates then freeze the data $form->freeze(); } $form->display(); ?>

    • ベストアンサー
    • PHP
  • QuickFormのradioボタンでエラーが出る

    require_once("HTML/QuickForm.php"); $form = new HTML_QuickForm(); $ques[] = &HTML_QuickForm::createElement('radio', null, 'Yes', 'Yes', '1');←”ここでエラーがでる” $ques[] = &HTML_QuickForm::createElement('radio', null, 'No', 'No', '2'); $form->addGroup($ques, 'ques'); $form->addRule('ques', '入力してください。', 'required', null, 'client'); if ($form->validate()){ $form->freeze();} $form->addElement('submit','submit', '送信'); require_once("HTML/QuickForm/Renderer/ArraySmarty.php"); $renderer= new HTML_QuickForm_Renderer_ArraySmarty($smarty); $form->accept($renderer); $smarty->assign('form', $renderer->toArray()); $file = 'test.tpl'; $smarty->display($file) ----------------------------------------------------------- HTML_QuickFormでラジオボタンをチェックしたいのですが、「←”ここでエラーがでる”」の部分で、Fatal error: [] operator not supported for strings in /virtual/パス/test.php on line 19←ここの数字はエラー行 のエラーがでます。 どうやったら、エラーを回避できるか分かりません。 よろしくお願いします。

    • 締切済み
    • PHP
  • PEAR::HTML_QuickForm 確認から完了について

    PEAR::HTML_QuickFormの使い方として、入力→内容確認→完了のように画面が遷移させるのが一般的だと思っています。 確証(validate)後はどのようにコーディングすれば良いでしょうか。 例えば、よくあるサンプルでこのような書き方があります。 if($form->validate()) { $form->process("hoge"); } しかし、processメソッドは戻り値がないく使いづらいので、ユーザー定義関数に置き換えています。 また if($form->validate()) { $form->freeze(); echo $form->toHtml(); } のようなものも良く見ますが、HTML_QuickForm_Elementのメソッドを利用してもheader要素はいじれないようなのでこれまた使いづらい気がします。 subimitボタンなんかもDefaultRenddererのまんまだとテーブルの要素になってしまうようで、書き直したりして・・・。 結局、不細工なソースになってしまってなんだか釈然としません。 抽象的な質問でスミマセンが、入力後の確認から完了までの標準的な雛形があれば参考にしたいと考えています。

    • ベストアンサー
    • PHP
  • HTML_QuickFormのチェックボックスについて

    smartyと連携させて作っています。 チェックボックスで取得した値を任意の場所に指定させたいのですが どのようにすればできるのでしょうか? 現状は、チェックボックスの値は正常に表示されるのですがメール本文 の最下部に表示されてしまい任煮の場所に表示させたいのですが方法がわかりません。 「現状のメール本文」 =============================================================== 【氏名】 nameに入力した値 【選択】 Array //←Arrayではなくここに選択肢の値を入れたい =============================================================== cb3の値 //←ここに選択肢の値は表示させたくない 中身は以下のようになっています。(抜粋) <?php $form->addElement('text', 'name', '氏名'); $checks = array(); $checks[] =& HTML_QuickForm::createElement('checkbox', 'cb3_1', null, 'cb3_1_label'); $checks[] =& HTML_QuickForm::createElement('checkbox', 'cb3_2', null, 'cb3_2_label'); $checks[] =& HTML_QuickForm::createElement('checkbox', 'cb3_3', null, 'cb3_3_label'); $form->addGroup($checks, 'cb3', '選択', "<br />\n"); $form->addGroupRule('cb3', '選択は必須項目です', 'required', null, 1); $message = <<<EOD =============================================================== 【氏名】 {$value['name']} 【選択】 {$value['cb3']} =============================================================== EOD; foreach ($value['cb3'] as $k => $v) { switch ($k) { case 'cb3_1' : $message .= "選択肢1が選択されました。\n"; break; case 'cb3_2' : $message .= "選択肢2が選択されました。\n"; break; case 'cb3_3' : $message .= "選択肢3が選択されました。\n"; break; } } mb_send_mail($to, $subject, $message, "From: {$value['email']}"); $form->freeze(); } else if ($form->validate() && isset($value['confirm'])) { } else { } ?>

    • 締切済み
    • PHP
  • HTML_QuickFormの関数について

    setRequiredNoteの使い方でわからないのですがマニュアルをみるとフォームに必須入力フィールドが 含まれている場合に 通常はフォームの下に表示されます。とありますが全く表示されません。 表示はsmartyで行っておりざっくりですが以下のようにしています。 $form->addElement('textarea', 'message', 'メッセージ:'); $form->addRule('message', '必須項目です', 'required'); $form->setRequiredNote('*必須入力'); フォーム等については問題なく表示され動作するのですがこれを表示するにはテンプレート側に どう記述すればいいですか? phpで$formをdumpしたところ[_requiredNote]に設定値があったので試しに{$form.requiredNote}と 入れてみましたが表示されず調べてみましたが全くわからずです。

    • ベストアンサー
    • PHP
  • QuickFormって新規作成したページのみ利用可能なのでしょうか?

    初歩的な質問で申し訳ありません。 PEARの中のHTML_QuickFormで使用できる入力チェックは新規で作成するフォームにしか使用できないのでしょうか? フォーム自体はデザイナさんに作っていただき既に存在するのでそのフォームに入力チェックロジックを付与したいのですが、そういうことはできますか?

    • ベストアンサー
    • PHP
  • Pear::QuickFormの代わりになる物

    PHP: 5.3.8を利用しております。 結構前のPHPVerで、HTML_Quickformで、form画面を作成したページを 今回のPHP: 5.3.8に載せて動かしてみたところ ”Deprecated: Assigning the return value of new by reference is deprecated in C:\xampp\php\PEAR\HTML\QuickForm.php on line 597” というメッセージが数件表示されるようになりました。 <色々調べてみた結果> ・QuickFormで使用されているメソッド関係が、今後無くなる可能性あり? みたいなことがわかりました。 <対応方法> ・Deprecated: メッセージが表示されないように、設定ファイルの変更 ・作り直し。 がわかりました。 「設定ファイルの変更」は、解決にならないと思うのでする予定はないのですが、 作り直しとして、「QuickForm2」というのものがあることを知りました。 【質問】 QuickForm2で作り直しに挑戦してもよいのですが、stableバージョンが2010年のようなのです。 現在、「QuickForm」のように簡単にフォームが作成できて、PHP: 5.3.8以上で使用しても Deprecated: Assigningメッセージがでない物を探しております。 ご教授おねがいします。

    • ベストアンサー
    • PHP
  • PEARのQuickFormを用いて同一ページ内で複数フォーム設置について

    PEARのQuickFormを用いて同一ページ内に2つのフォームを 設置したいのですが、一方のフォームの送信ボタンを押すと、 両フォームとも確認画面で確認表示となってしまいます。 他方のフォームはそのままフォームを出力させたいのですが。 それから下記のように二つのフォームに、 重複する項目(mailaddress)があります。 mailaddressという変数名はDBのカラム名でもあり、変更できません。 ボタンを押したフォームのみ、確認表示されるようにはできませんでしょうか? <form method="post" action="***.php" name="formA"> ID:{$form.mailaddress.html} PASS:{$form.pass.html} {$form.submit.html} </form> <form method="post" action="***.php" name="formB"> メールアドレス:{$form.mailaddress.html} お問い合わせ内容:{$form.toiawase.html} {$form.submit.html} </form>

    • ベストアンサー
    • PHP
  • なぜ、unexpected T_VARIABLEになるのでしょうか? 

    WindowsXP機に、PHP5とPEARを入れています。 あるWebサイトに記述されている下記のサンプルスクリプトをコピペして(PEARは絶対パスに書き換えて)実行しましたが、次のエラーが出ます。全角スペースは入っていませんし、原因が分かりません。 なぜ、unexpected T_VARIABLEになるのでしょうか? どのようにすれば解決できるでしょうか? エラー Parse error: syntax error, unexpected T_VARIABLE, expecting T_FUNCTION in C:\Program Files\Apache Group\Apache2\htdocs\HQuickForm_test\QfrmSmpl.php on line 14 サンプルスクリプト一部抜粋: <?php require_once("C:\php\PEAR\HTML\QuickForm.php"); class QfrmSmpl{ var $_form; function QfrmSmpl($sbmtAct){ $this -> _form = new HTML_QuickForm("frmSmpl","post",$sbmtAct); } function setForm(){ $this -> _form -> addElement("text","txtName","名前(全角日本字):"); $this -> _form -> addElement("text","txtEname","名前(半角英字):"); $this -> _form -> addElement("text","txtEmail","E-mail:"); $this -> _form -> addElement("text","txtEmail2","E-mail(確認用):"); $this -> _form -> addElement("textarea","txtrComment","コメント:"); } $this -> _form -> applyFilter(__ALL__,"trim"); $this -> _form -> addRule("txtName","名前を入力!","required", null, "client"); $this -> _form -> addRule("txtEname","半角英字で入力!","alphanumeric", null, "client"); $this -> _form -> addRule(array("txtEmail","txtEmail2"),"メールアドレス不一致!","compare", null, "client"); $this -> _form -> addRule("txtEmail","無効なメールアドレス!","email", null, "client"); $this -> _form -> addRule("txtrComment","コメントを入力!","required", null, "client"); $this -> _form -> setRequiredNote("<font color='red'>*</font>必須入力"); } 以下略

    • ベストアンサー
    • PHP
  • HTML_QuickForm ラジオボタンにデフォルト値を設定するには

    HTML_QuickForm::createElementにて作成したラジオボタンのグループの1つにデフォルトでチェックを入れるにはどうしたら良いでしょうか。 addElementではなくcreateElementです。 具体的にはこのようなソースです。 for($i=0;$i<=$m;$i++) { $tmp[$i] = array( $form->createElement("text","t", ), $form->createElement("radio","r",NULL,"r0",0), $form->createElement("radio","r",NULL,"r1",1), $form->createElement("radio","r",NULL,"r2",2) ); $form->addGroup($tmp[$i],"gp".$i,"rgp".$i.":"); } r0をチェックした期待するhtmlは下記の通りです。 <input type="radio" name="gp1[r]" value="0" checked>r0 宜しくお願い致します。

    • ベストアンサー
    • PHP

専門家に質問してみよう