如何保存输入到ListBoxField中的多个值并循环显示值?

ifu*_*ion 3 silverstripe

我希望能够将团队成员与使用该项目的项目相关联ListBoxField.我有一个ProjectHolder具有Project网页,因为它的孩子.我也有一个TeamHolder,其具有TeamPage的作为其子.

我希望能够在其中保存多个团队成员ListBoxField,然后在Project页面上循环访问它们.我还希望能够链接到团队成员页面.例如

<% loop $TeamMemberNames %>
    <a href="$Link">$Name</a>
<% end_loop %>
Run Code Online (Sandbox Code Playgroud)

我目前的代码:

TeamPage.php

class TeamPage extends Page
{
    private static $db = array(
        'Name' => 'Varchar(255)',
    );

    public function getCMSFields() {

        $fields = parent::getCMSFields();

        $fields->addFieldToTab('Root.TeamMembers', TextField::create('Name'));

        return $fields;
    }
}
Run Code Online (Sandbox Code Playgroud)

Project.php

class Project extends Page
{
    private static $db = array(
        'Name' => 'Varchar(255)',
    );

    public function getCMSFields() {

        $fields = parent::getCMSFields();

        $fields->addFieldToTab('Root.TeamMembers', TextField::create('Name'));

        $fields->addFieldToTab('Root.TeamMembers', ListBoxField::create(
            'TeamPage',
            'Select Team Members for project',
            TeamPage::get()->map("ID", "Name")->toArray()
        )->setMultiple(true));

        return $fields;
    }

}
Run Code Online (Sandbox Code Playgroud)

截图:

在此输入图像描述

我可以将TeamPage对象中的名称拉进去,ListBoxField但是在选择名称之后我需要一种方法来保存多个值并获得链接,这样我就可以链接到列出的相应团队成员页面.

3dg*_*goo 5

要将数据保存到数据库,我们必须首先定义与类中数据的关系.在这种情况下,我们希望$many_manyProject和之间建立关系TeamPage.

Project课堂上我们添加一个$many_many关系TeamPage.这里,关系名称是TeamPages.

创建时,ListBoxField我们传递TeamPages关系名称,以便字段知道保存此数据的位置:

Project.php

class Project extends Page
{
    private static $db = array(
        'Name' => 'Varchar(255)'
    );

    private static $many_many = array(
        'TeamPages' => 'TeamPage'
    );

    public function getCMSFields() {

        $fields = parent::getCMSFields();

        $fields->addFieldToTab('Root.TeamMembers', TextField::create('Name'));

        $fields->addFieldToTab('Root.TeamMembers', ListBoxField::create(
            'TeamPages',
            'Select Team Members for project',
            TeamPage::get()->map('ID', 'Name')->toArray()
        )->setMultiple(true));

        return $fields;
    }
}
Run Code Online (Sandbox Code Playgroud)

现在在我们的模板中,我们可以通过Project's $TeamPages调用以下内容来遍历:

模板

<% loop $TeamPages %>
    <a href="$Link">$Name</a>
<% end_loop %>
Run Code Online (Sandbox Code Playgroud)

如果我们希望TeamPage能够访问它的相关内容,Projects我们可以$belongs_many_manyTeamPage类中添加一个指向Project该类的内容.您还可以添加ListBoxField到控制ProjectsTeamPage.

TeamPage.php

class TeamPage extends Page
{
    private static $db = array(
        'Name' => 'Varchar(255)'
    );

    private static $belongs_many_many = array(
        'Projects' => 'Project'
    );

    public function getCMSFields() {

        $fields = parent::getCMSFields();

        $fields->addFieldToTab('Root.TeamMembers', TextField::create('Name'));

        $fields->addFieldToTab('Root.TeamMembers', ListBoxField::create(
            'Projects',
            'Select project for this team page',
            Project::get()->map('ID', 'Name')->toArray()
        )->setMultiple(true));

        return $fields;
    }
}
Run Code Online (Sandbox Code Playgroud)

需要注意的是TeamPage并且Project都延伸了Page.这意味着两个类都继承了一个Title字段.我会建议使用Title而不是Name,除非你有特定的理由这样做.

这将使代码:

Project.php

class Project extends Page
{
    private static $many_many = array(
        'TeamPages' => 'TeamPage'
    );

    public function getCMSFields() {

        $fields = parent::getCMSFields();

        $fields->addFieldToTab('Root.TeamMembers', ListBoxField::create(
            'TeamPages',
            'Select Team Members for project',
            TeamPage::get()->map('ID', 'Title')->toArray()
        )->setMultiple(true));

        return $fields;
    }
}
Run Code Online (Sandbox Code Playgroud)

TeamPage.php

class TeamPage extends Page
{
    private static $belongs_many_many = array(
        'Projects' => 'Project'
    );

    public function getCMSFields() {

        $fields = parent::getCMSFields();

        $fields->addFieldToTab('Root.Projects', ListBoxField::create(
            'Projects',
            'Select project for this team page',
            Project::get()->map('ID', 'Title')->toArray()
        )->setMultiple(true));

        return $fields;
    }
}
Run Code Online (Sandbox Code Playgroud)

模板

<% loop $TeamPages %>
    <a href="$Link">$Title</a>
<% end_loop %>
Run Code Online (Sandbox Code Playgroud)