#はじめまして
qiitaの投稿をはじめました。普段は関西のweb系の会社でインターンをしています。phpとjqueryを中心にバックエンド開発をしており、laravel, wordpress, eccubeを使って開発をしています。今日はeccubeのデータベースを拡張して商品やカテゴリの内容を追加(例えば各商品にpdfファイルを追加したいとか)にはどうすればよいかを書いていきたいと思います。最近けっこうeccube4をさわっているので当分それ系の記事が多くなるかもしてませんね。また、自分自身の備忘録もかねています。
#テーブルの拡張
eccube4 はご存知の方もおおいと思いますが、symfonyが使われていますので、symfonyに則ってやることを考えるのが一番いいと思います。
###traitを作成する
たとえば、Eccube/Entity/Product.php(dtb_product テーブル)を拡張したいとき、基本的には /app/Customize/Entityの配下にProductTrait.phpファイルを作成し、そこに追加したい項目を書くのがよいでしょう。
<?php
namespace Customize\Entity;
use Doctrine\ORM\Mapping as ORM;
use Eccube\Annotation\EntityExtension;
use Symfony\Component\Validator\Constraints as Assert;
/**
* @EntityExtension("Eccube\Entity\Product")
*/
trait ProductTrait
{
/**
* @ORM\Column(type="string", length=100, nullable=true)
*/
private $paperPdf;
/**
* @return string|null
*/
/**
* @return \String
*/
public function getPaperPdf()
{
return $this->paperPdf;
}
/**
* @param string
* @return Eccube\Entity\Product
*/
public function setPaperPdf($paperPdf)
{
$this->paperPdf = $paperPdf;
return $this;
}
}
###作ったtraitファイルを元にテーブルを拡張する
ます、symfonyに、さきほど作ったProductTrait.phpを認識させることからはじめます。
$ php bin/console cache:clear --no-warmup
$ php bin/console eccube:generate:proxies
やっていることは上の行でキャッシュを消して、次でproxyを作成してsymfonyがこのファイルも認識して読み込むようにしています。キャッシュを消さないとほぼTraitを認識してくれません。
$ php bin/console doctrine:schema:update --dump-sql
$ php bin/console doctrine:schema:update --force
上の--dump-sqlのコマンドをうつとsql文が吐かれるので、ここで自分が意図したsqlになっているかどうかを確認してください。(ここではまだマイグレーションはされていない) つぎの--forceでテーブルが拡張されます。
#管理画面で入力できるようにしたい!
テーブルを拡張したけど、管理画面から閲覧したり登録できてほしいというときは SymfonyのFormTypeを使います。formTypeは /src/Eccube/Form/Typeの中にたくさん入っています。管理画面のformtypeはその配下のAdminフォルダに入っています。
<?php
use Symfony\Component\Form\Extension\Core\Type\TextType;
/**
* 省略
*/
class ProductType extends AbstractType
{
/**
* @var CategoryRepository
*/
protected $categoryRepository;
public function buildForm(FormBuilderInterface $builder, array $options)
{
$builder
/**
* 省略
* 下を追加
*/
->add('paper_pdf', TextType::class, [
'required' => false,
])
/**
* 省略
*/
}
最後に管理画面のtwigファイルに {{ form.paper_pdf }}を追加する
{{ form_widget(form.paper_pdf) }}
{{ form_errors(form.paper_pdf) }}
#最後に
これを読んだほとんどの人が formtypeのpaper_pdfとentityの$paperPdfがどうやって関連づけられているのかと思うかもしれませんが、僕もまだあまりわかっていません。また追々勉強していきたいと思います。