『PEAR HTML_QuickForm+SMARTYを使用してフォーム検証が動作しない問題』


Formの値を送信の際に、Javascriptを呼び出して任意の値とフォームの値を持ちながら次のページに問題なく移動し変数も渡されていますが、QuickFormで設定したルール違反を行っても、アラートとも出ないまま、スルーしてページを移動してしまいます。

QuickFormの検証の記述のタイミングが悪いのでしょうか? 

また現状のように、QuickFormの検証ルールが呼び出して展開するJavaScriptをSmartyのテンプレートに先回りして記述してよいのでしょうか?…

色々と試してみましたが、初級者の私には解決が出来ずにおります。

解決の糸口をご存知の方がいましたら、ご教授いただけると助かります。

サンプルコードはこちらを参照ください。
http://kinsekitei.com/prototype/sample.html


よろしくお願いします。

回答の条件
  • 1人5回まで
  • 登録:
  • 終了:2011/09/27 21:36:58
※ 有料アンケート・ポイント付き質問機能は2023年2月28日に終了しました。

ベストアンサー

id:Jupiter2100 No.1

回答回数444ベストアンサー獲得回数74

ポイント300pt

検証のJavaScriptを別に用意したのでしょうか?

QuickFormが生成する関数と名前の衝突が起こり、これらの関数がエラーを起こし、正常に機能しないのだと思います。

検証用関数はQuickFormに任せるか、QuickFormを使わずに自力で検証用関数を用意するかの2つに1つの選択になると思います。

id:DrArabes

返信ありがとうございます。お世話になります!

検証用のJavaScriptを設置したわけでは有りません。Javascriptはショッピングカート用のものです。特に競合する関数名を見つける事もできませんでした。さらにカート用JSはテンプレートに記述しなくても作動しました。

動作の比較としてQuickFormのみとQuickForm+Smartyを見て気がついたことは、Smartyテンプレートを使用すると、QuickFormが書き出す検証用のJSがソースに書き出されていませんでした。テンプレートにて書き出す場所を設定するべきなのでしょうか?

要はQuickFormのaddRuleが作動していないってこと…これが不具合の原因なのかと思っております。これが仰る関数と名前の衝突でしょうか?

<検証が 作動 するファイル "HTML_QuickForm" >

http://kinsekitei.com/prototype/sample_b.html

<検証が 誤作動 するファイル "HTML_QuickForm+SMARTY" >

http://kinsekitei.com/prototype/sample_a.html


お手数ですが、ご教授いただけると助かります。

2011/09/27 17:23:22
  • id:DrArabes
    お世話になります。試行錯誤の結果… カートに入れるJavascriptは<HEADER>から外部.jsと記述し問題なく機能を果たしてくれました。

    ですが…検証のルールが適応されていません。「関数と名前の衝突」と仰っていましたが、その衝突はQuickFormファイル内部で起きていることなのでしょうか?またテンプレートファイルとの衝突なのでしょうか?

    問題は、Smartyとテンプレートを使用した場合に、QuickFormが自動にHTMLに書き出す検証Javascriptの書き出す位置をテンプレートにどの位置にどのように示すかが誤作動の原因のような気がしています。

    下記の比較のファイルを除いてみてください。QuickFormのみではルール検証スクリプトが出力されているのに対して、+SMARTYの場合は出力がされていません。(きっと私が指示を記述していないからだと思います。)


    <検証が 作動 するファイル "HTML_QuickForm" >
    http://kinsekitei.com/prototype/sample_b.html

    <検証が 誤作動 するファイル "HTML_QuickForm+SMARTY" >
    http://kinsekitei.com/prototype/sample_a.html

    どなたか、解決の糸口をご存知の方がいましたら、ご教授ください。よろしくお願いします。
  • id:DrArabes
    すごくあっけなく解決しました。
    Smartyテンプレートの<form>タグの前に{$form.javascript}を挿入するだけでした。
    ご回答いただきありがとうございました!

    ---------------------------------
    {$form.javascript}

    <form {$form.attributes} >
    |
    |
    </form>
    ---------------------------------
  • id:tobeoscontinue
    エラーはテンプレートHTML本文の
    <a href="javascript:buy({$id})">にある$idをSmartyが展開する時に問題が発生($idが無い)しているものと思います。
    しかし当方では確認できませんでした。もしかしたらキャッシュに問題があるのかもしれません。
    /var/www/vhosts/kinsekitei.com/smarty/templates_cのファイルを全て削除してみてはどうでしょう。

    QuickFormのみではルール検証スクリプトが出力されているものが希望するものなら
    $form.toHTML()でそのhtmlをテンプレートに入れるのも手です。

    HTML_QuickForm_Renderer_DefaultやHTML_QuickForm_Renderer_ArraySmartyなどのレンダーを
    使う必要があるのでしょうか。
    $form->toArray()でいいように思うのですが。
    ただ配列の内容は異なります。var_dump()で確認すればわかると思いますが
    テンプレートは
    {$form.javascript}
    <form {$form.attributes} >
    {$form.elements[0].html}
    {$form.elements[1].html}
    {$form.elements[2].label}{$form.elements[2].html}
    {$form.elements[3].html}
    {$form.requirednote}
    </form>
    などとなるでしょう。

この質問への反応(ブックマークコメント)

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

回答リクエストを送信したユーザーはいません