当{{printed}}时,对象可以告诉Twig不要转义输出

时间:2016-09-10 21:03:18

标签: twig

我有一种情况,发送到我的Twig模板的一些变量是普通的旧变量,所以我希望它们被html转义(默认行为)。但发送到我的模板的其他变量实际上是带有__toString()渲染器的对象......其中一些对象发送原始HTML(例如来自WinyIWYG编辑器,如TinyMCE或CKEditor)。

理想情况下,我希望我的模板设计人员不必在对象上使用|raw过滤器,而是以某种方式让对象告诉Twig它们已经被转义。

换句话说,我试图模仿设置is_safe的Twig函数的行为,但不要求模板设计者使用函数。

E.g。我可以在其定义中使用is_safe参数编写一个Twig函数,并且能够在我的模板中使用它:

{{ figure_out_what_to_do(something) }}

figure_out_what_to_do知道检查“某事”对象以确定是否需要进行转义)。但对我而言,这并不比记得在“某事”的每个输出之后放置|raw更好。所以相反,我希望能够做到这一点:

{{ something }}

...让Twig认识到something是一个对象,因此询问它是否需要被转义。

我猜这个答案是“不”,但我想我会问,如果有人对Twig内部有更多了解,可以为我提供任何指示。

感谢。

2 个答案:

答案 0 :(得分:1)

__toString()方法中,您可以代替返回html输出,执行此操作:return new Twig_Markup($html, 'UTF-8');从而将其标记为安全且不会被转义

答案 1 :(得分:0)

您可以扩展\Twig_Markup

,而不是在__toString()中返回新的\Twig_Markup对象(这会导致致命错误,因为它必须返回字符串),而不是在其中返回class Something extends \Twig_Markup { public function __toString() { return $this->safeValue; } public function count() { return mb_strlen($this->safeValue); } }

\Twig_Markup

Twig在决定是否对字符串进行转义时会查看该对象以查看其是否为\Twig_Markup的实例。这是 /* * This file is part of Twig. * * (c) Fabien Potencier * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Twig; /** * Marks a content as safe. * * @author Fabien Potencier <fabien@symfony.com> */ class Markup implements \Countable { protected $content; protected $charset; public function __construct($content, $charset) { $this->content = (string) $content; $this->charset = $charset; } public function __toString() { return $this->content; } public function count() { return \function_exists('mb_get_info') ? mb_strlen($this->content, $this->charset) : \strlen($this->content); } } class_alias('Twig\Markup', 'Twig_Markup'); 的来源:

\Twig_Markup

从源代码中可以看到,\Countable实现了public function count()。这就是为什么我在示例中重写A variable = new B(); variable.doSomething(); // Output: classB 的实现的原因。