Zend形式弹出窗口(fancybox,lightbox ....)

时间:2011-04-08 14:33:03

标签: zend-framework popup zend-form fancybox lightbox

我正在使用Zend开发一个Web应用程序,并且我对我遇到的问题用尽了想法。简而言之,我试图在弹出窗口中设置联系表单(Fancybox,lightbox,colorbox或其他......)。整个事情很好,从弹出窗口中显示联系表单并允许发送电子邮件。但是,每当出现错误(未填充输入或填充错误)时,我都无法将这些错误显示在弹出窗口中(它实际上将我重定向回正常显示中的表单(视图+布局))以显示错误

这可能是可能的,但我现在认为,或许我可以更容易地将我的错误消息带到一个新的弹出窗口(联系人页面,填写不正确,将导致错误弹出页面......)。我认为这种替代方案可能看起来很酷,但实际上却遇到了麻烦。现在我真正的问题是:我们真的可以在弹出窗口上制作一个表单,使用Facybox(Lighbox或任何其他实际的......只是想要我的弹出窗口)和Zend?任何大师都在哪里? 非常感谢 这是代码:

链接例如:

<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');
  }
}

3 个答案:

答案 0 :(得分:2)

我建议实施AJAX验证。这样就可以在提交表单之前对表单进行验证。 ZendCasts有一个关于如何实现这个目标的好教程:http://www.zendcasts.com/ajaxify-your-zend_form-validation-with-jquery/2010/04/

答案 1 :(得分:0)

通过contextSwitch动作帮助程序处理Ajax请求。您可以在控制器的init方法中指定操作需要处理的各种上下文(xml或json),如下所示:

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

请求网址应包含追加到查询字符串的“format = json”。这将执行操作并以json格式发送响应。 JSON上下文的默认行为是提取视图的所有公共属性并将其编码为JSON。有关详细信息,请参阅http://framework.zend.com/manual/en/zend.controller.actionhelpers.html

答案 2 :(得分:0)

我发现了一个“可能不是最漂亮的”工作解决方案,它确实使用了前面的zendcast中提到的ajax来验证停止真正的验证(preventdefault),处理数据返回结果,如果一切正常,请重新启动它