【发布时间】:2011-06-22 12:02:27
【问题描述】:
我创建了一个数据模型,其中包含办公室地址的纯文本区域输入字段。在我的相关 Silverstripe 模板中打印数据时,我想做相当于 nl2br($OfficeAddr) 的操作。据我所知,他们的模板系统不支持这样的功能。
我错过了什么吗?有什么推荐的解决方法吗?
【问题讨论】:
标签: php templates function silverstripe
我创建了一个数据模型,其中包含办公室地址的纯文本区域输入字段。在我的相关 Silverstripe 模板中打印数据时,我想做相当于 nl2br($OfficeAddr) 的操作。据我所知,他们的模板系统不支持这样的功能。
我错过了什么吗?有什么推荐的解决方法吗?
【问题讨论】:
标签: php templates function silverstripe
重要提示:此解决方案适用于 SilverStripe 2.X。如果您使用的是 SilverStripe 3.0 - 请参阅此页面上的 SS3.0 答案。
您只需在模型中添加一个吸气剂:
public function FormattedAddress {
return nl2br($this->OfficeAddr);
}
然后在你的模板中调用它:
<p>$FormattedAddress</p>
OR - 如果你想坚持 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 中,这最好通过创建 DataExtension class(而不是覆盖类)来实现。 (注意:这在 2.4.x 中也是可能的,但代码会完全不同。)
创建一个名为TextFormatter 的新类,它扩展了Extension:
class TextFormatter extends Extension {
public function NL2BR() {
return nl2br($this->owner->value);
}
}
在配置中指定 Text 类应该使用您的全新类进行扩展。这可以在您的 _config.php 文件或(最好)在 YAML 文件中完成。
如果您还没有,请在 mysite/_config/extensions.yml 创建一个新文件,其中包含以下内容(或者您可以将其附加到现有文件中):
Text:
extensions:
['TextFormatter']
这只是说“用TextFormatter 类扩展Text 类”,这将使我们的新NL2BR 函数可用于所有Text 对象。
现在,在您的模板中,您只需调用$OfficeAddr.NL2BR,输出将在输出之前通过您的函数运行。
请注意,我假设您的模型使用 Text 作为字段类型,而不是之前的答案假设的 HTMLText。如果您使用的是HTMLText,则可以通过适当地更改extensions.yml 文件来扩展该类。
【讨论】:
这是fixed in SilverStripe 3(自 2013 年 5 月起),所有这些答案都早于它。现在,所有Text 和Varchar 数据库字段都使用nl2br() 自动转换。
所以...如果您像我一样愚蠢而最终来到这里,请注意,您实际上可能输出的是 HTMLText 字段,但认为您使用的是纯文本(因为也许你用TextareaField 设置->getCMSFields())。
希望这对未来的访客有所帮助!
【讨论】: