Wednesday, January 18, 2012

Symfony 1.4, 1.3 űrlapok és ajax validáció

Nem nagyon találtam leírást arról, hogy a Symfony 1.4-ben és a Symfony régebbi változataiban hogyan lehet ajaxos validációt készíteni úgy, hogy ne kelljen változtatni az űrlapjainkon és csakis BaseFormDoctrine-ból származtatott űrlapokat használjuk.

Ez lenne a Symfony esemény és a feldolgozó metódus:

  public function executeUpdate(sfWebRequest $request)  
  {  
   $this->forward404Unless($request->isMethod(sfRequest::POST) || $request->isMethod(sfRequest::PUT));  
   $this->forward404Unless($family = Doctrine_Core::getTable('Family')->find(array($request->getParameter('id'))), sprintf('Object family does not exist (%s).', $request->getParameter('id')));  
   $this->form = new UpdateFamilyCollectionForm($family);  
   $this->processForm($request, $this->form);  
   return sfView::NONE;  
  }  

  /**
   * 
   * Process Form
   * @param sfWebRequest $request
   * @param sfForm $form
   * @author BlaBla :)
   */
  protected function processForm(sfWebRequest $request, sfForm $form)  
  {  
    $sJsonReturnString = "";  
    $this->setLayout(false);  
    $form->bind($request->getParameter($form->getName()), $request->getFiles($form->getName()));  
   if ( $form->isValid())   
   {  
    $family = $form->save();  
    $sJsonReturnString = json_encode(array( "msg"=>"ok" ));  
   }  
   else  
   {  
           $errors = $form->getErrorSchema()->getErrors();  
           $aErrors = array();  
             if (count($errors) > 0)  
             {  
          {  
               $i = 0;  
               foreach ($errors as $name => $error)  
               {  
                 $aErrors[ $name ] = $error->getMessage();  
               }  
          }       
           }  
           $sJsonReturnString = json_encode($aErrors);       
   }  
   echo $sJsonReturnString;  
  } //processForm  


Az $errors = $form->getErrorSchema()->getErrors(); visszaadja a hibákat és ezeket írjuk ki a kliensnek.

A kliensen pedig valahogy így dolgozhatjuk fel a kapott értékeket (én most JQuery-t használtam):

 var dataString = jQuery('#updatefamilyForm').serialize();  
 var postUrl = jQuery('#updatefamilyForm').attr('action');  
 $.ajax({  
           type: "POST",  
           url: postUrl,  
           data: dataString,  
           success: function(response) {  
            var FormErrors = $.parseJSON(response);  
            jQuery.each(FormErrors, function(i, val) {  
                     alert(i+val);  
                });                         
           }  
      });  

Az űrlapunkat a sablonban a klasszikus Symfony-s módon készítjük el, annyi különbséggel, hogy a form elem kap egy id-t:

 <form id="updatefamilyForm" action="<?php echo url_for('family/'.($form->getObject()->isNew() ? 'create' : 'update').(!$form->getObject()->isNew() ? '?id='.$form->getObject()->getId() : '')) ?>" method="post" <?php $form->isMultipart() and print 'enctype="multipart/form-data" ' ?>>  


Ezt a problémát sokféleképpen meg lehetne oldani, ez csak egy módszer a sok közül.

0 comments: