spreadable / template
面向组合的模板引擎,使用PHP编写。
1.5.4
2021-11-09 08:32 UTC
Requires
- php: >=8.0
- ext-dom: *
- ext-libxml: *
README
面向组合的模板引擎,使用PHP编写。
安装
composer install spreadable/template
标记
存在两种类型的标记
{user.name}:表示必要数据的标记{?user.name}:表示可选数据的标记
属性上唯一可选标记的特殊含义
如果一个属性包含唯一的可选标记,并且提供的值为null,则在渲染时,该属性将被简单地删除,这对于布尔属性很有用。
基本模板
use function Spreadable\Template\fragment; /* <p class="{?class}">{salutations} {user}</p> */ $paragraph = fragment('./paragraph.html'); /* <em>{name}</em> */ $user = fragment('./user.html'); $visitor_paragraph = $paragraph([ 'salutations' => 'Hello', 'user' => 'visitor' ]); $jane_paragraph = $visitor_paragraph([ 'class' => 'woman', 'user' => $user([ 'name' => 'Jane' ]) ]); $john_paragraph = $visitor_paragraph([ 'class' => 'man', 'user' => $user([ 'name' => 'John' ]) ]); var_dump([ 'visitor' => $visitor_paragraph->serialize(), // <p>Hello visitor</p> 'jane' => $jane_paragraph->serialize(), // <p class="woman">Hello <em>Jane</em></p>" 'john' => $john_paragraph->serialize() // <p class="man">Hello <em>John</em></p> ]);
构建整个页面
// Additionally, to the previous code use function Spreadable\Template\page; /* <link rel="stylesheet" href="/style.css?t={timestamp}" /> <script src="/main.js?t={timestamp}" type="module"></script> */ $head_fragment = fragment('./head-fragment.html'); /* <header><h1>Branding Name</h1></header> <nav></nav> <main> <h1>Page title</h1> {contents} </main> */ $body_fragment = fragment('./body-fragment.html'); $page = page( 'en', 'Branding Name', $head_fragment([ 'timestamp' => time() ]), $body_fragment([ 'contents' => [ $visitor_paragraph, $jane_paragraph, $john_paragraph ] ]) ); echo $page->serialize(); /* <!DOCTYPE html> <html lang="en"> <head> <title>Page title - Branding Name</title> <meta charset="utf-8"> <link rel="stylesheet" href="/style.css?t=1634472822"> <script src="/main.js?t=1634472822" type="module"></script> </head> <body> <header><h1>Branding Name</h1></header> <nav></nav> <main> <h1>Page title</h1> <p>Hello visitor</p> <p class="woman">Hello <em>Jane</em></p> <p class="man">Hello <em>John</em></p> </main> </body> </html> */
预填充
1.1.0中添加
有时,预先填充一些片段可以避免在运行时进行整个填充工作。
因此,您可以使用带有匹配第一个标记段的前缀的$fragment->serialize(string $prefix = null)进行调用。
现在您可以将它们保存为文件,以便在运行时仅填充其余部分时重用它们。
映射
1.2.0中添加
一个片段有一个$fragment->map(array $datas, callable $callback = null),它在每个条目上调用该片段。
相反,如果提供了$callback,则片段在$callback($datas_entry_value, $datas_entry_key, $datas)的结果上调用。