2

我创建了一个 Link DataObject 来自动让用户在前端创建对不同页面的引用。我在前端使用两种语言,德语和英语。在弹出窗口中,我创建一个下拉列表来选择页面

public function getCMSFields_forPopup()
{
    return new FieldSet(
        new TextField('Titel'),
        new TextField('URL', 'Externer Link'),
        new SimpleTreeDropdownField('PageLinkID', 'Interner Link', 'SiteTree')
    );
}

但我只在下拉列表中获得德语页面。试图将管理语言更改为英语,但没有任何变化。数据库似乎只返回德语页面......

有什么线索吗?

4

1 回答 1

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.
于 2011-02-14T21:36:15.147 回答