Kel*_*tar 4 php templates function silverstripe
我创建了一个数据模型,其中包含办公地址的普通textarea输入字段.我想nl2br($OfficeAddr)在我的相关Silverstripe模板中打印数据时做相同的操作.据我所知,他们的模板系统不支持这种功能.
我错过了什么吗?任何推荐的解决方法?
drz*_*zax 11
在Silverstripe 3中,最好通过创建一个DataExtension类(而不是覆盖类)来实现.(注意:这也可以在2.4.x中使用,但代码会有很大不同.)
创建一个名为TextFormatterextends 的新类Extension:
class TextFormatter extends Extension {
public function NL2BR() {
return nl2br($this->owner->value);
}
}
Run Code Online (Sandbox Code Playgroud)
在配置中指定Text应该使用全新的类扩展该类.这可以在您的_config.php文件中完成,也可以(最好)在YAML文件中完成.
如果您还没有,请mysite/_config/extensions.yml使用以下内容创建一个新文件(或者您可以将其附加到现有文件):
Text:
extensions:
['TextFormatter']
Run Code Online (Sandbox Code Playgroud)
这只是说" Text用类扩展类TextFormatter",这将使我们的新NL2BR函数可用于所有Text对象.
现在,在模板中,您可以简单地调用$OfficeAddr.NL2BR,输出将在输出之前通过您的函数运行.
请注意,我假设您的模型Text用作字段类型而不是HTMLText之前的答案.如果您正在使用HTMLText,则可以通过extensions.yml适当更改文件来扩展该类.
重要信息:此解决方案适用于SilverStripe 2.X. 如果您使用的是SilverStripe 3.0,请参阅此页面上的SS3.0答案.
您只需在模型中添加一个getter:
public function FormattedAddress {
return nl2br($this->OfficeAddr);
}
Run Code Online (Sandbox Code Playgroud)
然后在模板中调用它:
<p>$FormattedAddress</p>
Run Code Online (Sandbox Code Playgroud)
或者 - 如果你想坚持MVC,更复杂的解决方案是......
假设您已使用HTMLText字段类型,则可以扩展HTMLText类:
创建一个名为 - Extended_HTMLText.php(或类似的东西)的文件 - 添加以下内容并将其保存到您的代码目录中:
class Extended_HTMLText extends HTMLText {
function NL2BR() {
return nl2br($this->value);
}
}
Run Code Online (Sandbox Code Playgroud)
将以下内容添加到_config.php文件中:
Object::useCustomClass('HTMLText', 'Extended_HTMLText', true);
Run Code Online (Sandbox Code Playgroud)
然后你可以在你的模板中调用它,如下所示:
<p>$OfficeAddr.NL2BR</p>
Run Code Online (Sandbox Code Playgroud)
这至少会使你的视图逻辑脱离你的模型;)
| 归档时间: |
|
| 查看次数: |
4184 次 |
| 最近记录: |