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



使用流利的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

会不会是流利完全忽略了这些链接功能?我是否仍然犯了错误或错过了什么?这是我的简短代码 控制器,DataObject,路由,扩展和流利配置

有什么建议吗?

更新 2

FluentSiteTree类中的LocaleLink函数似乎是"问题">

您已经从数据库中获取了一个页面并获取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);
}

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

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

对于其他任何被困在这里的人,直到有一个真正的解决方案,这是我的工作代码控制器,DataObject,Routes,Extensions & 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'
],

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

最新更新