seanmorris/theme

为PHP提供的简单、合理的模板和主题

1.0.8 2022-01-17 21:40 UTC

This package is auto-updated.

Last update: 2024-09-18 03:37:46 UTC


README

为PHP提供的简单、合理的模板和主题

Build Status Latest Stable Version Total Downloads Latest Unstable Version License

主题库的目标是提供将表示层和逻辑层分离的起点。它只有两个职责

  • 将对象映射到视图
  • 渲染这些视图

Composer

只需在您的项目目录中运行 composer require seanmorris/theme

您也可以将 "seanmorris/theme": "^1.0.0" 添加到您项目中的 composer.json 文件的 require 数组。

"require": {
  "seanmorris/theme": "^1.0.0"
}

模板化

将模板与视图类耦合非常简单。只需简单地继承提供的视图并在调用 __halt_compiler();(带有闭合的 ?>)后附加模板即可,如下所示

(注意:从 PHP 5.4 开始启用了短标签,用于简单的 echo 语句,但不是必需的)

<?php
class FooView extends \SeanMorris\Theme\View
{
}
__halt_compiler(); ?>
<h1>FooView</h1>
<span class = "some_class"><?=$a;?></span>
<p><?=$b;?>. <b><?=$c;?></b></p>

将关联数组传递给构造函数以填充模板中的变量。数组的键将被转换为变量名。

<?php
$view = new FooView([
  'a' => 'value'
  , 'b' => 'value'
  , 'c' => 'value'
]);

echo $view;

预处理

预处理模板很简单。只需在您的视图类中实现 preprocess 方法,您就会有机会在渲染之前操作变量。

<?php
class FooView extends \SeanMorris\Theme\View
{
  public function preprocess(&$vars)
  {
    $vars['a'] = $vars['a'] . '...';
    $vars['b'] = $vars['b'] . '?';
    $vars['c'] = $vars['b'] . '!'
  }
}
__halt_compiler(); ?>
<h1>FooView</h1>
<span class = "some_class"><?=$a;?></span>
<p><?=$b;?>. <b><?=$c;?></b></p>

用法

<?php
$view = new FooView([
  'a' => 'value'
  , 'b' => 'value'
  , 'c' => 'value'
]);

echo $view;

主题化

创建主题就像扩展主题类,并提供从您的对象类到视图类的映射,如下所示

<?php
class Theme extends \SeanMorris\Theme\Theme
{
  protected static
  $view = [
    'SeanMorris\Foo' => 'SeanMorris\Theme\FooView'
  ];
}

用法

<?php echo Theme::render(new Foo(...)); ?>

包装

如果您有一个默认的“trim”要用于包装一切(即包含您的 和结构的视图),只需将静态属性 $wrap 设置为一个数组,列出您的包装器,从内到外。

<?php
class Theme extends \SeanMorris\Theme\Theme
{
  protected static
  $wrap = [
    'SeanMorris\Theme\Wrapper'
    , 'SeanMorris\Theme\HtmlDocument' 
  ];
}

用法

<?php
$bodyText = 'Lorem ipsum dolor sit amet...';
echo Theme::wrap($bodyText);

高级内容...

尽管库没有做什么,但它内部有一些功能。

后备主题

如果主题无法渲染对象,它可以将其渲染推迟到可以渲染给定对象的其它主题。这是通过指定 $themes 静态属性来完成的。列表将按顺序检查,直到有主题能够渲染指定的对象。

<?php
class Theme extends \SeanMorris\Theme\Theme
{
  protected static
  $themes = [
    'SeanMorris\SomeTheme\Theme'
    , 'SeanMorris\SomeOtherTheme\Theme'
  ];
}

视图类子类化

您可以从任何视图类进行子类化并保留模板,通过省略对 __halt_compiler() 的调用并扩展现有的视图。您可能还想覆盖父级预处理器。

<?php
class FoozleView extends FooView
{
  public function preprocess(&$vars)
  {
    parent::preprocess($vars);
    $vars['a'] = $vars['object']->a . 'DIFFERENT!!!';
  }
}

上下文化主题化

通过在 $contextViews 数组中定义类到视图的映射,您可以在从某些类调用渲染调用时指定视图应以不同的方式渲染。

在这个例子中,SeanMorris\Stuff\Foo 当在 SeanMorris\Stuff\RandomObject 类内部渲染时将使用 SeanMorris\Theme\FooAlternateView 类,但外部将使用 SeanMorris\Theme\FooView

<?php
class Theme extends \SeanMorris\Theme\Theme
{
  protected static
  $contextView = [
    'SeanMorris\Stuff\RandomObject' => [
      'SeanMorris\Stuff\Foo' => 'SeanMorris\Theme\FooAlternateView'
    ]
  ]
  , $view = [
    'SeanMorris\Stuff\Foo' => 'SeanMorris\Theme\FooView'
  ];
}