メモ > 技術 > CMS: ECCube > カスタマイズ: 商品情報に項目を追加
カスタマイズ: 商品情報に項目を追加
※プラグインで対応する、という手段も検討する
むしろ独自に項目を追加すると、CSVエクスポートなど他機能と連携するための処理も考慮する必要があってややこしい
原則独自に追加しようとせずに、素直にプラグインに頼るのが良さそう
EC-CUBEシリーズ!「独自項目追加カスタマイズ」 #PHP - Qiita
https://qiita.com/espritfort_tech/items/1729c93b300120be8885
以下は前述の「カスタマイズ: 会員情報に項目を追加」の内容をもとにした、「おすすめポイント」の項目を追加する手順
注意点についても、前述の内容を確認しておくこと
■Entityを作成
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
{
/**
* @var string|null
* @ORM\Column(type="text", nullable=true)
* @Eccube\Annotation\FormAppend(
* auto_render=false,
* type="\Symfony\Component\Form\Extension\Core\Type\TextareaType",
* options={
* "required": false,
* "label": "おすすめポイント",
* "attr": {"placeholder": "例:この商品は…", "rows": 5}
* })
*/
private $recommend_text;
/**
* @return string|null
*/
public function getRecommendText()
{
return $this->recommend_text;
}
/**
* @param string|null $recommend_text
* @return ProductTrait
*/
public function setRecommendText($recommend_text)
{
$this->recommend_text = $recommend_text;
return $this;
}
}
作業したらキャッシュを削除する
$ php bin/console cache:clear --no-warmup
プロキシファイルを作成する
$ php bin/console eccube:generate:proxies
以下に、トレイトを認識させるためのプロキシファイルが作成される
app\proxy\entity\src\Eccube\Entity\Product.php
■テーブル定義を変更
$ php bin/console cache:clear --no-warmup
$ php bin/console doctrine:migrations:diff
Generated new migration class to "/var/www/html/app/DoctrineMigrations/Version20240902044809.php" from schema differences.
以下のファイルが作成される
app\DoctrineMigrations\Version20240902044809.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 Version20240902044809 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_product ADD recommend_text LONGTEXT 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_product DROP recommend_text');
}
}
マイグレーションを実行すると、テーブルに項目が追加される
$ php bin/console doctrine:migrations:status
$ php bin/console doctrine:migrations:migrate
■画面表示を調整
src\Eccube\Resource\template\admin\Product\product.twig
を複製して
app\template\admin\Product\product.twig
を作成し、以下を追加する
<div class="collapse show ec-cardCollapse" id="recommendText">
<div class="card-body">
<div class="row">
<div class="col-3">
<span>{{ 'admin.common.recommend_text'|trans }}</span>
</div>
<div class="col-9">
<div>
{{ form_widget(form.recommend_text, {id: 'wysiwyg-area', attr : { rows : "8"} }) }}
{{ form_errors(form.recommend_text) }}
</div>
</div>
</div>
</div>
</div>
src\Eccube\Resource\template\default\Product\detail.twig
を複製して
app\template\default\Product\detail.twig
を作成し、以下を追加する
{% if Product.recommendText %}
<div class="ec-productRole__recommendText">
{{ include(template_from_string(Product.recommendText)) }}
</div>
{% endif %}
■リソースファイルを調整
ラベルを正しく表示させるに、以下のリソースファイルに文言を追加する
app\Customize\Resource\locale\messages.ja.yaml
common.recommend_text: おすすめポイント
admin.common.recommend_text: おすすめポイント
app\Customize\Resource\locale\messages.en.yaml
common.recommend_text: Recommendation Points
admin.common.recommend_text: Recommendation Points
■キャッシュをクリア
最後に、キャッシュをクリアしておく
$ php bin/console cache:clear --no-warmup
これで商品におすすめポイント欄が追加される
■CSVダウンロードに反映
商品に「おすすめポイント」の項目を追加したが、何もしなければ「商品一覧」の「CSVダウンロード」には反映されない
以下のページをもとに、この項目をCSVに出力する
EC-CUBE4でCSV出力項目をカスタマイズする方法 |株式会社サイバースペース|愛媛県松山市のWeb制作・ホームページ制作・システム会社
https://cyberspace-jp.com/2023/1664/
以下のコマンドでマイグレーションを作成する
$ php bin/console doctrine:migrations:generate
以下のようにマイグレーションを調整する
public function up(Schema $schema) : void
{
// this up() migration is auto-generated, please modify it to your needs
$this->addSql("INSERT INTO dtb_csv (csv_type_id, creator_id, entity_name, field_name, reference_field_name, disp_name, sort_no, enabled, create_date, update_date, discriminator_type) VALUES (1, null, ?, 'recommend_text', null, 'おすすめポイント', 31, false, CURRENT_TIMESTAMP, CURRENT_TIMESTAMP,'csv')", ['Eccube\\\\Entity\\\\Product']);
}
以下のとおりマイグレーションを実行する
$ php bin/console doctrine:migrations:status
$ php bin/console doctrine:migrations:migrate
この時点では、まだCSVには反映されていない
管理画面「設定 → 店舗設定 → CSV出力項目設定 → 商品CSV」を確認する
「出力しない項目」に「おすすめポイント」が追加されているので、「出力する項目」に追加する。必要に応じて並び順も調整する
これで「おすすめポイント」の項目がCSVに出力される
■管理画面での検索に反映
商品に「おすすめポイント」の項目を追加したが、何もしなければ「商品一覧」の検索には反映されない
以下の手順で検索機能を追加できる
app/Customize/Form/Extension/SearchProductExtension.php
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
<?php
namespace Customize\Form\Extension;
use Eccube\Form\Type\Admin\SearchProductType;
use Symfony\Component\Form\AbstractTypeExtension;
use Symfony\Component\Form\FormBuilderInterface;
use Symfony\Component\Form\Extension\Core\Type\TextType;
class SearchProductExtension extends AbstractTypeExtension
{
public function buildForm(FormBuilderInterface $builder, array $options)
{
$builder
->add('recommend_text', TextType::class, [
'required' => false,
'label' => 'おすすめポイント',
'attr' => [
'placeholder' => 'おすすめポイントを入力',
],
]);
}
public function getExtendedType()
{
return SearchProductType::class;
}
}
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
app/Customize/Repository/AdminProductListWhereCustomizer.php
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
<?php
namespace Customize\Repository;
use Eccube\Doctrine\Query\JoinClause;
use Eccube\Doctrine\Query\WhereClause;
use Eccube\Doctrine\Query\WhereCustomizer;
use Eccube\Repository\QueryKey;
class AdminProductListWhereCustomizer extends WhereCustomizer
{
/**
* 検索条件を追加する
*
* @param array $params
* @param $queryKey
* @return JoinClause[]
*/
public function createStatements($params, $queryKey)
{
if (empty($params['recommend_text'])) {
return [];
} else {
return [WhereClause::like('p.recommend_text', ':recommend_text', ['recommend_text' => '%' . $params['recommend_text'] . '%'])];
}
}
/**
* @return string
* @see \Eccube\Repository\ProductRepository::getQueryBuilderBySearchDataForAdmin()
* @see QueryKey
*/
public function getQueryKey()
{
// 管理画面の商品一覧をカスタマイズする
return QueryKey::PRODUCT_SEARCH_ADMIN;
}
}
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
src/Eccube/Resource/template/admin/Product/index.twig を複製して app/template/admin/Product/index.twig を作成し、以下のとおり検索フォームに項目を追加する
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
<div class="mb-2">
<label class="col-form-label" data-tooltip="true" data-placement="top" title="{{ 'admin.common.recommend_text'|trans }}">{{ 'admin.common.recommend_text'|trans }}<i class="fa fa-question-circle fa-lg ml-1"></i></label>
{{ form_widget(searchForm.recommend_text) }}
{{ form_errors(searchForm.recommend_text) }}
</div>
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
これで管理画面の商品一覧に、「おすすめポイント」の検索項目が追加される
■メモ
以下も参考になりそう
【EC-CUBE4】商品項目を無限に追加できる機能を実装する方法 - あずみ.net
https://a-zumi.net/eccube4-add-product-item/