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:
np.
w lokalizacji:
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 |
|
|
| Tłumaczenia | Szablon per language pack:
|
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 | ||