2017-05-19 1 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의 대답은 내 링크 기능을 향상시킬 수에

감사 : 그건 내 현재 코드입니다. 불행히도 아직 Fluent Locale 메뉴의 링크에는 아무 것도 변경되지 않았습니다.

대신 geschichte/..en/geschichte/.. 나는 영어 하나 geschichte/..?l=de_DEgeschichte/..?l=en_US 독일 사이트 및 en/geschichte/..?l=de_DEen/geschichte/..?l=en_US을받을 수 있습니다.

유창하게 링크 기능을 완전히 무시할 수 있습니까? 나는 아직도 실수를했거나 무언가를 놓쳤는가? 여기 내 shortend 코드 Controller, DataObject, Routes, Extensions & Fluent Config

어떤 제안입니까?

업데이트 2

FluentSiteTree 클래스의 LocaleLink 기능은 "문제"

+0

영어가 기본 로케일입니까? 설정을 공유 할 수 있습니까? URL에서 기본 로케일을 제거하는 설정이 있습니다. –

+0

독일어입니다. 내 질문을 편집하고 구성을 추가했습니다 –

+0

당신의 데이터 객체에 대한 사용자 정의 컨트롤러가 있습니까 아니면 그냥 페이지의 하위 링크입니까? – wmk

답변

1

당신은 이미 DB에서 페이지를 움켜 잡고 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

링크 생성을 훨씬 쉽게 해주는 감사합니다. 불행히도 아직 Fluent Locale 메뉴의 링크에는 아무 것도 변경되지 않았습니다. 내 질문에 대한 업데이트를 만들었을 것입니다. 아마도 아이디어가 있습니까? –

0

와 링크 부분을 CONCAT.

컨트롤러에 FluentExtension을 추가하면 컨트롤러가 작동하고 컨트롤러에는 해당 LocaleLink 기능이 구현되었습니다.어느 한 사람 여기 붙어 진짜 해결책이 될 때까지, 여기 내 작업 코드 Controller, DataObject, Routes의 내용은

, 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' 
    ], 
같은 경로를 변경

누군가가이를 달성하기 위해 "더 좋은"방법을 찾으면 좋을 것입니다.

관련 문제