Проблема: в письмах модуля ProductAlert не работают переводы, для товаров не подтягиваются картинки (вместо них url изображения товара заменяется на плейсхолдер)
Решение: проблема скрыта глубоко в механизме Magento, а именно то, как она загружает информацию о текущей зоне (area). Из нее в последующем будет вытаскиваться текущая тема, из темы переводы, а так же все связанные с ней слои (layouts).
Не смотря на то, что в самом модуле ProductAlerts storeId передается правильно при отправке письма, необходимая зона загружается неполностью.
1 2 3 4 5 6 |
\Magento\ProductAlert\Model\Email::send $storeId = (int) $this->getStoreId() ?: (int) $this->_customer->getStoreId(); $store = $this->getStore($storeId); $this->_appEmulation->startEnvironmentEmulation($storeId); |
Чтобы исправить это, я написал before-плагин:
- app/code/<Vendor>/<Module>/Plugin/LoadAreaBeforeSendingEmailPlugin.php
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 |
<?php declare(strict_types=1); namespace <Vendor>\<Module>\Plugin; use Magento\Framework\App\AreaList; use Magento\ProductAlert\Model\Email; class LoadAreaBeforeSendingEmailPlugin { public function __construct( private AreaList $areaList ) { } public function beforeSend(Email $subject): array { $area = $this->areaList->getArea(\Magento\Framework\App\Area::AREA_FRONTEND); $area->load(); return []; } } |
2. app/code/<Vendor>/<Module>/etc/di.xml
1 2 3 4 5 6 7 8 |
<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:framework:ObjectManager/etc/config.xsd"> <type name="\Magento\ProductAlert\Model\Email"> <plugin name="<Vendor>_<Module>::load_area_before_sending_email" type="<Vendor>\<Module>\Plugin\LoadAreaBeforeSendingEmailPlugin" /> </type> </config> |
Он загружает всю зону целиком, после этого правильно загружается тема, слои и переводы
Связанные issue:
- https://github.com/magento/magento2/issues/37507
- https://github.com/magento/magento2/issues/35674
- https://github.com/magento/magento2/issues/23063