coreorm/slim3-view

slim3 的视图渲染器,具有非常直接和简单(但仍然可定制)的主题/布局/模板结构

v1.1.6 2016-09-30 07:05 UTC

This package is not auto-updated.

Last update: 2024-09-28 19:52:45 UTC


README

Build Status

slim3 的视图渲染器,具有非常直接和简单(但仍然可定制)的主题/布局/模板结构。

这也适用于任何符合 PSR-7 规范的响应对象。

示例

要求

  • php 5.6+
  • composer

安装

composer require coreorm/slim3-view

测试

phpunit

结构

确保您的主题目录结构如下

themes
├── default
│   └── layouts
│       └── default.phtml
├── theme 1
│   ├── layouts
│   │   └── main.phtml
│   └── views
│       └── index.phtml
...
  • 布局:布局文件应放置在 <theme name>/layouts/ 目录。
  • 注意,如果没有找到自定义布局,建议使用默认布局,它将回退到默认布局。
  • 视图:视图必须位于 views 下,但可以位于嵌套目录中,在需要渲染时,只需使用相对于 views 的相对路径即可,例如,如果您有 views/foo/bar.phtml,只需调用 $theme->render($response, 'foo/bar')

布局模板

布局模板必须在主体中包含默认变量 $mainContent,以便子模板可以出现,例如。

# file: themes/default/layouts/default.phtml

...
<body><?php echo $mainContent; ?></body>
...

另一种将渲染的内容发送到页面的方法是使用 $theme->renderView(),例如。

# in route
$theme->setData('myHeader', $theme->renderView('shared/header'));

# in layout

...
<head>
echo $myHeader
</head>
...

使用示例(或只需打开 examples/app/index.php)

  • 与 slim 一起使用
use \Coreorm\Slim3\Theme;

$app = new Slim\App();

$theme = Theme::instance(__DIR__ . '/../themes', 'example');
// set layout
$theme->setLayout('main')->setData('title', 'Slim 3 View Example');

$app->get('/', function ($request, $response, $args) use ($theme) {
    return $theme->render($response, 'index', [
        'foo' => 'bar'
    ]);
});

$app->run();
  • 与其它符合 PSR-7 规范的库一起使用
$response = new Response();
$response = Theme::instance('theme-base-dir', 'theme-name')->render($response, 'template-name', [data array]);
echo $response->getBody();

APIs

主题 API

Theme::instance($templatePath = null, $theme = 'default')

实例化主题类:我们使用单例模式确保所有共享数据对每个模板都可用,因此只需使用

use \Coreorm\Slim3\Theme;

$theme = Theme::instance('theme base directory', 'layout name');

$theme->setLayout($layout)

切换布局:可以在代码的开始或运行时在路由中切换布局。

$theme->setLayout('layout name');

例如。

$app->get('/', function ($request, $response, $args) use ($theme) {
    $theme->setLayout('new-layout');
    return $theme->render($response, 'index', [
        'foo' => 'bar'
    ]);
});

$theme->setTheme($theme)

切换主题:这将设置当前主题为 $theme 的字符串值。

$theme->share($templateRelativePath, $theme)

标记特定主题的模板为可共享:这将使其成为一个全局模板,在找不到不同主题中具有相同名称的模板时使用。

  • $templateRelativePath 模板的相对路径
  • $theme 主题名称

例如。

$theme->share('views/page1', 'default');

这将标记页面 themes/default/views/page1.phtml 为相对路径 views/page1 的共享视图,因此如果我在主题 'new' 中,调用 renderView('page1'),如果 themes/new/views/page1.phtml 不存在,它将使用 themes/default/views/page1.phtml 代替。

$theme->render(ResponseInterface $response, $template, array $data = [], $shouldFallback = false)

渲染模板及布局:这是您想在路由/控制器中运行的最终渲染函数,因为它渲染了给定的模板并将其分配给 $mainContent 部分数据,然后将其显示在模板的主要主体(或您想显示的地方,通过调用 <?php echo $mainContent; ?>)中。因此,它渲染模板,然后布局,然后输出到浏览器。

  • $shouldFallback - 当此设置为 true 时,系统将尝试找到回退模板,如果找不到给定的模板(有关详细信息,请参阅上面的 share API)。

例如。

$theme->render($response, 'relative path/template name', [partial data], true);

$theme->renderView($template, $data = [], $shouldFallback = true, $reuseHTML = false)

渲染模板并获取内容:这将渲染模板并返回 html。

$reuseHTML 如果设置为true,则给定模板将只渲染一次,并且对同一模板的任何后续的 renderView/import 调用都将重用从第一次渲染生成的HTML。适用于页面中重复出现且具有完全相同HTML源代码的元素。

例如。

$viewSrcHTML = $theme->renderView('relative path/template name', [partial data]);

模板(布局/视图)API

$this->import($templateFile, $data = [], $shouldFallback = true, $reuseHTML = false)

在模板内部导入子模板 这只在模板内部可用。

在模板代码中,执行

$this->import('relative path/template name', [partial data]);

数据范围

全局(对所有模板都可用)

$theme->setData($k, $v) 设置对所有模板/布局都有效的数据;

私有(部分数据将覆盖全局数据,当用于渲染单个视图时使用)

将部分数据传递给render/import函数将仅设置给定模板的私有数据。例如,$theme->render($response, 'page', ['foo' => 'bar']) 将仅将 $foo 的值设置为 'bar' 用于 page 模板。