编辑:我做了更多的挖掘,发现了如何做到这一点。在获取 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.