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');という行に注意してください。私の考えでは、インデックスページからこのフォーム(一般的なフォームであることに注意してください)に入力すると、「contactuscontroller」インデックスアクションを通過します。そこからメールを送信し、インデックスページに戻ります。ページが私たちについてのページから埋められると、私たちについてのページに戻ります。

インデックス、バージョン情報などのさまざまなページにコードで含まれています

$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()それも機能しない場合。

検証メッセージやその他のメッセージを適切にディップする方法を提案していただけますか?英語が下手でごめんなさい、そして事前に感謝します

4

2 に答える 2

1

フォームが検証されない (そして連絡先情報が送信されない) 場合は、リダイレクトしないでください。リダイレクトを「有効な場合」ブロックに移動するだけです。

フォームが正常に完了したときに戻るページを格納するフィールドを追加することもできます。ただし、おそらく別の方法で入力する必要があります。そうしないと、contactus/index アクションでフォームが作成されたときに (つまり、フォームが最初のアクションを検証しない場合)、連絡先ページが「移動」ページとして使用されます。時間)

また、実際にメールを送信するために Zend_Mail を使用していない理由はありますか? とにかくZend Frameworkを使用しているので?

于 2009-09-08T07:28:51.563 に答える
0

はい、問題は私のアプローチが間違っていた可能性があります。1 つのコントローラー/ページを使用しました。たとえば、インデックス ページの IndexController、about us ページの Aboutus Controller などの場合、contactus はこれらすべてのページに含まれる小さなフォームであるため、問題が発生します。誰でもより良い方法を提案できますか?

于 2009-09-10T09:28:51.493 に答える