如何在 Silverstripe 4 的 GridField DataColumn 中显示格式化的 HTML

How to display formatted HTML in GridField DataColumn in Silverstripe 4

我们有一个对象有两个字段 - 一个是 Text,另一个是 HTMLText:

private static $db = [
    'Question' => 'Varchar(255)',
    'Answer' => 'HTMLText'
];

我们正在使用 DataColumns:

Gridfield 中引用此对象
$questionsGrid = GridField::create(
  'Questions', 'Questions', 
  $this->Questions(), 
  GridFieldConfig_RelationEditor::create()
);

$dataColumns = $questionsGrid->
  getConfig()->getComponentByType(GridFieldDataColumns::class);

$dataColumns->setDisplayFields([
        'Question' => 'Question',
        'Answer' => 'Answer'
    ]);
    $dataColumns->setFieldCasting([
        'Question' => 'Text',
        'Answer' => 'HTMLText'
    ]);

然而 Answer 列显示为原始 HTML - 带有可见标签且没有格式。

<p>The answer to life the universe & everything is 42.</p><p>A second paragraph for good measure.</p>

我们如何按 HTML 格式显示 Answer 列?

您可以为该列使用 'HTMLFragment->RAW'

$dataColumns->setFieldCasting([
    'Question' => 'Text',
    'Answer' => 'HTMLFragment->RAW'
]);

如果要修改 DataObject 子类上的方法,将其呈现为 GridField 中的一行以实现相同的目的,只需将其转换为 HTMLText:

    /**
     * @return HTMLText
     */
    public function ImageNice(): \HTMLText
    {
        $image = '<img src="/path/to/foo.png" />';
        return \DBField::create_field(\HTMLText::class, $image);
    }