【问题标题】:How to save multiple values entered into ListBoxField and loop through values?如何保存输入到 ListBoxField 中的多个值并循环遍历值?
【发布时间】:2015-11-11 08:53:43
【问题描述】:

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

我希望能够在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;
    }

}

截图:

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

【问题讨论】:

  • 您需要先定义如何将其保存在数据库中。我猜一个成员可以加入很多项目,一个项目有很多成员,你需要一个 $many_many 关系。你上课了吗? silverstripe.org/learn/lessons 那里的教程应该涵盖所有内容。

标签: silverstripe


【解决方案1】:

要将数据保存到数据库中,我们必须首先在类中定义与数据的关系。在这种情况下,我们要在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 %>

【讨论】:

  • 非常感谢,就是这样!感谢您的时间:)
猜你喜欢
  • 2013-08-12
  • 1970-01-01
  • 1970-01-01
  • 2021-11-04
  • 2021-10-24
  • 2015-07-26
  • 1970-01-01
  • 2016-10-05
  • 2013-03-25
相关资源
最近更新 更多