2016-12-21 51 views
0

我的頁面上有三種可以過濾和排序數據對象視圖的表單。SilverStripe 3.5 - 尊重已經設置的url參數的GET表格

問題是提交一個表單之後,該網址指標的影響通過另一種形式設置失去了應有的FormAction至極重定向到當前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

爲什麼不救這些形式的會話狀態? – wmk

+0

這是我現在的解決方法。但我想有一個鏈接,你可以分享 –

回答

1

看來你已經大部分已經在那裏。在我回答之前有一個問題需要解決 - 我不確定提交GET方法是否會覆蓋所有現有的查詢參數,或者它們是否會根據需要進行追加/覆蓋。儘管這與SilverStripe不是一回事,但值得一提的是,如果它是實現設計的阻擋者(在覆蓋的情況下)。它可能取決於用戶代理。這不是我以前考慮過的事情。

您可能知道的一種表單方法是一種返回Form對象的方法,並且該表單默認情況下會自動提交表單。這意味着在製造過程中,GET參數被忽略(默認值基本上是$controller->Link($factory_name))。因此,當您使用setFormAction時,此時還需要考慮查詢字符串。您可以使用Controller::join_links來暗示或自己構建字符串,只要<form>上的結果action=屬性正確反映了這一點,我認爲這並不特別重要。

您需要考慮的第二件事是FormAction。這是完全用戶定義的,使用Controller::redirectBack只是重建路由 - 它不使用請求(AFAIK)。如上所述,您現在需要考慮完整的$request->getVars。除此之外,它應該是平穩的航行......不考慮這個職位的開放警告。

+0

,這是我直到現在才知道;)但我無法弄清楚一個工作的例子。你可以嗎? –

1

您可以通過修改$this->Link()並添加所有重要GET-瓦爾它。 Controller::join_links()是一個好幫手。例如。 Controller::join_links('?foo=1', '?bar=2')將導致?foo=1&bar=2

我曾經有過類似的問題,並且wrote about it

在你的控制器,你可以覆蓋Link()方法來獲取所有PARAMS:

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)); 
    } 
+0

我建議你使用['http_build_query'](http://php.net/manual/en/function.http-build-query.php)來建立查詢。編寫代碼較少,而不像字符串連接那麼醜陋...... – bummzack