eth8505/laminas-mvc-themer

为 laminas-mvc 应用添加主题支持模块

1.2.0 2024-08-16 13:49 UTC

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 指定自定义元标签

与脚本、样式或变量相比,元标签要复杂一些,因为有两种基本类型,即 namehttp-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);
        
    }

}