【问题标题】:Silverstripe 3.1 - One player has many teamsSilverstripe 3.1 - 一名球员拥有多支球队
【发布时间】:2013-10-20 18:45:07
【问题描述】:

我正在尝试创建这样的团队列表。

TeamHolder - 适用于所有团队。有 Teampages 作为孩子

TeamPage - 团队的描述和形象。还有一个与 TeamMember(Dataobject) 的 has_one 关系

TeamMember - 拥有成员。在这里,您还应该能够定义玩家所在的团队。这是我的代码。但我不知道如何与我的团队页面建立 has_many 关系,以便您可以为一名球员选择多个球队。有没有人解决这个问题?

http://www.sspaste.com/paste/show/526422c0d33bc

提前谢谢

【问题讨论】:

  • 团队成员有多个团队?团队成员不应该只有一个团队,一个团队可以有多个团队成员吗?如果是这样,TeamPage 将与 TeamMember 具有 has_many 关系,而 TeamMember 将与 TeamPage 具有 has_one 关系。如果一个团队成员可以有多个团队,而一个团队可以有多个团队成员,那么您需要在两者之间建立many_many 关系。所以TeamPage 会有一个many_many 链接到TeamMemberTeamMember 会有一个belongs_many_many 链接回到TeamPage

标签: php silverstripe


【解决方案1】:

如果您希望 1 名玩家 (TeamMember) 加入多个团队,并且团队拥有多个玩家,则需要 many_many。如果在这里使用 has_many,那么 Team 将有一个 PlayerID,这意味着每个团队中只能有 1 个 Player。

class TeamPage extends Page {
    private static $many_many = array('TeamMembers' => 'TeamMember');
    public function getCMSFields() {
        $fields = parent::getCMSFields();
        $fields->addFieldToTab('Root', Tab::create('MembersTab', 'Team Members'));
        $fields->addFieldToTab('Root.MembersTab', GridField::create('TeamMembers', 'The Team Members', $this->TeamMembers(), GridFieldConfig_RelationEditor::create());
        return $fields;
    }
}
class TeamMember extends DataObject {
    private static $belongs_many_many = array('Teams' => 'TeamPage');
    public function getCMSFields() {
        $fields = FieldList::create();
        if (!$this->isInDB()) {
            // if the TeamMember has not been saved yet, display a message that it needs to be saved before teams can be assigned
            $fields->push(ReadOnlyField::create('Teams', '', 'Save to assign Teams'));
        } else {
            $config = GridFieldConfig_RelationEditor::create();
            // if you don't want the "add a new team" button on this grid, you can remove that with the following line:
            // $config->removeComponentsByType('GridFieldAddNewButton');
            $fields->push(GridField::create('Teams', 'Team this Member is in', $this->Teams(), $config);
        }
        return $fields;
    }
}

请注意,我使用了GridFieldConfig_RelationEditor 而不是GridFieldConfig_RecordEditor,它会在您的网格字段中添加一个GridFieldAddExistingAutocompleter,以便您链接对象。

【讨论】:

  • 嗨,这似乎工作得很好:) 但是有没有办法在添加新成员时删除“添加团队页面”按钮?
  • 什么“添加团队页面”按钮?可以截图吗?
  • 如果你添加了一个新成员,那么你就有了这个选项。 x04.img-up.net/Unbenannt-9546.jpg
  • 您可以通过在网格字段配置上调用 ->removeComponentsByType('GridFieldAddNewButton') 从网格字段中删除该按钮,我更新了答案中的代码示例以将其包含为注释
  • 是的,但可以在汇总字段中使用自定义方法。但这是另一个问题,你介意为此提出一个新问题吗?标题可能是这样的:“在 GridField 中显示来自 many_many 关系的标题”
猜你喜欢
  • 2019-07-10
  • 1970-01-01
  • 1970-01-01
  • 2021-01-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多