php 条件过滤器,php - 创建Twig过滤器以条件定义显示结果[关闭] - SO中文参考 - www.soinside.com...

在twig中创建“简单”过滤器的问题在于它没有考虑未定义的变量/属性。要解决这个问题,你需要创建自己的node class,其行为与default过滤器相同

步骤1.使用节点类注册过滤器/函数

$filter = new \Twig_SimpleFilter('yesNoNa', function ($v) {

return isset($v)?($v?'Yes':'No'):'N/A';

}, [ 'node_class' => \MyProject\Base\Twig\Expression\Filter\YesNoNa::class);

步骤2.创建节点类

namespace MyProject\Base\Twig\Expression\Filter;

class YesNoNa extends \Twig_Node_Expression_Filter_Default {

public function __construct(\Twig_NodeInterface $node, \Twig_Node_Expression_Constant $filterName, \Twig_NodeInterface $arguments, $lineno, $tag = null)

{

$yesNoNa = new \Twig_Node_Expression_Filter($node, new \Twig_Node_Expression_Constant('yesNoNa', $node->getLine()), $arguments, $node->getLine());

if ('yesNoNa' === $filterName->getAttribute('value') && ($node instanceof \Twig_Node_Expression_Name || $node instanceof \Twig_Node_Expression_GetAttr)) {

$test = new \Twig_Node_Expression_Test_Defined(clone $node, 'defined', new \Twig_Node(), $node->getLine());

$false = count($arguments) ? $arguments->getNode(0) : new \Twig_Node_Expression_Constant('N/A', $node->getLine());

$node = new \Twig_Node_Expression_Conditional($test, $yesNoNa, $false, $node->getLine());

} else {

$node = $yesNoNa;

}

parent::__construct($node, $filterName, $arguments, $lineno, $tag);

}

}

为了找到这个类,我只是深入了解源代码,了解如何在内核中定义默认过滤器。

看来这一行,当未定义变量时,$false = count($arguments) ? $arguments->getNode(0) : new \Twig_Node_Expression_Constant('N/A', $node->getLine());将定义'默认'输出。 (因此那里的N / A)

现在在我的沙盒中使用过滤器会产生以下输出:

{% set foo = false %}

{% set bar = true %}

{% set foobar = null %}

{% set arr = { 10: 'foobar', 1: 'foo', 5 : 'bar', 'foo': 42, } %}

Foo: {{ foo | yesNoNa }} {# No #}

Bar: {{ bar | yesNoNa }} {# Yes #}

Undefined: {{ undefined | yesNoNa }} {# N/A #}

Foobar: {{ foobar | yesNoNa }} {# N/A #}

foo.bar.foo {{foo.bar.foo | yesNoNa }} {# N/A #}

arr.foo {{ arr.foo | yesNoNa }} {# Yes #}

这是在twig 1.X中测试的 - 可能是这个解决方案需要所有使用的twig类的正确名称空间而不是twig 2.x中的根名称

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值