受注詳細のメール通知からメール送信した際に処理を追加する


要望

出荷メールを編集して送信したい

現状

  • 受注詳細から出荷メールを送っても受注一覧でメールのアイコンが出ない。
    • 出荷データに出荷メール送信日が登録されていないため

デフォルトのメール通知はあくまでもお知らせなどを送る用途のため、出荷処理が走らないのは当然ではある。

現状はOrderMailTypeを編集して出してます。

実装

コアコードには書かない前提で考えている。
まずはMailControllerを見てみよう。

MailController.php
$event = new EventArgs(
[
'form' => $form,
'Order' => $Order,
'MailTemplate' => $MailTemplate,
'MailHistory' => $MailHistory,
],$request);
$this->eventDispatcher->dispatch(EccubeEvents::ADMIN_ORDER_MAIL_INDEX_COMPLETE, $event);

EccubeEvents::ADMIN_ORDER_MAIL_INDEX_COMPLETEが用意されているためにここに処理を追加すればいいことがわかる。
eccube4公式

Customizeディレクトリ配下にEventListenerのファイルを追加。
$eventの変数にはMailControllerで格納されているものがある。(ちょっと自信ない)

ここに自分のしたい処理を記述して、getSubscribedEventsにreturnしてあげればおk。

<?php
declare(strict_types=1);
namespace Customize\EventListener\Admin;

use Doctrine\ORM\EntityManagerInterface;
use Eccube\Controller\AbstractController;
use Eccube\Entity\Order;
use Eccube\Entity\Shipping;
use Eccube\Repository\ShippingRepository;
use Eccube\Service\PurchaseFlow\PurchaseContext;
use Eccube\Service\PurchaseFlow\PurchaseFlow;
use Symfony\Component\EventDispatcher\EventSubscriberInterface;
use Eccube\Event\EccubeEvents;
use Eccube\Event\EventArgs;

/** 受注詳細のメール送信完了後に処理を追加する
 */
class OrderMailIndexCompleteListener extends AbstractController implements EventSubscriberInterface
{
    /**
     * @var EntityManagerInterface
     */
    protected $entityManager;

    /**
     * OrderEditIndexCompleteListener constructor.
     *
     * @param  EntityManagerInterface  $entityManager
     */

    /**
     * @var PurchaseFlow
     */
    protected $purchaseFlow;

    /**
     * @var ShippingRepository
     */
    protected $shippingRepository;

    public function __construct(
        EntityManagerInterface $entityManager,
        PurchaseFlow $purchaseFlow,
        ShippingRepository $shippingRepository
    ) {
        $this->entityManager      = $entityManager;
        $this->purchaseFlow       = $purchaseFlow;
        $this->shippingRepository = $shippingRepository;
    }

    public static function getSubscribedEvents(): array
    {
        return [
            EccubeEvents::ADMIN_ORDER_MAIL_INDEX_COMPLETE => 'onAdminOrderMailIndexComplete',
        ];
    }


    /**
     * メール通知 受注管理から出荷メールを送った際の処理
     *
     * @param  EventArgs  $event
     *
     * @throws \Exception
     */
    public function onAdminOrderMailIndexComplete(EventArgs $event)
    {
        /** @var Order $Order */
        $Order         = $event->getArgument('Order');
        $orderMailType = $event->getArgument('MailTemplate');

        //出荷メールの場合のみ実行
        if ($orderMailType->getId() === 8) {

            $Shippings = $Order->getShippings();

            foreach ($Shippings as $Shipping) {
                $this->entityManager->persist($Shipping);
                $Shipping->setMailSendDate(new \DateTime());
                $this->shippingRepository->save($Shipping);
            }
            $this->entityManager->flush();

            $this->addInfo('「対応状況のステータスを配送手続き完了にしてください。」', 'admin');
        }

    }

}

こんな感じでフックポイントを使うことでコアコードを触らなくても大丈夫。