我创建了一个Link DataObject来自动让用户创建对前端中不同页面的引用。我在前端使用两种语言,德语和英语。在弹出窗口中,我创建一个下拉列表来选择页面
public function getCMSFields_forPopup()
{
return new FieldSet(
new TextField('Titel'),
new TextField('URL', 'Externer Link'),
new SimpleTreeDropdownField('PageLinkID', 'Interner Link', 'SiteTree')
);
}
但我只在下拉列表中获得德语页面。试图将管理语言更改为英语但没有变化。数据库似乎只返回德语页面......
有任何线索吗?
答案 0 :(得分:4)
编辑:我做了一些挖掘,并找到了如何做到这一点。在获取SiteTree对象之前,需要调用“disable_locale_filter”:
Translatable::disable_locale_filter();
一旦你检索到它们,就调用“enable_locale_filter”:
Translatable::enable_locale_filter();
我会留下其他方法,因为我认为它们仍然有用......
我相信你可能必须使用Translatable :: get_by_locale()这样做 - 我假设你只希望人们能够选择一个页面来链接到他们的语言?
也许是这样的?
public function getCMSFields_forPopup()
{
$member = Member::currentUser();
if($member && $member->Locale) {
$pagesByLocale = Translatable::get_by_locale('SiteTree', $member->Locale);
$pagesByLocale = $pagesByLocale->map('ID', 'Title', '(Select one)', true);
return new FieldSet(
new TextField('Title'),
new TextField('URL', 'Externer Link'),
new DropdownField('PageLinkID', 'Interner Link', $pagesByLocale);
);
} else {
// Handle non-member
}
}
编辑:请参阅下面的注释,但另一个选项是使用Translatable :: get_current_locale()函数查找该区域设置的站点树中的所有页面...如果用户正在查看英文页面,则应设置区域设置英语等...
public function getCMSFields_forPopup()
{
$pagesByLocale = Translatable::get_by_locale('SiteTree', Translatable::get_current_locale());
$pagesByLocale = $pagesByLocale->map('ID', 'Title', '(Select one)', true);
return new FieldSet(
new TextField('Title'),
new TextField('URL', 'Externer Link'),
new DropdownField('PageLinkID', 'Interner Link', $pagesByLocale);
);
}
您还可以从当前页面获取区域设置,例如
$this->Locale; // From within the model
$this->dataRecord->Locale; // from within the controller
Director::get_current_page()->Locale; // If you're outside the context of the page altogether i.e. code inside your DataObject.