1

我的项目中有一个通用的“联系表”,在大多数页面(如索引、关于我们等)中都会调用。该页面接受用户输入并向管理员发送电子邮件,然后返回到调用它的页面

联系表格的代码是

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

请注意,$this->setAction('contactus/index'); 行。我的想法是,如果我从索引页面填写此表格(注意这是一个常见表格),它会通过“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);
  }
}

一切正常,如果我填写此表格,邮件就会消失,只是表格未经过验证。例如,发送的邮件可能没有“全名”,这是一个必填字段

另一个问题是无法显示像 ''Thank you' 这样的消息。

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

任何人都可以为我建议一种方法来正确地处理验证消息和其他消息吗?对不起我的英语不好,提前谢谢

4

2 回答 2

1

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

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

另外,您不使用 Zend_Mail 来实际发送邮件是否有原因?既然您仍然使用 Zend 框架?

于 2009-09-08T07:28:51.563 回答
0

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

于 2009-09-10T09:28:51.493 回答