iamntz/handlebars.wp

WordPress 开发中用于 Handlebars.php 的实用工具。

v1.0.0 2020-08-31 15:53 UTC

This package is auto-updated.

Last update: 2024-08-29 04:42:56 UTC


README

从WordPress诞生之初,WordPress就鼓励混合PHP和HTML代码。这应该停止!这里有一个实用工具可以帮助你处理一些事情。

这个包是在实际使用中构建的,是 Handlebars.php 的包装/辅助工具,适用于WordPress使用。它提供了HTML/PHP的分离、级联回退(即您可以让用户覆盖模板文件)等更多功能。

所以,而不是一个这样的文件

while( have_posts() ){ the_post();
  ?>
  <h2><?php the_title(); ?></h2>
  <?php if(is_single()) { ?>
    <div class="theContent"><?php the_content ?></div>
  <?php } else { ?>
    <div class="theExcerpt"><?php the_excerpt(); ?></div>
  <?php }
  <?php
}

您将有两个文件

// index.php
use \iamntz\handlebarsWP\WP;
(new \MyTpl\Tpl )->show('index', [
  'the_content' => WP::get()->buffer_the_content(),
  'the_excerpt' => WP::get()->buffer_the_excerpt(),
  'title' => WP::get()->buffer_the_title(),
  'is_single' => is_single()
]);
// index.hbs
<h2>{{{ title }}}</h2>

{{#if is_single}}
  <div class="theContent">{{{ the_content }}}</div>
{{else}}
  <div class="theExcerpt">{{{ the_excerpt }}}</div>
{{/if}}

更好,对吧?您已经将责任分离了;您知道在您的 php 文件中您将只找到 PHP代码。可以说,这就像学习一门全新的语言,但实际上,您只需要花大约15分钟来习惯handlebars语法!

加分项:您还可以在JavaScript中重用这些模板!

安装

简单的方法是通过composer安装: composer require iamntz/handlebars.wp 并在您的 functions.php 中添加 require 'vendor/autoload.php';

困难的方法是下载zip文件,下载Handlebars.php,然后自己处理所有require。所以,请走简单的方法 :)

如何使用?

隔离事物最好的方法是扩展 Tpl 类并重写方法。最基本的是重写 get_namespace 方法

class MyTpl extends \iamntz\handlebarsWP\Tpl {
  public function get_namespace() {
    return 'my_namespace';
  }

注意:这部分是完全可选的,但强烈推荐,因为您将确保不会与也使用这个优秀包的插件和主题发生冲突。

(new \MyTpl\Tpl )->show('foo', []);

echo (new \MyTpl\Tpl )->get('foo', []);

这将搜索当前主题目录中的 views/foo.hbs,然后搜索父主题目录,如果文件未找到,则抛出异常。

如果您正在包含部分,则按上述顺序在 views/partials/foo.hbs 中搜索。

WordPress 辅助函数

目前,只有一些辅助函数:各种清理、用于复选框和单选框输入和选择的 _checked_selected

选择和复选框

(new \MyTpl\Tpl )->show('select', [
  'options' => [
    [
      'optionValue' => 'foo'
    ],
    [
      'optionValue' => 'bar'
    ]
  ],
  'currentValue' => 'bar'
]);
{{each options}}
  <option value="{{ optionValue }}" {{_selected optionValue currentValue}}></option>
{{/each}}

同样的规则适用于复选框和单选框。

清理

您可以使用一些内置的辅助函数来清理字段。

<input value="{{{_esc_attr myValue}}}">

默认情况下,只有一些函数可用: _esc_attr_esc_textarea_sanitize_text_field_esc_url,但如果所需的函数不存在,您可以执行以下操作之一

  1. 运行一个通用辅助函数:{{_sanitize myValue sanitize_key}}(其中sanitize_key)是一个WP函数(然而,这将允许您运行 任何 函数,所以请小心!);
  2. 注册一个新的辅助函数,如下所示
add_filter('iamntz/templates/engine', function($engine){
  $engine->addHelper( 'my_helper', new MyHelperClass );
  return $engine
});

属性

您还可以向 _expand_attrs 辅助函数传递一个数组,该数组将展开为一个属性字符串

(new \MyTpl\Tpl )->get('template_file', [
    'attrs' => [
      'foo' => 'bar',
      'baz',
    ]
  ]);

在您的 template_file.hbs 中,您将使用它如下所示

<div {{{_expand_attrs attrs}}}></div>

并将扩展为以下内容

<div foo="bar" baz></div>

关于自定义辅助函数的说明

使用模板引擎的目的是将逻辑从HTML中移除,所以不要过度使用!尽管您可以使用辅助函数做很多事情,但请考虑将逻辑移动到您的PHP文件中!

关于WordPress函数的echo操作怎么办?

有一些WordPress函数会执行echo操作,但没有内置的禁用方式(例如,the_contentthe_excerpt)。您也可以使用内置的辅助函数来处理这种情况

\iamntz\handlebarsWP\WP::get()->buffer_the_content()

基本上,所有以 buffer_ 为前缀的函数都会被...嗯,缓存。

自定义

当然,您可以自定义大多数配置

添加自定义路径

如果您在使用此包的插件中,可能需要添加要搜索的插件路径

add_filter('my_namespace/template/directories', function($paths)
{
  $paths[] = plugin_dir_path( __FILE__ );
  return $paths;
});

这样,您将允许用户自定义插件视图。这不是很酷吗?

更改默认扩展名

默认情况下,模板扩展名为 .hbs,但若想更改,可以使用 my_namespace/template/options 过滤器来实现(并更改许多其他选项)。

i18n

“那翻译怎么办?”您可能会问。别担心,您也受到了保护!

add_filter('my_namespace/template/i18n_strings', function($strings)
{
  $strings['hello'] = __('hello world!');
  return $strings;
});

然后,在您的模板中,只需使用 {{{ i18n.hello }}} 即可。简单易懂,对吧?

添加ID?

有时您需要给一个元素添加ID。无需在每个模板上手动操作,您已经可以使用 {{ _id }} 或,如果您喜欢,一个超长的ID {{ _uniqid }}

请注意,_id基本上是传递给模板的数据的 crc32 哈希值。如果您觉得这太慢,可以使用 my_namespace/template/hash 过滤器指定不同的算法。

觉得这个有用吗?

您可以通过 托管捐赠 或购买我的 礼物 来支持我。

许可证

MIT。