0

我的挑战是构建一个表单,在其中数据在保存之前得到验证,如果验证失败,用户应该确认他是否要保存。

实际例子:

有一个包含 2 个字段的注册表单 - 用户名和 is_manager。该名称不需要验证,但 is_manager 应该使用 Zend_Db_NoRecordExists 进行验证(确保另一个用户不是经理 - is_manager = true),如果另一个用户已经是经理,则应该提示用户确认覆盖经理。

目标数据库表将是用户(名称、用户名、is_manager)。

任何想法都是受欢迎的!谢谢你!

4

2 回答 2

1

您可以对该字段进行 AJAX 检查,当有人更改 is_manager 复选框的状态时。我在这个例子中使用了 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 回答
1

一种方法——不依赖于 javascript——是有两种形式:

  1. 具有相同验证的现有表单。
  2. 一个只包含提交按钮的覆盖确认表单。

流程如下:

  1. 在第一次输入时,加载标准表格。

  2. 在提交表单时,如果验证失败,请检查验证错误。

    2.1 如果唯一的验证错误是经理覆盖,则将他提交的信息存储在会话中,并将他重定向到显示确认表单的操作。

    2.2 如果不是,则重新显示他当前的错误表格。

  3. 如果验证成功,则照常写入记录。

  4. 在确认表单的操作中,只需确保会话包含您期望的数据。提交时,正常写入记录并清除会话数据。

当然不像客户端脚本辅助方法(如@tasmaniski 所建议的那样)那么巧妙,但至少没有javascript依赖。也许最佳组合是根据上面的默认流程设计您的表单,但是将您的 javascript 编写为渐进式增强,当 javascript 不可用时允许流程优雅地降级到上面。

于 2012-12-18T15:11:32.217 回答