我有一种情况,发送到我的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内部有更多了解,可以为我提供任何指示。
感谢。
答案 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
的实现的原因。