0

私の課題は、データが保存される前に検証されるフォームを作成することです。検証に失敗した場合、ユーザーは保存するかどうかを確認する必要があります。

実際の例:

ユーザー名と is_manager の 2 つのフィールドを持つ登録フォームがあります。名前の検証は必要ありませんが、is_manager は Zend_Db_NoRecordExists を使用して検証する必要があります (別のユーザーがまだマネージャーになっていないことを確認してください - is_manager = true)。別のユーザーが既にマネージャーである場合、そのユーザーはマネージャーを上書きすることを確認するように求められます。

ターゲット DB テーブルは users(name, username, is_manager) になります。

どんなアイデアでも大歓迎です!ありがとう!

4

2 に答える 2

1

javascriptに依存しない1つのアプローチは、2つの形式を持つことです。

  1. 同じ検証を持つ既存のフォーム。
  2. 送信ボタンのみを含む上書き確認フォーム。

フローは次のようになります。

  1. 最初のエントリで、標準フォームをロードします。

  2. フォームの送信時に検証が失敗した場合は、検証エラーを調べてください。

    2.1唯一の検証エラーがマネージャーの上書きである場合は、送信された情報をセッションに隠し、確認フォームが表示されるアクションにリダイレクトします。

    2.2そうでない場合は、現在のフォームをエラーとともに再表示します。

  3. 検証が成功した場合は、通常どおりレコードを書き込みます。

  4. 確認フォームのアクションで、セッションに期待するデータが含まれていることを確認してください。送信時に、通常どおりレコードを書き込み、セッションデータをクリアします。

確かに(@tasmaniskiによって提案されたように)クライアント側のスクリプト支援アプローチほど巧妙ではありませんが、少なくともjavascriptへの依存はありません。おそらく最適な組み合わせは、上記のデフォルトフローに従ってフォームを設計することですが、JavaScriptをプログレッシブエンハンスメントとして記述し、JavaScriptが利用できない場合にフローを上記に適切に低下させることを可能にします。

于 2012-12-18T15:11:32.217 に答える
1

誰かがis_managerチェックボックスのステータスを変更したときに、その1つのフィールドに対してAJAXチェックを行うことができます。この例では JQuery を使用します。

Zend_Form_Element_Checkbox で設定:

$is_manager->setAttrib('onchange', 'checkValue(this)');

あなたがJSを持っているよりも:

<script language = "Javascript">
function checkValue(object){
    var is_manager = $(object).is(':checked') ? 1 : 0;
    jQuery.ajax({
        url: '/default/index/ajax',  //modul/controller/action
        type: 'POST',
        data: {is_manager: is_manager},
        dataType: "json",
        success: function(result){
            if(result.status != 'OK')
                alert(result.message);
        }
    });
}
</script>

IndexController では、ajaxAction() はリクエストを取得し、JSON レスポンスを送信する必要があります。

public function ajaxAction(){
    $this->view->layout()->disableLayout();
    $this->_helper->viewRenderer->setNoRender(true);

    $is_manager = $this->_getParam('is_manager');

    // DO THE OTHER STUFF/validation AND LOGIC HERE
    // ... 

    // OR set success message and status = OK
    $results = array(
        'status'  => 'error',
        'message' => 'You will overwriting existing manager!'
    );

    $this->_response->setBody(json_encode($results));
}
于 2012-12-18T13:37:45.203 に答える