Magento2.xプラグインModule(モジュール)開発実戦
Magento2.xプラグインModule(モジュール)開発実戦
一、基本紹介
1、開発したプラグインモジュールコードは同じ:app/code/ディレクトリの下に置く;2、モジュールのファイル命名規則:app/code/namespace/module
a.namespace:ここで私が使っているPluginの名前b.module:ここで私が使っているTestの名前
3、テストモジュールのディレクトリ構造は以下の通りである.
二、テストモジュール実戦
(一)モジュール宣言
1.moduleを作成する.xmlファイル、app/code/Plugin/Test/etc/module.xml
a.name:moduleの名前b.setup_を表すバージョン:moduleを表すバージョン番号
2.registrationを作成する.phpファイル、app/code/Plugin/Test/registration.php
3、モジュールをアクティブにする
a.端末はディレクトリをmangent 2プロジェクトルートディレクトリに切り替える.b.実行
(二)ルーティング宣言
1、フロントエンドルーティング
a.フロントエンドルーティングを作成する場合、app/code/Plugin/Test/etc/frontend/routesを新規作成する必要がある.xmlファイルで、フロントエンドコントローラの名前を宣言します.
b.routerラベルの説明:
id=standardはフロントエンドルーティングを表す.
c.routeラベルの説明:
id:routerに対する一意の識別名;frontName:フロントエンドURLの制御名;
d.moduleラベル説明:
name:moduleの名前を宣言します.before:moduleを定義する前にロードすることを示します.after:moduelを定義した後にロードすることを示します.
2、フロントエンドコントローラの作成
a.例えば、私たちのフロントエンドアクセスルートURLは:web.magento2.com/test/hello/word、ファイルの作成を続行(app/code/Plugin/Test/Clontroller/Hello/World.php)
b.先のルートURLを聞くと、ブラウザの出力内容が見えます(Web Hello World!)しました.(このコマンドは常に
(三)Blockの作成
1、コントローラからページへの出力方法について説明しましたが、ブラウザページに最も関連しているのか、対応するBlockからデータを出力しているのか、blockを作成するにはどうすればいいのでしょうか.
a.コントローラapp/code/Silk/Test/controller/Helo/Worldを修正します.phpの内容:
b.次にblockファイル(app/code/Plugin/Test/Index/Hello.php)を作成する
(四)フロントlayoutレイアウトファイルtemplateテンプレートファイルの作成
1、レイアウトファイルの命名規則は以下の通りである:
a.ここでレイアウトファイル名test_hello_world.xml ( app/code/Plugin/Test/view/frontend/layout/test_hello_world.xml )
b.ここではhelloテンプレートファイルを定義し、このテンプレートファイルを新規作成します.
2、テンプレートファイルhelloを作成する.phtml
a.テンプレートファイルパス:(app/code/Plugin/Test/view/frontend/templates/hello.phtml)
3、キャッシュロードコンポーネントのコマンドを再実行し、ブラウザをリフレッシュしてWebにアクセスする.magento2.com/test/hello/wordルーティング、出力結果:hello world!block function !
(五)データベースの移行(テーブルの作成、およびデフォルトデータのロード)
1、表構造のInstallSchemaを作成する.php (app/code/Plugin/Test/Setup/InstallSchema.php)
2、デフォルトデータInstallDataをロードする.php (app/code/Plugin/Test/Setup/InstallData.php)
(六)モデル、リソースモデル、コレクションの作成
1、ユーザーモデルの作成(app/code/Plugin/Test/Model/User.php)
2、ユーザー資源モデルの作成(app/code/Plugin/Test/Model/ResourceModel/User.php)
3、ユーザー集合の作成(app/code/Plugin/Test/Model/ResourceModel/User/Collection.php)
4、修正(app/code/Plugin/Test/view/frontend/template/index/hello.phtml)Blockの中のコード、データベースの中のデータをロードしてweb端に出力して、下図のように;
一、基本紹介
1、開発したプラグインモジュールコードは同じ:app/code/ディレクトリの下に置く;2、モジュールのファイル命名規則:app/code/namespace/module
a.namespace:ここで私が使っているPluginの名前b.module:ここで私が使っているTestの名前
3、テストモジュールのディレクトリ構造は以下の通りである.
二、テストモジュール実戦
(一)モジュール宣言
1.moduleを作成する.xmlファイル、app/code/Plugin/Test/etc/module.xml
xml version="1.0"?>
"http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:framework:Module/etc/module.xsd">
"Plugin_Test" setup_version="1.0.0" active="true" />
a.name:moduleの名前b.setup_を表すバージョン:moduleを表すバージョン番号
2.registrationを作成する.phpファイル、app/code/Plugin/Test/registration.php
\Magento\Framework\Component\ComponentRegistrar::register(
\Magento\Framework\Component\ComponentRegistrar::MODULE,
'Plugin_Test',
__DIR__
);
3、モジュールをアクティブにする
a.端末はディレクトリをmangent 2プロジェクトルートディレクトリに切り替える.b.実行
php bin/magento setup:upgrade
コマンドb.結果:(モジュール証明書がロードされた場合)(二)ルーティング宣言
1、フロントエンドルーティング
a.フロントエンドルーティングを作成する場合、app/code/Plugin/Test/etc/frontend/routesを新規作成する必要がある.xmlファイルで、フロントエンドコントローラの名前を宣言します.
xml version="1.0"?>
"http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:framework:App/etc/routes.xsd">
"standard">
"test" frontName="test">
"Plugin_Test" before="Magento_Core"/>
b.routerラベルの説明:
id=standardはフロントエンドルーティングを表す.
c.routeラベルの説明:
id:routerに対する一意の識別名;frontName:フロントエンドURLの制御名;
d.moduleラベル説明:
name:moduleの名前を宣言します.before:moduleを定義する前にロードすることを示します.after:moduelを定義した後にロードすることを示します.
2、フロントエンドコントローラの作成
a.例えば、私たちのフロントエンドアクセスルートURLは:web.magento2.com/test/hello/word、ファイルの作成を続行(app/code/Plugin/Test/Clontroller/Hello/World.php)
/**
* Created by PhpStorm.
* User: Admin
* Date: 2017/12/23
* Time: 17:21
*/
namespace Plugin\Test\Controller\Hello;
use Magento\Framework\App\Action\Action;
use Magento\Framework\App\Action\Context;
use Magento\Framework\View\Result\PageFactory;
class World extends Action
{
/** @var \Magento\Framework\View\Result\Page */
protected $resultPageFactory;
/**
* World constructor.
*
* @param Context $context
* @param PageFactory $resultPageFactory
*/
public function __construct(Context $context, PageFactory $resultPageFactory) {
$this->resultPageFactory = $resultPageFactory;
parent::__construct($context);
}
/**
*
* @return \Magento\Framework\View\Result\PageFactory
*/
public function execute()
{
echo "Web Hello World !";
die;
}
}
b.先のルートURLを聞くと、ブラウザの出力内容が見えます(Web Hello World!)しました.(このコマンドは常に
php bin/magento setup:upgrade
を実行してください.)(三)Blockの作成
1、コントローラからページへの出力方法について説明しましたが、ブラウザページに最も関連しているのか、対応するBlockからデータを出力しているのか、blockを作成するにはどうすればいいのでしょうか.
a.コントローラapp/code/Silk/Test/controller/Helo/Worldを修正します.phpの内容:
/**
* Created by PhpStorm.
* User: Admin
* Date: 2017/12/23
* Time: 17:21
*/
namespace Plugin\Test\Controller\Hello;
use Magento\Framework\App\Action\Action;
use Magento\Framework\App\Action\Context;
use Magento\Framework\View\Result\PageFactory;
class World extends Action
{
/** @var \Magento\Framework\View\Result\Page */
protected $resultPageFactory;
/**
* World constructor.
*
* @param Context $context
* @param PageFactory $resultPageFactory
*/
public function __construct(Context $context, PageFactory $resultPageFactory) {
$this->resultPageFactory = $resultPageFactory;
parent::__construct($context);
}
/**
*
* @return \Magento\Framework\View\Result\PageFactory
*/
public function execute()
{
$this->_view->loadLayout();
$this->_view->getLayout()->initMessages();
$this->_view->renderLayout();
}
}
b.次にblockファイル(app/code/Plugin/Test/Index/Hello.php)を作成する
/**
* Created by PhpStorm.
* User: Admin
* Date: 2017/12/25
* Time: 16:02
*/
namespace Plugin\Test\Block\Index;
class Hello extends \Magento\Framework\View\Element\Template
{
/**
* @var \Trackingmore\Detrack\Model\UserFactory
*/
protected $_userFactory;
/**
* Hello constructor.
*
* @param \Magento\Framework\View\Element\Template\Context $context
* @param \Trackingmore\Detrack\Model\UserFactory $userFactory
*/
public function __construct(
\Magento\Framework\View\Element\Template\Context $context,
\Plugin\Test\Model\UserFactory $userFactory
) {
$this->_userFactory = $userFactory;
parent::__construct($context);
}
/**
* @return $this
*/
public function _prepareLayout() {
/* case 1
* @return string 'Plugin\Test\Model\UserFactory' (length=36)
*/
// var_dump(
// get_class($this->_userFactory)
// );
// exit;
/* case 2
* load ID 1 model
*/
// $post = $this->_userFactory->create();
// $post = $post->load(1);
// var_dump($post);
// die;
/* case 3
* use collection
*/
// $post = $this->_userFactory->create();
// $collection = $post->getCollection();
// foreach ($collection as $item) {
// var_dump($item->getData());
// }
// exit;
// var_dump($this->getUserData());die;
return parent::_prepareLayout();
}
/**
*
*/
public function testOutputAction() {
echo 'block function !';
}
/**
*
*
* @return \Magento\Framework\Model\ResourceModel\Db\Collection\AbstractCollection
*/
public function getUserData() {
$post = $this->_userFactory->create();
$collection = $post->getCollection();
$userArr = [];
foreach ($collection as $item) {
$userArr[] = $item->getData();
}
// var_dump($userArr);
return $userArr;
}
}
(四)フロントlayoutレイアウトファイルtemplateテンプレートファイルの作成
1、レイアウトファイルの命名規則は以下の通りである:
a.ここでレイアウトファイル名test_hello_world.xml ( app/code/Plugin/Test/view/frontend/layout/test_hello_world.xml )
xml version="1.0" ?>
"1column" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:framework:View/Layout/etc/page_configuration.xsd">
"content">
class="Plugin\Test\Block\Index\Hello" name="index.hello" template="Plugin_Test::index/hello.phtml"/>
referenceContainer>
body>
page>
b.ここではhelloテンプレートファイルを定義し、このテンプレートファイルを新規作成します.
2、テンプレートファイルhelloを作成する.phtml
a.テンプレートファイルパス:(app/code/Plugin/Test/view/frontend/templates/hello.phtml)
hello world !
$block->testOutputAction();?>
3、キャッシュロードコンポーネントのコマンドを再実行し、ブラウザをリフレッシュしてWebにアクセスする.magento2.com/test/hello/wordルーティング、出力結果:hello world!block function !
(五)データベースの移行(テーブルの作成、およびデフォルトデータのロード)
1、表構造のInstallSchemaを作成する.php (app/code/Plugin/Test/Setup/InstallSchema.php)
/**
* Created by PhpStorm.
* User: Admin
* Date: 2017/12/25
* Time: 16:38
*/
namespace Plugin\Test\Setup;
use Magento\Framework\Setup\InstallSchemaInterface;
use Magento\Framework\Setup\ModuleContextInterface;
use Magento\Framework\Setup\SchemaSetupInterface;
use Magento\Framework\DB\Ddl\Table;
use Magento\Framework\DB\Adapter\AdapterInterface;
class InstallSchema implements InstallSchemaInterface
{
/**
* Installs DB schema for a module
*
* @param SchemaSetupInterface $setup
* @param ModuleContextInterface $context
*
* @return bool
*/
public function install(
SchemaSetupInterface $setup,
ModuleContextInterface $context
) {
//
$installer = $setup;
//
$installer->startSetup();
//
$installer->getConnection()->dropTable($installer->getTable('test_users'));
// test_users
if (!$installer->tableExists('test_users')) {
$table = $installer->getConnection()
->newTable($installer->getTable('test_users'))
->addColumn(
'id',
Table::TYPE_INTEGER,
null,
['identity' => true, 'nullable' => false, 'primary' => true],
'users ID'
)
->addColumn('username', Table::TYPE_TEXT, 50, ['nullable' => false])
->addColumn('password', Table::TYPE_TEXT, 255, ['nullable' => false])
->addColumn('age', Table::TYPE_INTEGER, 255, [])
->addColumn('address', Table::TYPE_TEXT, 255, [])
->setComment('users table');
$installer->getConnection()->createTable($table);
}
//
$installer->endSetup();
}
}
2、デフォルトデータInstallDataをロードする.php (app/code/Plugin/Test/Setup/InstallData.php)
/**
* Created by PhpStorm.
* User: Admin
* Date: 2017/12/25
* Time: 16:38
*/
namespace Plugin\Test\Setup;
use Magento\Framework\Setup\InstallDataInterface;
use Magento\Framework\Setup\ModuleContextInterface;
use Magento\Framework\Setup\ModuleDataSetupInterface;
class InstallData implements InstallDataInterface
{
/**
*
*
* @param ModuleDataSetupInterface $setup
* @param ModuleContextInterface $context
*
* @return bool
*/
public function install(
ModuleDataSetupInterface $setup,
ModuleContextInterface $context
) {
$data = [
['username' => 'zhangsan', 'password' => '123123', 'age' => '18', 'address' => 'shenzhen'],
['username' => 'lisi', 'password' => '456456456', 'age' => '28', 'address' => 'shanghai']
];
foreach ($data as $bind) {
$setup->getConnection()
->insertForce($setup->getTable('test_users'), $bind);
}
}
}
(六)モデル、リソースモデル、コレクションの作成
1、ユーザーモデルの作成(app/code/Plugin/Test/Model/User.php)
/**
* Created by PhpStorm.
* User: Admin
* Date: 2017/12/26
* Time: 9:28
*/
namespace Plugin\Test\Model;
use Magento\Framework\Model\AbstractModel;
class User extends AbstractModel
{
/**
* Initialize resource model
*
* @return void
*/
protected function _construct()
{
//
$this->_init('Plugin\Test\Model\ResourceModel\User');
}
}
2、ユーザー資源モデルの作成(app/code/Plugin/Test/Model/ResourceModel/User.php)
/**
* Created by PhpStorm.
* User: Admin
* Date: 2017/12/26
* Time: 9:29
*/
namespace Plugin\Test\Model\ResourceModel;
use Magento\Framework\Model\ResourceModel\Db\AbstractDb;
class User extends AbstractDb
{
/**
* Initialize resource model
*
* @return void
*/
protected function _construct()
{
$this->_init('test_users', 'id');
}
}
3、ユーザー集合の作成(app/code/Plugin/Test/Model/ResourceModel/User/Collection.php)
/**
* Created by PhpStorm.
* User: Admin
* Date: 2017/12/26
* Time: 9:43
*/
namespace Plugin\Test\Model\ResourceModel\User;
use Magento\Framework\Model\ResourceModel\Db\Collection\AbstractCollection;
class Collection extends AbstractCollection
{
/**
* ID
*
* @var string
*/
protected $_idFieldName = 'id';
/**
*
*
* @return bool
*/
protected function _construct()
{
$this->_init(
'Plugin\Test\Model\User',
'Plugin\Test\Model\ResourceModel\User'
);
}
}
4、修正(app/code/Plugin/Test/view/frontend/template/index/hello.phtml)Blockの中のコード、データベースの中のデータをロードしてweb端に出力して、下図のように;
hello world !
$block->testOutputAction();?>
"600" border="1" cellspacing="0">
foreach($block->getUserData() as $key=>$val) :?>
endforeach;?>
00000 echo $val['id'];?>
echo $val['username'];?>
echo $val['password'];?>
echo $val['age'];?>
echo $val['address'];?>