Silverstripe页面关系用不同的语言

时间:2011-02-03 10:38:03

标签: php content-management-system silverstripe

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

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

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

有任何线索吗?

1 个答案:

答案 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.