昨日ECCUBE4のインストールはできたので、今日はカスタマイズの実践をしてみたいと思います
実際の案件でよくある、商品情報に項目を追加したい!をやってみます
Entityのカスタマイズ
ECCUBE3となにより違うのは、app/Customizeというディレクトリがあること
ECCUBE3ではカスタマイズ用のベースプラグインを作ったりしてたけどそれが要らなくなったんですね
開発ドキュメントをそのままなぞる形で商品情報にメーカー名を入れるカスタマイズをします。
app/Customize/Entity/ProductTrait.php
<?php namespace Customize\Entity; use Doctrine\ORM\Mapping as ORM; use Eccube\Annotation\EntityExtension; /** * @EntityExtension("Eccube\Entity\Product") */ trait ProductTrait { /** * @ORM\Column(type="string", length=255, nullable=true) * @Eccube\Annotation\FormAppend( * auto_render=false, * type="\Symfony\Component\Form\Extension\Core\Type\TextType", * options={ * "required": false, * "label": "メーカー名" * }) */ public $maker_name; }
Entityを作ったらそこからProxyクラスを生成します
Proxy…ECCUBE3にはなかった用語ですね
$ bin/console eccube:generate:proxies gen -> /opt/bitnami/apps/ec-cube/app/proxy/entity/Product.php
出来上がった app/proxy/entity/Product.php を見るとECCUBE3時代のEntityファイルのような内容
EC4のEntity ≒ EC3のdoctrine/*dcm.yml
EC4のProxy ≒ EC3のEntity
みたいな理解でいいのかな
Proxyができたらそれをデータベースに反映させます
$ bin/console doctrine:schema:update --dump-sql --force
テンプレートをカスタマイズ
さきほど作ったEntityに@Eccube\Annotation\FormAppendを記述したのでこれでもうフォームを使う準備は整っています
あとは管理画面の商品管理画面にメーカー名の項目を追加するよう、カスタマイズtwigを作成します
src/Eccube/Resource/template/admin/Product/product.twig
をそのまま以下にコピーして
app/template/admin/Product/product.twig
商品説明と販売価格(これはproduct_classがないときだけ出てくる項目)の間にメーカー名フォームを記述
~~ 前略 ~~ {{ form_widget(form.description_list, { attr : { rows : "4"} }) }} {{ form_errors(form.description_list) }} </div> </div> </div> </div> {# maker_nameフォーム #} <div class="row"> <div class="col-3"> <div class="d-inline-block"> <span>{{ form.maker_name.vars.label|trans }}</span> </div> </div> <div class="col mb-2"> {{ form_widget(form.maker_name) }} {{ form_errors(form.maker_name) }} </div> </div> {% if has_class == false %} <div class="row"> <div class="col-3"> <div class="d-inline-block"> <span>{{ 'admin.product.sale_price'|trans }}</span> ~~ 後略 ~~
以上で商品情報にメーカー名が追加できました!
コマンドができなければ、別の方法がありますか?