【EC-CUBE4】お問い合わせ内容をデータベースに保存する方法

EC-CUBE4でお問い合わせ内容をデータベースに保存する方法です。

※下記ソースコードはPHP7.1以上を対象としています。

Contactエンティティを用意

まずお問い合わせ内容を保存するため、Cusotomize/Enitiyディレクトリ内にContact.phpというファイル名で下記のソースコードを設置してください。

<?php

namespace Customize\Entity;

use Doctrine\ORM\Mapping as ORM;

/**
 * @ORM\Entity(repositoryClass="Customize\Repository\ContactRepository")
 */
class Contact extends \Eccube\Entity\AbstractEntity
{
    /**
     * @ORM\Id()
     * @ORM\GeneratedValue()
     * @ORM\Column(type="integer")
     */
    private $id;

    /**
     * @ORM\Column(type="string", length=255)
     */
    private $name01;
    
    /**
     * @ORM\Column(type="string", length=255)
     */
    private $name02;

    /**
     * @ORM\Column(type="string", length=255, nullable=true)
     */
    private $kana01;
    
    /**
     * @ORM\Column(type="string", length=255, nullable=true)
     */
    private $kana02;

    /**
     * @ORM\Column(type="string", length=255, nullable=true)
     */
    private $postal_code;

    /**
     * @ORM\Column(type="string", length=255, nullable=true)
     */
    private $pref;
    
    /**
     * @ORM\Column(type="string", length=255, nullable=true)
     */
    private $addr01;
    
    /**
     * @ORM\Column(type="string", length=255, nullable=true)
     */
    private $addr02;

    /**
     * @ORM\Column(type="string", length=255, nullable=true)
     */
    private $phone_number;

    /**
     * @ORM\Column(type="string", length=255)
     */
    private $email;

    /**
     * @ORM\Column(type="text")
     */
    private $contents;

    public function getId(): ?int
    {
        return $this->id;
    }

    public function getName01(): ?string
    {
        return $this->name01;
    }

    public function setName01(string $name01): self
    {
        $this->name01 = $name01;

        return $this;
    }
    
    public function getName02(): ?string
    {
        return $this->name02;
    }

    public function setName02(string $name02): self
    {
        $this->name02 = $name02;

        return $this;
    }

    public function getKana01(): ?string
    {
        return $this->kana01;
    }

    public function setKana01(?string $kana01): self
    {
        $this->kana01 = $kana01;

        return $this;
    }
    
    public function getKana02(): ?string
    {
        return $this->kana02;
    }

    public function setKana02(?string $kana02): self
    {
        $this->kana02 = $kana02;

        return $this;
    }

    public function getPostalCode(): ?string
    {
        return $this->postal_code;
    }

    public function setPostalCode(?string $postal_code): self
    {
        $this->postal_code = $postal_code;

        return $this;
    }

    public function getPref(): ?string
    {
        return $this->pref;
    }

    public function setPref(?string $pref): self
    {
        $this->pref = $pref;

        return $this;
    }
    
    public function getAddr01(): ?string
    {
        return $this->addr01;
    }

    public function setAddr01(?string $addr01): self
    {
        $this->addr01 = $addr01;

        return $this;
    }
    
    public function getAddr02(): ?string
    {
        return $this->addr02;
    }

    public function setAddr02(?string $addr02): self
    {
        $this->addr02 = $addr02;

        return $this;
    }

    public function getPhoneNumber(): ?string
    {
        return $this->phone_number;
    }

    public function setPhoneNumber(?string $phone_number): self
    {
        $this->phone_number = $phone_number;

        return $this;
    }

    public function getEmail(): ?string
    {
        return $this->email;
    }

    public function setEmail(string $email): self
    {
        $this->email = $email;

        return $this;
    }

    public function getContents(): ?string
    {
        return $this->contents;
    }

    public function setContents(string $contents): self
    {
        $this->contents = $contents;

        return $this;
    }
}

データベースにお問い合わせ内容を保存するテーブルを作成

下記のコマンドを実行すると、上記で作成したエンティティを元にお問い合わせ内容を保存するテーブルが自動で生成されます。

bin/console eccube:schema:update --force

お問い合わせ完了時にお問い合わせ内容を保存するイベント処理を用意

お問い合わせ送信後にお問い合わせ内容を保存する処理を追加するため、CusotomizeディレクトリにEvent.phpというファイル名で下記のソースコードを設置してください。

<?php

namespace Customize;

use Symfony\Component\EventDispatcher\EventSubscriberInterface;
use Eccube\Event\EccubeEvents;
use Eccube\Event\EventArgs;
use Customize\Entity\Contact;
use Doctrine\ORM\EntityManagerInterface;

class Event implements EventSubscriberInterface
{
    /**
     * @var EntityManagerInterface
     */
    private $entityManager;
    
    public function __construct(EntityManagerInterface $entityManager)
    {
        $this->entityManager = $entityManager;
    }
    
    /**
     * @return array
     */
    public static function getSubscribedEvents()
    {
        return [
            EccubeEvents::FRONT_CONTACT_INDEX_COMPLETE => 'onFrontContactIndexComplete'
        ];
    }
    
    public function onFrontContactIndexComplete(EventArgs $event)
    {
        $data = $event->getArgument("data");
        
        $Contact = new Contact();
        $Contact->setName01($data["name01"]);
        $Contact->setName02($data["name02"]);
        $Contact->setKana01($data["kana01"]);
        $Contact->setKana02($data["kana02"]);
        $Contact->setPostalCode($data["postal_code"]);
        $Contact->setPref($data["pref"]);
        $Contact->setAddr01($data["addr01"]);
        $Contact->setAddr02($data["addr02"]);
        $Contact->setPhoneNumber($data["phone_number"]);
        $Contact->setEmail($data["email"]);
        $Contact->setContents($data["contents"]);
        
        $this->entityManager->persist($Contact);
        $this->entityManager->flush();
    }
}

以上で完成です。

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

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