Silverstripe 扩展成员类仍在尝试写入成员表

Silverstripe 扩展成员类仍在尝试写入成员表,silverstripe,Silverstripe,我正在扩展成员表以包括基本地址详细信息 设置: class ClientMember extends Member { private static $db = array( "AddressLine1" => "Varchar(255)", "AddressLine2" => "Varchar(255)", "Country" => "Varchar(50)", "State"

我正在扩展成员表以包括基本地址详细信息

设置:

class ClientMember extends Member {

    private static $db = array(
        "AddressLine1" => "Varchar(255)",
        "AddressLine2" => "Varchar(255)",
        "Country"      => "Varchar(50)",
        "State"        => "Varchar(50)",
        "Postcode"     => "Int(4)"
    );

    public function getCMSFields() {
        $fields = parent::getCMSFields();

        $addressLine1 = new TextField('AddressLine1', 'Address line 1', null, 255);
        $addressLine2 = new TextField('AddressLine2', 'Address line 2', null, 255);
        $country      = new CountryDropdownField('Country', 'Country', null, 'AU');
        $state        = new DropdownField('State', 'State', array('vic' => 'Victoria', 'sa' => 'South Australia', 'wa' => 'Western Australia'));
        $postcode     = new NumericField('Postcode', 'Postcode', null, 4);

        $fields->addFieldsToTab(
            'Root.Address',
            array(
                $addressLine1,
                $addressLine2,
                $country,
                $state,
                $postcode
            )
        );

        return $fields;
    }
}
然后我告诉SilverStripe在YAML配置中使用新的类名称
ClientMember

Injector:
  Member:
    class: ClientMember
问题:

class ClientMember extends Member {

    private static $db = array(
        "AddressLine1" => "Varchar(255)",
        "AddressLine2" => "Varchar(255)",
        "Country"      => "Varchar(50)",
        "State"        => "Varchar(50)",
        "Postcode"     => "Int(4)"
    );

    public function getCMSFields() {
        $fields = parent::getCMSFields();

        $addressLine1 = new TextField('AddressLine1', 'Address line 1', null, 255);
        $addressLine2 = new TextField('AddressLine2', 'Address line 2', null, 255);
        $country      = new CountryDropdownField('Country', 'Country', null, 'AU');
        $state        = new DropdownField('State', 'State', array('vic' => 'Victoria', 'sa' => 'South Australia', 'wa' => 'Western Australia'));
        $postcode     = new NumericField('Postcode', 'Postcode', null, 4);

        $fields->addFieldsToTab(
            'Root.Address',
            array(
                $addressLine1,
                $addressLine2,
                $country,
                $state,
                $postcode
            )
        );

        return $fields;
    }
}
然后,我可以通过CMS和新地址选项卡创建新的“客户成员”,所有字段都按预期工作。保存时,出现以下错误:

字符串“”无法运行查询:更新“成员”集“AddressLine1”= '测试',“地址行2”='测试',“国家”='非盟',“州”='维克', “邮政编码”=1212,“最后编辑”=“2015-07-10 12:43:58”,其中“ID”= 十,

“字段列表”中的未知列“AddressLine1”(长度=245)

注意,它试图将新字段写入
Member
表,而不是扩展
ClientMember


我遗漏了什么?

我这样做的方式是使用
数据扩展扩展扩展
成员
,如下所示:

客户成员 config.yml
您能否澄清一下,您是想用ClientMember完全替换成员,还是想同时拥有ClientMember和Member?我正在尝试替换(扩展)成员。在理想情况下,它们是分开的,但我想重用Member附带的所有登录功能。@nickspiel对此做了更多解释:所有新数据都将在ClientMember中(所以地址等等),但Member表仍然存在,当您保存新成员时,您使用该类而不是ClientMember。。。。因此,请阅读扩展是如何工作的,以便更好地理解它:)现在,当我访问安全选项卡时,我将其切换到了这个新设置,得到了以下信息:“调用未定义的方法ClientMember::setSourceQueryParams()”看起来安全选项卡正试图将“ClientMember”视为DataObject$item->setSourceQueryParams($this->dataQuery()->getQueryParams());(form DataList.php createDataObject())这很奇怪。我以前在项目中使用过相同的方法,但从未遇到过这个问题。我将尝试我的答案中的确切代码,看看是否可以重新创建您的问题。对于那些感兴趣的人,我不得不丢弃与成员关联的表并重新构建,然后一切都按预期进行。
Member:
  extensions:
    - ClientMember