0

我想允许我网站上的用户提交纯文本评论。当我在我的网站上展示这些评论时,我希望它们显示为 HTML(即:在<p>标记中,换行为<br>)。

如何在 Silverstripe 3.3 中将纯文本呈现为 HTML?

我有一个数据对象

private static $db = array (
        'MyText' => 'HTMLText',
);

和一个表格:

public function MyForm() {
      $myForm = Form::create(
          $this,
          __FUNCTION__,
          FieldList::create(
              HtmlEditorField::create('MyText')
          ),
          FieldList::create(
              FormAction::create('submit','Submit')
          )
      );
      return $myForm;
}

当我的提交功能是这样的

public function submit($data, $form) {
      $myDataobject = new MyDataobject();
      $form->saveInto($myDataobject);
      $myDataobject->write();

      $form->sessionMessage('Message saved.','good');
      return $this->redirectBack();
}

目前它将文本保存为没有任何 HTML 的纯文本字符串。

4

1 回答 1

1

好的 - 从您的评论看来,您的示例代码不是您实际在做的,您使用的是 aTextareaField而不是HTMLEditorField.

这很好,所以你有几个选择:

  1. 在编写表单提交之前添加 HTML:

    公共函数提交($data, $form) { $myDataobject = new MyDataobject(); $form->saveInto($myDataobject); $myDataobject->MyText = sprintf('

    %s

    ', nl2br(Convert::raw2xml($data['MyText']))); $myDataobject->write();

      $form->sessionMessage('Message saved.','good');
      return $this->redirectBack();
    

    }

请注意使用Convert::raw2html- 如果没有这个,您很可能容易受到提交 HTML 以执行 HTML 注入攻击的恶意用户的攻击。

  1. 在模型上添加一个设置器:

    类 MyDataobject 扩展 DataObject {

    ...

    public function setMyText($value) {
        return $this->setField('MyText', sprintf('<p>%s</p>', nl2br(Convert::raw2xml($value)));
    }
    

    }

这种方法可能会非常脆弱,因为在任何时候设置值时,它都会被编码,这可能是你故意设置 HTML 的时候。

推荐解决方案:#1

于 2016-04-11T08:21:01.640 回答