javascript - 在 Zend Framework 1.12 中保存之前确认验证

标签 javascript php jquery validation zend-framework

我有一个表单和对该表单的验证。为了保存数据,我使用了一个使用 ajax 来保存数据的函数。这是我的表格

    <form name="enquiry_form"  method="post" id="enquiry_form">
        Full Name: <input name="name" id="name" type="text" pattern="[A-Za-z ]{1,20}" oninvalid="setCustomValidity('Plz enter only Alphabets ')" onchange="try{setCustomValidity('')}catch(e){}"> 
        Email: <input  name="email"  id="email" type="email"  oninvalid="setCustomValidity('Plz enter valid email ')" onchange="try{setCustomValidity('')}catch(e){}" required   >
         Phone: <input name="mobile"  id="mobile" type="text" pattern="[0-9]{10,12}" oninvalid="setCustomValidity('Plz enter valid Mobile Number ')" onchange="try{setCustomValidity('')}catch(e){}" required >
         Query: <textarea name="query"  id="query" class="" required></textarea></li> 
         <input type="submit" value="SUBMIT"  id="enq_submit" onclick="getEnquiryForm(); ">                           
            </form>

这是我的 getEnquiryForm() 函数:

    getEnquiryForm: function()
{
        var url = window.location.protocol+'//'+window.location.host+'/'+path.base_path+'/ajax/save-enquiry'; //url path
            new Ajax.Request(url,
            {
                parameters: $('enquiry_form').serialize(),
                method:'POST',
                onSuccess: function(transport) {
                    //alert(transport.responseText);

                },
                onFailure: function(transport) {
                    alert('Could not connect to Propladder Server for this request');
                },
                onComplete: function(transport) {
                }
            });
},

然后是我的 ajaxController,其中我在函数中的上面的 url 中提到了 saveEnquiry() 操作

    public function saveEnquiryAction()
{
    $data = array();
            $data['name'] = $this->_getParam('name');
            $data['email'] = $this->_getParam('email');
            $data['mobile'] =$this->_getParam('mobile');
            $data['query'] =$this->_getParam('query');  
    $mapper = new Application_Model_EnquiryMapper();
        $mapper->save($data); 
}

在我单击提交按钮后,如果验证为 false,它会立即移动到该函数并保存在数据库中,并且还会显示验证警报,并且在提供验证为 true 的输入后,数据将再次保存。这样我的表单就被保存了多次。相反,只有当所有表单都满足时,光标才应移动到 getEnquiryForm()saveEnquiryAction()验证正确

最佳答案

为什么不创建一个 Zend_Form 并验证它?

http://framework.zend.com/manual/1.12/en/zend.form.html

或者你可以直接使用抽象类Zend_Validate来检查验证是否通过。并构建一个错误数组以在 View 中显示用户错误

$errors = array();

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

/** @see Zend_Validate */
// Zend_Validate::is($value,$baseClassName);
// baseClassName: NotEmpty, EmailAddress, Uri, GreaterThan, LessThan

if(Zend_Validate::is($name,'NotEmpty')) {
    $data['name'] = $name;
}
else {
    $errors['name'] = 'Empty';
}
if(Zend_Validate::is($name,'EmailAddress')) {
    $data['email'] = $email;
}
else {
    $errors['email'] = 'Not an email';
}
...

$enquiryMapper = new Application_Model_EnquiryMapper();
//check if existing?
$enquiry = $enquiryMapper->fetchByEmail($email);
if($enquiry) {
    $errors['email'] = 'Email existing';
}
...
//check if no errors are occured
if(!count($errors)) {
    //save your model
    $data = array();
    $data['name'] = $this->_getParam('name');
    $data['email'] = $this->_getParam('email');
    $data['mobile'] =$this->_getParam('mobile');
    $data['query'] =$this->_getParam('query');  

    $enquiry = $enquiryMapper->save($data); 
}
...
$this->view->enquiry = $enquiry; //used to check if saved correctly
$this->view->errors = $errors; //used to show errors in the view (foreach)

但我强烈建议您使用 Zend_Form 对象以及验证器和过滤器。

您将获得过滤后的干净值并自动翻译(如果设置了 Zend_Locale)错误消息。

通过 Controller 中的新的 Zend_Form

$form = new Zend_Form();
$form->setAction("");
$form->setMethod('POST');

$name = $form->createElement('text','name',array(
    //'label' => 'Name:',
    'placeholder' => 'Name',
    'required' => true,
    'validators'    => array(
        array(new Zend_Validate_NotEmpty(), true),
        array(new Zend_Validate_StringLength(array('min' => 1,'max' => 64)),true)
    ),
    'filters' => array()
));

$form->addElement($name);
...

$form->addElement('button', 'submit', array(
    'label' => "Save"
));

$this->view->form = $form;

或者在 application/forms/Test.php 中扩展 Zend_Form

class Application_Form_Test extends Zend_Form {
    public function init() {
         $this->setAction("");
         $this->setMethod("POST");

         $name = $this->createElement('text','name',array(
             //'label' => 'Name:',
             'placeholder' => 'Name',
             'required' => true,
             'validators'    => array(
                 array(new Zend_Validate_NotEmpty(), true),
                 array(new Zend_Validate_StringLength(array('min' => 1,'max' => 64)),true)
             ),
             'filters' => array()
         ));

        $this->addElement($name);
        //...
        $this->addElement('button', 'submit', array(
            'label' => "Save"
        ));
    }
}

在 Controller 中

$form = new Application_Form_Test(); //or directly create like shown above

$request = $this->getRequest();

if($request->isPost()) {
    //validate form (auto render errors)
    if($form->isValid($request->getPost())) {
        //form is valid... 
        //check for existing objects by email, name, phone, etc
        //save your object to db
    }
}
$this->view->form = $form;

在 View 中

echo $this->form;

关于javascript - 在 Zend Framework 1.12 中保存之前确认验证,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23495284/

相关文章:

javascript - 我们应该使用 .prototype 而不是当前的实例化方法吗?

PHP mysql_query 自动去除斜杠?

javascript - 如何计算 list.js 中当前未显示的已选中复选框?

javascript - 提示框重新创建自身,直到输入正确的字段

php - OAuth2 - 调用未定义的方法 Authorizer::getResourceOwnerId()

javascript - 垃圾邮件可以看到/使用 javascript 吗?

javascript - 将鼠标悬停事件添加到 javascript 创建的 DIV

jquery - Grails不会将jquery库放入HTML

javascript - Angular2 可以在 Chrome 中工作,但不能在 Firefox 中工作

javascript - 解析 AJAX 请求的结果