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 |