メモ > 技術 > CMS: ECCube > カスタマイズ: テーブルを作成
カスタマイズ: テーブルを作成
Entityのカスタマイズ - < for EC-CUBE 4.0 Developers />
https://doc4.ec-cube.net/customize_entity
以下を参考に、お問い合わせ(/contact)の内容をデータベースに保存してみる
【EC-CUBE4】お問い合わせ内容をデータベースに保存する方法 - あずみ.net
https://a-zumi.net/eccube4-save-contact/
■データベース操作の概要
マイグレーション用のSQL作成について、大きく分けて
・マイグレーションで作成する
・ORMの機能で作成する
と2つの方法がある
どちらでも同じ結果を得られるが、デフォルトでは列を追加するとテーブルの最後に追加される
マイグレーションならマイグレーション内容を調整することで任意の場所に追加できるので、
特に理由が無ければ「マイグレーションで作成する」の方が無難そう
また、ORMとマイグレーションが混在すると混乱の元なので、常に「マイグレーションで作成する」を使うように統一するほうが良さそう
ただしECCube4のお作法としては「マイグレーションはデータの編集に使う」という思想があるようなので、引き続き検証したい
EC-CUBE4カスタマイズ - マイグレーションの作成・実行方法
https://umebius.com/eccube/eccube4-howto-migration/
■Entityを作成
html\app\Customize\Entity\Contact.php を作成する
<?php
namespace Customize\Entity;
use Doctrine\ORM\Mapping as ORM;
/**
* @ORM\Table(name="dtb_contact")
* @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;
}
}
■テーブルを作成(マイグレーションを使用する場合)
$ php bin/console cache:clear --no-warmup
$ php bin/console doctrine:migrations:diff
Generated new migration class to "/var/www/html/app/DoctrineMigrations/Version20200826091332.php" from schema differences.
以下のファイルが作成された
必要に応じて、SQLの内容を変更する(「COMMENT」を追加したりなど)
html\app\DoctrineMigrations\Version20200826091332.php
<?php declare(strict_types=1);
namespace DoctrineMigrations;
use Doctrine\DBAL\Schema\Schema;
use Doctrine\Migrations\AbstractMigration;
/**
* Auto-generated Migration: Please modify to your needs!
*/
final class Version20200826091332 extends AbstractMigration
{
public function up(Schema $schema) : void
{
// this up() migration is auto-generated, please modify it to your needs
$this->abortIf($this->connection->getDatabasePlatform()->getName() !== 'mysql', 'Migration can only be executed safely on \'mysql\'.');
$this->addSql('CREATE TABLE dtb_contact (id INT AUTO_INCREMENT NOT NULL, name01 VARCHAR(255) NOT NULL, name02 VARCHAR(255) NOT NULL, kana01 VARCHAR(255) DEFAULT NULL, kana02 VARCHAR(255) DEFAULT NULL, postal_code VARCHAR(255) DEFAULT NULL, pref VARCHAR(255) DEFAULT NULL, addr01 VARCHAR(255) DEFAULT NULL, addr02 VARCHAR(255) DEFAULT NULL, phone_number VARCHAR(255) DEFAULT NULL, email VARCHAR(255) NOT NULL, contents LONGTEXT NOT NULL, PRIMARY KEY(id)) DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci ENGINE = InnoDB');
}
public function down(Schema $schema) : void
{
// this down() migration is auto-generated, please modify it to your needs
$this->abortIf($this->connection->getDatabasePlatform()->getName() !== 'mysql', 'Migration can only be executed safely on \'mysql\'.');
$this->addSql('DROP TABLE dtb_contact');
}
}
実行されていない新しいバージョンのmigrationがあるかを確認
(ECCubeデフォルトのマイグレーションが未実行だと、その分も表示される)
$ php bin/console doctrine:migrations:status
マイグレーションを実行
$ php bin/console doctrine:migrations:migrate
テーブルが作成される
■テーブルを作成(ORMを使用する場合)
以下のようにして、作成される予定のSQLを確認する
(実際は CREATE TABLE は1行で表示される。インデントも調整されていない。またORMを使用する場合、「COMMENT」を追加したりなどはできないみたい)
$ php bin/console eccube:schema:update --dump-sql
gen -> /tmp/proxy_9gCzBn5rLdAt/src/Eccube/Entity/Customer.php
The following SQL statements will be executed:
CREATE TABLE dtb_contact (
id INT AUTO_INCREMENT NOT NULL,
name01 VARCHAR(255) NOT NULL,
name02 VARCHAR(255) NOT NULL,
kana01 VARCHAR(255) DEFAULT NULL,
kana02 VARCHAR(255) DEFAULT NULL,
postal_code VARCHAR(255) DEFAULT NULL,
pref VARCHAR(255) DEFAULT NULL,
addr01 VARCHAR(255) DEFAULT NULL,
addr02 VARCHAR(255) DEFAULT NULL,
phone_number VARCHAR(255) DEFAULT NULL,
email VARCHAR(255) NOT NULL,
contents LONGTEXT NOT NULL,
PRIMARY KEY(id)
) DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci ENGINE = InnoDB;
以下のようにして、実際にテーブルを作成する
$ php bin/console eccube:schema:update --force
gen -> /tmp/proxy_WQKomAybHkLO/src/Eccube/Entity/Customer.php
gen -> /tmp/proxy_WQKomAybHkLO/src/Eccube/Entity/Customer.php
Updating database schema...
1 query was executed
[OK] Database schema updated successfully!
dtb_contact テーブルが作成されているので確認する
■イベントを作成
html\app\Customize\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();
}
}
以下でキャッシュを削除する
$ php bin/console cache:clear --no-warmup
お問い合わせからメールを送信すると、データベースの dtb_contact テーブルに記録される
「EccubeEvents::FRONT_CONTACT_INDEX_COMPLETE」は処理を行うタイミングの指定みたい
大した説明は無いが以下が参考になりそう
EC-CUBE4 APIドキュメント
https://www.xross-cube.com/EC-CUBE_doc/classes/Eccube-Event-EccubeEvents.html