主轴/视图

简单的布局渲染器

1.0.3 2015-04-19 15:28 UTC

This package is not auto-updated.

Last update: 2024-09-24 01:02:39 UTC


README

Build Status Scrutinizer Code Quality Code Coverage Latest Stable Version Total Downloads Latest Unstable Version License

这是一个用于在将纯PHP作为模板引擎使用时实现布局结构的库。这是一个非常小巧的库,只有一个类,但几乎涵盖了所有的“继承”功能。

没有自动转义等功能,但已经以helper的形式实现了最基础的转义功能。

可以使用composer进行安装。

$ composer require "spindle/view:*"

从版本1.0.2开始,GitHub的zip-archive中只包含最基本的数据源代码。如果需要test或example,请参考此仓库或使用--prefer-source选项。

$ composer require "spindle/view:*" --prefer-source

使用方法

由于只有一个类,因此可以通过require_once加载,也可以通过composer自动加载。

1. 简单示例

template.phtml是一个用纯PHP编写的模板文件。将 $title和$main 填充后,就可以得到完整的HTML字符串。

<html>
<head>
 <title><?= $title ?></title>
</head>
<body>
 <h1><?= $title ?></h1>
 <div class="main">
  <?= $main ?> 
 </div>
</body>
</html>

要将其转换为HTML,可以编写以下脚本。

<?php
require 'vendor/autoload.php';

$view = new Spindle\View('template.phtml');
$view->title = 'Spindle Example';
$view->main  = 'Hello! Spindle/View!';

echo $view->render();

render()方法将模板文件转换为字符串并返回。render()方法本身不会输出到屏幕,因此需要根据需要使用echo进行输出。

1-1. 视图变量传递方式

在将值传递到模板文件时,有多种方法。

//一つ一つ渡す
$view->title = 'sample';
$view->data = array(1,2,3);

//連想配列からまとめて渡す
$view->assign(array(
    'title' => 'sample',
    'data' => array(1,2,3),
));

// compactを使うとこんな書き方でもOK
$title = 'sample';
$data = array(1,2,3);
$view->assign(compact('title', 'data'));

另一方面,在接收端的模板文件中,变量是展开的。可以用$title$data来引用。也可以用$this->title$this->data来引用。添加this的方法是冗余的,但在变量替换操作期间,会有不同的行为。具体请参考布局部分。

<!-- 同じ意味 -->
<title><?= $title ?></title>
<title><?= $this->title ?></title>

<ul>
<?php foreach ($data as $i): ?>
 <li><?= $i ?></li>
<?php endforeach ?>
</ul>

可以传递的变量类型没有限制,可以直接传递对象。

与PHP的常规函数不同,模板文件没有明确指出可以接受哪些参数。与传递大量变量相比,将变量组合成一个或两个对象传递可能更容易维护。

1-2. 视图变量作用域

视图脚本在函数内执行,因此变量的作用域是局部的。在模板文件中随意创建或修改变量是局部的,不会污染全局空间。

1-3. 模板文件搜索路径

如果未指定特定的路径来搜索template.phtml,则会按顺序搜索include_path。如果没有改变PHP的设置,则view脚本和相同路径将作为最优先搜索。

如果需要从特定路径指定,请使用第二个参数指定搜索基准路径。绝对路径和相对路径都可以。

$view = new Spindle\View('template.phtml', '/path/to/template');

2. 布局

模板可以是嵌套的。

假设template.phtml写成以下这样,

<?php $this->setLayout('layout.phtml') ?>
template

而layout.phtml写成以下这样,

<div>
<?= $this->content() ?>
</div>

template.phtml的结果将是以下这样。

<div>
template
</div>

请注意,template.phtml指定了应该是父布局模板的模板。$this->content()在存在子模板时返回其绘制结果,单独调用时返回空字符串。

2-1. 模板的绘制顺序

模板是从内部开始的。因此,如果对视图变量进行加工,会影响到外部的布局模板。具体请参考example/03

特别是,对数组类型的视图变量进行操作时,可能会出现意想不到的行为。使用$this->append($name, array( ... ))$this->prepend($name, array( ... ))可以更直观地处理数组类型的视图变量。

3. 嵌套布局

布局可以无限嵌套。(实际上,取决于计算机内存的容量。)如果父布局模板设置了setLayout,则可以无限嵌套。

具体请参考example/04

4. 部分模板

可以使用$this->partial()方法代替PHP的include语句。可以从相同的基准路径搜索模板,部分模板也可以通过setLayout嵌套。

具体请参考example/05example/06

许可证

Spindle/View的版权已经放弃。使用时没有限制,不需要联系作者或显示版权声明。即使是代码片段也可以随意复制使用。

许可证原文

CC0-1.0 (无保留权利)