【问题标题】:Is it possible to run a function on a Silverstripe template variable to format output?是否可以在 Silverstripe 模板变量上运行函数来格式化输出?
【发布时间】:2011-06-22 12:02:27
【问题描述】:

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

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

【问题讨论】:

    标签: php templates function silverstripe


    【解决方案1】:

    重要提示:此解决方案适用于 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>
    

    这至少将你的视图逻辑从你的模型中移除;)

    【讨论】:

    • 太好了,这对我有用。不知道它对单独的内容、显示和逻辑人员如何工作,但他们永远不会赢……谢谢!
    • :) 刚刚添加了一个符合 MVC 的选项。不过有点复杂。
    【解决方案2】:

    在 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 文件来扩展该类。

    【讨论】:

      【解决方案3】:

      这是fixed in SilverStripe 3(自 2013 年 5 月起),所有这些答案都早于它。现在,所有TextVarchar 数据库字段都使用nl2br() 自动转换。

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2017-02-28
        • 2016-10-03
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-09-28
        • 1970-01-01
        相关资源
        最近更新 更多