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

How to save multiple values entered into ListBoxField and loop through values?

我希望能够使用 ListBoxField 将团队成员关联到项目。我有一个 ProjectHolder,它有 Project 页,因为它是 children。我还有一个 TeamHolder,它的 TeamPage 作为它的 children。

我希望能够在 ListBoxField 中保存多个团队成员,然后在 Project 页面上循环浏览他们。我也希望能够 link 到团队成员页面。例如

<% loop $TeamMemberNames %>
    <a href="$Link">$Name</a>
<% end_loop %>

我的当前代码:

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;
    }
}

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;
    }

}

截图:

我可以将 TeamPage Object 中的名称拉入 ListBoxField 但是在选择名称后我需要一种方法来保存多个值并获得 Link 这样我就可以 link 转到列出的相应团队成员页面。

要将数据保存到数据库中,我们必须首先在 class 中定义与数据的关系。在这种情况下,我们要在 ProjectTeamPage 之间创建 $many_many 关系。

Project class 中我们添加 $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;
    }
}

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

模板

<% loop $TeamPages %>
    <a href="$Link">$Name</a>
<% end_loop %>

如果我们希望 TeamPage 能够访问它的相关 Projects 我们可以添加一个 $belongs_many_manyTeamPage class 来指向回到 Project class。您还可以从 TeamPage.

添加一个 ListBoxField 来控制 Projects

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;
    }
}

需要注意的是 TeamPageProject 都扩展了 Page。这意味着两个 class 都继承了一个 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;
    }
}

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;
    }
}

模板

<% loop $TeamPages %>
    <a href="$Link">$Title</a>
<% end_loop %>