dataobject的silverstripe覆盖功能

dataobject的silverstripe覆盖功能,silverstripe,Silverstripe,我想扩展我使用的模块(UserDefinedForms)的DataObject(EditableDateField)。在这里,我想覆盖某个方法(getFormField)。我正试着和你一起扩展。但它不起作用 这里是代码 config.php: EditableDateField::add_extension("CustomEditableDateField"); class CustomEditableDateField extends DataExtension { public f

我想扩展我使用的模块(UserDefinedForms)的DataObject(EditableDateField)。在这里,我想覆盖某个方法(getFormField)。我正试着和你一起扩展。但它不起作用

这里是代码

config.php

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

EditableDateField::add_extension("CustomEditableDateField");
class CustomEditableDateField extends DataExtension {
    public function getFormField() {
        //test is function called
        echo 'test';
        exit();
    }
} 
我还尝试在配置中使用Object::useCustomClass将整个EditableDateField替换为我的CustomClass,但也没有成功

最好的方法是什么

许多人,
Florian

要实现您想要实现的目标,您不需要扩展
EditableDateField

您要查找的是扩展了
DateField
EditableDateField\u FormField
DateField
完成了生成HTML和进行验证等的繁重工作。
DateField
有一个静态变量,名为
default\u config

static$default\u config=array(
'showcalendar'=>false,
'jslocale'=>null,
“dmyfields”=>错误,
“dmyseparator”=>“/”,
“dmyplaceholders”=>正确,
“dateformat”=>null,
'datavalueformat'=>'yyyy MM dd',
'min'=>null,
“max”=>null,
);
使用Silverstripe中的配置系统,您可以通过以下方式将默认的
dateformat
更改为
dd.MM.yyyy
格式:

EditableDateField_FormField:
  default_config:
    'dateformat': 'dd.MM.yyyy'
您需要像上面的示例一样使用
EditableDateField\u FormField
,而不是更改
DateField
本身的
default\u config
,否则您可能会在CMS中遇到问题

技术说明 这项工作的原因是


因为
default\u config
dateformat
的值通常为
NULL
,这会导致
dateformat
通过覆盖
getFormField
来设置来自
i18n::get\u date\u format()
的结果?可能是您可以使用的另一个函数,它有一个
extend
回调?我想这样做,并在多语言网站中强制始终使用相同的日期格式:公共函数getFormField(){$defaultValue=($this->getSetting('defaultToToToDay'))?日期('Y-m-d'):$this->Default;$field=新的日期字段($this->Name,$this->Title,$defaultValue);$field->setConfig('showcalendar',true);$field->setConfig('dateformat','dd.MM.yyyy');返回$field;}不是100%确定,但只是为了设置dateformat,您不能在扩展上使用onBeforeRender回调吗?thx。基本问题是扩展中的函数没有被调用。如果我再次阅读DataExtension的文档,我想知道是否真的可以只覆盖现有方法。我认为您不能覆盖只要您愿意,DataExtension在原始类上有extend()调用的特殊钩子,在FormFields上onBeforeRender是唯一一个在扩展上被调用的钩子。如果您想覆盖任何函数,您必须创建一个扩展EditableDateField的自定义类。