blogスタッフブログ
HOME > スタッフブログ > CMS >EC-CUBE 4.0に触れてみて

EC-CUBE 4.0に触れてみて

お客様のご要望を実現するためにEC-CUBEを採用することになった案件があり、私も初めてEC-CUBE 4.0を触りました。EC-CUBEは6〜7年前頃に2.12.xを触って以来ですのでかなり久しぶりです。

EC-CUBE 4ではEC-CUBE 3で採用されたPHPマイクロフレームワーク「Silex」が開発終了となり、PHPフレームワーク「Symfony 3.4」ベースとなっています。そのことから「Symfonyを覚えるのは敷居がかなり高そうだな…」という印象を持っていました。しかし典型的なMVCフレームワークであり、「EC-CUBE 4.0 開発者向けドキュメント」を参照しつつ展開したEC-CUBEのパッケージを眺めていると、お問い合わせ画面をカスタマイズするにはsrc/Eccube/Controller/ContactController.phpから見て行けばいいのだなというのがすぐ分かりました。公式サイトにある「機能カスタマイズがより簡単に」というのもうなずけます。

お問い合わせフォームに添付ファイル欄を付けてみる

お問い合わせフォームに添付ファイルを付けて欲しいというご要望があり調査をしてみました。

フォーム項目を増やすには「FormTypeのカスタマイズ」に沿ってコードを書きます。お問い合わせフォームなので拡張するフォームの種類はContactType::classとなります。ちなみにContactTypeはsrc/Eccube/Form/Type/Front/ContactType.phpで定義されています。この辺りがパッとつながり、useで書けるようになるとカスタマイズがしやすいのではないかと思います。

ファイルを送信するフィールドはSymfonyのFileType Fieldです。たったこれだけのコードでフォームに添付ファイル欄が表示できます。(Twigテンプレートも編集する必要がありますが、他のフィールドをコピーして少し書き換えるだけです。)

<?php
namespace Customize\Form\Extension;

use Eccube\Form\Type\Front\ContactType;
use Symfony\Component\Form\AbstractTypeExtension;
use Symfony\Component\Form\Extension\Core\Type\FileType;
use Symfony\Component\Form\FormBuilderInterface;

class LABContactTypeExtension extends AbstractTypeExtension
{
    /**
     * {@inheritdoc}
     */
    public function buildForm(FormBuilderInterface $builder, array $options)
    {
        $builder
            ->add('attachment', FileType::class);
    }

    /**
     * {@inheritdoc}
     */
    public function getExtendedType()
    {
        return ContactType::class;
    }
}

ファイルを添付してPOSTされた後の処理をどうするかですが、これはsrc/Eccube/Controller/ContactController.phpをコピーしてapp/Customize/Controller/LABContactController.phpを作成しindexメソッドを書き換えました。具体的には確認画面を表示する時に送信されたファイルをサーバー上に置く、フォームの送信が完了した時にメール送信を行うメソッドにファイルのパスを通知して添付する、というカスタマイズでした。EC-CUBEの知識は一切関係なく、純粋にPHPが理解できているか、Symfonyが理解できているか、が問われたように思います。

アップロードされたファイルのハンドリングはSymfonyのドキュメント「How to Upload Files」で詳しく解説されています。メールにファイルを添付するのは以下のような3行のコードです。Swift Mailerが採用されているのでとても簡単です。

if ($attachmentFilePath) {
    $message->attach(\Swift_Attachment::fromPath($attachmentFilePath));
}

カスタマイズしたコードがapp/に収まるのが好印象

EC-CUBE 4ではカスタマイズしたコードを全てapp/に収める仕様になっています。コントローラであればapp/Customize/Controller/に入れておけば自動で読み込まれます。また、翻訳を追加したければapp/Resource/locale/messages.ja.yamlを用意し、app/config/eccube/packages/translation.yamlに翻訳ファイルのパスを追加するだけです。EC-CUBE 2の頃はコアファイルを直接編集してアップデートが大変だった思い出があり、この辺りはすごく良いなと感じました。

余談ですが、bin/console server:run(bin/console server:start)で開発サーバーが立ち上がるのもとても便利です。

まとめ

EC-CUBE 4を触る前は情報(Tips)も少なく心配でしたが、PHPやSymfonyの知識があれば特に情報はいらないのだ、と感じるようになりました。(決済プラグインを作る、となるとまた少し違うとは思います。)Google検索で情報を見つけ、そのページのコードを貼り付けて「動いた!」となることが多いこの頃ですが、しっかりとした基礎知識を身につけ、そのコードがどういう意味なのかを的確に理解することがとても重要だなとEC-CUBE 4に触れて改めて感じることができました。また、SymfonyのようなMVCフレームワークを操る楽しさも感じることができました。