seanmorris / theme
为PHP提供的简单、合理的模板和主题
Requires (Dev)
- simpletest/simpletest: dev-master
README
为PHP提供的简单、合理的模板和主题
主题库的目标是提供将表示层和逻辑层分离的起点。它只有两个职责
- 将对象映射到视图
- 渲染这些视图
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' ]; }