spreadable/template

面向组合的模板引擎,使用PHP编写。

1.5.4 2021-11-09 08:32 UTC

This package is auto-updated.

Last update: 2024-09-09 14:51:58 UTC


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)的结果上调用。

许可

MIT