Silverstripe 3.3 - 如何将 HTML 格式的文本从前端表单保存到数据库中?

Silverstripe 3.3 - How can I save HTML formatted text into database from frontend form?

我想允许我网站上的用户提交纯文本评论。当我在我的网站上展示这些评论时,我希望它们显示为 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。

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

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

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

    public 函数提交($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. 在模型上添加一个setter:

    class MyDataobject 扩展了 DataObject {

    ...

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

    }

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

推荐解决方案:#1