【问题标题】:silverstripe overwrite function of dataobject数据对象的silverstripe覆盖功能
【发布时间】:2014-04-25 10:42:23
【问题描述】:

我想扩展我使用的模块 (UserDefinedForms) 的 DataObject (EditableDateField)。在那里我想覆盖某个方法(getFormField)。我试图用DataExtension 扩展。但它不起作用。

这里是代码...

config.php

EditableDateField::add_extension("CustomEditableDateField");

CustomEditableDateField

class CustomEditableDateField extends DataExtension {
    public function getFormField() {
        //test is function called
        echo 'test';
        exit();
    }
} 

我还尝试在配置中使用 Object::useCustomClass 将整个 EditableDateField 替换为我的 CustomClass,但也没有成功。

最好的方法是什么?

多谢, 弗洛里安

【问题讨论】:

  • 通过覆盖getFormField 你想做什么?可能是您可以使用的另一个函数并具有extend 回调?
  • 我想这样做并在多语言网站中始终强制使用相同的日期格式: public function getFormField() { $defaultValue = ($this->getSetting('DefaultToToday')) ?日期('Y-m-d'):$this->默认值; $field = new DateField($this->Name, $this->Title, $defaultValue); $field->setConfig('showcalendar', true); $field->setConfig('dateformat', 'dd.MM.yyyy'); return $field; }
  • 不是 100% 确定,但只是为了设置日期格式,您不能在扩展程序上使用 onBeforeRender 回调吗?
  • 谢谢。基本问题是扩展中的函数没有被调用。如果我再次阅读 DataExtension 的文档,我想知道是否真的可以覆盖现有方法。
  • 我不认为你可以覆盖任何你想要的东西,DataExtension 在原始类上有由 extend() 调用的特殊钩子,在 FormFields 上 onBeforeRender 是唯一调用扩展的钩子。如果你想覆盖任何函数,你必须创建一个扩展 EditableDateField 的自定义类。

标签: silverstripe


【解决方案1】:

要做你想做的事,你不需要扩展EditableDateField

您正在寻找的是EditableDateField_FormField,它扩展了DateFieldDateField 为生成 HTML 和进行验证等做了繁重的工作。DateField 确实有一个名为 default_config which looks like this: 的静态变量

static $default_config = array(
    'showcalendar' => false,
    'jslocale' => null,
    'dmyfields' => false,
    'dmyseparator' => '&nbsp;<span class="separator">/</span>&nbsp;',
    'dmyplaceholders' => true,
    'dateformat' => null,
    'datavalueformat' => 'yyyy-MM-dd',
    'min' => null,
    'max' => null,
);

使用 Silverstripe 中的配置系统,您可以使用以下命令将默认 dateformat 更改为您的 dd.MM.yyyy 格式:

EditableDateField_FormField:
  default_config:
    'dateformat': 'dd.MM.yyyy'

您需要像我上面的示例一样使用EditableDateField_FormField,而不是更改DateField 本身的default_config,否则您可能会在CMS 中遇到问题。

技术说明

这得益于the constructor of DateField setting the instance config to the value of the default_config

因为dateformat 的值通常是default_config 中的NULL,所以an if-statement passes 导致dateformat 被设置为i18n::get_date_format() 的结果。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-10-10
    • 2016-10-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多