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
。
这很好,所以您有几个选择:
写表单提交前添加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 注入攻击。
在模型上添加一个setter:
class MyDataobject 扩展了 DataObject {
...
public function setMyText($value) {
return $this->setField('MyText', sprintf('<p>%s</p>', nl2br(Convert::raw2xml($value)));
}
}
这种方法可能会非常脆弱,因为任何时候设置值时,它都会被编码,这可能是在您故意设置 HTML.
时
推荐解决方案:#1
我想允许我网站上的用户提交纯文本评论。当我在我的网站上展示这些评论时,我希望它们显示为 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
。
这很好,所以您有几个选择:
写表单提交前添加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 注入攻击。
在模型上添加一个setter:
class MyDataobject 扩展了 DataObject {
...
public function setMyText($value) { return $this->setField('MyText', sprintf('<p>%s</p>', nl2br(Convert::raw2xml($value))); }
}
这种方法可能会非常脆弱,因为任何时候设置值时,它都会被编码,这可能是在您故意设置 HTML.
时推荐解决方案:#1