我的页面上有三个表单,用于过滤和排序数据对象的视图。
问题是在提交一个表单之后,由于FormAction重定向到当前url而没有保留查询字符串,因此由另一个表单设置的url参数丢失了。有没有办法将它们结合起来?
因此,如果我的网址看起来像domaint.tld?color=blue&size=l
,并且在我使用排序表单后,新参数将仅应用于当前网址,例如domaint.tld?color=blue&size=l&sort=TitleASC
,而不是删除已设置的参数?
我的代码的重要部分看起来像
return $form
->setFormMethod('GET')
->setFormAction($this->Link() . '#produkte') // todo: join links?!
->disableSecurityToken()
->loadDataFrom($this->request->getVars());
我已尝试将$this->Link
替换为$_SERVER['REQUEST_URI']
,但这是新请求。即使使用之前设置的参数(仅用于测试目的)对链接进行硬编码,也可以在不考虑设置参数的情况下替换链接。
答案 0 :(得分:1)
好像你已经在那里了。在我回答之前还有一个问题 - 我不确定提交GET方法是否会覆盖所有现有的查询参数,或者是否会根据需要附加/覆盖它们。这与SilverStripe无关,但值得一提的是,如果它阻碍了您的实现设计(在覆盖的情况下)。它可能取决于用户代理。这不是我以前考虑过的事情。
您可能知道的一种表单方法是返回Form对象的方法,默认情况下表单将自动提交。这意味着在工厂制造期间,忽略GET参数(默认值基本上为$controller->Link($factory_name)
)。因此,当您使用setFormAction
时,您还需要在此时考虑查询字符串。您可以使用Controller::join_links
,或者自己构建字符串,我认为这并不特别重要,只要action=
上生成的<form>
属性反映了这一点正确。
您需要考虑的第二件事是FormAction
。这完全是用户定义的,使用Controller::redirectBack
只需重建路由 - 它不使用请求(AFAIK)。如上所述,此时您还需要将完整的$request->getVars
考虑在内。除此之外,它应该是顺利航行......不考虑这篇文章的开头警告。
答案 1 :(得分:1)
您可以修改$this->Link()
并为其添加所有重要的get-vars。 Controller::join_links()
是一个好帮手。例如。 Controller::join_links('?foo=1', '?bar=2')
会产生?foo=1&bar=2
。
我曾遇到过类似问题wrote about it。
在您的控制器中,您可以覆盖Link()
方法以获取所有参数:
public function Link($action = '')
{
$base = parent::Link($action);
foreach(['foo', 'bar'] as $getParam) {
if ($this->request->getVar($getParam)) {
$additionalParams[] = $getParam . '=' . $this->request->getVar($getParam);
}
}
return Controller::join_links($base, '?' . join('&', $additionalParams));
}