SilverStripe - 添加 2 个 TreeDropdownFields,只有一个有效
SilverStripe - Adding 2 TreeDropdownFields, only one works
我 运行 在为 DataObject
创建 2 TreeDropdownFields
时遇到了一个非常奇怪的问题。出于某种原因,2 个 TreeDropdownFields
中只有 1 个在 SilverStripe 管理中正确呈现。另一个根本不呈现为 TreeDropdownField
,而只是作为标签:
代码如下:
class HomeBanner extends DataObject {
public static $db = array(
'SortOrder' => 'Int',
'Title' => 'Varchar'
);
public static $has_one = array(
'Image' => 'Image',
'SecondaryImage' => 'Image',
'FirstLink' => 'SiteTree',
'SecondLink' => 'SiteTree'
);
public function getCMSFields() {
$fields = parent::getCMSFields();
$fields->removeFieldFromTab('Root.Main', 'PageID');
$fields->removeFieldFromTab('Root.Main', 'SortOrder');
$fields->addFieldToTab('Root.Main', new TreeDropdownField('FirstLinkID', 'First Link', 'SiteTree'));
$fields->addFieldToTab('Root.Main', new TreeDropdownField('SecondLinkID', 'Second Link', 'SiteTree'));
return $fields;
}
public static $summary_fields = array(
'ID' => 'ID',
'Title' => 'Title',
'Thumbnail' => 'Thumbnail'
);
public function getThumbnail() {
return $this->Image()->CMSThumbnail();
}
}
这是我目前尝试过的方法:
- 运行宁
dev/build/?flush=true
- 运行宁
?flush=all
和?flush=1
- 注销并在
dev/build
+ 刷新后重新登录
- 在另一个浏览器中登录管理员(我通常使用 Chrome 但是
在 FireFox 上登录该网站的管理员并看到同样的问题)
- 错误日志没有任何报告 -- 它们很清楚
- Chrome 的开发工具的控制台中没有错误
- 添加第三个
TreeDropdownField
将允许前两个呈现
正确但第三个只会显示标签而不是
TreeDropdownField
此格式有效,但不会保存任何已选择的内容——它会在您离开页面后立即清除您的选择。此外,除非我将其删除,否则它会删除已保存在管理员中的所有内容。我无法进行更改,否则保存的项目将被删除。):
$fields->addFieldToTab('Root.Main', new TreeDropdownField('SecondLink', 'Second Link', 'SiteTree', 'ID'));
有人知道为什么会发生这种情况吗?不能有多个TreeDropdownFields
.
似乎没有意义
重新发布,因为这原来是答案:
The name “HomeBanner” suggests to me that there should also be a has_one pointing back to HomePage or similar? The cause of this is probably that SilverStripe is automatically trying to set one of the has_one relations to point back to the page that the banner belongs to.
使用如下代码时也会发生类似的冲突:
class Page extends SiteTree {
private static $has_many = [
'Banners' => 'Banner'
];
}
class Banner extends DataObject {
private static $has_one = [
'Page' => 'Page',
'LinkedPage' => 'Page'
];
}
因为 SilverStripe 不知道它应该使用 PageID
还是 LinkedPageID
来自动填充 has_many
关系的那一侧(GridField 将尝试自动分配正确的 has_one
ID).
在这些情况下,您可以使用圆点符号来区分它们 - 您可以将其更改为 $has_many = ['Banners' => 'Banner.Page'];
。有关详细信息,请参阅 https://docs.silverstripe.org/en/3/developer_guides/model/relations/#has-many。
我 运行 在为 DataObject
创建 2 TreeDropdownFields
时遇到了一个非常奇怪的问题。出于某种原因,2 个 TreeDropdownFields
中只有 1 个在 SilverStripe 管理中正确呈现。另一个根本不呈现为 TreeDropdownField
,而只是作为标签:
代码如下:
class HomeBanner extends DataObject {
public static $db = array(
'SortOrder' => 'Int',
'Title' => 'Varchar'
);
public static $has_one = array(
'Image' => 'Image',
'SecondaryImage' => 'Image',
'FirstLink' => 'SiteTree',
'SecondLink' => 'SiteTree'
);
public function getCMSFields() {
$fields = parent::getCMSFields();
$fields->removeFieldFromTab('Root.Main', 'PageID');
$fields->removeFieldFromTab('Root.Main', 'SortOrder');
$fields->addFieldToTab('Root.Main', new TreeDropdownField('FirstLinkID', 'First Link', 'SiteTree'));
$fields->addFieldToTab('Root.Main', new TreeDropdownField('SecondLinkID', 'Second Link', 'SiteTree'));
return $fields;
}
public static $summary_fields = array(
'ID' => 'ID',
'Title' => 'Title',
'Thumbnail' => 'Thumbnail'
);
public function getThumbnail() {
return $this->Image()->CMSThumbnail();
}
}
这是我目前尝试过的方法:
- 运行宁
dev/build/?flush=true
- 运行宁
?flush=all
和?flush=1
- 注销并在
dev/build
+ 刷新后重新登录 - 在另一个浏览器中登录管理员(我通常使用 Chrome 但是 在 FireFox 上登录该网站的管理员并看到同样的问题)
- 错误日志没有任何报告 -- 它们很清楚
- Chrome 的开发工具的控制台中没有错误
- 添加第三个
TreeDropdownField
将允许前两个呈现 正确但第三个只会显示标签而不是TreeDropdownField
此格式有效,但不会保存任何已选择的内容——它会在您离开页面后立即清除您的选择。此外,除非我将其删除,否则它会删除已保存在管理员中的所有内容。我无法进行更改,否则保存的项目将被删除。):
$fields->addFieldToTab('Root.Main', new TreeDropdownField('SecondLink', 'Second Link', 'SiteTree', 'ID'));
有人知道为什么会发生这种情况吗?不能有多个TreeDropdownFields
.
重新发布,因为这原来是答案:
The name “HomeBanner” suggests to me that there should also be a has_one pointing back to HomePage or similar? The cause of this is probably that SilverStripe is automatically trying to set one of the has_one relations to point back to the page that the banner belongs to.
使用如下代码时也会发生类似的冲突:
class Page extends SiteTree {
private static $has_many = [
'Banners' => 'Banner'
];
}
class Banner extends DataObject {
private static $has_one = [
'Page' => 'Page',
'LinkedPage' => 'Page'
];
}
因为 SilverStripe 不知道它应该使用 PageID
还是 LinkedPageID
来自动填充 has_many
关系的那一侧(GridField 将尝试自动分配正确的 has_one
ID).
在这些情况下,您可以使用圆点符号来区分它们 - 您可以将其更改为 $has_many = ['Banners' => 'Banner.Page'];
。有关详细信息,请参阅 https://docs.silverstripe.org/en/3/developer_guides/model/relations/#has-many。