【问题标题】:Silverstripe page relation in different languages不同语言的 Silverstripe 页面关系
【发布时间】:2011-02-03 10:38:02
【问题描述】:

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

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

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

有什么线索吗?

【问题讨论】:

    标签: php content-management-system silverstripe


    【解决方案1】:

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

    编辑:参见下面的 cmets,但另一个选项是使用 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.
    

    【讨论】:

    • 嗨,谢谢,首先适用于会员语言,但我希望人们能够链接到 CMS 中可用的任何语言。因此下拉列表将包含两种语言的 SiteTree。或者至少让用户在编辑英文页面时链接到英文页面。
    • 我刚刚想到“或者至少让用户在编辑英文页面时链接到英文页面” - 你说过这是前端功能吧? ...使用类似的方法,您可以从他们正在查看/编辑的页面而不是从成员对象中获取语言环境。查看对原始答案的修改...
    • 他们没有相同的 ID。数据库中的 SiteTree 表列出了具有自己 ID 的英文页面,所以我猜 $obj->getTranslation 所做的是检查 SiteTree_Translation 表中的翻译。
    • 啊——是的,你是对的。希望以上内容对您有所帮助。
    • @spankmaster79 - 我刚刚为您添加了一个新的解决方案。这应该完全做你想要的:)
    猜你喜欢
    • 2013-06-09
    • 2019-07-19
    • 2013-12-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-03-07
    • 1970-01-01
    • 2019-05-18
    相关资源
    最近更新 更多