2017-05-19 4 views
0

流暢なテンプレートからLocalMenuテンプレートを使用すると、私のカスタムコントローラーやデータオブジェクトに「間違った」リンクが表示され、ページとして表示されます。SilverStripe Fluent - カスタムコントローラーのクエリーストーンへのフォールバックを防ぐ方法を教えてください。

私は両方を持っています。ページとして表示される他のカスタムコントローラ上のページおよびデータオブジェクトとしてのコントローラ。

代わりのen/sompage/foobar私は、私はそれは、これらのデータオブジェクトとコントローラ上のLink機能の私の間違った実装に起因していると思いsomepage/foobar?l=en_US

を受けます。

どうすれば修正できますか?私はそれについて何も見つけることができません。私は私のリンク機能を改善することができ

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/..私は英語1にgeschichte/..?l=de_DEgeschichte/..?l=en_USドイツのサイト上とen/geschichte/..?l=de_DEen/geschichte/..?l=en_USを受けます。

これらのリンク機能は完全に無視されていますか?私はまだ間違いを犯しましたか、何かを逃しましたか?ここに私のshortendコードControllerDataObjectRoutesExtensions & Fluent Config

任意の提案ですか?

アップデート2

FluentSiteTreeクラスのLocaleLink機能は、すでにDBからページを取得し、URLSegmentを取る「問題」

+0

英語はデフォルトのロケールですか?あなたの設定を共有できますか?デフォルトのロケールをURLから削除する設定があります。 –

+0

ドイツ語です。私は自分の質問を編集し、設定を追加しました –

+0

あなたはあなたのデータオブジェクト用のカスタムコントローラを持っているのですか、それとも単にページのサブリンクですか? – wmk

答えて

1

のようです。なぜそのページの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

とリンク部連結次に

コントローラにもFluentExtensionを追加して管理するように管理しました。コントローラには、自分でLocaleLink機能を実装しました。他のいずれかの場合

ここで立ち往生し、真の解決策がありますまで、ここに私の作業コードControllerDataObjectRoutesだ、Extensions & Fluent Config

そして、あなたはコントローラ用に変換urlsegmentを使用するwan't場合はできます

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' 
    ], 
のようなルートを変更します

誰かがそれを達成するために「より良い」方法を見つけられるとよいでしょう。

関連する問題