{"id":16770886,"url":"https://github.com/craue/twigextensionsbundle","last_synced_at":"2025-06-29T13:03:00.158Z","repository":{"id":56958724,"uuid":"1776160","full_name":"craue/TwigExtensionsBundle","owner":"craue","description":"Useful Twig extensions for your Symfony project.","archived":false,"fork":false,"pushed_at":"2022-03-31T13:36:36.000Z","size":514,"stargazers_count":77,"open_issues_count":1,"forks_count":11,"subscribers_count":4,"default_branch":"master","last_synced_at":"2025-06-29T13:02:29.863Z","etag":null,"topics":["bundle","php","symfony","symfony-bundle","twig-extension"],"latest_commit_sha":null,"homepage":"","language":"PHP","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/craue.png","metadata":{"files":{"readme":"README.md","changelog":"CHANGELOG.md","contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null}},"created_at":"2011-05-20T11:28:44.000Z","updated_at":"2024-11-16T08:22:45.000Z","dependencies_parsed_at":"2022-08-21T09:50:28.030Z","dependency_job_id":null,"html_url":"https://github.com/craue/TwigExtensionsBundle","commit_stats":null,"previous_names":[],"tags_count":17,"template":false,"template_full_name":null,"purl":"pkg:github/craue/TwigExtensionsBundle","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/craue%2FTwigExtensionsBundle","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/craue%2FTwigExtensionsBundle/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/craue%2FTwigExtensionsBundle/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/craue%2FTwigExtensionsBundle/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/craue","download_url":"https://codeload.github.com/craue/TwigExtensionsBundle/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/craue%2FTwigExtensionsBundle/sbom","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":262598141,"owners_count":23334667,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["bundle","php","symfony","symfony-bundle","twig-extension"],"created_at":"2024-10-13T06:25:54.242Z","updated_at":"2025-06-29T13:03:00.112Z","avatar_url":"https://github.com/craue.png","language":"PHP","funding_links":[],"categories":[],"sub_categories":[],"readme":"# Information\n\n[![Build Status](https://travis-ci.org/craue/TwigExtensionsBundle.svg?branch=master)](https://travis-ci.org/craue/TwigExtensionsBundle)\n\nTwigExtensionsBundle is a collection of useful Twig extensions for your Symfony project.\n\nA live demo with code examples can is available at http://craue.de/symfony-playground/en/CraueTwigExtensions/.\n\n## DecorateEmptyValueExtension\n\nProvides an enhanced `default` filter, `craue_default`, to decorate empty values with a placeholder which can even be\nHTML.\n\nUsually, if you want to use HTML, e.g. the HTML entity `\u0026mdash;`, as value for the default filter in an HTML Twig\ntemplate you have to do cumbersome\n\n```twig\n{{ somevalue | e | default('\u0026mdash;') | raw }}\n```\n\nto make it render properly. With this extension you can write\n\n```twig\n{{ somevalue | craue_default }}\n```\n\ninstead.\n\n## ArrayHelperExtension\n\nProvides the filters\n\n- `craue_without` wrapping PHP's `array_diff` function,\n- `craue_replaceKey` which adds/replaces an array entry (whereupon the key can be a variable),\n- `craue_removeKey` which removes an array entry by key (whereupon the key can be a variable), and\n- `craue_translateArray` which translates all entries in an array.\n\n## FormExtension\n\nProvides a mechanism to render a form several times on one page. This is done by cloning the form prior to rendering\nusing the `craue_cloneForm` function.\n\n## StringHelperExtension\n\nProvides the `craue_trailingDot` filter for ensuring that a text ends with a dot.\nThis comes in handy when using error messages (e.g. for validation) of vendor bundles (which are written like sentences\nbut are missing the trailing dots) together with your own ones (which should include the trailing dot).\n\n## FormatDateTimeExtension\n\nProvides the filters `craue_date`, `craue_time`, and `craue_datetime` for locale-aware formatting of date, time, and\ndate/time values.\n\n## FormatNumberExtension\n\nProvides the filters `craue_number`, `craue_currency`, and `craue_spellout` for locale-aware formatting of numbers and\ncurrencies.\n\n## ChangeLanguageExtension\n\nProvides the functions `craue_languageName` and `craue_availableLocales` as well as a template for implementing a\nlanguage change mechanism.\n\n# Installation\n\n## Get the bundle\n\nLet Composer download and install the bundle by running\n\n```sh\ncomposer require craue/twigextensions-bundle\n```\n\nin a shell.\n\n## Enable the bundle\n\nIf you don't use Symfony Flex, register the bundle manually:\n\n```php\n// in config/bundles.php\nreturn [\n\t// ...\n\tCraue\\TwigExtensionsBundle\\CraueTwigExtensionsBundle::class =\u003e ['all' =\u003e true],\n];\n```\n\nOr, for Symfony 3.4:\n\n```php\n// in app/AppKernel.php\npublic function registerBundles() {\n\t$bundles = [\n\t\t// ...\n\t\tnew Craue\\TwigExtensionsBundle\\CraueTwigExtensionsBundle(),\n\t];\n\t// ...\n}\n```\n\n# Examples to use the extensions in your Twig template\n\n## DecorateEmptyValueExtension\n\n```twig\n{{ someValueWhichMayBeEmpty | craue_default }}\u003cbr /\u003e\n{{ someValueWhichMayBeEmpty | craue_default('no value') }}\u003cbr /\u003e\n{{ someValueWhichMayBeEmpty | craue_default('\u0026ndash;') }}\u003cbr /\u003e\n{{ someValueWhichMayBeEmpty | craue_default(0) }}\n```\n\n## ArrayHelperExtension\n\n```twig\n{{ anArray | craue_without(aValueOrAnArray) | join(', ') }}\u003cbr /\u003e\n{{ ['red', 'green', 'yellow', 'blue'] | craue_without('yellow') | join(', ') }} will print \"red, green, blue\"\u003cbr /\u003e\n{{ ['red', 'green', 'yellow', 'blue'] | craue_without(['yellow', 'black', 'red']) | join(', ') }} will print \"green, blue\"\n\n{{ anArray | craue_replaceKey(key, value) | join(', ') }}\u003cbr /\u003e\n{% set newKey = 'key3' %}\n{{ {'key1': 'value1', 'key2': 'value2'} | craue_replaceKey(newKey, 'value3') | join(', ') }} will print \"value1, value2, value3\"\n\n{{ anArray | craue_removeKey(key) | join(', ') }}\u003cbr /\u003e\n{{ {'key1': 'value1', 'key2': 'value2'} | craue_removeKey('key1') | join(', ') }} will print \"value2\"\n\n{{ anArray | craue_translateArray() | join(', ') }}\u003cbr /\u003e\n```\n\n## FormExtension\n\n```twig\n{% for myEntity in myEntities %}\n\t{% set myFormInstance = craue_cloneForm(myForm) %}\n\t\u003cform action=\"{{ path('my_route', {'id': myEntity.getId()}) }}\" method=\"post\" {{ form_enctype(myFormInstance) }}\u003e\n\t\t{{ form_widget(myFormInstance) }}\n\t\t\u003cinput type=\"submit\" /\u003e\n\t\u003c/form\u003e\n{% endfor %}\n```\n\n## StringHelperExtension\n\n```twig\n{{ aString | craue_trailingDot }}\u003cbr /\u003e\n{{ 'This text should end with a dot' | craue_trailingDot }}\u003cbr /\u003e\n{{ 'This text should end with exactly one dot.' | craue_trailingDot }}\n```\n\n## FormatDateTimeExtension\n\n```twig\n\u003ch2\u003ewith the current locale\u003c/h2\u003e\ndate: {{ someDateTimeValue | craue_date }}\u003cbr /\u003e\ntime: {{ someDateTimeValue | craue_time }}\u003cbr /\u003e\nboth: {{ someDateTimeValue | craue_datetime }}\n\n\u003ch2\u003ewith a specific locale\u003c/h2\u003e\ndate: {{ someDateTimeValue | craue_date('de-DE') }}\u003cbr /\u003e\ntime: {{ someDateTimeValue | craue_time('de') }}\u003cbr /\u003e\nboth: {{ someDateTimeValue | craue_datetime('en-GB') }}\n```\n\n## FormatNumberExtension\n\n```twig\n\u003ch2\u003ewith the current locale\u003c/h2\u003e\nthousands separator: {{ someNumber | craue_number }}\u003cbr /\u003e\ndefault currency: {{ someNumber | craue_currency }}\u003cbr /\u003e\nspecific currency: {{ someNumber | craue_currency('EUR') }}\u003cbr /\u003e\nspelled out number: {{ someNumber | craue_spellout }}\n\n\u003ch2\u003ewith a specific locale\u003c/h2\u003e\nthousands separator: {{ someNumber | craue_number('de-DE') }}\u003cbr /\u003e\ndefault currency: {{ someNumber | craue_currency(null, 'de-DE') }}\u003cbr /\u003e\nspecific currency: {{ someNumber | craue_currency('EUR', 'de-DE') }}\u003cbr /\u003e\nspelled out number: {{ someNumber | craue_spellout('de-DE') }}\n```\n\n## ChangeLanguageExtension\n\nThere's a Twig template provided which you can use to render a \"change language\" menu like this:\n\n```twig\n{% include '@CraueTwigExtensions/ChangeLanguage/changeLanguage.html.twig' %}\n```\n\nThis will render a list of links to the current route in all defined languages. Wrap it in a div to style it via CSS.\nTake a look at the template if you want to customize it.\n\n# Set/override default values\n\n## DecorateEmptyValueExtension\n\n```yaml\n# in app/config/parameters.yml\n  craue_twig_extensions.decorateEmptyValue.placeholder: \u0026ndash;\n```\n\n## FormatDateTimeExtension\n\n```yaml\n# in app/config/parameters.yml\n  craue_twig_extensions.formatDateTime.datetype: full\n  craue_twig_extensions.formatDateTime.timetype: short\n  craue_twig_extensions.formatDateTime.timeZone: Europe/Berlin\n```\n\n## FormatNumberExtension\n\n```yaml\n# in app/config/parameters.yml\n  craue_twig_extensions.formatNumber.currency: EUR\n```\n\n## ChangeLanguageExtension\n\n```yaml\n# in app/config/parameters.yml\n  craue_twig_extensions.changeLanguage.availableLocales: [de, en, ru]\n  craue_twig_extensions.changeLanguage.showForeignLanguageNames: true\n  craue_twig_extensions.changeLanguage.showFirstUppercase: false\n```\n\nYou can also set the keys to be more specific about the locales:\n\n```yaml\n# in app/config/parameters.yml\n  craue_twig_extensions.changeLanguage.availableLocales:\n    de_DE: de\n    en: en\n    ru: ru\n```\n\n```xml\n\u003c!-- in app/config/parameters.xml --\u003e\n\u003cparameter key=\"craue_twig_extensions.changeLanguage.availableLocales\" type=\"collection\"\u003e\n\t\u003cparameter key=\"de_DE\"\u003ede\u003c/parameter\u003e\n\t\u003cparameter key=\"en\"\u003een\u003c/parameter\u003e\n\t\u003cparameter key=\"ru\"\u003eru\u003c/parameter\u003e\n\u003c/parameter\u003e\n```\n\n# Advanced stuff\n\n## Aliases\n\nOptionally, you can define aliases for all provided filters/functions to be used within your project.\nThis allows you to use names you prefer instead of the pre-defined ones. E.g., if you don't like to write\n\n```twig\n{{ somevalue | craue_default }}\n```\n\nall the time, you may define an alias like `d` for the `craue_default` filter which allows you to write\n\n```twig\n{{ somevalue | d }}\n```\n\nin your Twig templates. But pay attention to not accidentally override built-in filters/functions, although you\ncan do it intentionally.\n\n### DecorateEmptyValueExtension\n\n```yaml\n# in app/config/parameters.yml\n  craue_twig_extensions.decorateEmptyValue.filterAlias: d\n```\n\n### ArrayHelperExtension\n\n```yaml\n# in app/config/parameters.yml\n  craue_twig_extensions.arrayHelper.withoutAlias: without\n  craue_twig_extensions.arrayHelper.replaceKeyAlias: replaceKey\n  craue_twig_extensions.arrayHelper.removeKeyAlias: removeKey\n  craue_twig_extensions.arrayHelper.translateArrayAlias: translateArray\n```\n\n### FormExtension\n\n```yaml\n# in app/config/parameters.yml\n  craue_twig_extensions.form.cloneFormAlias: cloneForm\n```\n\n### StringHelperExtension\n\n```yaml\n# in app/config/parameters.yml\n  craue_twig_extensions.stringHelper.trailingDotAlias: trailingDot\n```\n\n### FormatDateTimeExtension\n\n```yaml\n# in app/config/parameters.yml\n  craue_twig_extensions.formatDateTime.dateFilterAlias: date\n  craue_twig_extensions.formatDateTime.timeFilterAlias: time\n  craue_twig_extensions.formatDateTime.dateTimeFilterAlias: datetime\n```\n\n### FormatNumberExtension\n\n```yaml\n# in app/config/parameters.yml\n  craue_twig_extensions.formatNumber.numberFilterAlias: number\n  craue_twig_extensions.formatNumber.currencyFilterAlias: currency\n  craue_twig_extensions.formatNumber.spelloutFilterAlias: spellout\n```\n\n### ChangeLanguageExtension\n\n```yaml\n# in app/config/parameters.yml\n  craue_twig_extensions.changeLanguage.languageNameAlias: languageName\n  craue_twig_extensions.changeLanguage.availableLocalesAlias: availableLocales\n```\n\n## Enabling only specific extensions\n\nBy default, all provided extensions are enabled. If you're using only one or some of them, you may want to disable the\nothers. The following enables them all, so remove the ones you don't need:\n\n```yaml\n# in app/config/config.yml\ncraue_twig_extensions:\n  enable_only:\n    - ArrayHelperExtension\n    - ChangeLanguageExtension\n    - DecorateEmptyValueExtension\n    - FormatDateTimeExtension\n    - FormatNumberExtension\n    - FormExtension\n    - StringHelperExtension\n```\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fcraue%2Ftwigextensionsbundle","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fcraue%2Ftwigextensionsbundle","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fcraue%2Ftwigextensionsbundle/lists"}