资讯专栏INFORMATION COLUMN

Magento2.x 如何创建一个Module?

bbbbbb / 2304人阅读

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

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),目录结构如下所示:

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

--magento2.1
    |---code
          |---Silk
               |---Test
    |---design
    |---etc
         |---config.php
         |---env.php           

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

模块声明

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

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



    

"module" 标签说明 :

name: 表示module的名称

setup_version: 表示module的版本号

Module registration

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

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

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


查看module是否激活

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

php bin/magento setup:upgrade

执行完成之后,你将会在config.php中看到刚才我们写的module。

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

路由声明

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

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

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



    
        
            
        
    

标签说明:

id = standard 表示前端路由;

标签说明:

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

frontName : 前端URL的控制名称;

标签说明:

name : 声明module的名称;

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

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

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

创建前端控制器

比如我们的URL为:local.magento2.com/test,继续创建文件

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

控制器中代码如下:

resultPageFactory = $resultPageFactory;
        parent::__construct($context);
    }

    /**
     * @return MagentoFrameworkViewResultPageFactory
     */
    public function execute()
    {
        echo "this is Silk_Test_Controller_Index_Index";
        die();
    }
}

现在访问刚才的路由URL,就可以看到浏览器输出内容了。

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

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

php bin/magento setup:upgrade
自定义URL

上面我们的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,我们该如何创建文件呢?
示例如下:

//File:app/code/Silk/Test/Controller/Helo/World.php
Silk
  |---Test
       |--Controller
            |--Hello
                |---World.php

World.php内容如下:

resultPageFactory = $resultPageFactory;
        parent::__construct($context);
    }

    /**
     * @return MagentoFrameworkViewResultPageFactory
     */
    public function execute()
    {
        echo "this is Silk_Test_Controller_Hello_World";
        die();
    }
}
创建Block

上面我们说了如何从控制器输出内容到页面,但是真正与浏览器页面最相关的还是由对应的Block输出数据,那么如何创建一个block呢?
我们来修改下我们控制器app/code/Silk/Test/Controller/Helo/World.php里面的内容:

namespace SilkTestControllerHello;
use MagentoFrameworkAppActionAction;

class World extends Action {
    /** @var  MagentoFrameworkViewResultPage */
    protected $resultPageFactory;
    /*** @param MagentoFrameworkAppActionContext $context*/
    public function __construct(MagentoFrameworkAppActionContext $context,
                                MagentoFrameworkViewResultPageFactory $resultPageFactory)     {
        $this->resultPageFactory = $resultPageFactory;
        parent::__construct($context);
    }

    /**
     * @return MagentoFrameworkViewResultPageFactory
     */
     public function execute()
     {
        $this->_view->loadLayout();
        $this->_view->getLayout()->initMessages();
        $this->_view->renderLayout();
    }
}

接着创建block文件

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

Hello.php中代码如下:


创建layout布局文件

布局文件的命名规则为:__

例如:
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

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

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

代码内容如下:



    
        
            
            
        
    

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

创建模板文件

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

helloworld.phtml代码内容如下:

HelloWorld

Congratulations ! You have created your first Magento Module !

The block classname is :

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

创建Model模型
-Model
   |--Job.php
   |--ResourceModel
          |--Job.php
          |--Job
              |--Collection.php

接着我们依次来创建这几个文件

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

代码内容如下:

_init("SilkTestModelResourceModelJob");
    }
}

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

代码内容如下:

_init("silk_job", "entity_id");
    }

}

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

代码内容如下:

_init("SilkTestModelJob", "SilkTestModelResourceModelJob");
    }
}

到此,我们就创建了一个Model模型.接下来,我们来创建脚本文件,即Setup/目录下的文件

InstallSchema.php

UpgradeSchema.php

InstallData.php

UpgradeData.php

Recurring.php

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

创建表结构InstallSchema.php

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

代码内容如下:

startSetup();

        $table = $installer->getConnection()->newTable(
            $installer->getTable("silk_test")
        )->addColumn(
            "e_id",
            MagentoFrameworkDBDdlTable::TYPE_INTEGER,
            null,
            array("identity" => true, "nullable" => false, "primary" => true),
            "Employee ID"
        )->addColumn(
            "e_name",
            MagentoFrameworkDBDdlTable::TYPE_TEXT,
            255,
            array("nullable" => false),
            "Employee Name"
        )->addColumn(
            "e_address",
            MagentoFrameworkDBDdlTable::TYPE_TEXT,
            "2M",
            array("nullable" => false),
            "Employee Address"
        )->addColumn(
            "is_active",
            MagentoFrameworkDBDdlTable::TYPE_SMALLINT,
            null,
            array(),
            "Active Status"
        )->addColumn(
            "created_at",
            MagentoFrameworkDBDdlTable::TYPE_TIMESTAMP,
            null,
            array(),
            "Creation Time"
        )->addColumn(
            "update_time",
            MagentoFrameworkDBDdlTable::TYPE_TIMESTAMP,
            null,
            array(),
            "Modification Time"
        )->setComment(
            "Employee Table"
        );
        $installer->getConnection()->createTable($table);

        $installer->endSetup();

    }
}
upgrade表结构UpgradeSchema.php

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

代码内容如下:

startSetup();
        if (version_compare($context->getVersion(), "1.0.1") < 0) 
        {
            $installer->startSetup();
            $tableName = $setup->getTable("silk_test");
            if ($setup->getConnection()->isTableExists($tableName) == true) 
            {
                $installer->getConnection()
                ->addColumn($installer->getTable("silk_test"),"e_profile_picture", array(
                    "type"      => Table::TYPE_TEXT,
                    "nullable"  => true,
                    "length"    => 255,
                    "comment"   => "Profile Picture"
                )); 
            }            
        }
        
        $installer->endSetup();

    }
    
}

备注: 更新表结构要查看module.xml中的schema_version标签的值是否小于这里的版本号.

创建后台配置文件

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

menu.xml

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

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

代码内容如下:



    
        
        
    

说明:

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

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

id : 唯一标识符;

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

acl.xml

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

代码内容如下:



    
        
            
                
                
                    
                        
                        
                    
                    
                        
                        
                    
                
                

                
                
                    
                        
                            
                        
                    
                

            
        
    

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

routes.xml

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

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

代码内容如下:



    
        
            
        
    

说明:

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

id: 唯一标识符;

system.xml

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

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

代码内容如下:



    
        
            
        
        
test Silk_Test::test Show list of the viewing 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元查看
<