2017-05-19 17 views
0

使用流暢的LocalMenu模板來獲取語言切換器會給我顯示爲頁面的自定義控制器和數據對象的「錯誤」鏈接。SilverStripe Fluent - 如何防止在自定義控制器上查詢字符串?

所以我都有。控制器作爲頁面和其他自定義控制器上的數據對象顯示爲頁面。

而不是en/sompage/foobar我收到somepage/foobar?l=en_US

我認爲這我的錯實現對這些數據對象和控制器的Link功能造成的。

我該如何做到正確?我找不到任何關於此的信息。這是我當前的代碼:

public function Link($action = null) { 
    $parent = MyParentPage::get()->first()->URLSegment; 
    $home = RootURLController::get_default_homepage_link(); 

    if($parent != $home) { 
     $url = $parent . '/'; 
    } else { 
     $url = null; 
    } 

    return Director::baseURL() . $this->fluentUrlSegment() . $url . 'controller-segment'; 
    } 

public function fluentUrlSegment() { 
    if(class_exists('Fluent')) { 
     $locale = Fluent::current_locale(); 
     $fluentConfig = Fluent::create()->config(); 

     if($fluentConfig->default_locale != $locale) { 
     if($fluentConfig->aliases && isset($fluentConfig->aliases[$locale])) { 
      $locale = $fluentConfig->aliases[$locale]; 
     } 

     $locale = $locale . '/'; 
     } else { 
     $locale = ''; 
     } 
    } else { 
     $locale = ''; 
    } 

    return $locale; 
    } 

流利配置

--- 
Name: projectfluentconfig 
After: '#fluentconfig' 
--- 
Fluent: 
    disable_default_prefix: true 
    detect_locale: true 
    remember_locale: true 
    default_locale: de_DE 
    locales: 
    - de_DE 
    - en_US 
    aliases: 
    de_DE: de 
    en_US: en 
    field_exclude: 
--- 
Name: projectfluentconfig 
After: '#fluenti18nconfig' 
--- 
i18n: 
    default_locale: de_DE 

更新

由於WMK的答案,我可以提高我的鏈接功能。不幸的是,它仍然沒有改變流利地區菜單中的鏈接。

代替geschichte/..en/geschichte/..我收到了德國網站geschichte/..?l=de_DEgeschichte/..?l=en_USen/geschichte/..?l=de_DEen/geschichte/..?l=en_US在英國之一。

難道說流利就完全忽略了這些鏈接功能嗎?我還犯了一個錯誤還是錯過了一些東西?這裏是我的shortend代碼ControllerDataObjectRoutesExtensions & Fluent Config

有什麼建議?

更新2

FluentSiteTree類的LocaleLink功能似乎是「問題」

+0

英語是您的默認語言環境嗎?你可以分享你的配置嗎?有一個設置可以從德國的URL –

+0

中刪除默認語言環境。我編輯了我的問題,並添加了配置 –

+0

你有一個自定義控制器爲你的數據對象,或者它只是一個頁面的子鏈接? – wmk

回答

1

你已經從數據庫中抓取頁面,並採取URLSegment。爲什麼不利用該頁面的Link()方法?這應該已經有流暢的東西了。

然後用Controller::join_links()

public function Link($action = null) { 
    //maybe parent::Link() also works, depending on your code structure 
    $parent = MyParentPage::get()->first()->Link(); 

    return Controller::join_links($parent, 'controller-segment', $action); 
} 
+0

謝謝,這使鏈接創建更容易清潔。不幸的是,它仍然沒有改變流利地區菜單中的鏈接。我已經更新了我的問題,也許你有一個想法? –

0

這是不是一個真正的答案,但解決方法Concat的鏈接部分。

我設法通過將FluentExtension也添加到控制器並在該控制器上實現我自己的LocaleLink功能。

對於這裏還有被卡住,直到有一個真正的解決方案,這是我工作的代碼ControllerDataObjectRoutes任何一個,Extensions & Fluent Config

如果你wan't使用翻譯urlsegment的控制器,你可能使用此鏈接功能

public function Link($action = null) { 
    $homepage = Page::get()->find('URLSegment', RootURLController::get_homepage_link()); 
    $parent = $homepage->Link(); 

    $urlByLocale = [ 
     'de_DE' => 'geschichte', 
     'en_US' => 'story', 
    ]; 

    return Controller::join_links($parent, $urlByLocale[Fluent::current_locale()], $action); 
    } 

,改變這樣的

'de/geschichte//$URLSegment!' => [ 
    'Controller' => 'Story_Controller', 
    'l' => 'de_DE' 
    ], 
    'en/story//$URLSegment!' => [ 
    'Controller' => 'Story_Controller', 
    'l' => 'en_US' 
    ], 
航線

如果有人會找到一個「更好的」方法來實現這一點,那將會很棒。

相關問題