Довольно часто возникает необходимость выслать пользователю магазина оповещение или письмо с какой-либо дополнительной информацией. Думаю, что многие осознают необходимость/полезность отправки писем с сайта. Тут разработчики Magento очень хорошо постарались, чтобы предоставить нам достаточно мощный механизм работы с почтой.
Итак, у некоторых может возникнуть вопрос: «А почему бы не использовать функцию mail()? Ведь она как раз и предназначена для подобных целей». Конечно можно, тем более, если кто-то жить без нее не может, сам бог велел mail-ить. Что же дает нам magento-вский механизм отправки писем? Первое и, на мой взгляд, самое главное достоинство — это использование шаблонов. Шаблоны представляют собой обычные html-файлы с небольшими дополнениями (но об этом чуть ниже), т.е. у шаблона может быть любое оформление, и верстальщики не будут больше плеваться, разбирая ваш php-код и стараясь воплотить задумку дизайнера. Также в шаблоны можно добавлять блоки любого из доступных модулей (только не забываем их инициализировать), что позволяет увеличить скорость разработки.
Итак, отправкой писем занимается метод sendTransactional() модели Mage_Core_Model_Email_Template
$storeId – идентификатор магазина (да, Magento может поднять несколько магазинов, прочитать об этом можно тут)
$templateId – идентификатор шаблона, он может быть либо строковым идентификатором, который берется из xml-конфига, либо целочисленным, который берется из БД
С целочисленными идентификаторами все просто, их можно посмотреть в разделе админки System > Transactional Emails и, при необходимости, добавить собственный шаблон. Строковые идентификаторы находятся в конфигах модулей в разделе global/template/email. Например,
customer_create_account_email_template и есть наш идентификатор. Как можно заметить, элемент customer_create_account_email_template имеет три дочерних элемента – это label, file, type.
$sender – отправитель письма, может быть представлен в виде ассоциативного массива, например:
Или взят из конфига Magento, чаще всего из раздела админки System > Configuretion > Store Email Addresses.
В этом примере путь ведет к конфигу General contact раздела админки System > Configuretion > Store Email Addresses.
$recepientEmail — email получателя письма
$recepientName – имя получателя письма
$templateData – ассоциативный массив, содержащий в себе данные, которые нужно передать в шаблон. Например:
Как я уже писал выше, шаблон письма представляет собой html-файл с небольшими дополнениями. Итак, шаблон начинается с заголовка, в котором указывается тема письма вот таким образом:
Далее может следовать любой html-код, т.е. после заголовка мы помещаем тело письма.
Как же использовать данные, которые мы положили в $templateData? Очень просто. Необходимо вставить в шаблон конструкцию следующего вида {{var <имя_ключа>}}. Например,
На выходе у нас получится:
Еще одна удобная возможность – это использование layout’ов в шаблонах. Т.е. вы можете описать layout в своем модуле, и использовать его потом в письме. Например, если добавить в конфиг mymodule.xml layout’ов вашего модуля строки
то добавление в шаблон следующей конструкции позволит отобразить блок(и), внутри layout’а:
Если layout’у необходимы какие-либо данные, то их можно передать в дополнительных атрибутах конструкции {{layout}}, в данном случае, это параметр items.
И последнее, что хотелось бы рассказать о шаблонах писем, это условные выражения. Описываются они с помощью конструкции:
Если значение condition истинно, то содержимое блока depend будет отображено. Например:
Вот таким образом реализована отправка почты. Этот метод позволяет использовать все достоинства этой замечательной CMS.
Что же тут особенного?
Итак, у некоторых может возникнуть вопрос: «А почему бы не использовать функцию 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.