4

我创建了一个数据模型,其中包含一个办公室地址的纯文本区域输入字段。我想做相当于nl2br($OfficeAddr)在我的相关 Silverstripe 模板中打印数据时做的事情。据我所知,他们的模板系统不支持这样的功能。

我错过了什么吗?有什么推荐的解决方法吗?

4

3 回答 3

11

在 Silverstripe 3 中,这最好通过创建一个DataExtension(而不是覆盖该类)来实现。(注意:这在 2.4.x 中也是可能的,但代码会完全不同。)

创建一个名为TextFormatterwhich extends的新类Extension

class TextFormatter extends Extension { 
    public function NL2BR() {
        return nl2br($this->owner->value);
    }
}

在配置中指定Text该类应使用您的全新类进行扩展。这可以在您的_config.php文件或(最好)在 YAML 文件中完成。

如果您还没有,请mysite/_config/extensions.yml使用以下内容创建一个新文件(或者您可以将其附加到现有文件中):

Text:
  extensions:
    ['TextFormatter']

这只是说“Text用类扩展类TextFormatter”,这将使我们的新NL2BR函数在所有Text对象上都可用。

现在,在您的模板中,您可以简单地调用$OfficeAddr.NL2BR,输出将在输出之前通过您的函数运行。

请注意,我假设您的模型Text用作字段类型,而不是HTMLText之前的答案所假设的。如果您正在使用,则可以通过适当地HTMLText更改文件来简单地扩展该类。extensions.yml

于 2013-01-25T07:11:50.950 回答
7

重要提示:此解决方案适用于 SilverStripe 2.X。如果您使用的是 SilverStripe 3.0 - 请参阅此页面上的 SS3.0 答案。

您只需在模型中添加一个吸气剂:

public function FormattedAddress {
    return nl2br($this->OfficeAddr);
}

然后在您的模板中调用它:

<p>$FormattedAddress</p>

或者- 如果你想坚持 MVC,更复杂的解决方案是......

假设您使用了 HTMLText 字段类型,您可以扩展 HTMLText 类:

创建一个名为 - Extended_HTMLText.php (或类似名称)的文件 - 将以下内容添加到其中并将其保存到您的代码目录中:

class Extended_HTMLText extends HTMLText {
    function NL2BR()    {
        return nl2br($this->value);
    }
}

将以下内容添加到您的 _config.php 文件中:

Object::useCustomClass('HTMLText', 'Extended_HTMLText', true);

然后你可以像这样在你的模板中调用它:

<p>$OfficeAddr.NL2BR</p>

这至少将您的视图逻辑从您的模型中取出;)

于 2011-02-07T02:22:49.510 回答
1

这已在 SilverStripe 3 (自 2013 年 5 月起)中得到修复,所有这些答案都早于这些答案。现在继续前进,所有TextVarchar数据库字段都使用nl2br().

所以......如果你像我一样愚蠢并且你最终来到这里,请注意你可能实际上正在输出一个HTMLText字段但认为你使用的是纯文本(因为也许你设置->getCMSFields()了 a TextareaField)。

希望这对未来的访客有所帮助!

于 2016-09-11T00:38:40.667 回答