Проблема: в письмах модуля ProductAlert не работают переводы, для товаров не подтягиваются картинки (вместо них url изображения товара заменяется на плейсхолдер)
Решение: проблема скрыта глубоко в механизме Magento, а именно то, как она загружает информацию о текущей зоне (area). Из нее в последующем будет вытаскиваться текущая тема, из темы переводы, а так же все связанные с ней слои (layouts).
Не смотря на то, что в самом модуле ProductAlerts storeId передается правильно при отправке письма, необходимая зона загружается неполностью.
\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
<?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
<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
