Отношение страницы Silverstripe на разных языках - PullRequest
2 голосов
/ 03 февраля 2011

Я создал объект Data Data объекта, чтобы автоматически разрешать пользователям создавать ссылки на другую страницу во внешнем интерфейсе. Я использую два языка в интерфейсе, немецкий и английский. Во всплывающем окне я создаю раскрывающийся список для выбора страниц

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

Но у меня только немецкие страницы в выпадающем списке. Пытался изменить язык администратора на английский, но без изменений. База данных, похоже, возвращает только немецкие страницы ...

Любая подсказка?

1 Ответ

4 голосов
/ 15 февраля 2011

Редактировать: Я сделал еще несколько копаний и узнал, как это сделать. Вам нужно вызвать «disable_locale_filter», прежде чем вы получите ваши объекты SiteTree:

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