【EC-CUBE4】カスタマイズ

スポンサーリンク
スポンサーリンク

バージョン:EC-CUBE4.0

いろいろ調べていて時間がかかったのでメモします

Bitly
スポンサーリンク

カスタマイズ

EC-CUBE本体がsrc配下にあります。

本体パス:参考になるソースがあるので確認して下さいって感じです。

カスタマイズ対応クラス
  1. データ項目追加「Entity」
  2. サービス「Service」
  3. バリデーション「Form」
  4. 表示「Twig」

既存機能のカスタマイズは、基本的にControllerの修正なしで行える。

テンプレートは本体をコピー

本体パス:src/Eccube/Resource/template/

カスタマイズパス:app/template/

本体からカスタマイズへコピーする。

あとは、app/template/配下のファイルをカスタマイズするだけです。

Controller

本体パス:/src/Eccube/Controller/

カスタマイズパス:app/Customize/Controller/

カスタマイズパスへコントローラーの作成

既存のパスを上書きしたい場合は、アノテーションで指定すれば良いらしい

PHP
    /**
     * @Method("GET")
     * @Route("/test")
     */
    public function index(){

    }

Entity

本体パス:src/Eccube/Entity/

カスタマイズパス:app/Customize/Entity/

コマンドで作成可能
テーブルのカラム定義とgetter,setterも作ってくれる。

拡張する場合は「trait」

※プラグインのEntityをTraitしてCustomizeで定義するのは、やめた方が良い。

スキーマ更新時にエラーが発生する可能性があるのでプラグイン内でTraitする

Bash
bin/console make:entity

Repository

本体パス:src/Eccube/Repository/

カスタマイズパス:app/Customize/Repository/

Entityをコマンドで作成したら、合わせて作成してくれる。

Bash
bin/console make:entity

Command

本体パス:src/Eccube/Command/

カスタマイズパス:app/Customize/Command/

bin/consoleコマンドが作成出来る。

メルマガや定期処理を「cron」で行う際に使用した。

コマンドで作成可能

Bash
bin/console make:command

Form

本体パス:src/Eccube/Form/

カスタマイズパス:app/Customize/Form/

Fromクラスは、基本的にExtensionとTypeの2種類使用する

Extension既存のFromクラスの拡張で使用する。

既存の必須解除上書きやオプション追加や追加した項目のForm定義も可能

Type項目単体で定義しFormクラスで読み込んで使用する。

Service

本体パス:/src/Eccube/Service/

カスタマイズパス:app/Customize/Service/

サービスクラスの作成やデフォルトの拡張やプラグインのサービスの拡張も可能

app/config/eccube/services.yamlへ追加すれば拡張も可能

YAML
    Customize\Service\新規クラス名:
        decorates: 継承するクラスのパス
YAML
    Customize\Service\RegularOrderServiceCustomizer:
        decorates: Plugin\SlnRegular4\Service\RegularOrderService

・拡張したいサービスのファイルをCustomize/Service/配下へコピー

・namespaceを変更

・useへ拡張元のファイルパス

・extensへ拡張クラス名

※decoratesするとsrcのService処理を通らなくなる為、プラグインとの競合が発生する可能性あり

データベースへ項目追加

下記2種類の方法があるみたいですね。
今回は1の方法で行っていきます。

1.Entityクラスに項目を追加しコマンドでデータベースに反映する方法

2.Entityをテーブルから逆再生する方法
https://qiita.com/haruna-nagayoshi/items/27108c75eaf9511f3524

今回は「商品情報」へ「項目の追加」をしていきたいと思います。

エンティティの拡張

商品エンティティの拡張をしていきます。

商品エンティティを拡張するので「ProductTrait.php」を作成する。

商品マスタ:dtb_product
商品エンティティ:/src/Eccube/Entity/Product
ProductTraitの作成する場所:/app/Customize/Entity/ProductTrait.php

PHP
<?php
namespace Customize\Entity;
 
use Doctrine\ORM\Mapping as ORM;
use Eccube\Annotation as Eccube;
 
/**
 * @Eccube\EntityExtension("Eccube\Entity\Product")
 */
trait ProductTrait
{
    /**
     * @var string|null
     *
     * @ORM\Column(name="product_symbol", type="string", length=45, nullable=true, options={"comment":"商品記号"})
     */
    public $product_symbol;

    /**
     * @var string|null
     *
     * @ORM\Column(name="packing_cost", type="decimal", precision=12, scale=2, nullable=true, options={"comment":"梱包料金"})
     */
    public $packing_cost;
}

コメントは入れるだけでもデータ構成の理解が早くなるのでなるべく書く٩(•̤̀ᵕ•̤́๑)

Proxyクラスの生成

Bash
cd プロジェクト配下
php bin/console eccube:generate:proxies
gen -> /Users/xxxxx/project/ec-cube/app/proxy/entity/src/Eccube/Entity/Product.php

ファイル変更後はキャッシュをクリア

Bash
bin/console cache:clear --no-warmup 

実行するSQLの確認

Bash
php bin/console doctrine:schema:update --dump-sql

エラー!!!

In AbstractMySQLDriver.php line 93:
 An exception occurred in driver: SQLSTATE[HY000] [2002] php_network_getaddresses: getaddrinfo failed: nodename nor servname provided, or not known 

めちゃくちゃハマりましたο(´・ω・`o)

こちらの記事の原因と対応に感謝します─=≡Σ((( つ•̀ω•́)つ

Docker + Laravel で躓いていた点 - Qiita
Laravel を触ってみよう、ということで Mac 上の Docker に入れてみようとしましたが、躓いた点があったためメモ。Laravel は初めてですし、Docker もちょっと触った程度な…

原因はDockerの知識が少ないところにありました。

macのターミナルでコマンド叩いてました。

EC-CUBE起動しているコンテナにログインしてコマンドを叩けば解決٩(•̤̀ᵕ•̤́๑)ᵒᵏᵎᵎᵎᵎ

と思いましたが変更が反映されずダメでした。

[OK] Nothing to update - your database is already in sync with the current entity metadata.

結局先ほどコマンドで作成したProxyへ「カラムの定義」を追加
場所:ec-cube/app/proxy/entity/src/Eccube/Entity/Product.php

// キャッシュクリア
bin/console cache:clear --no-warmup
// テーブルとの差分で実行するSQL確認
php bin/console doctrine:schema:update --dump-sql
// 結果↓
The following SQL statements will be executed:
「実行するSQL」
// テーブルとの差分でSQLを実行する
bin/console doctrine:schema:update --dump-sql --force
//結果
「実行したSQL」
[OK] Database schema updated successfully!

Entityの更新が反映されない

Entityの修正した時に発生した◟꒰◍´Д‵◍꒱◞

キャッシュクリアすれば出来るって記事はあったけど関係なかった、、、

bin/console cache:clear --no-warmup

composerで依存関係が管理されていてそれを更新すれば、エラーを解消できた!!

EC-CUBE起動しているコンテナにログインしてコマンドを叩けば解決٩(•̤̀ᵕ•̤́๑)ᵒᵏᵎᵎᵎᵎ

composer install

以上─=≡Σ((( つ•̀ω•́)つ

Dockerのコンテナにログインする方法

Dockerの下記画面で、黄色の枠のCLIを押せばコンテナへログインしたコマンドラインが起動します。

エンティティの作成

新規テーブル追加

app/config/eccube/pakages/devへ

maker.yamlファイルの追加

下記内容で保存

maker:
  root_namespace: 'Customize'

あとはターミナルのコマンドで解決
対話形式で作成していく

エンティティ作成コマンド

bin/console make:entity

コントローラー作成コマンド

bin/console make:controller

実行クエリ確認

どんなSQLを投げたのか確認したい事ありますよね!

dump($qb->getQuery()->getSQL());
exit;

こんな感じで確認できます٩(•̤̀ᵕ•̤́๑)ᵒᵏᵎᵎᵎᵎ

商品登録画面

追加項目への必須が機能しない

いろいろ調べたら、required属性が機能していなかった。

formタグに「novalidate」検証無効の設定がされていた、、、

アノテーションの自動生成で実装していたので「Assert\NotBlank()」を追加し解決

商品の非公開設定

商品データ関連を入れた際に確認した情報

商品「dtb_product:product_status_id」で非公開が可能

結論を言うと「dtb_product:product_status_id=2」

product_status_id 1:公開, 2:非公開 3:廃止

ただ、関連テーブルに非表示がある「dtb_class_category・dtb_product_class」「visible」、、、

情報も非表示にした方が良いのか?

dtb_productと関連した情報を持っていた場合は、管理画面の商品検索でエラーになります。

商品一覧の検索にヒットしないなど、余計な事になるのでやらない方が良いです。

コメント

タイトルとURLをコピーしました