Memo

メモ > 技術 > 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/main/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

Advertisement