Php zend framework-验证后确认保存

Php zend framework-验证后确认保存,php,validation,zend-framework,Php,Validation,Zend Framework,我的挑战是构建一个表单,其中数据在保存之前会得到验证,如果验证失败,用户应该确认是否要保存 实例: 有一个带有两个字段的注册表-用户名和is_manager。该名称不需要验证,但应使用Zend_Db_NoRecordExists验证is_管理器(确保另一个用户还没有管理器-has is_manager=true),如果另一个用户已经是管理器,则应提示该用户确认覆盖该管理器 目标数据库表将是users(名称、用户名、is_manager) 任何想法都是好主意!谢谢大家! 当有人更改is_manag

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

实例:

有一个带有两个字段的注册表-用户名和is_manager。该名称不需要验证,但应使用Zend_Db_NoRecordExists验证is_管理器(确保另一个用户还没有管理器-has is_manager=true),如果另一个用户已经是管理器,则应提示该用户确认覆盖该管理器

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


任何想法都是好主意!谢谢大家!

当有人更改is_manager复选框的状态时,您可以对该字段执行AJAX检查。我在本例中使用JQuery

设置Zend_Form_Element_复选框:

$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>

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

  • 您的现有表单具有相同的验证
  • 只包含一个提交按钮的覆盖确认表单
  • 流程如下:

  • 在第一次输入时,加载标准表单

  • 提交表单时,如果验证失败,请检查验证错误

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

    2.2如果没有,则重新显示他当前的表单和错误

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

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


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

    如何使用隐藏字段确定是否应覆盖管理器。如果另一个用户是管理员-取消选中复选框,但将隐藏的输入设置为true。如果再次选中-覆盖。是否使用Zend_表单创建该表单??您是否使用Zend_Form_Validate验证输入?所以您可以在那里执行AJAX请求ant ask$form->isValid(),并通过JSON返回响应…@tasmaniski是的,我使用zend_表单zend验证器。你能再详细说明一下你的想法吗?10倍!
    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));
    }