SilverStripe Fluent - 如何防止回退到自定义控制器上的查询字符串?

时间:2017-05-19 19:30:47

标签: php silverstripe

使用来自流利的LocalMenu模板来获取语言切换器,这给了我"错误"我自定义控制器和数据对象的链接,我显示为页面。

所以我有两个。控制器作为页面和数据对象在其他自定义控制器上显示为页面。

而不是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_US,在英语网站上收到en/geschichte/..?l=de_DEen/geschichte/..?l=en_US

流利的是否完全忽略了这些链接功能?我还犯错了还是错过了什么?这是我的短代码ControllerDataObjectRoutesExtensions& Fluent Config

有什么建议吗?

更新2

LocaleLink课程中的FluentSiteTree函数似乎是"问题"

2 个答案:

答案 0 :(得分: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);
}

答案 1 :(得分:0)

这不是一个真正的答案,而是一种解决方法。

我通过将FluentExtension也添加到Controller来管理它以使其工作,并且在该控制器上我实现了自己的LocaleLink函数。

对于任何困在这里的人,直到有一个真正的解决方案,这是我的工作代码ControllerDataObjectRoutesExtensions& Fluent Config

如果你不想为控制器使用翻译的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'
  ],

如果有人能找到一种“更好”的方法来实现这一目标,那就太棒了。