Наверх

Почта

Работа с электронной почтой основана на плагине PHPMailer. Соединение DIAFAN.CMS и плагина обеспечивает функция send_mail, описанная в файле includes/mail.php. В CMS данная функция используется в основном для уведомлений пользователей о каких-либо действиях, например, о покупке товара (modules/cart/cart.action.php).

Методы

boolean send_mail (string|array $recipient, string $subject, string $body, [string $from = ''], [string &$error_output = ''], [string &$trace_output = '']) – Отправляет электронное письмо.

  • string|array $recipient: получатель/получатели
  • string $subject: тема письма
  • string $body: содержание письма
  • string $from: адрес отправителя
  • string $error_output: вывод ошибки
  • string $trace_output: вывод трассировки

Пример:

// Отправляем Васе уведомление на почтовый ящик, каждый раз при просмотре его товара
// файл modules/shop/shop.model.php метод id()
$sent = send_mail(
    
"vasya@mail.ru", // кому
    
"Кто-то смотрит твой товар на сайте ".BASE_PATH_HREF, // тема
    
"Привет, кто-то зашел на страницу твоего товара
    "
.BASE_PATH_HREF.$this->diafan->_route->current_link(), // текст сообщения
); // === true, если письмо успешно отправлено

Пример использования

Для примера в магазине реализуем кнопку «Порекомендовать другу», при нажатии на которую появляется форма с полем ввода email.

Пример:

Создадим файл modules/shop/views/shop.view.email_form.php

<div class="modal-wrap" id="shop-modal-wrap">
   <div class="modal" id="shop-modal">
       <div class="window" style="width:300px">
           <div class="window_title">
               Послать другу
           </div>
           <form method="POST" enctype="multipart/form-data" action="" class="ajax">
               <input type="hidden" name="module" value="shop">
               <input type="hidden" name="action" value="mail">
               <input type="hidden" name="good_id" value="<?php echo $result['id'];?>">
               <table style="width:300px">
                   <tr>
                       <td>E-mail:</td>
                       <td>
                           <input type="email" name="mail">
                           <div class="errors error_mail" style="display:none"></div>
                       </td>
                   </tr>
               </table>
               <input type="submit" value="Отправить">
           </form>
           <div class="errors error"></div>
           <div class="modal-close close"></div>
       </div>
   </div>
</div>

В файле modules/shop/views/shop.view.id.php в напишем:

$this->get('email_form', 'shop', $result);

В контроллер добавляем modules/shop/shop.php

switch ($_POST['action'])
{
    case
'mail':
    return
$this->action->send_friends();
    
// ...
}

Теперь обработчик POST-запросов modules/shop/shop.action.php

public function send_friends()
{
    if (empty(
$_POST['mail']))
    {
        
$this->result['errors']['mail'] = 'Пожалуйста, введите e-mail.';
    }
    else
    {
        
$this->valid_email($_POST['mail'], "mail");
    }
    
$row = DB::query_fetch_array("SELECT [name], site_id, cat_id, id FROM {shop} WHERE id=%d LIMIT 1", $_POST['good_id']);
    if (empty(
$row))
    {
        
$this->result['errors'][0] = 'Ошибка отправки запроса.';
    }

    if (
$this->result())
            return;

    
$row['link'] = BASE_PATH_HREF.$this->diafan->_route->link($row["site_id"], "shop", $row["id"]);

    
Custom::inc(ABSOLUTE_PATH.'includes/mail.php');
    
$subject = "Рекомендую посмотреть";
    
$message = 'Здравствуйте! Ваш друг рекомендует Вам посмотреть <a href="'.$row['link'].'">'.$row['name'].'</a>.';
    
$from_mail = $this->diafan->configmodules("emailconf", 'shop') ? $this->diafan->configmodules("email", 'shop') : '';

    
$this->result['errors'][0] = send_mail($_POST['mail'], $subject, $message, $from_mail) ? 'Отправлено' : 'Ошибка';
}

Ваши комментарии и дополнения

Подскажите, а как обрабатывать ошибки?
Вот, например, у вас в примере есть такая строчка
Код
$this->result['errors']['mail'] = 'Пожалуйста, введите e-mail.';

Этот обработчик будет вызван или непосредственно POST запросом или вообще через AJAX. И тут возникает непонимание, как пользователь увидит это сообщение об ошибке? Да и по остальным, типа $this->result['errors'][0]
Почему так? Почему первым элементом массива, а выше вообще с индексом mail?
Где можно об этом подробней ознакомиться?
Марина, спасибо.
С аяксом понятно, а где перехватывать обработку если все же обычным POST запросом? В action модуля? Где лежит этот result и как вывести на экран?
Зарегистрируйтесь или авторизируйтесь для того, чтобы оставить комментарий.