资讯专栏INFORMATION COLUMN

Magento2.x 如何创建一个Module?

bbbbbb / 2444人阅读

摘要:今天记录下如何创建一个,直接进入正题。创建好我们的和之后,接下来就需要创建一系列的文件,我们依次来说每个文件如何创建。

Magento2.x版本已经发布一段时间了,到现在为止已经到2.2了,最新版本可以关注Magento在github上的更新。今天记录下Magento2.1如何创建一个module,直接进入正题。

安装Magento2后,进入项目的根目录后,进入/app目录,只有app/design/,app/etc/两个文件夹,design/目录是存放主题内容,安装成功后,在etc/文件夹下会多出config.php和env.php两个php文件,config.php可以看到magento2加载了那些模块,类似magento1.x的eetc/modules/文件夹,env.php保存了连接的数据库的一些信息,如果你要更改项目连接的数据库,可以在env.php里面修改,类似Magento1.x的local.xml文件。用过Magento1.x,应该发现app目录少了code目录,对头,这里我们也要新建code目录,用来存放我自己编写的模块代码,首先需要创建一个""(这里我用Silk),在这个下,新建我们的""(这里我用Test),目录结构如下所示:

</>复制代码

  1. 备注:Magento2.1的所有核心代码位于/vendor/magento/目录下。

</>复制代码

  1. --magento2.1
  2. |---code
  3. |---Silk
  4. |---Test
  5. |---design
  6. |---etc
  7. |---config.php
  8. |---env.php

创建好我们的之后,接下来就需要创建一系列的文件,我们依次来说每个文件如何创建。

模块声明

</>复制代码

  1. File:app/code/Silk/Test/etc/module.xml

在module.xml中编写如下代码:

</>复制代码

"module" 标签说明 :

name: 表示module的名称

setup_version: 表示module的版本号

Module registration

这里需要在module的根目录下创建一个"registration.php"文件

</>复制代码

  1. File:app/code/Silk/Test/registration.php

在registration.php中编写如下代码:

</>复制代码

  1. 查看module是否激活
  2. 打开app/etc/config/php文件后,这时你会发现没有刚才我们编写的module,这里需要利用终端进入到magento2的根目录执行magento命令:

  3. </>复制代码

    1. php bin/magento setup:upgrade
  4. 执行完成之后,你将会在config.php中看到刚才我们写的module

  5. 接下来,我们就来创建前端控制器。

  6. 路由声明
  7. 创建前端控制器时,需要新建etc/frontend/routes.xml文件,来声明前端控制器的名称。

  8. </>复制代码

    1. File:app/code/Silk/Test/etc/frontend/routes.xml

  9. routes.php中编写如下代码:

  10. </>复制代码

  11. 标签说明:

  12. id = standard 表示前端路由;

  13. 标签说明:

  14. id : 对于router的唯一标识名;

  15. frontName : 前端URL的控制名称;

  16. 标签说明:

  17. name : 声明module的名称;

  18. before : 表示在定义module之前加载;

  19. after : 表示在定义moduel之后加载;

  20. </>复制代码

    1. 备注:“before” et “after” 在创建module时不是必须的.

  21. 创建前端控制器
  22. 比如我们的URL为:local.magento2.com/test,继续创建文件

  23. </>复制代码

    1. File:app/code/Silk/Test/Controller/Index/Index.php

  24. 控制器中代码如下:

  25. </>复制代码

    1. resultPageFactory = $resultPageFactory;
    2. parent::__construct($context);
    3. }
    4. /**
    5. * @return MagentoFrameworkViewResultPageFactory
    6. */
    7. public function execute()
    8. {
    9. echo "this is Silk_Test_Controller_Index_Index";
    10. die();
    11. }
    12. }
  26. 现在访问刚才的路由URL,就可以看到浏览器输出内容了。

  27. </>复制代码

    1. 备注:这里如果报错:Please upgrade your database: Run "bin/magento setup:upgrade" from the Magento root directory.

  28. 解决办法就是到根目录执行命令

  29. </>复制代码

    1. php bin/magento setup:upgrade
  30. 自定义URL
  31. 上面我们的URL很简单,为local.magento2.com/test,实际上magento将它转化成了local.magento2.com/test/index/index,test为/etc/routes.xml下我们定义的frontName名,第一个index是位于Controller文件夹下的Index文件夹名,第二个index是位于Index文件夹下的Index.php名,比如我们现在要我们的URL为:local.magento2.com/test/hello/world,我们该如何创建文件呢?
    示例如下:

  32. </>复制代码

    1. //File:app/code/Silk/Test/Controller/Helo/World.php
    2. Silk
    3. |---Test
    4. |--Controller
    5. |--Hello
    6. |---World.php
  33. World.php内容如下:

  34. </>复制代码

    1. resultPageFactory = $resultPageFactory;
    2. parent::__construct($context);
    3. }
    4. /**
    5. * @return MagentoFrameworkViewResultPageFactory
    6. */
    7. public function execute()
    8. {
    9. echo "this is Silk_Test_Controller_Hello_World";
    10. die();
    11. }
    12. }
  35. 创建Block
  36. 上面我们说了如何从控制器输出内容到页面,但是真正与浏览器页面最相关的还是由对应的Block输出数据,那么如何创建一个block呢?
    我们来修改下我们控制器app/code/Silk/Test/Controller/Helo/World.php里面的内容:

  37. </>复制代码

    1. namespace SilkTestControllerHello;
    2. use MagentoFrameworkAppActionAction;
    3. class World extends Action {
    4. /** @var MagentoFrameworkViewResultPage */
    5. protected $resultPageFactory;
    6. /*** @param MagentoFrameworkAppActionContext $context*/
    7. public function __construct(MagentoFrameworkAppActionContext $context,
    8. MagentoFrameworkViewResultPageFactory $resultPageFactory) {
    9. $this->resultPageFactory = $resultPageFactory;
    10. parent::__construct($context);
    11. }
    12. /**
    13. * @return MagentoFrameworkViewResultPageFactory
    14. */
    15. public function execute()
    16. {
    17. $this->_view->loadLayout();
    18. $this->_view->getLayout()->initMessages();
    19. $this->_view->renderLayout();
    20. }
    21. }
  38. 接着创建block文件

  39. </>复制代码

    1. File:app/code/Silk/Test/Block/Hello.php

  40. Hello.php中代码如下:

  41. </>复制代码

    1. 创建layout布局文件
    2. 布局文件的命名规则为:__

    3. </>复制代码

      1. 例如:
        local.magento2.com/test -----test_index_index.xml
        local.magento2.com/test/say -----test_say_index_index.xml
        local.magento2.com/test/hello/world -----test_hello_world.xml

    4. 这里我们的布局文件名称test_hello_world.xml

    5. </>复制代码

      1. File:app/code/Silk/Test/view/frontend/layout/test_hello_world.xml

    6. 代码内容如下:

    7. </>复制代码

    8. 这里我们又定义了一个helloworld.phtml文件,继续来新建这个模板文件。

    9. 创建模板文件
    10. </>复制代码

      1. File:app/code/Silk/Test/view/frontend/templates/helloworld.phtml

    11. helloworld.phtml代码内容如下:

    12. </>复制代码

      1. HelloWorld

      2. Congratulations ! You have created your first Magento Module !

      3. The block classname is :

    13. 现在重新刷新我们的网页URL:local.magento2.com/test/hello/world
      到此,我们就完成了一个简单的前端控制器到模板的数据输出.需要注意的是,block仍然是提供给模板phtml页面数据,但是在模板中调用Block中的函数方式时,Magento2是用$block,而不再是$this.
      下面我们继续完善我们这module,在创建后台部分之前,先来创建Model模型.

    14. 创建Model模型
    15. </>复制代码

      1. -Model
      2. |--Job.php
      3. |--ResourceModel
      4. |--Job.php
      5. |--Job
      6. |--Collection.php
    16. 接着我们依次来创建这几个文件

    17. </>复制代码

      1. File:app/code/Silk/Test/Model/Job.php

    18. 代码内容如下:

    19. </>复制代码

      1. _init("SilkTestModelResourceModelJob");
      2. }
      3. }
    20. </>复制代码

      1. File:app/code/Silk/Test/Model/ResourceModel/Job.php

    21. 代码内容如下:

    22. </>复制代码

      1. _init("silk_job", "entity_id");
      2. }
      3. }
    23. </>复制代码

      1. File:app/code/Silk/Test/Model/ResourceModel/Job/Collection.php

    24. 代码内容如下:

    25. </>复制代码

      1. _init("SilkTestModelJob", "SilkTestModelResourceModelJob");
      2. }
      3. }
    26. 到此,我们就创建了一个Model模型.接下来,我们来创建脚本文件,即Setup/目录下的文件

    27. InstallSchema.php

    28. UpgradeSchema.php

    29. InstallData.php

    30. UpgradeData.php

    31. Recurring.php

    32. </>复制代码

      1. 备注:InstallSchema.php是模块初次运行时创建表结构的脚本,InstallData.php是模块初次运行时插入表中的数据,而UpgradeSchema.phpUpgradeData.php是根据module.xml中的setup_version版本号来执行更新表结构和表数据的脚本.

    33. 创建表结构InstallSchema.php
    34. </>复制代码

      1. File:app/code/Silk/Test/Setup/InstallSchema.php

    35. 代码内容如下:

    36. </>复制代码

      1. startSetup();
      2. $table = $installer->getConnection()->newTable(
      3. $installer->getTable("silk_test")
      4. )->addColumn(
      5. "e_id",
      6. MagentoFrameworkDBDdlTable::TYPE_INTEGER,
      7. null,
      8. array("identity" => true, "nullable" => false, "primary" => true),
      9. "Employee ID"
      10. )->addColumn(
      11. "e_name",
      12. MagentoFrameworkDBDdlTable::TYPE_TEXT,
      13. 255,
      14. array("nullable" => false),
      15. "Employee Name"
      16. )->addColumn(
      17. "e_address",
      18. MagentoFrameworkDBDdlTable::TYPE_TEXT,
      19. "2M",
      20. array("nullable" => false),
      21. "Employee Address"
      22. )->addColumn(
      23. "is_active",
      24. MagentoFrameworkDBDdlTable::TYPE_SMALLINT,
      25. null,
      26. array(),
      27. "Active Status"
      28. )->addColumn(
      29. "created_at",
      30. MagentoFrameworkDBDdlTable::TYPE_TIMESTAMP,
      31. null,
      32. array(),
      33. "Creation Time"
      34. )->addColumn(
      35. "update_time",
      36. MagentoFrameworkDBDdlTable::TYPE_TIMESTAMP,
      37. null,
      38. array(),
      39. "Modification Time"
      40. )->setComment(
      41. "Employee Table"
      42. );
      43. $installer->getConnection()->createTable($table);
      44. $installer->endSetup();
      45. }
      46. }
    37. upgrade表结构UpgradeSchema.php
    38. </>复制代码

      1. File:app/code/Silk/Test/Setup/UpgradeSchema.php

    39. 代码内容如下:

    40. </>复制代码

      1. startSetup();
      2. if (version_compare($context->getVersion(), "1.0.1") < 0)
      3. {
      4. $installer->startSetup();
      5. $tableName = $setup->getTable("silk_test");
      6. if ($setup->getConnection()->isTableExists($tableName) == true)
      7. {
      8. $installer->getConnection()
      9. ->addColumn($installer->getTable("silk_test"),"e_profile_picture", array(
      10. "type" => Table::TYPE_TEXT,
      11. "nullable" => true,
      12. "length" => 255,
      13. "comment" => "Profile Picture"
      14. ));
      15. }
      16. }
      17. $installer->endSetup();
      18. }
      19. }
    41. 备注: 更新表结构要查看module.xml中的schema_version标签的值是否小于这里的版本号.

    42. 创建后台配置文件
    43. 后台的配置文件是在etc/adminhtml/目录下创建,比如menu.xml,routes.xml,system.xml,di.xml等等,依次来解释下这些xml的作用

    44. menu.xml
    45. menu.xml可以看作是配置当前模块在后台的导航位置的配置信息

    46. </>复制代码

      1. File:app/code/Silk/Test/etc/adminhtml/menu.xml

    47. 代码内容如下:

    48. </>复制代码

    49. 说明:

    50. parent: "Magento_Backend::stores"表示当前模块位于后台Stores选项中;

    51. title : 表示在后台显示的名称;

    52. id : 唯一标识符;

    53. action: 表示点击该选项要跳转的路由;

    54. acl.xml
    55. </>复制代码

      1. File:app/code/Silk/Test/etc/acl.xml

    56. 代码内容如下:

    57. </>复制代码

    58. 查看权限位置:System > Permissions > User roles;

    59. routes.xml
    60. routes.xml是配置后台路由的信息

    61. </>复制代码

      1. File:app/code/Silk/Test/etc/adminhtml/routes.xml

    62. 代码内容如下:

    63. </>复制代码

    64. 说明:

    65. frontName: 表示你后台控制器的名称

    66. id: 唯一标识符;

    67. system.xml
    68. system.xml是配置后台路由的信息

    69. </>复制代码

      1. File:app/code/Silk/Test/etc/adminhtml/system.xml

    70. 代码内容如下:

    71. </>复制代码

      1. test
      2. Silk_Test::test
      3. Show list of the viewing
      4. MagentoConfigModelConfigSourceYesno

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/21852.html

相关文章

  • 基于模块的自定义商品开发研究

    摘要:目标自定义字段。能够对接自定义商品后续处理过程。参考模块博文状态持续编辑中简单教程通过模块开发自定义商品类型忽略部分,如何创建一个模块,并启用这个部分可以看我的其它博文。基本内容可以看到我整篇代码复制模块下面的,只自定义了一下这样就可以了。 目标: 1. 自定义字段。 2. 启用新商品类型简化商品属性。 3. 能够对接自定义商品后续处理过程。 参考:Magento_Downloa...

    CKJOKER 评论0 收藏0
  • [译] 如何对 Angular Controller 进行单元测试

    摘要:原文地址上面一篇文章简单介绍了如何使用进行的单元测试我们用了一段简单的代码进行计算的测试。添加测试接下来终于到了我们的主题,添加一些单元测试给我们忽略代码中部分,主要集中在的代码中。 原文地址:http://www.bradoncode.com/blog/2015/05/17/angularjs-testing-controller/@Bradley Braithwaite show...

    aboutU 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<