<?php
/*
役割:受信時のメール制御
現時点:不定貫用メール
*/
namespace Plugin\SDream\EventSubscriber;
use Eccube\Event\EccubeEvents;
use Symfony\Component\EventDispatcher\EventSubscriberInterface;
use Eccube\Event\EventArgs;
use Twig\Environment;
use Psr\Log\LoggerInterface;
class OrderMailSubscriber implements EventSubscriberInterface
{
private Environment $twig;
private LoggerInterface $logger;
public function __construct(
Environment $twig,
LoggerInterface $logger
) {
$this->twig = $twig;
$this->logger = $logger;
}
public static function getSubscribedEvents(): array
{
return [
EccubeEvents::MAIL_ORDER => 'onMailOrder',
];
}
public function onMailOrder(EventArgs $event): void
{
$this->logger->info('onMailOrder called');
$message = $event->getArgument('message');
$Order = $event->getArgument('Order');
$this->logger->info('[SDream] MAIL_ORDER event fired', [
'order_id' => $Order ? $Order->getId() : null,
'has_variable_weight' => $Order ? $Order->hasVariableWeight() : null,
]);
/* デバッグ用
// 送信先を削除して、この後のメール送信を一時的に止める
// 顧客メール → 送信されない
// 管理者通知 → 送信されない
// ★注文処理自体 → 正常完了
$message->to();
$message->bcc();
*/
//イベント発火を確認
if (!$Order || !$this->isVariableWeightOrder($Order)) {
return;
}
//app/Plugin/SDream/Resource/template/mail/variable_weight_order.twig
$textTemplate = '@SDream/mail/variable_weight_order.twig';
if (!$this->twig->getLoader()->exists($textTemplate)) {
$this->logger->warning('[SDream] mail textTemplate not found', [
'textTemplate' => $textTemplate
]);
return;
}
$htmlTemplate = '@SDream/mail/variable_weight_order_html.twig';
if (!$this->twig->getLoader()->exists($htmlTemplate )) {
$this->logger->warning('[SDream] mail htmlTemplate not found', [
'htmlTemplate' => $htmlTemplate
]);
return;
}
// 不定貫用テンプレートに差し替え
$textBody = $this->twig->render($textTemplate, [
'Order' => $Order
]);
$htmlBody = $this->twig->render($htmlTemplate, [
'Order' => $Order
]);
//Bodyはオブジェクトで渡す
$textBody = preg_replace("/\r\n|\r|\n/", "\r\n", $textBody);
$message->text($textBody);//text
$message->html($htmlBody);//html
// 件名変更
$message->subject(
'【仮注文内容のご確認】 '.$message->getSubject()
);
}
private function isVariableWeightOrder($Order): bool
{
foreach ($Order->getOrderItems() as $item) {
$pc = $item->getProductClass();
if (!$pc) continue;
$product = $pc->getProduct();
if (!$product) continue;
if (method_exists($product, 'getFirmvariableattribute')) {
if ((int)$product->getFirmvariableattribute() === 1) {
return true;
}
}
}
return false;
}
}