初めに
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されてる物を見るのが一番早いかと思います。
最初の頃はファイルを探すのも苦労してました。
なので、少しでも役に立った記事になる事を願ってます。