【问题标题】:Extended Member class still attempting to write to Member table扩展成员类仍在尝试写入成员表
【发布时间】:2015-07-10 02:45:59
【问题描述】:

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

设置:

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

问题:

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

string '无法运行查询:UPDATE "Member" SET "AddressLine1" = “测试”,“AddressLine2”=“测试”,“国家”=“澳大利亚”,“州”=“维克”, "邮政编码" = 1212, "LastEdited" = '2015-07-10 12:43:58' 其中 "ID" = 10

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

注意它正在尝试将新字段写入Member 表,而不是扩展的ClientMember 表。

我错过了什么?

【问题讨论】:

  • 您能否澄清一下您是想完全用 ClientMember 替换 Member,还是想要同时拥有 ClientMember 和 Member?
  • 我正在尝试替换(扩展)成员。在理想情况下,它们应该是分开的,但我想重用 Member 附带的所有登录功能。

标签: silverstripe


【解决方案1】:

我这样做的方法是使用 DataExtension 扩展 Member,如下所示:

客户会员

class ClientMember extends DataExtension {

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

    public function updateCMSFields(FieldList $fields) {

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

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

config.yml

Member:
  extensions:
    - ClientMember

【讨论】:

  • @nickspiel 对此添加更多解释:所有新数据都将在 ClientMember 中(所以地址和所有这些),但成员表仍然存在,当您保存新成员时,您使用该类而不是 ClientMember.... 所以请阅读扩展如何工作以更好地理解它:)
  • 当我访问“安全”选项卡时,我现在将它换成了这个新设置,我得到以下信息:'调用未定义的方法 ClientMember::setSourceQueryParams()'
  • 看起来安全选项卡正试图将“ClientMember”视为数据对象 $item->setSourceQueryParams($this->dataQuery()->getQueryParams()); (form DataList.php createDataObject())
  • 这很奇怪。我以前在项目中使用过相同的方法,从来没有遇到过这个问题。我会在我的答案中尝试确切的代码,看看我是否可以重新创建您的问题。
  • 对于那些感兴趣的人,我不得不删除与成员关联的表并重建,之后一切都按预期工作。