Search code examples
phpzend-frameworkzend-framework2zend-formzfcuser

How to get the validation errors to a array and show them in the view using ajax?


i am using zf2 and i am new to ajax and zf2. i used a bootstrap modal to open the form as a modal dialog. i have set an initial status value as -1. then if the data saved then it will become 0. and if not it will return 1. so if the form is not valid it will return the -1.

my code is working but i don't know how to show the validation errors in the modal.

this is my validationAction in controller.

    public function validateinviteAction() {

    $request = $this->getRequest ();
    $data = $_POST ['textData'];

->  $dataform = array('email'=>$data); 
->  $form = new InviteForm ();
->  $validate = new Invite ();
->  $validate->exchangeArray ( $dataform);
->  $form->setInputFilter ( $validate->getInputFilter () );
->  $form->setData ( $dataform );
    $status=-1;
    if ($form->isValid ()) {
            $validate->exchangeArray ( $form->getData () );
            $row = $this->getUsersTable ()->getUserbyemail ( $validate->email );
            $reply = $this->getInviteTable ()->saveInvites ( $validate );
            $status=$reply;
        }

    $result = new JsonModel ( array (
            'status' => $status 
    ) );
    return $result;
}

This is my ajax code

$.ajax({
      type: "POST",
      url: "<?php echo $this->url('users', array('action'=>'validateinvite')); ?>",
  ->  data: emailtxt,
      success: function(resp){ 
          if(resp.status==0){
             // if saved successfully
              $("#messagesuccess").text(' The invitation sent successfully.');               
              document.getElementById("email").value = "";

          }
          else if(resp.status==1){
            //if cannot save successfully
              $("#messagefailed").text(' You have already sent an invitation to this person.');
          }
          else{
            //form is not valid // if status==-1
              $("#messagefailed").text(' The provided inputs are not valid.');
          }
      },
      error: function(resp){
          $("#messagefailed").text('Internet connection lost. Try again later.');
      }
});

Thanks in advance.


Solution

  • ok first off don't use $_POST for getting data $data = $_POST ['textData'];

    $data = $this->params()->fromPost('textData');
    

    you can get error messages from form using one of these:

    $error = $form->getMessages();
    //or
    $error = $form->getInputFilter()->getMessages()
    
    $result = new JsonModel ( array (
                'status' => $status ,
                'error' => $error
        ) );
    

    and in your ajax :

      else{
        //form is not valid // if status==-1
          $("#messagefailed").text(' The provided inputs are not valid.');
          alert(resp.error.join("\n"));//or however u like
      }
    

    UPDATE:

    this line is extra and not required , the form does this itself

    $validate->exchangeArray ( $dataform);
    

    use this code to send forms data using ajax

    data: $('#myForm').serialize()
    

    first check if the request is post in your action

    if($this->request->isPost())
    

    then get post data and set to form

    $form->setData ( $this->request->getPost());
    

    and validate and if $form->isValid() then just simply get the data from form

    $data = $form->getData ()