etc/module.xml //插件配置文件
composer.json //插件依赖,用来打包上传
registration.php //插件注册文件
这几个文件是必须的。
因为我目前的项目是magento2demo,所以我的项目插件为Zou_Demo.
也就是把针对该项目的所有修改(针对php逻辑代码部分)都放在Zou_Demo插件里。
Zou -> 公司名
Demo -> 插件名
Block -> 块
Controller -> 控制器
etc -> 配置文件
adminhtml -> 后台配置文件
routes.xml ->后台路由
frontend -> 前台配置文件
routes.xml -> 前台路由
config.xml -> 默认配置数据
module.xml ->模块配置
Helper -> 帮助(helper)类
Data.php -> 默认帮助类
i18n -> 插件翻译文件
zh_Hans_CN.csv -> 中文翻译文件
Model -> 模型类
Setup -> 数据库安装以及升级脚本数据
InstallData.php -> 默认设置和默认数据的增删改 (第一次安装生效)
UpgradeData.php -> 版本升级后的默认设置和数据的增删改
InstallSchema.php -> 表和字段相关的增删改 (第一次安装生效)
UpgradeSchema.php -> 版本升级后的表和字段相关的增删改
view -> 视图文件
frontend -> 前台
layout -> 布局xml
templates -> 模版
web -> js/css/图片/字体等
composer.json -> 插件composer依赖
registration.php -> 插件注册
可以发现,这个插件就相当于是一个非常独立的网站模块了,MVC架构,自带翻译+数据库+js/css等。
有几点要注意下:
关于建表, 2.3.x里开始用声明式架构 (db_schema.xml)来建了,https://devdocs.magento.com/guides/v2.3/extension-dev-guide/declarative-schema/
当然下面说的Setup
方法也是可用的,冒得问题,放心大胆用即可。
你也可以用2.3.x提供的命令来把下面Setup
里的php建表代码转换成db_schema.xml。
module.xml里有schema_version
和setup_version
。
这2个是什么东西呢?
schema_version
对应Setup
目录下面的InstallSchema.php
和UpgradeSchema.php
,主要是数据库表和字段相关的操作。setup_version
对应Setup
目录下面的InstallData.php
和UpgradeData.php
,主要是属性相关的操作。举个例子,
老板要我做一个推荐插件,根据用户购买习惯推荐产品给他。
你肯定要建一个表,来保存对应关系。
你还要给插件设置一个版本号(比如1.0.0版本),方便以后升级维护。
那么,你创建表的代码就应该写在InstallSchema.php
里。
版本号写在schema_version
,为schema_version = "1.0.0"
,
老板又说,我们应该给插件加一些演示数据,可以更直观,免得别人不知道怎么用。
那么这些演示数据应该写在InstallData.php
里。
版本号写在setup_version
,为setup_version = "1.0.0"
。
嗯,插件上线了,用了一段时间,老板又说还要加点东西,还得加个统计表,后台分析。也得加些默认设置和演示数据。
现在等于是插件要升级了,所以我们要改下版本号,好让系统更新最新数据。
版本号改成了1.1.0
,
创建新表的代码就应该写在UpgradeSchema.php
里,
版本号写在schema_version
,改为schema_version = "1.1.0"
,
新的演示数据应该写在UpgradeData.php
里。
版本号写在setup_version
,为setup_version = "1.1.0"
。
嗯,好了,插件升级到了1.1.0版本,上线了几个月,老板又要加表/加功能/改字段。
那么以后该插件的数据库表和数据相关的升级,都写在UpgradeSchema.php
和UpgradeData.php
里。
你会觉得太麻烦了,为啥不能直接写在一个文件里呢?
为什么要分schema_version
和setup_version
。
为什么要有InstallData.php
,UpgradeData.php
,InstallSchema.php
,UpgradeSchema.php
。
太他妈麻烦了。数据库相关的操作不能直接写在一个文件里吗?
嗯,可以的。
刚出炉的插件的数据库脚本写在InstallSchema.php
里。
后续升级的数据库脚本都写在UpgradeSchema.php
里。
其实InstallData.php
跟,InstallSchema.php
UpgradeData.php
跟UpgradeSchema.php
没有严格的区分,基本上是通用的。
只要schema_version
和setup_version
的版本号一致就行。都设一样。
比如插件升级到2.0.0版本了。那么schema_version = "2.0.0"
和setup_version = "2.0.0"
。
搞一样就行了。
执行命令
php bin/magento setup:upgrade
就会自动更新。
至于UpgradeSchema.php
里的代码怎么写?
看插件实战
。
参考这篇文章,更深入:
https://inviqa.com/blog/using-setup-scripts-magento-2
另外插件的版本号都记录在
setup_module
表里,如果你想要重新安装插件执行InstallData.php
或者InstallSchema.php
里的数据的话,需要去setup_module
表里删掉当前插件的记录,然后执行php bin/magento setup:upgrade
插件里包括 block
,hepler
,model
,controller
,widget
。
我想知道这几个代码里应该继承哪个类?
按照m2的做法,一般这样继承
继承 \Magento\Framework\View\Element\Template
类。
比如
继承 \Magento\Framework\App\Helper\AbstractHelper
类。
比如
这个没有强制性要求,最终继承的是 \Magento\Framework\DataObject
类。
比如
控制器分前台控制器和后台控制器,不一样,因为后台控制器是在后台操作的,需要权限验证,
前台控制器 继承 \Magento\Framework\App\Action\Action
类
比如
后台控制器 继承 \Magento\Backend\App\Action
类
比如
widget
其实本质就是block
,用于前台显示的,继承 \Magento\Framework\View\Element\Template
类。
我们项目里一般很少用widget
,这个东西要在后台widget
里设置,太灵活,比较繁琐,一般开发中用的不多。