EC-CUBEシリーズ！「独自項目追加カスタマイズ」

![ec_cube_additem.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2633992/0fa3e580-186c-bcfd-ee78-c9cfa5c89498.jpeg)

エスプリフォートでは、ECによる請負開発やプロダクト（自社サービス）開発を長く行ってきました。
そしてECサイトを構築する際には、お客様の業種・業態やお客様独自の管理法などにあわせて運用・管理できるようにするために、管理項目を増やしたり、商品情報を増やすようなことはアドオン開発では当たり前にあります。

ECサイトを構築する際の一つの選択肢として、エスプリフォートが長年扱ってきましたEC-CUBEで、管理項目を増やしたり、商品情報を増やす方法をご紹介していきます。

## １、画面の追加項目を作成
管理画面の商品登録画面に項目を追加してみます。
「/app/Customize/Form/Extension/Admin」ディレクトリに「ProductTypeExtension.php」というファイルを作成します。

```php
namespace Customize\Form\Extension\Admin;

use Eccube\Form\Type\Admin\ProductType;
use Symfony\Component\Form\AbstractTypeExtension;
use Symfony\Component\Form\Extension\Core\Type\TextType;
use Symfony\Component\Form\Extension\Core\Type\IntegerType;
use Symfony\Component\Form\FormBuilderInterface;

class ProductTypeExtension extends AbstractTypeExtension {
  public function getExtendedType() {
    return ProductType::class;
  }

  public function buildForm(FormBuilderInterface $builder, array $options) {
    $builder->add('special_sort_no', TextType::class, [
      'required' => false
    ]);
    $builder->add('special_comment', TextType::class, [
      'required' => false
    ]);
  }
}
```
※その他のフォームタイプは「[Form Types Reference](https://symfony.com/doc/current/reference/forms/types.html "Form Types Reference")」を参照ください。

## ２、テーブルの追加項目を作成
「/app/Customize/Entity/ProductTrait.php」を作成します。
「special_sort_no」はint型で整数のみ（unsigned）とし、nullを許容する。
「special_comment」はstring型でnullを許容する。

```php
<?php
namespace Customize\Entity;
use Eccube\Annotation\EntityExtension;
use Eccube\Entity\Product;

/**
 * @EntityExtension("Eccube\Entity\Product")
 */
trait ProductTrait {

  /**
   * @var string
   *
   * @ORM\Column(name="parts_new_sort_no", type="integer", nullable=true, options={"unsigned":true})
   */
  private $special_sort_no;

  /**
   * @var string
   *
   * @ORM\Column(name="special_comment", type="string", nullable=true)
   */
  private $special_comment;

  /**
   * Set special_sort_no.
   *
   * @param integer|null $special_sort_no
   *
   * @return Product
   */
  public function setSpecialSortNo($special_sort_no) {
    $this->special_sort_no = $special_sort_no;
    return $this;
  }

  /**
   * Get special_sort_no.
   *
   * @return integer
   */
  public function getSpecialSortNo() {
    return $this->special_sort_no;
  }

  /**
   * Set special_comment.
   *
   * @param string|null $special_comment
   *
   * @return Product
   */
  public function setSpecialComment($special_comment) {
    $this->special_comment = $special_comment;
    return $this;
  }

  /**
   * Get special_comment.
   *
   * @return string
   */
  public function getSpecialComment() {
    return $this->special_comment;
  }
}
```

## ３、コマンドでproxyファイルを作成し、DBに「ProductTrait」で指定した項目を追加
サーバーにSSHで接続して、EC-CUBEのインストールディレクトリまでcdコマンドで移動します。

```console
cd /var/www/public_html/[EC-CUBEインストールディレクトリ]
```
移動後、下記コマンドを実行し、「/app/proxy/entity/src/Eccube/Entity/Product.php」が作成します。
```console
php bin/console eccube:generate:proxies
```
次に、EC-CUBEのキャッシュをクリアします。
```console
/usr/bin/php bin/console cache:clear --no-warmup
```
最後に、下記コマンドを実行してデータベースに列を追加します。
```console
/usr/bin/php bin/console doctrine:schema:update --dump-sql --force
```

## ４、ビューに画面に追加する項目を追加

「/src/Eccube/Resource/template/admin/Product/product.twig」に画面に追加する項目を追加します。

```html
<div class="row">
    <div class="col-3">
        <div class="d-inline-block" data-tooltip="true" data-placement="top" title="{{ 'tooltip.admin.product.special_sort_no'|trans }}">
            <span>{{ 'admin.product.special_sort_no'|trans }}</span>
            <i class="fa fa-question-circle fa-lg ml-1"></i>
        </div>
    </div>
    <div class="col mb-2">
        <div>
            {{ form_widget(form.special_sort_no) }}
            {{ form_errors(form.special_sort_no) }}
        </div>
    </div>
</div>
<div class="row">
    <div class="col-3">
        <div class="d-inline-block" data-tooltip="true" data-placement="top" title="{{ 'tooltip.admin.product.special_comment'|trans }}">
            <span>{{ 'admin.product.special_comment'|trans }}</span>
            <i class="fa fa-question-circle fa-lg ml-1"></i>
        </div>
    </div>
    <div class="col mb-2">
        <div>
            {{ form_widget(form.special_comment) }}
            {{ form_errors(form.special_comment) }}
        </div>
    </div>
</div>
```

## ５、画面に表示する固定文言を追加
「/app/Customize/Resource/locale/Eccube/messages.ja.yaml」に画面で利用する固定文言を追加します。

```
admin.product.special_sort_no: スペシャル商品の並び順
admin.product.special_comment: スペシャル商品用のコメント

tooltip.admin.product.special_sort_no: スペシャル商品の並び順を指定します。
tooltip.admin.product.special_comment: スペシャル商品用のコメントを設定します。
```

## 最後に
アドオン開発において、お客様の業種・業態やお客様独自の管理法などにあわせて運用・管理できるようにするために、管理項目を増やしたり、商品情報を増やすようなことはアドオン開発では当たり前にありますので、覚えておいて損はないかと思います。

https://www.esprit-fort.co.jp/


https://www.esprit-fort.co.jp/recruit/