Magento — Отправка писем

    Довольно часто возникает необходимость выслать пользователю магазина оповещение или письмо с какой-либо дополнительной информацией. Думаю, что многие осознают необходимость/полезность отправки писем с сайта. Тут разработчики Magento очень хорошо постарались, чтобы предоставить нам достаточно мощный механизм работы с почтой.

    Что же тут особенного?


    Итак, у некоторых может возникнуть вопрос: «А почему бы не использовать функцию mail()? Ведь она как раз и предназначена для подобных целей». Конечно можно, тем более, если кто-то жить без нее не может, сам бог велел mail-ить. Что же дает нам magento-вский механизм отправки писем? Первое и, на мой взгляд, самое главное достоинство — это использование шаблонов. Шаблоны представляют собой обычные html-файлы с небольшими дополнениями (но об этом чуть ниже), т.е. у шаблона может быть любое оформление, и верстальщики не будут больше плеваться, разбирая ваш php-код и стараясь воплотить задумку дизайнера. Также в шаблоны можно добавлять блоки любого из доступных модулей (только не забываем их инициализировать), что позволяет увеличить скорость разработки.

    С чего начать?


    Итак, отправкой писем занимается метод sendTransactional() модели Mage_Core_Model_Email_Template

    Mage::getModel('core/email_template')
          ->setDesignConfig(array('area'=>'frontend', 'store'=>$storeId))
          ->sendTransactional(
            $templateId,
            $sender,
            $recepientEmail,
            $recepientName,
            $templateData);


    * This source code was highlighted with Source Code Highlighter.


    $storeId – идентификатор магазина (да, Magento может поднять несколько магазинов, прочитать об этом можно тут)

    $templateId – идентификатор шаблона, он может быть либо строковым идентификатором, который берется из xml-конфига, либо целочисленным, который берется из БД

    С целочисленными идентификаторами все просто, их можно посмотреть в разделе админки System > Transactional Emails и, при необходимости, добавить собственный шаблон. Строковые идентификаторы находятся в конфигах модулей в разделе global/template/email. Например,

    <global>
      <template>
        <email>
          <customer_create_account_email_template translate="label" module="customer">
            <label>New account</label>
            <file>account_new.html</file>
            <type>html</type>
          </customer_create_account_email_template>
        </email>
      </template>
    </global>


    * This source code was highlighted with Source Code Highlighter.


    customer_create_account_email_template и есть наш идентификатор. Как можно заметить, элемент customer_create_account_email_template имеет три дочерних элемента – это label, file, type.

    • label – название шаблона
    • file – путь к файлу шаблона, относительно текущей локали (по умолчанию это app/locale/en_US/template/email)
    • type – тип шаблона (либо text, либо html)

    $sender – отправитель письма, может быть представлен в виде ассоциативного массива, например:
    $sender = array('email' => 'sender@example.com', 'name' => 'Sender Name');
    Или взят из конфига Magento, чаще всего из раздела админки System > Configuretion > Store Email Addresses.
    $sender = Mage::getStoreConfig('customer/create_account/email_identity');
    В этом примере путь ведет к конфигу General contact раздела админки System > Configuretion > Store Email Addresses.

    $recepientEmail — email получателя письма

    $recepientName – имя получателя письма

    $templateData – ассоциативный массив, содержащий в себе данные, которые нужно передать в шаблон. Например:
    $templateData = array('name' => 'Василий Пупкин', 'link_url' => 'http://google.ru', 'items_collection' => $items, 'phone_number' => '11122233');

    Шаблоны писем


    Как я уже писал выше, шаблон письма представляет собой html-файл с небольшими дополнениями. Итак, шаблон начинается с заголовка, в котором указывается тема письма вот таким образом:

    Далее может следовать любой html-код, т.е. после заголовка мы помещаем тело письма.
    Уважаемая Екатерина Матвеевна…
    Как же использовать данные, которые мы положили в $templateData? Очень просто. Необходимо вставить в шаблон конструкцию следующего вида {{var <имя_ключа>}}. Например,

    <a href="{{var link_url}}">{{var name}}</a>

    * This source code was highlighted with Source Code Highlighter.


    На выходе у нас получится:

    <a href=”http://google.ru>Василий Пупкин<a>

    * This source code was highlighted with Source Code Highlighter.


    Еще одна удобная возможность – это использование layout’ов в шаблонах. Т.е. вы можете описать layout в своем модуле, и использовать его потом в письме. Например, если добавить в конфиг mymodule.xml layout’ов вашего модуля строки

    <mymodule_email_someitems>
      <block type="mymodule/email_items" name="items" template="email/mymodule/items.phtml"/>
    </mymodule_email_someitems>


    * This source code was highlighted with Source Code Highlighter.


    то добавление в шаблон следующей конструкции позволит отобразить блок(и), внутри layout’а:
    {{layout handle="mymodule_email_someitems" items=$items_collection}}
    Если layout’у необходимы какие-либо данные, то их можно передать в дополнительных атрибутах конструкции {{layout}}, в данном случае, это параметр items.

    И последнее, что хотелось бы рассказать о шаблонах писем, это условные выражения. Описываются они с помощью конструкции:

    {{depend condition}}
    Тут может быть любой код, разрешенный к использованию в шаблонах
    {{/depend}}

    Если значение condition истинно, то содержимое блока depend будет отображено. Например:

    {{depend phone_number}}
    {{var phone_number}} – позвони мне.
    {{/depend}}

    Вот таким образом реализована отправка почты. Этот метод позволяет использовать все достоинства этой замечательной CMS.

    Комментарии 3

      0
      А почему бы не использовать функцию mail()

      Именно ее Magento и использует, насколько я вижу:
      $result = mail($this->recipients, $this->_mail->getSubject(), $this->body, $this->header, $this->parameters);
        –1
        Кстати то что у вас занимает целую статью, в simpla cms делается 2 строками:

        $message = $this->smarty->fetch('email_template.tpl');
        $this->email($email_address, 'тема письма', $message);
          +1
          Это замечательно.

          Представляю диалог заказчика и испольнителя:
          З: — У меня уже полгода работает магазин на Magento. Вот хочу активным покупателям выслать поздравительные письма на новый год. Плачу стотыщмильенов за работу.
          И: — не, не кактит, используй лучше simpla cms, там это делается двумя строками кода.

          Т.е. эта статья людей, которые на модификаци и расширении кода Magento зарабатывают себе не хлеб. И во 2-м обзаце были указаны приемущества использования этого метода вместо обычного вызова функции mail().

        Только полноправные пользователи могут оставлять комментарии. Войдите, пожалуйста.

        Самое читаемое