#初めに
EC-CUBEのカスタマイズをするには、カスタマイズ無しのEC-CUBEの基本的な動作を把握する事が必要と、初心者が知っておいた方が良い事の記事に書きました。
このページをカスタマイズしたいとなった時、どのような処理がされているのか、本体ソースを読む力が必要になってきます。
会員情報に項目を追加したいといった場合、どのENTITYファイルを、どのFORMファイルを拡張すれば良いのか分からなければ、カスタマイズ出来ないです。
この記事では、ページURLからどんなファイルが使われているのか、その探し方について書いています。
※こんな簡単な方法があるよ等、他に良い方法があればコメント下さい。僕と、この記事を読んでくれた方が成長できます。
#URLからController内の処理(関数)を見つけ出す。
まずは、目的のページで、どのControllerのどの関数が利用されているのか調べます。
Controllerから、その他のファイルを利用して、様々な処理が実行されるので、Controllerを軸にソースを読んでいきます。
Controllerには@Route
でURLが設定されてますので、そこを見つけることができれば、目的のページのControllerにたどり着けます。
とはいえ、ファイルが多すぎて探せないよってなるのですが、フォルダ構成やファイル名からでもある程度推測できるので、URLからControllerのフォルダ・ファイルを絞り込み、@Route
から利用されている関数を見つける事ができます。
本体ソースのControllerはsrc/Eccube/Controller
のフォルダになります。
###フロント画面のController
####TOPページのControllerを探してみる。
src/Eccube/Controller
内のファイル名を見てみます。
すると、TopController.php
というファイルがあります。
その中を見ると、public function index()
があり、@Route("/", name="homepage")
が設定されています。
TOPページのURLはhttps://exsample.com/
なので、後ろに続く文字がありません。なので@Route
は「/」になってます。
nameの部分はルート名であり、使い方はテンプレート内で{{ url('homepage') }}
とすれば、TOPページのURLが表示されます。
テンプレート以外でも使う事があるのでが、それはまた別の機会に。
####商品一覧ページのControllerを探してみる。
商品一覧ページのURLはhttps://exsample.com/products/list
になります。
src/Eccube/Controller
内のファイル名を見てみると、URLのproductsに近いProductController.php
というファイルがあります。
その中には@Route("/products/list", name="product_list")
がありURLの/products/list
と一緒の部分があります。
その関数public function index(Request $request, Paginator $paginator)
が商品一覧の処理になります。
####マイページのControllerを探してみる。
マイページのURLはhttps://exsample.com/mypage
になります。
src/Eccube/Controller
内のファイル名を見ても、それっぽいControllerファイルはありません。
しかし、src/Eccube/Controller/Mypage
というフォルダがあり、その中にいくつかControllerファイルがあります。
それらのファイルが、マイページのControllerになります。
####src/Eccube/Controller内のフォルダ
Mypageの他にも、Admin
Block
Install
のフォルダがあります。
それぞれ簡単に説明すると以下の通りです。
- Adminは管理画面。
- Blockは管理画面→コンテンツ管理→ブロック管理で管理されてるブロック
- InstallはEC-CUBE本体のインストール画面
どうですか?フロント画面のURLからControllerと関数を探せそうですか?
次は管理画面のControllerの探し方になります。
###管理画面のController
管理画面のControllerはsrc/Eccube/Controller/Admin
のフォルダ内になります。
管理画面URLはhttps://exsample.com/××××/
になり、××××はインストール時に設定した管理画面のディレクトリ名になります。
@Route
には、/%eccube_admin_route%/
があり、この部分が管理画面のディレクトリ名に対応します。
管理画面もフロント画面と同様の方法でControllerを探すことができます。
####src/Eccube/Controller/Admin内のフォルダ
src/Eccube/Controller/Admin
内にあるフォルダに対応する管理画面メニュー
- Content コンテンツ管理
- Customer 会員管理
- Order 受注管理
- Product 商品管理
- Setting 設定
- ┣Shop 店舗設定
- ┗System システム設定
- Store オーナーズストア
####管理画面・商品一覧ページのControllerを探してみる。
管理画面の商品管理、商品一覧ページのURLはhttps://exsample.com/××××/product
になります。
src/Eccube/Controller/Admin/Product
内を見てみるとProductController
というファイルがあります。
その中に、@Route("/%eccube_admin_route%/product", name="admin_product")
があり、URLの××××/product
と一緒の部分がありますね。
もう一つ@Route("/%eccube_admin_route%/product/page/{page_no}", requirements={"page_no" = "\d+"}, name="admin_product_page")
が設定されてますが、こちらは2ページ目以降のURLに対応しています。
商品一覧は商品数が増えれば2ページ、3ページとページング処理されます。
2ページ目のURLはhttps://exsample.com/××××/product/page/2
になり、@Route("/%eccube_admin_route%/product/page/{page_no}"
と比較すると同じ形ですね。
page_no
はページ数になり、ページ数によって数値が変動します。requirements
でその値を正規表現でパターンマッチします。
####管理画面・会員登録ページのControllerを探してみる。
管理画面の会員管理、会員登録ページのURLはhttps://exsample.com/××××/customer/new
になります。
src/Eccube/Controller/Admin/Customer
内を見てみるとCustomerController
というファイルがあります。
その中を見るとcustomer/new
に一致する@Route
が見つかりません。
別のCustomerEditController
というファイルを見てみましょう。
すると、@Route("/%eccube_admin_route%/customer/new", name="admin_customer_new")
があり、URLの××××/product
と一緒の部分があります
もう一つ@Route("/%eccube_admin_route%/customer/{id}/edit", requirements={"id" = "\d+"}, name="admin_customer_edit")
があり、こちらは編集する時のURLになります。
編集と登録は同じ関数を使っている事が多いので、編集ページを探すときは登録ページを探してみても良いかもですね。
#Controllerで使われている他のファイルを探してみる。
例として、フロント画面のお問合せを見てみます。
FORMが使われているし、問い合わせ完了時にメールが送信されているので例題にはいいかなと思いました。
(ここではControllerのソース解説はしないです。)
お問合せはFORM入力画面
入力内容確認画面
完了画面
になります。
それでは、お問合せ画面のControllerを探して中を見てみましょう。
お問合せのContorllerはsrc/Eccube/Controller/ContactController.php
になります。
内容を見てみると関数がindex()
とcomplete()
が実装されていて、complete
は画面表示だけというのが分かります。
では、index()
の内容を見てみましょう。
$builder = $this->formFactory->createBuilder(ContactType::class);
最初出てくるこの部分、FORMを作成する為のFORMTYPEファイルを読み込んでいます。
ここから分かるのはClass名だけですが、Controller上部にあるuse
を見てみましょう。
すると、ContactType
のパスが記載された行use Eccube\Form\Type\Front\ContactType;
があり、そのパス通りにsrc/Eccube/Form/Type/Front
のフォルダ内を見てみるとContactType.php
があります。
お問合せのFORMTYPEはsrc/Eccube/Form/Type/Front/ContactType.php
が使われているというのが分かりますね。
次に「メール送信」のコメントを見てみましょう。
$this->mailService->sendContactMail($data);
$this->mailService
は__construct
でMailService
のオブジェクトが入っているのが分かります。
ContactType
同様にController上部を見てみるとuse Eccube\Service\MailService;
と書かれています。
その階層のフォルダを見てみるとMailService.php
があります。
メール送信はMailService.php
を見れば、どんな事を行っているのか分かりますね。
#まとめ
すべてのパターンを説明できているかと言われれば、たぶんできていないですが、この記事にような感じで探せば、目的のソースへたどり着けると思います。
慣れてくれば探さずとも直感で見つける事も出来ますよ。
そして、この記事の説明では、関数内からuseを探してって感じで説明してますが、最初からuseされてる物を見るのが一番早いかと思います。
最初の頃はファイルを探すのも苦労してました。
なので、少しでも役に立った記事になる事を願ってます。