バージョン:EC-CUBE4.0
いろいろ調べていて時間がかかったのでメモします
カスタマイズ
EC-CUBE本体がsrc配下にあります。
本体パス:参考になるソースがあるので確認して下さいって感じです。
- データ項目追加「Entity」
- サービス「Service」
- バリデーション「Form」
- 表示「Twig」
既存機能のカスタマイズは、基本的にControllerの修正なしで行える。
テンプレートは本体をコピー
本体パス:src/Eccube/Resource/template/
カスタマイズパス:app/template/
本体からカスタマイズへコピーする。
あとは、app/template/配下のファイルをカスタマイズするだけです。
Controller
本体パス:/src/Eccube/Controller/
カスタマイズパス:app/Customize/Controller/
カスタマイズパスへコントローラーの作成
既存のパスを上書きしたい場合は、アノテーションで指定すれば良いらしい
/**
* @Method("GET")
* @Route("/test")
*/
public function index(){
}
Entity
本体パス:src/Eccube/Entity/
カスタマイズパス:app/Customize/Entity/
コマンドで作成可能
テーブルのカラム定義とgetter,setterも作ってくれる。
拡張する場合は「trait」
※プラグインのEntityをTraitしてCustomizeで定義するのは、やめた方が良い。
スキーマ更新時にエラーが発生する可能性があるのでプラグイン内でTraitする
bin/console make:entity
Repository
本体パス:src/Eccube/Repository/
カスタマイズパス:app/Customize/Repository/
Entityをコマンドで作成したら、合わせて作成してくれる。
bin/console make:entity
Command
本体パス:src/Eccube/Command/
カスタマイズパス:app/Customize/Command/
bin/consoleコマンドが作成出来る。
メルマガや定期処理を「cron」で行う際に使用した。
コマンドで作成可能
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へ追加すれば拡張も可能
Customize\Service\新規クラス名:
decorates: 継承するクラスのパス
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
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クラスの生成
cd プロジェクト配下
php bin/console eccube:generate:proxies
gen -> /Users/xxxxx/project/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
エラー!!!
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の知識が少ないところにありました。
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と関連した情報を持っていた場合は、管理画面の商品検索でエラーになります。
商品一覧の検索にヒットしないなど、余計な事になるのでやらない方が良いです。
コメント