arrays - 在 Twig 中:检查数组元素是否存在。如果不设置这一元素
问题描述
在 Twig 中,我将数组params
传递给宏。在宏中,我检查是否设置了所有必需required_element
的元素(此处:)params
。如果没有,我想将其设置为默认值。
这段代码有效,但我认为必须有更好的方法:
{% macro my_macro(params) %}
{% if not params.required_element is defined %}
{% set params = params|merge({'required_element: 'value'}) %}
{% endif %}
我想到了一些更短的东西,比如{% params.required_element ?: value %}
,但这不起作用。
由于各种原因,我不想将它们一个一个地作为参数传递给宏,所以这不是一种选择:
{% macro my_macro(required_element, another_element, yet_another, puh_another, next_element) %}
解决方案
不,这是唯一的(香草)方式。如果你想让它更短,你需要twig
像这样扩展:
<?php
$twig = new \Twig\Environment($loader);
$function = new \Twig\TwigFunction('set_array_value', function (&$context, $array_name, $index, $value) {
if (!isset($context[$array_name])) return;
/**
- If value is array just do arr[index] = value
- Otherwise test if object
-> test if method $index exists
-> test if there is a setter for the property $index
**/
if (is_array($context[$array_name])) $context[$array_name][$index] = $value;
elseif(is_object($context[$array_name])) {
if (method_exists($context[$array_name], $index)) $context[$array_name]->{$index}($value);
elseif(method_exists($context[$array_name], 'set'.$index)) $context[$array_name]->{'set'.$index}($value);
}
}, ['needs_context' => true, ]);
$twig->addFunction($function);
{% macro foo(my_array) %}
{% if not array.foo is defined %}{% do set_array_value('my_array', 'foo', 'bar') %}{% endif %}
{{ my_array.foo }}
{% endmacro %}
{% import _self as sandbox %}
{{ sandbox.foo({}) }} #output: bar
{{ sandbox.foo({'foo': 42,}) }} #output: 42
推荐阅读
- ansible - Ansible 无法安装 Windows INF 驱动程序
- javascript - 重新加载页面后 Ajax 值保持不变
- java - Java 从属性文件 yaml 存储和读取字节数组
- reactjs - 新路线未显示在 React Native Drawer 中
- google-chrome - 如何在 chrome 打包的应用程序中限制某些 url
- javascript - Webpack 4 - 多个条目 - 每个条目多个实例
- css - Wordpress 自定义 Html - 跳转到锚点然后滚动
- angular - 如何将两个值放在 html 列表中,然后只读取一个以显示在
{{ }}
- android - 签名的 .apk 在调试 .apk 工作正常的地方不起作用
- powershell - VSCode 中的 Powershell 终端编码