gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-01 11:29:43 25 4
gpt4 key购买 nike

我希望能够使用 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com