craue / twigextensions-bundle
为您的 Symfony 项目提供有用的 Twig 扩展。
Requires
- php: ^7.3|^8
- symfony/config: ~4.4|~5.3|^6
- symfony/dependency-injection: ~4.4|~5.3|^6
- symfony/twig-bundle: ~4.4|~5.3|^6
Requires (Dev)
- phpunit/phpunit: ^9.5
- symfony/browser-kit: ~4.4|~5.3|^6
- symfony/form: ~4.4|~5.3|^6
- symfony/framework-bundle: ~4.4|~5.3|^6
- symfony/phpunit-bridge: ^6
- symfony/translation: ~4.4|~5.3|^6
- symfony/yaml: ~4.4|~5.3|^6
README
TwigExtensionsBundle 是为您的 Symfony 项目提供的一组有用的 Twig 扩展。
在 http://craue.de/symfony-playground/en/CraueTwigExtensions/ 上提供了一个包含代码示例的实时演示。
DecorateEmptyValueExtension
提供了一个增强的 default
过滤器,craue_default
,用于使用占位符装饰空值,甚至可以是 HTML。
通常,如果您想在 HTML 模板中使用 HTML,例如 HTML 实体 —
作为默认过滤器中的值,您必须做繁琐的操作
{{ somevalue | e | default('—') | raw }}
以使其正确渲染。使用此扩展,您可以写入
{{ somevalue | craue_default }}
代替。
ArrayHelperExtension
提供了以下过滤器
craue_without
包装 PHP 的array_diff
函数,craue_replaceKey
添加/替换数组条目(此时键可以是变量),craue_removeKey
通过键(此时键可以是变量)删除数组条目,以及craue_translateArray
将数组中的所有条目进行翻译。
FormExtension
提供了一种机制,可以在一个页面上多次渲染表单。这是通过在渲染之前使用 craue_cloneForm
函数克隆表单来实现的。
StringHelperExtension
提供了 craue_trailingDot
过滤器,以确保文本以点结尾。这在使用供应商包的错误消息(例如验证)时非常有用(这些错误消息像句子一样编写,但缺少尾点),以及与您自己的错误消息(应包含尾点)一起使用。
FormatDateTimeExtension
提供了 craue_date
、craue_time
和 craue_datetime
过滤器,用于对日期、时间和日期/时间值进行区域感知格式化。
FormatNumberExtension
提供了 craue_number
、craue_currency
和 craue_spellout
过滤器,用于对数字和货币进行区域感知格式化。
ChangeLanguageExtension
提供了 craue_languageName
和 craue_availableLocales
函数以及一个模板来实现语言更改机制。
安装
获取包
在 shell 中运行以下命令以让 Composer 下载并安装包:
composer require craue/twigextensions-bundle
启用包
如果您不使用 Symfony Flex,则手动注册包
// in config/bundles.php return [ // ... Craue\TwigExtensionsBundle\CraueTwigExtensionsBundle::class => ['all' => true], ];
或者,对于 Symfony 3.4
// in app/AppKernel.php public function registerBundles() { $bundles = [ // ... new Craue\TwigExtensionsBundle\CraueTwigExtensionsBundle(), ]; // ... }
在您的 Twig 模板中使用扩展的示例
DecorateEmptyValueExtension
{{ someValueWhichMayBeEmpty | craue_default }}<br /> {{ someValueWhichMayBeEmpty | craue_default('no value') }}<br /> {{ someValueWhichMayBeEmpty | craue_default('–') }}<br /> {{ someValueWhichMayBeEmpty | craue_default(0) }}
ArrayHelperExtension
{{ anArray | craue_without(aValueOrAnArray) | join(', ') }}<br /> {{ ['red', 'green', 'yellow', 'blue'] | craue_without('yellow') | join(', ') }} will print "red, green, blue"<br /> {{ ['red', 'green', 'yellow', 'blue'] | craue_without(['yellow', 'black', 'red']) | join(', ') }} will print "green, blue" {{ anArray | craue_replaceKey(key, value) | join(', ') }}<br /> {% set newKey = 'key3' %} {{ {'key1': 'value1', 'key2': 'value2'} | craue_replaceKey(newKey, 'value3') | join(', ') }} will print "value1, value2, value3" {{ anArray | craue_removeKey(key) | join(', ') }}<br /> {{ {'key1': 'value1', 'key2': 'value2'} | craue_removeKey('key1') | join(', ') }} will print "value2" {{ anArray | craue_translateArray() | join(', ') }}<br />
FormExtension
{% for myEntity in myEntities %} {% set myFormInstance = craue_cloneForm(myForm) %} <form action="{{ path('my_route', {'id': myEntity.getId()}) }}" method="post" {{ form_enctype(myFormInstance) }}> {{ form_widget(myFormInstance) }} <input type="submit" /> </form> {% endfor %}
StringHelperExtension
{{ aString | craue_trailingDot }}<br /> {{ 'This text should end with a dot' | craue_trailingDot }}<br /> {{ 'This text should end with exactly one dot.' | craue_trailingDot }}
FormatDateTimeExtension
<h2>with the current locale</h2> date: {{ someDateTimeValue | craue_date }}<br /> time: {{ someDateTimeValue | craue_time }}<br /> both: {{ someDateTimeValue | craue_datetime }} <h2>with a specific locale</h2> date: {{ someDateTimeValue | craue_date('de-DE') }}<br /> time: {{ someDateTimeValue | craue_time('de') }}<br /> both: {{ someDateTimeValue | craue_datetime('en-GB') }}
FormatNumberExtension
<h2>with the current locale</h2> thousands separator: {{ someNumber | craue_number }}<br /> default currency: {{ someNumber | craue_currency }}<br /> specific currency: {{ someNumber | craue_currency('EUR') }}<br /> spelled out number: {{ someNumber | craue_spellout }} <h2>with a specific locale</h2> thousands separator: {{ someNumber | craue_number('de-DE') }}<br /> default currency: {{ someNumber | craue_currency(null, 'de-DE') }}<br /> specific currency: {{ someNumber | craue_currency('EUR', 'de-DE') }}<br /> spelled out number: {{ someNumber | craue_spellout('de-DE') }}
ChangeLanguageExtension
提供了一个 Twig 模板,您可以使用它来渲染一个类似这样的“更改语言”菜单:
{% include '@CraueTwigExtensions/ChangeLanguage/changeLanguage.html.twig' %}
这将渲染到所有定义的语言中当前路由的链接列表。将其包裹在 div 中以通过 CSS 进行样式化。如果您想自定义它,请查看模板。
设置/覆盖默认值
DecorateEmptyValueExtension
# in app/config/parameters.yml craue_twig_extensions.decorateEmptyValue.placeholder: –
FormatDateTimeExtension
# in app/config/parameters.yml craue_twig_extensions.formatDateTime.datetype: full craue_twig_extensions.formatDateTime.timetype: short craue_twig_extensions.formatDateTime.timeZone: Europe/Berlin
FormatNumberExtension
# in app/config/parameters.yml craue_twig_extensions.formatNumber.currency: EUR
ChangeLanguageExtension
# in app/config/parameters.yml craue_twig_extensions.changeLanguage.availableLocales: [de, en, ru] craue_twig_extensions.changeLanguage.showForeignLanguageNames: true craue_twig_extensions.changeLanguage.showFirstUppercase: false
您还可以设置键以更具体地说明区域
# in app/config/parameters.yml craue_twig_extensions.changeLanguage.availableLocales: de_DE: de en: en ru: ru
<!-- in app/config/parameters.xml --> <parameter key="craue_twig_extensions.changeLanguage.availableLocales" type="collection"> <parameter key="de_DE">de</parameter> <parameter key="en">en</parameter> <parameter key="ru">ru</parameter> </parameter>
高级功能
别名
可选地,您可以在项目中定义所有提供的过滤器/函数的别名。这允许您使用您喜欢的名称而不是预定义的名称。例如,如果您不喜欢一直写
{{ somevalue | craue_default }}
您可以为 craue_default
过滤器定义一个别名 d
,这使得您可以写
{{ somevalue | d }}
在您的Twig模板中使用。但请注意,不要意外地覆盖内置的过滤器/函数,尽管您可以有意为之。
DecorateEmptyValueExtension
# in app/config/parameters.yml craue_twig_extensions.decorateEmptyValue.filterAlias: d
ArrayHelperExtension
# in app/config/parameters.yml craue_twig_extensions.arrayHelper.withoutAlias: without craue_twig_extensions.arrayHelper.replaceKeyAlias: replaceKey craue_twig_extensions.arrayHelper.removeKeyAlias: removeKey craue_twig_extensions.arrayHelper.translateArrayAlias: translateArray
FormExtension
# in app/config/parameters.yml craue_twig_extensions.form.cloneFormAlias: cloneForm
StringHelperExtension
# in app/config/parameters.yml craue_twig_extensions.stringHelper.trailingDotAlias: trailingDot
FormatDateTimeExtension
# in app/config/parameters.yml craue_twig_extensions.formatDateTime.dateFilterAlias: date craue_twig_extensions.formatDateTime.timeFilterAlias: time craue_twig_extensions.formatDateTime.dateTimeFilterAlias: datetime
FormatNumberExtension
# in app/config/parameters.yml craue_twig_extensions.formatNumber.numberFilterAlias: number craue_twig_extensions.formatNumber.currencyFilterAlias: currency craue_twig_extensions.formatNumber.spelloutFilterAlias: spellout
ChangeLanguageExtension
# in app/config/parameters.yml craue_twig_extensions.changeLanguage.languageNameAlias: languageName craue_twig_extensions.changeLanguage.availableLocalesAlias: availableLocales
仅启用特定扩展
默认情况下,所有提供的扩展都已启用。如果您只使用一个或其中几个,您可能想禁用其他扩展。以下代码启用了所有扩展,因此请删除您不需要的扩展。
# in app/config/config.yml craue_twig_extensions: enable_only: - ArrayHelperExtension - ChangeLanguageExtension - DecorateEmptyValueExtension - FormatDateTimeExtension - FormatNumberExtension - FormExtension - StringHelperExtension