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

标签 silverstripe

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

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

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

}

截图:

enter image description here

我可以将 TeamPage 对象中的名称提取到 ListBoxField 中,但是在选择名称后,我需要一种方法来保存多个值并获取链接,以便我可以链接到列出的相应团队成员页面。

最佳答案

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

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

现在在我们的模板中,我们可以通过调用以下代码循环访问 Project's $TeamPages:

模板

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

如果我们希望 TeamPage 能够访问它的相关 Projects,我们可以将 $belongs_many_many 添加到 TeamPage 类指向 Project 类。您还可以添加一个 ListBoxField 来控制 TeamPage 中的 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。这意味着两个类都继承了一个 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 %>

关于silverstripe - 如何保存输入到 ListBoxField 中的多个值并循环遍历值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33647047/

相关文章:

silverstripe - 如何自定义 SilverStripe 页面的 &lt;title&gt;

php - SilverShop 模块的动态排序选项

syntax-highlighting - Silverstripe 的 Coda 语法高亮显示

php - SilverStripe 3.6.2 - 按下拉选择对分页数据对象进行排序会触发 404 错误

silverstripe - 如何从 "Title"对象获取 "Page"属性

styles - silverstripe - 将样式添加到编辑器上的 'styles' 下拉菜单

php - SilverStripe 按自定义顺序排序页面列表

silverstripe - 如何翻译托管模型选项卡?

javascript - 自动更新 URL 段的最简单方法是什么?

php - Silverstripe 合并 GroupedLists