creative-sizzle / wn-twigextensions-plugin
为您的Winter CMS模板注册更多Twig过滤器
Requires
- php: >=7.0
- composer/installers: ~1.4
- snilius/twig-sort-by-field: dev-master
- symfony/translation: ~3.3.9
- twig/extensions: ~1.5.1
Requires (Dev)
README
OctoberCMS的Twig扩展插件为您的模板添加新的过滤器和方法。无其他插件依赖。
与最新的稳定版OctoberCMS构建420(带Laravel 5.5)进行测试。对于Laravel 5.4,请使用特殊分支laravel54。
安装
通过CMS后端或Composer安装插件
composer require creative-sizzle/wn-twigextensions-plugin
然后您可以在模板中使用新添加的过滤器/函数
<h1 class="heading">{{ article.heading | uppercase }}</h1>
<p class="created">
Posted at {{ article.date | strftime('%d.%m.%Y %H:%M:%S') }}
</p>
<p class="perex">
{{ article.perex | truncate(80) }}
</p>
可用函数
config, env, session, trans, var_dump, template_from_string
config
函数将Laravel config()辅助函数的功能移动到Twig。
{{ config('app.locale') }}
示例将输出当前存储在app.locale中的值。有关Laravel配置辅助函数的更多信息,请参阅此处。
env
函数将Laravel env()辅助函数的功能移动到Twig。
{{ env('APP_ENV', 'production') }}
示例将输出当前存储在APP_ENV环境变量中的值。第二个参数是默认值,当ENV键不存在时使用。
session
函数将Laravel session()辅助函数的功能移动到Twig。
{{ session('my.session.key') }}
示例将输出当前存储在my.session.key中的值。有关Laravel会话辅助函数的更多信息,请参阅此处。
trans
函数将Laravel trans()辅助函数的功能移动到Twig。
{{ trans('acme.blog::lang.app.name') }}
示例将输出一个存储在假设的博客插件本地化文件中的值。有关October CMS中的本地化更多信息,请参阅此处。
var_dump
输出变量的信息。也可以用作过滤器。
<pre>{{ var_dump(users) }}</pre>
template_from_string
函数从字符串加载模板。
{% set name = 'John' %}
{{ include(template_from_string("Hello {{ name }}")) }}
{{ include(template_from_string("Hurry up it is: {{ "now"|date("m/d/Y") }}")) }}
可用过滤器
strftime, 大写,小写,首字母大写,首字母小写,去除左侧空格,去除右侧空格,重复字符串,复数形式,截断,自动换行,字符串填充,字符串替换,去除标签,左填充,右填充,从右到左,随机排序,时间差,本地化日期,本地化数字,本地化货币,发送邮件,变量打印,修订,按字段排序
strftime
根据区域设置格式化本地时间/日期。
Posted at {{ article.date | strftime('%d.%m.%Y %H:%M:%S') }}
示例将输出 发布于 04.01.2016 22:57:42。查看更多格式参数 这里。
大写
将字符串转换为大写。
Hello I'm {{ 'Jack' | uppercase }}
示例将输出 Hello I'm JACK。
小写
将字符串转换为小写。
Hello I'm {{ 'JACK' | lowercase }}
示例将输出 Hello I'm jack。
首字母大写
将字符串的第一个字符转换为大写。
Hello I'm {{ 'jack' | ucfirst }}
示例将输出 Hello I'm Jack。
首字母小写
将字符串的第一个字符转换为小写。
Hello I'm {{ 'Jack' | lcfirst }}
示例将输出 Hello I'm jack。
去除左侧空格
从字符串开头去除空格(或其他字符)。
Hello I'm {{ ' jack' | ltrim }}
示例将输出 Hello I'm jack,开头没有空格。
去除右侧空格
从字符串末尾去除空格(或其他字符)。
Hello I'm {{ 'jack ' | rtrim }}
示例将输出 Hello I'm jack,末尾没有空格。
重复字符串
重复字符串。
I'm the {{ 'best' | str_repeat(3) }}!
示例将输出 I'm the best best best!。
复数形式
获取英语单词的复数形式。
You have {{ count }} new {{ 'mail' | plural(count) }}
示例将输出 你有 1 封新邮件 或 你有 3 封新邮件 - 取决于邮件数量。
截断
使用截断过滤器在达到限制后截断字符串。
{{ "Hello World!" | truncate(5) }}
示例将输出 Hello...,其中 ... 是默认分隔符。
您还可以通过将第二个参数设置为 true 来让截断保留整个单词。如果最后一个单词位于分隔符上,截断将输出整个单词。
{{ "Hello World!" | truncate(7, true) }}
这里将打印 Hello World!。
如果您想更改分隔符,只需将第三个参数设置为所需的分隔符。
{{ "Hello World!" | truncate(7, false, "??") }}
此示例将打印 Hello W??。
自动换行
使用自动换行过滤器将文本分割成等长的行。
{{ "Lorem ipsum dolor sit amet, consectetur adipiscing" | wordwrap(10) }}
此示例将打印
Lorem ipsu
m dolor si
t amet, co
nsectetur
adipiscing
默认分隔符是 "\n",但您可以通过提供分隔符来轻松更改它
{{ "Lorem ipsum dolor sit amet, consectetur adipiscing" | wordwrap(10, "zz\n") }}
这将产生以下结果
Lorem ipsuzz
m dolor sizz
t amet, cozz
nsectetur zz
adipiscing
字符串填充
使用另一个字符串从两侧填充字符串到特定长度。
{{ 'xxx' | strpad(7, 'o') }}
这将打印
ooxxxoo
字符串替换
将搜索字符串的所有出现替换为替换字符串。
{{ 'Alice' | str_replace('Alice', 'Bob') }}
这将返回
Bob
去除标签
从字符串中去除 HTML 和 PHP 标签。在第一个参数中,您可以指定允许的标签。
{{ '<p><b>Text</b></p>' | strip_tags('<p>') }}
这将返回
<p>Text</p>
左填充
使用另一个字符串从左侧填充字符串到特定长度。
{{ 'xxx' | leftpad(5, 'o') }}
这将打印
ooxxx
rightpad
使用另一个字符串从右侧填充字符串到指定长度。
{{ 'xxx' | rightpad(5, 'o') }}
这将打印
xxxoo
rtl
反转字符串。
{{ 'Hello world!' | rtl }}
这将打印
!dlrow olleH
shuffle
打乱数组。
{{ songs | shuffle }}
或者在foreach中
{% for fruit in ['apple', 'banana', 'orange'] | shuffle %}
{{ fruit }}
{% endfor %}
time_diff
使用time_diff过滤器来渲染日期与当前时间之间的差异。
{{ post.published_at | time_diff }}
上面的示例将输出类似“4秒前”或“在1个月后”的字符串,具体取决于过滤后的日期。
输出是可翻译的。所有翻译都存储在此插件的/lang文件夹中。如果您想要更多的地区设置,只需从此存储库复制它们,将%count%替换为:count,然后作为pull request发送到此存储库。
参数
- date: 计算与现在差异的日期。可以是字符串或DateTime实例。
- now: 应用作现在的日期。可以是字符串或DateTime实例。不要设置此参数以使用当前日期。
翻译
要获取可翻译的输出,请将Symfony\Component\Translation\TranslatorInterface作为构造函数参数提供。返回的字符串格式为diff.ago.XXX或diff.in.XXX,其中XXX可以是任何有效单位:second,minute,hour,day,month,year。
localizeddate
使用localizeddate过滤器将日期格式化为表示日期的本地化字符串。注意,必须安装php5-intl 扩展/php7-intl 扩展!
{{ post.published_at | localizeddate('medium', 'none', locale) }}
localizeddate过滤器接受字符串(它必须是由strtotime函数支持的格式),DateTime实例或Unix时间戳。
参数
- date_format: 日期格式。选择以下格式之一
- 'none': IntlDateFormatter::NONE
- 'short': IntlDateFormatter::SHORT
- 'medium': IntlDateFormatter::MEDIUM
- 'long': IntlDateFormatter::LONG
- 'full': IntlDateFormatter::FULL
- time_format: 时间格式。与上面相同格式可能。
- locale: 用于格式的区域设置。如果提供NULL,则Twig将使用Locale::getDefault()
- timezone: 日期时区
- format: 用于格式化或解析的可选模式。可能的模式在ICU用户指南中记录。
localizednumber
使用localizednumber过滤器将数字格式化为表示数字的本地化字符串。注意,必须安装php5-intl 扩展!
{{ product.quantity | localizednumber }}
内部,Twig使用PHP NumberFormatter::create()函数处理数字。
参数
- style: 可选的日期格式(默认:'decimal')。选择以下格式之一
- 'decimal': NumberFormatter::DECIMAL
- 'currency': NumberFormatter::CURRENCY
- 'percent': NumberFormatter::PERCENT
- 'scientific': NumberFormatter::SCIENTIFIC
- 'spellout': NumberFormatter::SPELLOUT
- 'ordinal': NumberFormatter::ORDINAL
- 'duration': NumberFormatter::DURATION
- type: 可选的格式化类型(默认:'default')。选择以下类型之一
- 'default': NumberFormatter::TYPE_DEFAULT
- 'int32': NumberFormatter::TYPE_INT32
- 'int64': NumberFormatter::TYPE_INT64
- 'double': NumberFormatter::TYPE_DOUBLE
- 'currency': NumberFormatter::TYPE_CURRENCY
- locale: 用于格式的区域设置。如果提供NULL,则Twig将使用Locale::getDefault()
localizedcurrency
使用本地化货币过滤器将货币值格式化为本地化字符串。注意,必须安装php5-intl 扩展!
{{ product.price | localizedcurrency('EUR') }}
参数
- currency:要使用的货币的3字母ISO 4217货币代码。
- locale: 用于格式的区域设置。如果提供NULL,则Twig将使用Locale::getDefault()
mailto
用于将电子邮件渲染为常规mailto链接,但具有针对机器人的加密!
{{ 'vojtasvoboda.cz@gmail.com' | mailto }}
返回
<span id="e846043876">[javascript protected email address]</span><script type="text/javascript">/*<![CDATA[*/eval("var a=\"9IV1G0on6.ryWZYS28iPcNBwq4aeUJF5CskjuLQAh3XdlEz@7KtmpHbTxM-ODg_+Rvf\";var b=a.split(\"\").sort().join(\"\");var c=\"_TtD3O_TXTl3VdfZ@H3KpVdTH\";var d=\"\";for(var e=0;e<c.length;e++)d+=b.charAt(a.indexOf(c.charAt(e)));document.getElementById(\"e846043876\").innerHTML=\"<a href=\\\"mailto:\"+d+\"\\\">\"+d+\"</a>\"")/*]]>*/</script>
将作为常规内容渲染到页面
<a href="mailto:vojtasvoboda.cz@gmail.com">vojtasvoboda.cz@gmail.com</a>
PHP会加密您的电子邮件地址并生成解密它的JavaScript。大多数机器人无法执行JavaScript,这就是它工作的原因。只要启用JavaScript,访问者就不会注意到您使用了此脚本。如果禁用JavaScript,访问者将看到"[javascript受保护电子邮件地址]"而不是电子邮件地址。
过滤器参数
{{ 'vojtasvoboda.cz@gmail.com' | mailto(true, true, 'Let me know', 'my-class') }}
- 第一个布尔参数 = 返回可点击的电子邮件(带有链接)
- 第二个布尔参数 = 启用加密
- 第三个字符串参数 = 链接文本(未加密!)
- 第四个(可选)参数 = CSS类名(将渲染 <a mailto:.. class="my-class">..)
var_dump
输出有关变量的信息。
<pre>{{ users | var_dump }}</pre>
修订
强制浏览器重新加载缓存的修改/更新资产文件。您可以提供格式参数,以便附加的时间戳可以相应地转换为PHP的date()函数。
用法
<img src="{{ 'assets/images/image_file.jpg' | theme | revision("m.d.y.H.i.s") }}" alt="an image" />
将返回类似
<img src="https://www.example.com/themes/my-theme/assets/image_file.png?12.03.16.04.52.38" alt="An image" />
https://stackoverflow.com/questions/32414/how-can-i-force-clients-to-refresh-javascript-files
https://php.ac.cn/manual/en/function.date.php
sortbyfield
按给定字段(键)对数组/集合进行排序。
{% set data = [{'name': 'David', 'age': 31}, {'name': 'John', 'age': 28}] %}
{% for item in data | sortbyfield('age') %}
{{ item.name }}
{% endfor %}
输出将为:John David
贡献
- 修复time_diff单元测试,该测试在本机通过,但在TravisCI失败。
- 将PHP函数和自定义代码转换为Twig_Extension类。
- 创建Twig_Extension加载器,并从配置中自动加载所有扩展和过滤器作为Twig_Extension。
- 新增过滤器 ga 和 gtm 用于添加GA或GTM代码(Heap Analytics) - {{ 'UA-1234567' | ga }}。
- 添加缓存扩展。
请随意发送pullrequest! 请将Pull Request发送到master分支。
许可
Twig扩展插件是开源软件,许可协议与OctoberCMS平台相同,遵循MIT许可。