SilverStripe 3.5 - GET表单,尊重已设置的url参数

时间:2016-12-21 11:47:34

标签: silverstripe

我的页面上有三个表单,用于过滤和排序数据对象的视图。

问题是在提交一个表单之后,由于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'],但这是新请求。即使使用之前设置的参数(仅用于测试目的)对链接进行硬编码,也可以在不考虑设置参数的情况下替换链接。

2 个答案:

答案 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));
    }