メモ > 技術 > CMS: ECCube > カスタマイズ: 会員情報に項目を追加
カスタマイズ: 会員情報に項目を追加
※テーブル構造自体を変更しているが、これだと副作用が発生する可能性がありそうな
新規にテーブルを作って、そちらと紐づける方針では対応できるか
ただし、これはこれで有効なので手順は残しておく
※Entityは「Trait」ではなく「Extension」という名前で扱うべきか
※Resourceは「common.mobile_number」ではなく「content.costomer.mobile_number」という名前で扱うべきか
※プラグインで対応する、という手段も検討する
むしろ独自に項目を追加すると、CSVエクスポートなど他機能と連携するための処理も考慮する必要があってややこしい
原則独自に追加しようとせずに、素直にプラグインに頼るのが良さそう
EC-CUBE4カスタマイズ - [4系] 新規会員登録画面に項目を追加する方法
https://umebius.com/eccube/eccube4-add-new-form-item-customer/
以下は「携帯電話番号」という項目を追加する手順
■Entityを作成
Entityのカスタマイズ - < for EC-CUBE 4.0 Developers />
https://doc4.ec-cube.net/customize_entity
html\app\Customize\Entity\CustomerTrait.php を作成
<?php
namespace Customize\Entity;
use Doctrine\ORM\Mapping as ORM;
use Eccube\Annotation\EntityExtension;
/**
* @EntityExtension("Eccube\Entity\Customer")
*/
trait CustomerTrait
{
/**
* @var string|null
* @ORM\Column(type="string", length=14, nullable=true)
* @Eccube\Annotation\FormAppend(
* auto_render=false,
* type="\Symfony\Component\Form\Extension\Core\Type\TextType",
* options={
* "required": false,
* "label": "携帯電話番号",
* "attr": {"placeholder": "例:09000000000"}
* })
*/
private $mobile_number;
/**
* @return string|null
*/
public function getMobileNumber()
{
return $this->mobile_number;
}
/**
* @param string|null $mobile_number
* @return CustomerTrait
*/
public function setMobileNumber($mobile_number)
{
$this->mobile_number = $mobile_number;
return $this;
}
}
作業したらキャッシュを削除する
$ php bin/console cache:clear --no-warmup
プロキシファイルを作成する
$ php bin/console eccube:generate:proxies
以下に、トレイトを認識させるためのプロキシファイルが作成される
ファイル内の「use \Customize\Entity\CustomerTrait;」で、上記ファイルが読み込まれる
html\app\proxy\entity\src\Eccube\Entity\Customer.php
■テーブル定義を変更(マイグレーションを使用する場合)
$ php bin/console cache:clear --no-warmup
$ php bin/console doctrine:migrations:diff
Generated new migration class to "/var/www/html/app/DoctrineMigrations/Version20200826083254.php" from schema differences.
以下のファイルが作成された
必要に応じて、SQLの内容を変更する(「AFTER column_name」を追加したりなど)
html\app\DoctrineMigrations\Version20200826083254.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 Version20200826083254 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('ALTER TABLE dtb_customer ADD mobile_number VARCHAR(14) DEFAULT NULL');
}
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('ALTER TABLE dtb_customer DROP mobile_number');
}
}
実行されていない新しいバージョンのmigrationがあるかを確認
(ECCubeデフォルトのマイグレーションが未実行だと、その分も表示される)
$ php bin/console doctrine:migrations:status
マイグレーションを実行
$ php bin/console doctrine:migrations:migrate
テーブルに項目が追加される
■テーブル定義を変更(ORMを使用する場合)
$ php bin/console cache:clear --no-warmup
$ php bin/console eccube:schema:update --force --dump-sql
[OK] Database schema updated successfully!
dtb_customerテーブルの最後に「mobile_number」が追加される
これは「ALTER TABLE dtb_customer ADD mobile_number VARCHAR(14) DEFAULT NULL;」と同じ効果
(ORMを使用する場合、「AFTER column_name」を追加したりなどはできないみたい)
--force を付けないと、「[CAUTION] This operation should not be executed in a production environment!」となって本番環境では実行できないので注意
また「[OK] Nothing to update - your database is already in sync with the current entity metadata.」と表示された場合、先にキャッシュの削除を行っておく
■画面表示を調整
html\src\Eccube\Resource\template\default\Entry\index.twig
を複製して
html\app\template\default\Entry\index.twig
を作成し、以下を追加する
<dl>
<dt>
{{ form_label(form.mobile_number, 'common.mobile_number', { 'label_attr': { 'class': 'ec-label' }}) }}
</dt>
<dd>
<div class="ec-telInput{{ has_errors(form.mobile_number) ? ' error' }}">
{{ form_widget(form.mobile_number) }}
{{ form_errors(form.mobile_number) }}
</div>
</dd>
</dl>
html\src\Eccube\Resource\template\default\Entry\confirm.twig
を複製して
html\app\template\default\Entry\confirm.twig
を作成し、以下を追加する
<dl>
<dt>
{{ form_label(form.mobile_number, 'common.mobile_number', { 'label_attr': { 'class': 'ec-label' }}) }}
</dt>
<dd>{{ form.mobile_number.vars.data }}
{{ form_widget(form.mobile_number, { type : 'hidden' }) }}
</dd>
</dl>
html\src\Eccube\Resource\template\default\Mypage\change.twig
を複製して
html\app\template\default\Mypage\change.twig
を作成し、以下を追加する
<dl>
<dt>
{{ form_label(form.mobile_number, 'common.mobile_number', { 'label_attr': { 'class': 'ec-label' }}) }}
</dt>
<dd>
<div class="ec-telInput{{ has_errors(form.mobile_number) ? ' error' }}">
{{ form_widget(form.mobile_number) }}
{{ form_errors(form.mobile_number) }}
</div>
</dd>
</dl>
ラベルを正しく表示させるには、以下のリソースファイルに文言を追加する
(リソースファイルが無ければ作成する)
html\app\Customize\Resource\locale\messages.ja.yaml
common.mobile_number: 携帯電話番号
html\app\Customize\Resource\locale\messages.en.yaml
common.mobile_number: Mobile Phone
これでユーザ側に携帯電話番号欄が追加される
引き続き、管理側も調整を行う
html\src\Eccube\Resource\template\admin\Customer\edit.twig
を複製して
html\app\template\admin\Customer\edit.twig
を作成し、以下を追加する
<div class="row mb-2">
<div class="col-3">
<span>{{ 'admin.common.mobile_number'|trans }}</span>
</div>
<div class="col">
{{ form_widget(form.mobile_number) }}
{{ form_errors(form.mobile_number) }}
</div>
</div>
管理画面のラベルを正しく表示させるには、以下のリソースファイルに文言を追加する
(リソースファイルが無ければ作成する)
html\app\Customize\Resource\locale\messages.ja.yaml
admin.common.mobile_number: 携帯電話番号
html\app\Customize\Resource\locale\messages.en.yaml
admin.common.phone_number: Mobile Phone
最後に、キャッシュをクリアしておく
$ php bin/console cache:clear --no-warmup
これで管理側に携帯電話番号欄が追加される
引き続き、PDFなどの掲載内容も必要に応じて調整が必要かもしれない