eth8505 / laminas-mvc-themer
为 laminas-mvc 应用添加主题支持模块
Requires
- php: ^8.1
- laminas/laminas-eventmanager: ^3.3
- laminas/laminas-modulemanager: ^2.10
- laminas/laminas-mvc: ^3.3
- laminas/laminas-servicemanager: ^3.4
- laminas/laminas-stdlib: ^3.3
- psr/container: ^1.0 || ^2.0
This package is auto-updated.
Last update: 2024-09-16 13:56:55 UTC
README
eth8505/laminas-mvc-themer 模块为 laminas-mvc 应用添加主题支持。
如何安装
通过 composer 安装 eth8505/laminas-mvc-themer
包。
$ composer require eth8505/laminas-mvc-themer
在您的 application.config.php
文件中加载模块,如下所示
<?php return [ 'modules' => [ 'LaminasMvcThemer', // ... ], ];
如何使用
1 创建主题
如上所述,主题需要通过主题插件管理器进行注册。主题必须实现 ThemeInterface
。所有方法除了 getName
之外都可以返回一个空数组。检查 DefaultTheme
类以查看一个仅指定名称的主题的空实现。
1.1 指定自定义样式表
在您的主题中实现 getStylesheet
方法,并返回一个数组。请注意,所有路径将通过 BasePath
视图助手进行推送,因此必须相对于您的 public/
目录。
<?php use LaminasMvcThemer\Theme\ThemeInterface; class MyTheme implements ThemeInterface { // ... public function getStylesheets() : array { return [ 'css/theme/my/custom/file.css' ]; } // ... }
所有样式表都使用 HeadLink
视图助手中的 appendStylesheet
方法注入。
1.2 指定自定义 JavaScript
在您的主题中实现 getScripts
方法,并返回一个数组。请注意,所有路径将通过 BasePath
视图助手进行推送,因此必须相对于您的 public/
目录。
<?php use LaminasMvcThemer\Theme\ThemeInterface; class MyTheme implements ThemeInterface { // ... public function getScripts() : array { return [ 'css/theme/my/custom/file.js' ]; } // ... }
所有脚本都使用 HeadScript
视图助手的 prependFile
方法注入。
1.3 指定自定义变量
在您的主题中实现 getVariables
方法,并返回一个数组。请注意,所有路径将通过 BasePath
视图助手进行推送,因此必须相对于您的 public/
目录。
<?php use LaminasMvcThemer\Theme\ThemeInterface; class MyTheme implements ThemeInterface { // ... public function getVariables() : array { return [ 'heading1' => 'one', 'heading2' => [ 'key1' => 'test' ] ]; } // ... }
主题变量不会自动注入到您的视图模型中,因为这可能会干扰您在视图模型中设置的内容。然而,该模块提供了一个 theme()
视图助手,允许访问主题变量。
<html> <body> <h1><?= $this->theme()->var('heading1') ?></h1> <h2><?= $this->theme()->var('heading2/key1') ?></h2> </body> </html>
1.4 指定自定义元标签
与脚本、样式或变量相比,元标签要复杂一些,因为有两种基本类型,即 name
和 http-equiv
。使用本模块,我们对两者使用相同的语法,将 type
作为定义数组中的键进行指定。要实现自定义元标签,在您的主题中实现 getMetaTags
方法。
<?php use LaminasMvcThemer\Theme\ThemeInterface; class MyTheme implements ThemeInterface { // ... public function getMetaTags() : array { return [ [ 'type' => 'name', 'name' => 'robots', 'content' => 'noindex,nofollow' ], [ 'type' => 'http-equiv', 'name' => 'refresh', 'content' => '30' ] ]; } // ... }
2. 在服务管理器中注册
您可以通过 module.config.php
中的配置将您的主题注册到服务管理器
<?php return [ 'laminas-mvc-themes' => [ 'invokables' => [ MyTheme::class ] ] ];
或者使用 ThemeProviderInterface
在您的模块类中注册它
<?php namespace MyModule; use LaminasMvcThemer\Theme\ThemeProviderInterface; class Module implements ThemeProviderInterface { /** * @inheritdoc */ public function getThemeConfig() { return [ 'invokables' => [ MyTheme::class ] ]; } }
3. 解决主题
默认情况下,主题解决是通过 ConfigResolver
类完成的,它简单地检查配置 laminas-mvc-themer/resolver
配置,并将主题作为 theme
服务注入。
3.1 自定义主题解决程序
除了默认的基于配置的主题解决程序之外,您还可以指定一个自定义解决程序类。这可以是您选择的任何实现了 ThemeResolverInterface
的实现,从会话中读取主题(如果您想为用户提供主题选择)。
简单基于主机名的主题解决程序的示例实现
<?php namespace MyModule; use LaminasMvcThemer\Resolver\ThemeResolverInterface; use LaminasMvcThemer\Theme\ThemeInterface; use LaminasMvcThemer\Theme\ThemePluginManager; use Laminas\Http\Request; class Module implements ThemeResolverInterface { private $request; private $pluginManager; public function __construct(Request $request, ThemePluginManager $pluginManager) { $this->request = $request; $this->pluginManager = $pluginManager; } public function resolve() : ThemeInterface { if ($this->request->getUri()->getHost() === 'my.awesome.host') { $theme = ThemeOne::class; } else { $theme = ThemeTwo::class; } return $this->pluginManager->get($theme); } }