是否可以在Silverstripe模板变量上运行函数来格式化输出?

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适当更改文件来扩展该类.


Sha*_*lja 7

重要信息:此解决方案适用于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)

这至少会使你的视图逻辑脱离你的模型;)