【EC-CUBE4.2】受注登録したメンバーを管理画面の受注登録ページに表示させる方法

EC-CUBE4.2で受注登録したメンバーを管理画面の受注登録ページに表示させるようカスタマイズする方法です。

実装は以下のとおりです。

Orderエンティティを拡張

<?php

/**
 * Copyright(c) 2023 Akira Kurozumi <info@a-zumi.net>
 *
 * https://a-zumi.net
 *
 * Released under the MIT license.
 * see https://opensource.org/licenses/MIT
 */

namespace Customize\Entity;

use Doctrine\ORM\Mapping as ORM;
use Eccube\Annotation\EntityExtension;
use Eccube\Entity\Member;

/**
 * @EntityExtension("Eccube\Entity\Order")
 */
trait OrderTrait
{
    /**
     * @var Member
     *
     * @ORM\ManyToOne(targetEntity="Eccube\Entity\Member", inversedBy="Orders")
     * @ORM\JoinColumn(name="member_id", referencedColumnName="id", nullable="true")
     */
    private $Member;

    /**
     * @return Member|null
     */
    public function getMember(): ?Member
    {
        return $this->Member;
    }

    /**
     * @param Member|null $Member
     * @return OrderTrait
     */
    public function setMember(?Member $Member): self
    {
        $this->Member = $Member;

        return $this;
    }
}

Memberエンティティを拡張

<?php

/**
 * Copyright(c) 2023 Akira Kurozumi <info@a-zumi.net>
 *
 * https://a-zumi.net
 *
 * Released under the MIT license.
 * see https://opensource.org/licenses/MIT
 */

namespace Customize\Entity;

use Doctrine\Common\Collections\ArrayCollection;
use Doctrine\Common\Collections\Collection;
use Doctrine\ORM\Mapping as ORM;
use Eccube\Annotation\EntityExtension;
use Eccube\Entity\Order;

/**
 * @EntityExtension("Eccube\Entity\Member")
 */
trait MemberTrait
{
    /**
     * @var Collection
     *
     * @ORM\OneToMany(targetEntity="Eccube\Entity\Order", mappedBy="Member")
     */
    private $Orders;

    /**
     * @param Order $Orders
     * @return Member
     */
    public function addOrder(Order $Order): self
    {
        if (null === $this->Orders) {
            $this->Orders = new ArrayCollection();
        }

        if (false === $this->Orders->contains($Order)) {
            $this->Orders->add($Order);
        }

        return $this;
    }

    /**
     * @param Order $Order
     * @return Member
     */
    public function removeOrder(Order $Order): self
    {
        if (null === $this->Orders) {
            $this->Orders = new ArrayCollection();
        }

        if ($this->Orders->contains($Order)) {
            $this->Orders->removeElement($Order);
        }

        return $this;
    }

    /**
     * @return Collection
     */
    public function getOrders(): Collection
    {
        if (null === $this->Orders) {
            $this->Orders = new ArrayCollection();
        }

        return $this->Orders;
    }
}

受注登録ページのテンプレートをカスタマイズ

EC-CUBE本体のテンプレートを直接編集するのはまずいのでカスタマイズ用ディレクトリにコピーします。

cp src/Eccube/Resource/template/admin/Order/edit.twig app/template/Order/edit.twig

コピーしたテンプレートの任意の場所に以下のコードを追加してください。

<div class="row mb-3">
    <div class="col-3"><i class="fa fa-user fa-fw me-1" aria-hidden="true"></i>{{ '登録メンバー'|trans }</div>
    <div class="col">{{ Order.Member }}</div>
</div>

管理画面で受注登録したときにメンバーを登録するイベント

メンバー登録条件はコード内にコメントしています。この部分は各サイトの運用に合う条件に変更してください。

<?php

/**
 * Copyright(c) 2023 Akira Kurozumi <info@a-zumi.net>
 *
 * https://a-zumi.net
 *
 * Released under the MIT license.
 * see https://opensource.org/licenses/MIT
 */

namespace Customize;

use Doctrine\ORM\EntityManagerInterface;
use Eccube\Entity\Member;
use Eccube\Entity\Order;
use Eccube\Event\EccubeEvents;
use Eccube\Event\EventArgs;
use Symfony\Component\EventDispatcher\EventSubscriberInterface;
use Symfony\Component\Security\Core\Security;

class Event implements EventSubscriberInterface
{
    /**
     * @var Security
     */
    private $security;

    /**
     * @var EntityManagerInterface
     */
    private $entityManager;

    public function __construct(Security $security, EntityManagerInterface $entityManager)
    {
        $this->security = $security;
        $this->entityManager = $entityManager;
    }

    public static function getSubscribedEvents()
    {
        return [
            EccubeEvents::ADMIN_ORDER_EDIT_INDEX_COMPLETE => 'onAdminOrderEditIndexComplete',
        ];
    }

    public function onAdminOrderEditIndexComplete(EventArgs $event)
    {
        if (!$this->security->getUser() instanceof Member) {
            return;
        }

        /** @var Order $Order */
        $Order = $event->getArgument('TargetOrder');

        /**
         * ############################
         * 端末種別がNULLではなくかつ登録メンバーがNULLの場合、
         * 受注を更新するとカスタマーの注文にもかかわらずメンバーが登録されてしまうため、
         * 端末種別と登録メンバーがNULLの場合、メンバーを登録する
         *
         * 登録メンバーのNULL判定をしない場合、受注を更新するたびに登録メンバーも更新されます。
         * ############################
         */
        if (null === $Order->getMember() && null == $Order->getDeviceType()) {
            $Order->setMember($this->security->getUser());
            $this->entityManager->persist($Order);
            $this->entityManager->flush();
        }
    }

}

お気軽にコメントをどうぞ

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください