有时候你想用一些功能或设计来增强一个客户网站,而这个网站是非常特定的。当然,你可以做一个自定义的插件脚手架从插件到ry .io,并遵循所以你想做一个工艺3 插件?文章。
但是,对于很多事情来说,这似乎太多了。也许你只是想增强登录屏幕的外观来应用客户品牌的背景图片。一个自定义插件似乎有点多。
随着Craft CMS 3,Craft引入了一个模块的概念,它适合这种类型的场景完美的法案。
模块与插件
模块和插件之间的主要区别是:
插件可以被禁用
插件可以被卸载
插件在AdminCP中有一个设置框架
除此之外,它们非常相似。模块和插件都是用PHP编写的,可以访问完整的Craft CMS API。
当功能是网站的一个组成部分时,模块是一个完美的选择
即使您不认为自己是“ PHP开发人员”,也可以轻松获得一个简单的模块,并在Craft AdminCP中加载一些自定义的CSS或JavaScript,以增强客户的体验。
我们将在本文中向您展示如何做到这一点。
模块下的搜索引擎
考虑Modules的一个好方法就是它们是不能被卸载的插件。他们在易于实现和提供插件的功能之间取得了很好的平衡。
虽然很容易想到模块被剥离了插件,但实际上插件实际上是建立在模块之上的!
所以我们应该把插件当成增强模块
看看代码craft\base\Plugin:
/**
* Plugin is the base class for classes representing plugins in terms of objects.
*
* @property string $handle The plugin’s handle (alias of [[id]])
* @property MigrationManager $migrator The plugin’s migration manager
*
* @author Pixel & Tonic, Inc. <support@pixelandtonic.com>
* @since 3.0
*/
class Plugin extends Module implements PluginInterface
{
...
工艺\基地\插件扩展模块!
这是什么显示的是工艺CMS 3 插件实际上是Yii的2模块,但只是一些通过增强像素加入到他们与 进补。这些增强功能允许卸载插件,设置,AdminCP部分等。
这是一个主题,在 建立一个新的工艺CMS 3 项目文章中讨论,这是工艺CMS 3 已完全重构在Yii 2之上。
工艺CMS 3现在是内容管理系统(CMS)和内容管理框架(CMF)
这是一个重要的观点,因为许多定制的应用程序通常使用像Laravel这样的框架来构建,可以使用Craft CMS 3来构建。使用Craft 3检查 RESTful API是一个例子。
这意味着,我们很可能会看到Craft CMS 3 被用作一个框架和 基础的网络应用程序,想要一个真棒CMS后端免费。但是我离题了。。。。
设置站点模块
那么让我们来谈谈为我们的Craft网站建立一个实际的网站模块。这里列出的所有代码都在可用的网站模块如果您想下载GitHub库。
我们所有的网站模块的作用是加载一个资产包,其中包含CSS和JavaScript,我们希望在AdminCP加载。
这允许您在登录屏幕上执行诸如拥有客户品牌背景图片之类的 功能,或者通过CSS 和 JavaScript 来调整AdminCP 的外观和功能。
模块可以做得比这更多,实际上他们可以做任何插件可以做的事情。但是这个基础允许前端开发人员增强他们客户的网站,而不需要深入了解模块的工作原理。
你会发现,如果你使用的 composer create-project -s RC craftcms/craft PATH是命令 像素和 进补建议 ,以创建新的项目,他们甚至提供了一个样本 config/app.php ,并 modules/Module.php 已经为你。我们已经调整了一些东西,所以让我们开始吧!
这是项目树的样子。再次,你可以从完整的源 站点模块 GitHub的页面:
vagrant@homestead ~/webdev/craft/site-module (develop) $ tree -L 8 .
.
├── CHANGELOG.md
├── composer.json
├── config
│ └── app.php
├── LICENSE.md
├── modules
│ └── nystudio107
│ └── sitemodule
│ ├── assetbundles
│ │ └── sitemodule
│ │ ├── dist
│ │ │ ├── css
│ │ │ │ └── SiteModule.css
│ │ │ ├── img
│ │ │ └── js
│ │ │ └── SiteModule.js
│ │ └── SiteModuleAsset.php
│ └── SiteModule.php
└── README.md
10 directories, 9 files
站点模块项目树
如果看起来很复杂,不要担心。实际上有比文件更多的组织文件夹!它基本上有3个 部分:
工艺 config/app.php
模块本身在 modules/nystudio107/sitemodule/SiteModule.php
我们加载的资产包 modules/nystudio107/sitemodule/assetbundles/SiteModuleAsset.php
我们不需要命名空间的东西,nystudio107/sitemodule但我使用这个熟悉的Composer供应商/包命名空间,以防将来我最终添加其他模块。
你可以轻松地摆脱这两个目录,并将所有内容放在modules/目录本身。
那么我们来看看这三个细节:
链接1.编辑CONFIG / APP.PHP
该config/目录有很多的,你已经习惯了,像配置文件general.php,db.php等用于工艺的各种设置CMS 3。但它也可以有一个app.php配置文件。
该app.php配置文件是超级强大,因为它允许您覆盖或扩展的工艺的任何部分CMS 3 的Yii 2的应用程序。再读一遍,因为它很大。使用简单的配置文件,我们可以扩展Craft CMS 3的Yii 2应用程序,或者我们可以完全替换功能。
我们只是将脚趾插入它,并添加一些代码来告诉它我们的新模块,并为我们加载它。
<?php
/**
* Yii Application Config
*
* Edit this file at your own risk!
*
* The array returned by this file will get merged with
* vendor/craftcms/cms/src/config/app/main.php and [web|console].php, when
* Craft's bootstrap script is defining the configuration for the entire
* application.
*
* You can define custom modules and system components, and even override the
* built-in system components.
*/
return [
// All environments
'*' => [
'modules' => [
'site-module' => \modules\nystudio107\sitemodule\SiteModule::class,
],
'bootstrap' => ['site-module'],
],
// Live (production) environment
'live' => [
],
// Staging (pre-production) environment
'staging' => [
],
// Local (development) environment
'local' => [
],
];
配置/ app.php
阿斯
我们给Craft模块的类,以及site-module引用它的句柄,然后我们告诉它加载它的每个请求通过bootstrap。
2.模块类
接下来,我们有我们的Module类本身modules/nystudio107/sitemodule/SiteModule.php。这是每个请求实际加载和执行的内容:
<?php
/**
* SiteModule
*
* @link https://nystudio107.com
* @copyright Copyright (c) 2017 nystudio107
*/
namespace modules\nystudio107\sitemodule;
use modules\nystudio107\sitemodule\assetbundles\sitemodule\SiteModuleAsset;
use Craft;
use craft\events\TemplateEvent;
use craft\web\View;
use yii\base\Event;
use yii\base\InvalidConfigException;
use yii\base\Module;
/**
* @author nystudio107
* @package SiteModule
* @since 1.0.0
* @inheritdoc
*/
class SiteModule extends Module
{
// Public Methods
// =========================================================================
/**
* @inheritdoc
*/
public function init()
{
Craft::setAlias('@site-module', $this->getBasePath());
parent::init();
// Only respond to AdminCP requests
$request = Craft::$app->getRequest();
if ($request->getIsCpRequest()) {
// Handler: View::EVENT_BEFORE_RENDER_TEMPLATE
Event::on(
View::class,
View::EVENT_BEFORE_RENDER_TEMPLATE,
function (TemplateEvent $event) {
Craft::trace(
'View::EVENT_BEFORE_RENDER_TEMPLATE',
__METHOD__
);
// Add our SiteModule AssetBundle
$view = Craft::$app->getView();
try {
$view->registerAssetBundle(SiteModuleAsset::class);
} catch (InvalidConfigException $e) {
Craft::error(
'Error registering AssetBundle - '.$e->getMessage(),
__METHOD__
);
}
}
);
}
}
}
模块/ nystudio107 / sitemodule / SiteModule.php
这里我们所做的就是设置一个Yii 2别名到我们的Module的目录中,以便稍后使用它,检查以确保这是一个AdminCP
请求(这不是控制台/命令行请求),然后监听 EVENT_BEFORE_RENDER_TEMPLATE事件。
这个事件在即将被渲染的小枝模板之前被触发。这可以让我们加载我们的资产包和其 最后的CSS 和 JavaScript,一切已经加载之后。
这是伟大的,因为我们通常要覆盖在AdminCP东西的外观或功能,并CSS特异性意味着如果我们在最后加载,我们得到的正是这样做的一个镜头。
3.我们的资产包
资产包只是一些任意资源的集合,例如CSS,JavaScript,图像等,需要在前端加载和使用。
这是我们的modules/nystudio107/sitemodule/assetbundles/SiteModuleAsset.php样子:
<?php
/**
* SiteModule AssetBundle
*
* @link https://nystudio107.com
* @copyright Copyright (c) 2017 nystudio107
*/
namespace modules\nystudio107\sitemodule\assetbundles\sitemodule;
use craft\redactor\assets\redactor\RedactorAsset;
use craft\web\AssetBundle;
use craft\web\assets\cp\CpAsset;
/**
* @author nystudio107
* @package SiteModule
* @since 1.0.0
* @inheritdoc
*/
class SiteModuleAsset extends AssetBundle
{
// Public Methods
// =========================================================================
/**
* @inheritdoc
*/
public function init()
{
// Set the path to our AssetBundle source
$this->sourcePath = '@site-module/assetbundles/sitemodule/dist';
// Declare AssetBundles that must be loaded first
$this->depends = [
CpAsset::class,
];
// Add in our CSS
$this->css = [
'css/SiteModule.css',
];
// Add in our JS
$this->js = [
'js/SiteModule.js',
];
parent::init();
}
}
模块/ nystudio107 / sitemodule / assetbundles / SiteModuleAsset.php
它只是设置sourcePath到我们的dist/目录,这意味着在dist/目录下的所有东西都是应该发布在前端web/cpresources/的哈希目录名称。
然后它说我们依赖于已经加载的AdminCP AssetBundle,并给出了 我们想要注入到AdminCP模板中的CSS 和 JavaScript 的路径。
所有你真正需要了解的是,dist/目录中的所有内容都将被发布,web/cpresources/并且 我们指定的CSS 和 JavaScript将被加载:
vagrant@homestead ~/webdev/craft/site-module/modules/nystudio107/sitemodule/assetbundles/sitemodule (develop) $ tree -L 3 .
.
├── dist
│ ├── css
│ │ └── SiteModule.css
│ ├── img
│ └── js
│ └── SiteModule.js
└── SiteModuleAsset.php
4 directories, 3 files
资产包目录树
所以你可以修改SiteModule.css和SiteModule.js你的心脏的内容,它会被我们的模块在AdminCP加载。
使作曲家快乐
为了使作曲家高兴,我们还需要确保我们的项目composer.json文件中包含以下内容:
"autoload": {
"psr-4": {
"modules\\": "modules/"
}
},
添加到composer.json
这只是确保作曲家将知道在哪里可以找到我们的模块。你可能还需要做:
composer dump-autoload
重建Composer自动载入映射
...从项目的根目录(如果您还没有上述内容)composer.json重建Composer自动载入映射。这将自动发生。