我希望能够使用 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;
}
}
截图:
我可以将 TeamPage
对象中的名称提取到 ListBoxField
中,但是在选择名称后,我需要一种方法来保存多个值并获取链接,以便我可以链接到列出的相应团队成员页面。
最佳答案
要将数据保存到数据库中,我们必须首先在我们的类中定义与数据的关系。在这种情况下,我们要在 Project
和 TeamPage
之间创建一个 $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;
}
}
需要注意的是 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;
}
}
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/