4

我有以下设置:php 5.4、symfony 1.4.17 和 firefox,即 chrome。

我已经建立了一个简单的新闻模块。

  • 桌子:TbNews
  • 列:
    • id作为主键
    • scontent作为保存新闻内容的文本字段。它将在里面有 html 内容,用 CKeditor 保存并且它工作得很好。

如果我使用fetchOne()(在模板中),则在编写内容之前会解释 html。

如果我使用 symfony 寻呼机(在行动中,然后是模板),则不会解释 html,并且我会在输出中看到带有内容的 HTML 标记。您可以看到下面的示例,这些示例准确地显示了我在说什么。

我在其他主题中读过,出于安全原因,symfony 输出转义器会自动将 HTML 转换为“文本”,我们必须在数据上使用 getRawValue 来获取原始 HTML 字符。

我有一些疑问:

  1. 为什么 symfony 输出转义器正在与 symfony 寻呼机一起使用,而如果我们使用它则不起作用fetchOne()
  2. 我应该如何getRawValue()在下面的示例中使用 symfony 寻呼机,解释 HTML,然后只显示内容?
  3. 只写内容是getRawValue()最好的选择吗?

示例代码:

//1. fetchOne() outputs content interpreting html before.
//index/templates/indexSuccess.php
//-------------------------------
$q = Doctrine_Query::create()->from('TbNews e')->where('e.id = ?', '1');
$new = $q->fetchOne(); // <p>testcontent</p>\r\n
echo $new['scontent']; 
// output:  testcontent  --- OK, output is not escaped because we are jumping symfony output escaper since we are doing it directly in the action.


//2. Get all news with symfony pager, html tags are not interpreted, html tags are shown.
//index/actions/actions.class.php
//-------------------------------
$app_max_news_in_homepage = 4;
$this->pager = new sfDoctrinePager('TbNews', $app_max_news_in_homepage);
$this->pager->setQuery(Doctrine::getTable('TbNews')->createQuery('a'));
$this->pager->setPage($request->getParameter('page', 1));
$this->pager->init();

//index/templates/indexSuccess.php 
//--------------------------------
foreach ($pager->getResults() as $new)
{
  echo $new['scontent']; // &lt;p&gt;testcontent&lt;/p&gt;\r\n
}

//output:  <p>testcontent</p>  --- OK, since output is escaped by symfony output escaper since we get data at the action and show it in the template.
4

1 回答 1

4

你的第一个测试是错误的。

当你用 测试时fetchOne(),你在一个动作中。因此,您从数据库中检索的内容和您显示的内容(使用echo)不会被转义,因为它没有发送到模板。

当您执行第二个测试时,您从操作中检索内容并在模板中显示结果。在这种情况下,内容被sfOutputEscaper. 如果您进行第一次测试,然后尝试在模板中显示内容,您会看到 html 被转义。

// in actions
$this->new = $q->fetchOne();

// in template
echo $new['scontent'];

// result-> &lt;p&gt;testcontent&lt;/p&gt;\r\n

如果您在您的 中激活escaping_strategy& ,则将转义给模板的所有内容。escaping_methodapps/[app_name]/config/settings.yml

当我想显示一个被转义的 html 内容时,我通常unescape使用sfOutputEscaper. 在你的情况下:

foreach ($pager->getResults() as $new)
{
  echo sfOutputEscaper::unescape($new['scontent']);
}

另一种选择(由Michal Trojanowski说):

foreach ($pager->getResults()->getRawValue() as $new)
{
  echo $new['scontent'];
}
于 2013-02-01T12:25:11.147 回答