2015-11-13 4 views
0

У меня есть эта функция в моем приложении (Zend Framework 2), которое использует Zend \ Mail.Zend Framework - Отправить только 1 письмо

Это пример сценария, пользователь нажимает флажок, а затем переходит к его отправке. Получатель получит электронное письмо с контентом.

Это функция отправки.

public function sendNotification() 
{ 
    $mail = new Mail\Message(); 
    $mail->setBody('This is the text of the email.'); 
    $mail->setFrom('[email protected]', 'Sender\'s name'); 
    $mail->addTo('[email protected]', 'Name of recipient'); 
    $mail->setSubject('TestSubject'); 

    $transport = new Mail\Transport\Sendmail(); 
    $transport->send($mail); 
} 

Моя проблема в том, что, когда пользователь нажимает 2 или много флажок, а затем нажимает кнопку отправки, он посылает 2 или много писем, что я хочу сделать, это отправить только 1 письмо в приемник.

Что мне делать с этим? Любые идеи (ы) были бы высоко оценены. Просьба прокомментировать все, что вы хотите уточнить и узнать.

+0

Я не уверен, имеют ли значения флажки в этот момент. Вы вызываете метод несколько раз? – Andrius

+0

Да, это то, что происходит, потому что каждый раз, когда нажимается флажок и отправляется, этот метод вызывается. – yowza

+2

Ну, зачем ты это делаешь? Не делай этого. Или сохраните какую-то ценность, если пользователь уже отправил электронное письмо. – Andrius

ответ

1

Решение для этого довольно простое. Все, что вам нужно сделать, это отслеживать, был ли вызван метод sendNotification() до или без.

Сессия идеально подходит для этого. Для того, чтобы заставить его работать и выглядеть чище, в то же время, вы можете обернуть его в автономный метод, например:

public function sendNotificationOnDemand() 
{ 
    $session = new \Zend\Session\Container(); 

    if (!$session->offsetExists('mail_sent')) { 
     $session->offsetSet('mail_sent', true); 
     return $this->sendNotification(); 
    } 
} 

Поэтому независимо от того, сколько раз вы могли бы назвать sendNotificationOnDemand(), уведомление будет отправлено только один раз ,

0
public function sendNotification() 
    { 

    $session = new Container('email'); 

    if($session->offsetGet('send') != 'yes') { 
     $mail = new Mail\Message(); 
     $mail->setBody('This is the text of the email.'); 
     $mail->setFrom('[email protected]', 'Sender\'s name'); 
     $mail->addTo('[email protected]', 'Name of recipient'); 
     $mail->setSubject('TestSubject'); 

     $transport = new Mail\Transport\Sendmail(); 
     $transport->send($mail); 

     $session->setExpirationSeconds(5000); 
     $session->offsetSet('send','yes'); 
    } 

} 
0

Если вы хотите запретить функциональность вызывается несколько раз для каждого пользователя вам нужно некоторое хранение, где информация (пользователь Allready называется действие, например, полученные по электронной почте) хранится.

Всякий раз, когда пользователь пытается отправить письмо по электронной почте, ваш код будет искать информацию из хранилища и может принять решение о результате (allready detected/not send), если письмо должно быть отправлено повторно.

Как уже было сказано, вы можете использовать хранилище сеансов ZF2 Zend\Session\Container.

http://framework.zend.com/manual/current/en/modules/zend.session.container.html

Но имейте в виду, что Сессии не являются постоянными Накопители информации. Если пользователь закрывает свой браузер и пересматривает ваш сайт, информация из предыдущих действий теряется, и он может повторно отправить форму.

Пример ZF2 Session

use Zend\Session\Container; 

public function sendNotification() 
{ 
    $sessionContainer = new Container; 

    if (!$sessionContainer->offsetExists('mail_send')) { 

     $sessionContainer->offsetSet('mail_send', true); 

     // send notification 
     ... 
    } 
} 

Если вы хотите сохранить информацию, постоянное использование постоянное хранение базы данных, как MySQL. Получение и хранение будут похожими.

 Смежные вопросы

  • Нет связанных вопросов^_^