Magento2 エクステンションの作成 その2
Rev.3を表示中。最新版はこちら。
1. 概要
ここでは、管理画面にページを追加するため、以下の作業を行う。
- 管理画面のメニューに項目を追加
- 管理画面のルートを作成
- 管理画面のコントローラーを作成
2. 管理画面内のURL
今回管理画面に追加するページのURLは、/admin/topic/posts/indexとする。このページに後々、ニュースの一覧を表示する。
3. メニューのカスタマイズ
まずは、管理画面にメニューを追加する。
メニューのカスタマイズにはetc/adminhtml/menu.xmlを作成し、そこにメニューの項目を定義する。
etc/adminhtml/menu.xml
<?xml version="1.0"?> <config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:module:Magento_Backend:etc/menu.xsd"> <menu> <add id="BitHive_Topic::topic" title="Topic" module="BitHive_Topic" sortOrder="51" resource="BitHive_Topic::topic"/> <add id="BitHive_Topic::posts" title="Posts" module="BitHive_Topic" sortOrder="10" action="topic/posts" resource="BitHive_Topic::list" parent="BitHive_T opic::topic"/> </menu> </config>
このmenu.xmlではトップ階層にTopicメニューを作成し、サブメニューとしてPosts項目を追加している。Postsのリンク先はaction属性で指定し(topic/posts)、/admin/topic/posts/indexにリンクしている。
ファイル作成後、./bin/magento cache:cleanでキャッシュをクリアすれば、管理画面のメニューに項目が追加されているはず。
図1 追加されたメニュー
4. ルート(route)の定義
3.ではメニューの項目を追加したが、ルートもまだないため、メニューの[Topic]-[Posts]をクリックしても404 Errorになる。ページを表示するにはルートとコントローラーの作成が必要になる。
ここでは、管理画面用のルートを作成する。管理画面のルートはetc/adminhtml/routes.xmlで定義する。
etc/adminhtml/routes.xml
<?xml version="1.0" ?> <config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:framework:App/etc/routes.xsd"> <router id="admin"> <route frontName="topic" id="topic"> <module name="BitHive_Topic"/> </route> </router> </config>
管理画面内のルートについては、routerタグのidにadminを指定する。また、routeタグのfrontNameでURLを指定することになる。
URLの形式は admin/<frontName>/<Controllerクラス> の形になる。このため、上のroutes.xmlではadmin/topic/****に関するルートを作成したことになる。****の部分の文字列に応じて同名のコントローラが呼び出される。
id属性はfrontName属性と同じでよい。
5. コントローラーの作成
今度は、作成したルートに合わせてコントローラーの作成を行う。コントローラーはControllerディレクトリを作成し、その中に配置する。
4.で作成したルートは admin/topic/**** で今回追加したいページのURLは/admin/topic/posts/index。コントローラ(****)部分の名前がposts/indexなので、今回作成するコントローラのファイルはController/Adminhtml/Posts/Index.phpとなる。
コントローラーはMagento\Backend\App\Actionクラスを継承して作成する。
Controller/Adminhtml/Posts/Index.php
<?php namespace BitHive\Topic\Controller\Adminhtml\Posts; class Index extends \Magento\Backend\App\Action { public function execute() { print 'posts/index page'; return; } }
コントローラーの処理はexecute()メソッドに記述する。ここでは、View等の処理は全て省略してprintでメッセージを表示するだけとする。
ここまでファイルを作成し、./bin/magento cache:cleanでキャッシュをクリア後、追加したメニューからadmin/posts/indexにアクセスすると'posts/index page'のメッセージが表示されるのが確認できるはず。
現時点でTopic配下は以下のようになっている。
./registration.php ./Setup/InstallSchema.php ./Controller/Adminhtml/Posts/Index.php ./etc/module.xml ./etc/adminhtml/menu.xml ./etc/adminhtml/routes.xml
今回はここまで。次回はコントローラーからビューを使って表示を行う処理について。