2011-04-08 32 views
2

我使用Zend深化發展的web應用程序,我跑出去的想法,我有一個問題。簡而言之,我試圖在彈出窗口(Fancybox,lightbox,colorbox或其他...)中添加一個聯繫表單。整個事情工作正常,就是說它在彈出窗口中顯示聯繫表單並允許發送電子郵件。然而,每當有錯誤(未填充輸入或填寫錯誤的),我無法獲取要顯示在彈出的這些錯誤(它實際上重定向我回一個正常顯示(表單視圖+佈局),以顯示錯誤Zend的形式在彈出(的fancybox,燈箱....)

這也許是可能的,但我現在認爲,也許我可以更容易地將我的錯誤消息帶到一個新的彈出窗口(聯繫頁面,填充不當,會導致錯誤彈出頁面...)。我認爲這。替代可能看起來很酷,但我有真正的麻煩做它現在我真正的問題是:我們能否真正做到上的彈出形式,使用Facybox(Lighbox或任何其他實際...只是希望我的彈出式)和Zend任何大師outhere? 非常感謝 這裏是代碼:

鏈接例如:

<a class="popLink" href=" <?php echo $this->url(array('module'=>'default', 'controller'=>'contact', 'action'=>'sendmail')).'?ProID='.$this->proProfil->getProID(); ?>">Contact</a> 

動作:

public function sendmailAction() 
{  
    $this->_helper->layout()->setLayout('blank'); 
    $request = $this->getRequest();  

    $proID = $this->_getParam("ProID");    
    $professionalsList = new Model_DirPro(); 
    $proName = $professionalsList->getProInfo($proID); 

    $translate = Zend_Registry::get('translate');  
    Zend_Validate_Abstract::setDefaultTranslator($translate);  
    Zend_Form::setDefaultTranslator($translate); 

    $contactform = new Form_ContactForm();   
    $contactform->setTranslator($translate); 
    $contactform->setAttrib('id', 'contact'); 

    $this->view->contactform = $contactform;   
    $this->view->proName = $proName; 

    if ($request->isPost()){ 
     if ($contactform->isValid($this->_getAllParams())){ 
      $mailSubject = $contactform->getValue('mailsubject');   
      if ($contactform->mailattcht->isUploaded()) { 
       $contactform->mailattcht->receive(); 
       //etc.... 

形式:

class Form_ContactForm extends Zend_Form 
{ 
    public function init() 
    { 
    $this->setName("email"); 
    $this->setMethod('post'); 

    $this->addElement('text', 'mailsubject', 
    array('filters' => array('StringTrim'), 
    'validators' => array(), 'required' => true, 'label' => 'Subject:')); 

    $mailattcht = new Zend_Form_Element_File('mailattcht'); 
    $mailattcht->setLabel('Attach File:')->setDestination(APPLICATION_PATH.'/../public/mails'); 
    $mailattcht->addValidator('Count', false, 1); 
    $mailattcht->addValidator('Size', false, 8000000); 
    $mailattcht->addValidator('Extension', false, 
    'jpg,png,gif,ppt,pptx,doc,docx,xls,xslx,pdf'); 
    $this->addElement($mailattcht, 'mailattcht'); 

    $this->addElement('textarea', 'mailbody', 
    array('filters' => array('StringTrim'), 
    'validators' => array(), 'required' => true, 'label' => 'Body:')); 

    $this->addElement('submit', 'send', 
    array('required' => false, 'ignore' => true, 'label' => 'Send')); 

    $this->addElement('hidden', 'return', array(
    'value' => Zend_Controller_Front::getInstance()->getRequest()->getRequestUri(),       
      )); 

    $this->setAttrib('enctype', 'multipart/form-data'); 
    } 
} 

回答

0

Ajax請求通過ContextSwitch動作助手處理。可以按如下方式來指定在所述控制器的初始化方法的動作需要處理各種上下文(XML或JSON):

public function init() 
{ 
    $this->_helper->contextSwitch()    
     ->addActionContext('send-mail', 'json') 
     ->initContext() 
    ; 
} 

請求URL應包含「格式= JSON」追加到查詢字符串。這將執行操作並以json格式發送響應。 JSON上下文的默認行爲是提取視圖的所有公共屬性並將它們編碼爲JSON。進一步的細節可以在這裏找到http://framework.zend.com/manual/en/zend.controller.actionhelpers.html

0

我發現了一個「可能不是最漂亮」的工作方案,這是確實使用AJAX在之前zendcast提到的驗證,以阻止真正的驗證(的preventDefault),處理數據返回結果,如果一切正常,重新啓動它。