grithin/phptemplate

v4.0.2 2021-06-28 15:19 UTC

This package is auto-updated.

Last update: 2024-09-15 21:07:31 UTC


README

一个可定制的简单模板系统,使用原生PHP。

功能

  • 模板层次结构(一个模板可以有父级包装器)
  • 区域化部分(可以定义稍后包含的区域)
  • 组件化部分(可以在模板内要求另一个模板)
  • 可预期的包含路径
    • 依赖于文件系统层次结构
    • 允许相对路径包含(相对于当前模板)

关于PHP-HTML集成的注意事项

意大利面代码很糟糕,但将PHP代码与HTML集成不一定会导致意大利面代码。

如果你遵循一套合理的规则,并且不将控制代码与视图代码混合,你就没问题。

人们提出使用具有自定义语法的模板系统的理由通常是不合理的

  • 更好的语法。 这取决于你的观点
  • 简短的帮助函数。这个工具可以拥有简短的帮助函数。我们可以让$e执行HTML转义
<span><?= $e($name) ?></span>

在排除避免意大利面代码之后,剩下的唯一原因是安全性。一些模板引擎允许你防止执行任意PHP代码,这允许你减少设计者在使用代码时可能造成的损害。
尽管即使模板是用原生PHP代码编写的,也可以进行安全性操作(get_all_tokens),但我没有这样的需求,所以我没有扩展这个工具来执行这样的操作,如果你需要这种安全性,你应该选择另一个具有此功能的模板引擎(twig)或者说服我花时间扩展这个工具。

为什么?

可能主要是由于2006年的一次不良经历,当时我不得不重写smarty模板引擎的各个部分来修复公司遇到的缓存问题。但,除此之外

  • 我不认为在PHP之上添加更多开发者需要学习的自定义语法有什么好处
  • 有时,在模板显示之前对数据进行格式化是必要的PHP代码。在自定义语法模板引擎中,这些PHP代码被迫放在控制代码中,尽管它们是视图代码。
  • Laravel的Blade模板引擎很荒谬。在众多事情中,它将参数作为一个未解析的单个字符串传递给辅助函数。祝你成功地找出如何在模板内包含另一个模板文件的方法。
  • Twig。如果你想将变量传递给父模板,你必须将这些变量转换为块。在这个引擎中,不仅传递给子模板的模板变量会被传递到父模板,而且子模板还可以添加变量传递给父模板。
  • 一般来说,子PHP模板的功能集将始终小于PHP模板。

指南

直接使用

$Template = new \Grithin\Template(['directory'=>__DIR__.'/templates/']);
$Template->get('page', ['first_name'=>'bob']);

模板文件预期以.php结尾

你可以在模板内包含另一个模板

<?= $Template->get('sidemenu') ?>

你甚至可以相对于当前模板的路径这样做

<?= $Template->get('./sidemenu') ?>

如果网站部分有自己的侧边菜单,这可能很有用。

模板文件中的 $Template 变量被注入到模板的上下文中。它可以以三种方式引用,即 $t$template$Template,但只有 $Template 可以保证不会被覆盖。

这些键是提供给模板的辅助数组的一部分。辅助数组是一个列表,其中包含了导入到模板作用域中的变量。这些变量可以是值、闭包或任何可以放入变量中的内容。

$Template = new Template([
	'helpers'=>[
		'upper'=>function($x){ return strtoupper($x)},
		'name' => 'bob'	]])
<span><?= $upper($name) ?></span>

实例级别的辅助变量,如 t,可能会被提供给 get 调用的具有相同键的变量覆盖。

$template->get('view_user', ['t'=> 'this will override the template variable for this template file inclusion'])

为了避免使用可能不存在的变量,传递给 get 的变量作为 $vars 中的键可用。

<?= isset($vars['name']) ? $name : 'Default Person' ?>

$vars 代表通过 get 传递的变量。$vars 可以被传递的变量覆盖。如果 $vars 被覆盖,它仍然可以通过 $Template->vars 访问。

您还可以访问被覆盖的类实例辅助函数。

<?= $helpers['name'] ?>
<?= $Template->helpers['name'] ?>

要获取当前模板的字符串标识,请使用 <?= $Template->template ?>

部分和层次结构

模板可以有一个父模板/布局。

<?php $Template->parent('layout') ?>

<div> Hello </div>

父模板通过 $Template->inner 指向子模板的内容。

<html><body> <?= $Template->inner ?> </html></body>

模板还可以使用部分。

<!-- create a header section and put meta tag into it -->
<?php	$Template->section('header') ?>
<meta charset="utf-8" >
<?php	$Template->section_end() ?>

父模板或其他模板可以使用这些定义的部分。

<head>
	<?= $Template->sections['header'] ?>
</head>
<?=

您可以附加一个现有的部分。

<?php	$Template->section('header') ?>
<?= $Template->sections['header'] ?>
<meta property="og:type" content= "website" />
<?php	$Template->section_end() ?>

如果需要,您可以直接设置部分变量。

<?php	$Template->sections['title']='The Page Title' ?>

父模板的复杂性

父模板获取传递给子模板的变量。尽管如此,子模板也可以向父模板传递变量,并且这些变量将根据键覆盖模板中的子变量。

<?php $Template->parent('layout', ['theme'=>'blue']) ?>