dhelfie / template-system
简单的PHP模板引擎
Requires
- php: >=8.0
Requires (Dev)
- phpunit/phpunit: 9.5.5
README
TemplateSystem是一个简单易用且快速的模板引擎。
简单,因为无需学习新的语法。因为所有功能都使用PHP的原生函数。
由于非常简单,TemplateSystem也可以被视为不是一个模板引擎。这更像是一个库,它简化了创建视图/部分模板的过程。
安装
通过Composer安装。
composer require dhenfie/template-system --no-dev
TemplateSystem需要PHP 8或更高版本。
首先,我需要导入Composer的autoloader以确保其工作,并创建一个来自dhenfie\TemplateSystem\TemplateSystem
类的对象。
require '../vendor/autoloader.php'; // sesuaikan dengan path autoloader anda $engine = new Dhenfie\TemplateSystem\TemplateSystem(); $engine->setViewPath('example'); // set root viewpath echo $engine->render('main.php'); // render template
注意setViewPath()
方法,该方法用于设置模板文件所在的目录。
在上面的例子中,render()
方法用于渲染一个位于'example'目录中的'example/main.php'模板文件。
渲染模板
可以使用TemplateSystem::render()
方法来渲染模板。
例如,渲染main.php模板:
$engine = new TemplateSystem(); $engine->setViewPath('example'); echo $engine->render('main.php');
我们还可以通过将键值对数组作为第二个参数添加到参数中向模板发送数据。
数组中的键将成为变量的名称。
echo $engine->render('main.php', ['message' => 'hello world']);
main.php
<?php // 'hello world' echo $message; ?>
发送到模板的数据也在模板主文件中可用。
使用块区域
块区域是一个特性,允许我们创建一个被包围在块中的视图。
block-section.php
<?php // create section 'message' section('message');?> <h1> Hello World </h1> <?php endSection();?> <?= renderSection('message'); ?>
view.php
// render template `block-section.php` echo $engine->render('block-section.php');
注意view.php文件
其中我渲染了'block-section.php'模板,输出结果是hello world
要创建块区域,可以使用section()
函数,其中第一个参数是区域名称。
要显示块区域,可以使用`renderSection()`函数,其中第一个参数是要显示的区域名称。
例如,我想创建名为'name'的块区域,其中包含我的名字,并显示它。
<?php section('name');?> Fajar Susilo <?php endSection(); ?> <?= renderSection('name');?>
需要注意的是,每次创建块区域时,都必须使用endSection()
函数结束。
如果要在主模板/模板继承的概念中实现,块区域将非常有用。
模板继承
在特定情况下,我们可能想要创建许多页面/模板,但每个页面的显示结构都相同,只是每个页面的内容不同。
对于这种情况,我们可以使用继承。
首先要做的事情是创建一个模板主文件,作为模板父文件,它负责设置整个模板的结构。并使用块区域来设置内容。
master.php
<html> <head> <title> <?= renderSection('page_title');?> </title> </head> <body> <?= renderSection('body'); ?> </body> </html>
在上面的代码示例中,renderSection('page_title')
将渲染'page_title'区域。同样,renderSection('body')
也是如此。
然后,我们可以使用section()
函数在子模板中设置这些区域的特定内容。
为了继承模板结构和使上述概念运行,我们需要在子模板中使用extend()
函数。
函数 extend()
有一个参数,即主模板的路径模板(相对于通过 setViewPath()
方法设置的 viewPath 的相对路径)。
child.php
<?php extend('master.php'); ?> <?php section('page_title'); ?> this is section title <?php endSection(); ?> <?php section('body'); ?> <p> this section body </p> <?php endSection(); ?>
插入脚本
我们通常需要 JavaScript 来使页面更加交互。
TemplateSystem 提供了一种简单的方法来在模板中插入脚本标签。
例如,我们想插入 foo.js 和 bar.js 脚本,这些脚本需要依赖 library/jquery.js 库
但是 foo.js 不依赖于 bar.js,反之亦然。因此,foo.js 和 bar.js 不需要同时插入。foo.js 只在特定页面上需要,同样 bar.js 也是。
因此,从在每个模板中插入 script/jquery.js 的做法来看,更好的做法是在主模板中使用 stack()
函数。
然后在子模板中使用 pushStack()
函数,向主模板添加 foo.js 或 bar.js 脚本。
master.php
<?php stack(); ?> <script src="jquery.js"></script> <?php endStack(); ?>
现在在子模板中。
child.php
<?php extend('master.php');?> <?php pushStack(); ?> <script src="foo.js"></script> <?php endPushStack(); ?>
通过使用 stack()
和 pushStack()
函数,脚本将自动添加到主模板中,并按照顺序排列,添加的脚本将位于 jQuery 脚本之下。
<script src="jquery.js"></script> <script src="foo.js"></script>