我创建了一个数据模型,其中包含一个办公室地址的纯文本区域输入字段。我想做相当于nl2br($OfficeAddr)
在我的相关 Silverstripe 模板中打印数据时做的事情。据我所知,他们的模板系统不支持这样的功能。
我错过了什么吗?有什么推荐的解决方法吗?
我创建了一个数据模型,其中包含一个办公室地址的纯文本区域输入字段。我想做相当于nl2br($OfficeAddr)
在我的相关 Silverstripe 模板中打印数据时做的事情。据我所知,他们的模板系统不支持这样的功能。
我错过了什么吗?有什么推荐的解决方法吗?
在 Silverstripe 3 中,这最好通过创建一个DataExtension
类(而不是覆盖该类)来实现。(注意:这在 2.4.x 中也是可能的,但代码会完全不同。)
创建一个名为TextFormatter
which 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
重要提示:此解决方案适用于 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>
这至少将您的视图逻辑从您的模型中取出;)
这已在 SilverStripe 3 (自 2013 年 5 月起)中得到修复,所有这些答案都早于这些答案。现在继续前进,所有Text
和Varchar
数据库字段都使用nl2br()
.
所以......如果你像我一样愚蠢并且你最终来到这里,请注意你可能实际上正在输出一个HTMLText
字段但认为你使用的是纯文本(因为也许你设置->getCMSFields()
了 a TextareaField
)。
希望这对未来的访客有所帮助!