Tworzenie e-maili w Magento 1 i Magento 2 – podsumowanie

O ile Magento 1 znam na tyle dobrze, że nie sprawia mi większego problemu zaglądanie mu pod maskę, to w przypadku Magento 2 odkrywam dopiero jego niuanse. Każda zmiana niesie za sobą wraz z powiewem świeżości również poczucie zagubienia. O Magento 2 na forach i grupach naczytała się i dużo złego ale i dobrego. Jak zawsze są wrogowie i zwolennicy. Ostatnie 3 wpisy miały na celu przybliżyć Wam jeden z ważniejszych sfer Magento, dot. tworzenia relacji z klientem. Ten wpis zgodnie z obietnicą będzie niejako podsumowaniem całości.

Zmiana treści domyślnych komunikatów Magento

Zarówno w Magento 1 jak i w Magento 2, wszelkiego rodzaju komunikaty możemy zmieniać za pomocą narzędzi dostępnych bezpośrednio w panelu administracyjnym.

Tworzenie e-mali w Magento 1 i w Magento 2 – kompendium

Magento 1  Magento 2*
Gdzie znaleźć w panelu? System → E-maile transakcyjne Marketing → Szablony e-mail
Gdzie e-maile leżą fizycznie na dysku? W language packu np.
app/locale/[language_code]/template/email
Szablonów należy szukać w konkretnym module np.
vendor/magento/module-sales/view/frontend/email
Nadpisywanie szablonow e-mail Nie wchodząc za bardzo w technikalia budowy config.xml w Magento, powiem, że tak naprawdę ustawiając poprawnie kolejność wczytywania modułów, możemy tak naprawdę nadpisać każdą konfigurację. Z jednej strony super ale z drugiej nagle może nam przestać działać coś co wcześniej działało a zainstalowaliśmy tylko nowy moduł, który w sumie nie miał nic wspólnego z tą konfiguracją, która nam przestała działać.
Szablony deklaruje się w pliku config.xml np.
<?xml version="1.0"?>
<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:module:Magento_Store:etc/config.xsd">
    <default>
        <design>
            <email>
                <payreminder>payreminder_email_general_email</payreminder>
            </email>
        </design>
    </default>
</config>
Szablony mogą być nadpisane zarówno przez panel administracyjny jak i skórkę. Jeśli skórka nadpisuje szablon należy go szukać w lokalizacji:

<theme_dir>/<ModuleVendorName>_<ModuleName>/email

np.

vendor/magento/module-sales/view/frontend/email/order_new.html

w lokalizacji:

<theme_dir>/Magento_Sales/email/order_new.html

Nie mówię, że to niemożliwe ale nie udało mi się dokonać nadpisania deklaracji szablonu za pomocą config.xml modułu

Tytuł e-maila Dodawany w treści szablonu za pomocą komentarza:
<!--@subject Payment reminder @-->
Dodawany w treści szablonu za pomocą komentarza:
<!--@subject Payment reminder @-->
Szablon e-mali
<!--@subject Payment reminder @-->
<!--@vars
{"store url=""":"Store Url",
"var logo_url":"Email Logo Image Url",
"var logo_alt":"Email Logo Image Alt",
"htmlescape var=$order.getCustomerName()":"Customer Name",
"var store.getFrontendName()":"Store Name",
"store url="customer/account/"":"Customer Account Url",
"var order.increment_id":"Order Id",
"var order.getCreatedAtFormated('long')":"Order Created At (datetime)",
"var order.getBillingAddress().format('html')":"Billing Address",
"var order.getShippingAddress().format('html')":"Shipping Address",
"var order.getShippingDescription()":"Shipping Description",
"layout handle="sales_email_order_items" order=$order":"Order Items Grid",
"var order.getEmailCustomerNote()":"Email Order Note"}
@->
{{var header_block}}
Dzień dobry,
<br/>
Nie odnotowaliśmy płatności za zamówienie nr  {{var order.increment_id}}
Pozdrawiamy
Twój sklep :)
{{var footer_block}}
<!--@subject Payment reminder @-->
<!--@vars {
"var formattedBillingAddress|raw":"Billing Address",
"var order.getEmailCustomerNote()":"Email Order Note",
"var order.increment_id":"Order Id",
"layout handle="sales_email_order_items" order=$order area="frontend"":"Order Items Grid",
"var payment_html|raw":"Payment Details",
"var formattedShippingAddress|raw":"Shipping Address",
"var order.getShippingDescription()":"Shipping Description"
} @-->
{{template config_path="design/email/header_template"}}
Dzień dobry,
<br />
Nie odnotowaliśmy płatności za  {{trans 'zamówienie nr #%increment_id' increment_id=$order.increment_id |raw}}
Pozdrawiamy
Twój sklep
{{template config_path="design/email/footer_template"}}
Zmienne w szablonie – przykład użycia
{{var order.increment_id}}
{{trans 'zamówienie nr #%increment_id' increment_id=$order.increment_id |raw}}
Tłumaczenia Szablon per language pack:

app/locale/[language_code]/template/email
Za pomocą funkcji trans()
config.xml
<global>
    <template>
        <email>
            <payment_reminder_template translate="label" module="namespace_payreminder">
                <label>Default Payreminder Template</label>
                <file>payreminder/payreminder.html</file>
                <type>html</type>
            </payment_reminder_template>
        </email>
    </template>
</global>
<?xml version="1.0"?>
<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:module:Magento_Store:etc/config.xsd">
    <default>
        <design>
            <email>
                <payreminder>payreminder_email_general_email</payreminder>
            </email>
        </design>
    </default>
</config>
email_templates.xml
<?xml version="1.0"?>
<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:module:Magento_Email:etc/email_templates.xsd">
    <template id="payreminder_email_general_email" label="Payreminder" file="payreminder.html" type="html" module="Namespace_Payreminder" area="frontend"/>
</config>
ACL
<?xml version="1.0"?>
<config>
    <acl>
        <resources>
            <all>
                <title>Allow Everything</title>
            </all>
            <admin>
                <children>
                    <system>
                        <children>
                            <config>
                                <children>
                                    <namespace_module>
                                        <title>Payreminder</title>
                                    </namespace_module>
                                </children>
                            </config>
                        </children>
                    </system>
                </children>
            </admin>
        </resources>
    </acl>
</config>
<?xml version="1.0"?>
<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:framework:Acl/etc/acl.xsd">
    <acl>
        <resources>
            <resource id="Magento_Backend::admin">
                <resource id="Magento_Backend::stores">
                    <resource id="Magento_Backend::stores_settings">
                        <resource id="Magento_Config::config">
                            <resource id="Namespace_Payreminder::configuration" title="Payreminder" />
                        </resource>
                    </resource>
                </resource>
            </resource>
        </resources>
    </acl>
</config>
Store config
<?xml version="1.0" encoding="UTF-8"?>
<config>
    <sections>
        <namespace_module translate="label" module="namespace_module">
            <label>Powiadomienia o płatności</label>
            <tab>sales</tab>
            <sort_order>100</sort_order>
            <show_in_default>1</show_in_default>
            <show_in_website>1</show_in_website>
            <show_in_store>1</show_in_store>
            <groups>
                <general>
                    <label>Ustawienia główne</label>
                    <frontend_type>text</frontend_type>
                    <sort_order>99</sort_order>
                    <show_in_default>1</show_in_default>
                    <show_in_website>1</show_in_website>
                    <show_in_store>1</show_in_store>
                    <fields>
                        <email_template translate="label">
                            <label>Szablon e-mail</label>
                            <frontend_type>select</frontend_type>
                            <source_model>adminhtml/system_config_source_email_template</source_model>
                            <sort_order>9</sort_order>
                            <show_in_default>1</show_in_default>
                            <show_in_website>1</show_in_website>
                            <show_in_store>1</show_in_store>
                        </email_template>
                    </fields>
                </general>
            </groups>
        </namespace_module>
    </sections>
</config>
<?xml version="1.0"?>
<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:module:Magento_Config:etc/system_file.xsd">
    <system>
        <section id="payreminder_email" translate="label" sortOrder="130" showInDefault="1" showInWebsite="1" showInStore="1">
            <label>Payreminder</label>
            <tab>sales</tab>
            <resource>Namespace_Payreminder::configuration</resource>
            <group id="general" translate="label" type="text" sortOrder="10" showInDefault="1" showInWebsite="0" showInStore="0">
                <label>General</label>
                <field id="email" translate="label comment" type="select" sortOrder="3" showInDefault="1" showInWebsite="1" showInStore="1" canRestore="1">
                    <label>Template</label>
                    <comment>Email template chosen based on theme fallback when "Default" option is selected.</comment>
                    <source_model>Magento/Config/Model/Config/Source/Email/Template</source_model>
                </field>
            </group>
        </section>
    </system>
</config>
PHP
$email = Mage::getModel('core/email_template');
$customerEmail = $_order→getCustomerEmail();
$storeId = Mage::app()->getStore()->getStoreId();
$emailTemplateVariables = [
    'order' => $_order
];
try {
    $email→sendTransactional(
        'payment_reminder_template',
        $sender,
        $customerEmail,
        $sender,
        $emailTemplateVariables
    );
} catch (Exception $error) {
    Mage::getSingleton('core/session')->addError($error→getMessage());
}

$templateId = Mage::getStoreConfig('namespace_module/general/email_template', $order->getStoreId());

if (!$templateId) {
    $templateId = ‘payment_reminder_template’;
}
/* @var \Magento\Framework\App\State $state */
/* @var \Magento\Sales\Api\OrderRepositoryInterface $orderRepository */
/* @var \Magento\Store\Model\StoreManagerInterface $storeManager */
/* @var \Magento\Framework\App\Config\ScopeConfigInterface $scopeConfig */
/* @var \Magento\Framework\Translate\Inline\StateInterface $inlineTranslation */
/* @var \Magento\Framework\Mail\Template\TransportBuilder $transportBuilder */

$order = $orderRepository->get(1);
$storeId = $order->getStoreId();
$templateOptions = array('area' => MagentoFrameworkAppArea::AREA_FRONTEND, 'store' => $storeId);
$templateVars = array(
    'store' => $storeManager->getStore($order->getStoreId()),
    'order' => $order,
);
$inlineTranslation->suspend();
$to = array($order->getCustomerEmail());
$sender = [
    'name' => $scopeConfig->getValue(
        'trans_email/ident_sales/name',
        MagentoStoreModelScopeInterface::SCOPE_STORE
    ),
    'email' => $scopeConfig->getValue(
        'trans_email/ident_sales/email',
        MagentoStoreModelScopeInterface::SCOPE_STORE
    )
];
$transport = $transportBuilder->setTemplateIdentifier('payreminder_email_general_email')
    ->setTemplateOptions($templateOptions)
    ->setTemplateVars($templateVars)
    ->setFrom($sender)
    ->addTo($to)
    ->getTransport();
$transport->sendMessage();
$inlineTranslation->resume();

$transport = $this->transportBuilder->setTemplateIdentifier(
        $this->scopeConfig->getValue('payreminder_email/general/email',
        MagentoStoreModelScopeInterface::SCOPE_STORE)
    )
    ->setTemplateOptions($templateOptions)
    ->setTemplateVars($templateVars)
    ->setFrom($sender)
    ->addTo($to)
    ->getTransport();
* Magento 2.2