5
4

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

EC-CUBE4 ページURLから利用される本体ソースを突き止める 脱初心者二歩目

Posted at

#初めに
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__constructMailServiceのオブジェクトが入っているのが分かります。

ContactType同様にController上部を見てみるとuse Eccube\Service\MailService;と書かれています。
その階層のフォルダを見てみるとMailService.phpがあります。

メール送信はMailService.phpを見れば、どんな事を行っているのか分かりますね。

#まとめ

すべてのパターンを説明できているかと言われれば、たぶんできていないですが、この記事にような感じで探せば、目的のソースへたどり着けると思います。
慣れてくれば探さずとも直感で見つける事も出来ますよ。

そして、この記事の説明では、関数内からuseを探してって感じで説明してますが、最初からuseされてる物を見るのが一番早いかと思います。

最初の頃はファイルを探すのも苦労してました。
なので、少しでも役に立った記事になる事を願ってます。

5
4
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
5
4

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?