symfony 1.4解释并且不使用模板中的fetchOne()显示html标签

时间:2013-02-01 11:59:31

标签: php html escaping symfony-1.4 html-escape-characters

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

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

  • 表:TbNews
  • 列:
    • id作为主键
    • scontent作为保存新闻内容的文本字段。它将包含html内容,与CKeditor一起保存并且工作正常。

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

如果我使用symfony pager(在行动中,然后是模板),则不会解释html,并且我会在输出中看到包含内容的HTML标记。 你可以看到下面的例子,它们显示了我正在谈论的内容。

我已阅读其他主题,出于安全原因,symfony输出escaper会自动将HTML转换为“text”,我们必须对数据使用getRawValue来获取原始HTML字符。

我有一些问题:

  1. 为什么symfony输出escaper正在使用symfony pager及其 如果我们使用fetchOne()
  2. ,则无法正常工作
  3. 我应该如何在下面的示例中使用getRawValue()和symfony 寻呼机,解释HTML,然后只显示内容?
  4. getRawValue()是仅获取所写内容的最佳选择吗?
  5. 示例代码:

    //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.
    

1 个答案:

答案 0 :(得分:3)

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

使用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&amp;在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'];
}