zend框架 - 验证后确认保存

时间:2012-12-18 08:29:13

标签: php validation zend-framework

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

实际例子:

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

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

任何想法都很受欢迎!谢谢你!

2 个答案:

答案 0 :(得分:1)

当有人更改is_manager的状态复选框时,您可以对该字段执行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));
}

答案 1 :(得分:1)

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

  1. 您的现有表单具有相同的验证。
  2. 一个覆盖确认表单,其中只包含一个提交按钮。
  3. 流程如下:

    1. 首次输入时,请加载标准表格。

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

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

      2.2如果没有,则重新显示当前表格中的错误。

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

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

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