2009-09-08 128 views
1

我在我的项目中有一个常见的“联系表单”,这个联系表单在大多数页面(如索引,关于我们等)中被调用。此页面接受用户输入并向管理员发送电子邮件,然后返回页面,从它被称为zend_Form:显示验证和错误消息

代码联系表格是

class Form_Contactus extends Zend_Form 
{ 
    public function init() 
    { 
    $this->setMethod('post'); 
    $this->setAction('contactus/index'); 
    $frontController = Zend_Controller_Front::getInstance(); 

    $pageName = $this->createElement('hidden','pageName'); 
    $pageName->setValue($frontController->getRequest()->getControllerName()); 

    $FullName = $this->createElement('text','FullName'); 
    $FullName->setLabel('Full Name') 
     ->setRequired(true) 
     ->addFilter('StripTags') 
     ->addFilter('StringTrim') 
     ->addValidator('NotEmpty'); 

    $Email = $this->createElement('text','Email'); 
    $Email->setLabel('Email') 
     ->setRequired(true) 
     ->addFilter('StringTrim') 
     ->addValidator('EmailAddress') 
     ->addValidator('NotEmpty'); 

    $Message = $this->createElement('textarea','Message'); 
    $Message->setLabel('Message') 
     ->setAttribs( array('rows' => 3, 'cols' => 20)) 
     ->setRequired(true) 
     ->addFilter('StripTags') 
     ->addFilter('StringTrim') 
     ->addValidator('NotEmpty'); 



    $submit = $this->createElement('submit','submit'); 
    $submit->setLabel('Submit') 
     ->setIgnore(true); 

    $this->addElements(array($pageName, 
     $FullName, 
     $Email, 
     $Message, 
     $submit,) 
    ); 
    } 
} 

请注意,行$这个 - >的setAction(“联系我们/指数”);.我的想法是,如果我从索引页填写此表单(注意它是一种常见表单),它会通过'contactus控制器'索引操作。从那里发送邮件并返回索引页。如果页面是从我们页面填充的,则返回到关于我们的页面。

它包含在由代码

$conForm = new Form_Contactus(); 
echo $conForm; 

而控制器代码不同的页面,如指数,约等貌似为

class ContactusController extends Zend_Controller_Action 
{ 
    protected $_redirector = null; 

    public function init() 
    { 
    $registry = Zend_Registry::getInstance(); 
    $this->msgObj = $registry['MessageHandler']; 
    } 

    public function indexAction() 
    { 

    $this->_helper->layout()->disableLayout(); 
    $this->_helper->viewRenderer->setNoRender(); 

    $form = new Form_Contactus(); 

    if ($this->_request->isPost()) { 
     $formData = $this->_request->getPost(); 
     if ($form->isValid($formData)) { 

     $pageName  = $formData['pageName']; 
     $FullName  = $formData['FullName']; 
     $Email  = $formData['Email']; 
     $Message  = $formData['Message']; 
     if(strlen(trim($FullName))){ 

      $mailBody .= "Name:\r\n\t".$FullName ."\r\n\r\n"; 
      $mailBody .= "Email:\r\n\t".$Email ."\r\n\r\n"; 
      $mailBody .= "Message:\r\n\t".$Message ."\r\n\r\n"; 

      $mail = new Zend_Mail(); 
      $transport = new Zend_Mail_Transport_Smtp('localhost'); 
      Zend_Mail::setDefaultTransport($transport); 
      $mail->setSubject('Contact Enquiry.'); 
      $mail->setFrom($Email, $FullName); 
      $mail->addTo(CONTACT_ADMIN_EMAIL, CONTACT_ADMIN_NAME); 
      $mail->setBodyText($mailBody); 

      if($mail->send()){ 
      $this->msgObj->addMessage('Thank you!'); 
      $this->msgObj->addMessage('Your message has been received and will be reviewed within 72 hours.'); 
      } 
      else{ 
      $this->msgObj->addError('Unable to sent mail! Please try later.'); 
      } 
     } 
     } 
     else { 
     $this->msgObj->addError('Please correct the following:!'); 
     $form->populate($formData); 
     $pageName = 'index'; 
     } 
    } 
    $this->view->form = $form; 
    $this->_helper->redirector('index', $pageName); 
    } 
} 

一切工作正常,邮件消失,如果我填写此表格,但表格未经验证。例如邮件可能没有'FullName'发送,这是必填字段

另一个问题是无法显示消息,如“'谢谢'。

这可能是因为使用了$ this - > _ helper-> redirector方法。表单被重定向并因此丢失了值。如果我使用$this->_helper->forwarded$this_forward()它也不起作用。

任何人都可以请建议一种方法,让我轻松验证消息和其他消息正确吗?对不起,我可怜的英语,并提前致谢

回答

1

如果表单不验证(并发送联系信息),则不要重定向。只需将您的重定向移动到您的“if valid”块。

您仍然可以添加一个字段来存储页面,以便在表单成功完成后返回。尽管您可能需要以不同的方式填充它,否则在contactus/index操作中创建表单时,联系页将用作“前往”页面(即,表单未验证第一个时间)

另外,是否有你没有使用Zend_Mail发送邮件的原因?既然你使用Zend Framework呢?

0

是的,问题可能是因为我的方法是错误的。我使用了一个控制器/页面。对于索引页面的IndexController,关于我们页面的Aboutus Controller等,contactus是一个包含在所有这些页面中的小表单,因此也是问题所在。任何人都可以请建议更好的方法?