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

时间:2015-11-11 08:53:44

标签: silverstripe

我希望能够使用ListBoxField将团队成员关联到项目。我有一个ProjectHolder,其中包含Project个页面。我还有一个TeamHolder,其中有TeamPage个孩子。

我希望能够在ListBoxField中保存多个团队成员,然后在Project页面上循环播放这些成员。我还希望能够链接到团队成员页面。 e.g

<% 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但是在选择名称之后我需要一种方法来保存多个值并获取链接以便我可以链接到相应的列出的团队成员页面。

1 个答案:

答案 0 :(得分: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;
    }
}

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

<强>模板

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

如果我们希望TeamPage能够访问相关的Projects,我们可以向$belongs_many_many类添加TeamPage以指向Project课程。ListBoxField。您还可以从Projects添加TeamPage来控制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; } }

<强> TeamPage.php

TeamPage

需要注意的是ProjectPage都延伸Title。这意味着两个类都继承了Title字段。我建议使用Name代替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; } } ,除非您有特定的理由这样做。

这会产生代码:

<强> Project.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;
    }
}

<强> TeamPage.php

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

<强>模板

power2() { echo "x=l($1)/l(2); scale=0; 2^((x+0.5)/1)" | bc -l; }