2016-12-21 4 views
0

私のページには、データオブジェクトのビューをフィルタリングして並べ替える3つのフォームがあります。SilverStripe 3.5 - 既に設定されているURLパラメータを尊重したGETフォーム

問題は、フォームを送信した後、別のフォームによって設定されたURLパラメータが、フォーム文字列を保持せずに現在のURLにリダイレクトするFormActionによって失われたことです。それらを組み合わせる方法はありますか?

私のURLがdomaint.tld?color=blue&size=lのように見えて、ソートフォームを使用した後に、すでに設定されているパラメータを削除する代わりに、新しいパラメータがちょうどdomaint.tld?color=blue&size=l&sort=TitleASCのような現在のURLに適用されましたか?

私のコードの重要な部分は、私はすでに$_SERVER['REQUEST_URI']$this->Linkを交換しようとしたその

return $form 
    ->setFormMethod('GET') 
    ->setFormAction($this->Link() . '#produkte') // todo: join links?! 
    ->disableSecurityToken() 
    ->loadDataFrom($this->request->getVars()); 

のように見えるが、それは新しい要求です。事前に設定されたパラメータ(テスト目的のためだけ)でリンクをハードコーディングしても、設定されたパラメータを尊重せずにリンクが置き換えられます。

+0

を? – wmk

+0

これは私の回避策です。しかし私はあなたが今まで知っているものである –

答えて

1

あなたはすでにほとんどそのように思えます。私が答える前に持っている質問があります - GETメソッドを提出すると、既存のすべてのクエリパラメータが上書きされるか、必要に応じて追加/上書きされるかどうかは分かりません。これはSilverStripeとは関係ありませんが、あなたの実装のデザイン(上書きの場合)を阻むものである場合には言及する価値があります。それはユーザエージェントに依存するかもしれません。私が以前考えたことではありません。

フォームメソッドは、フォームオブジェクトを返すメソッドであり、既定でフォームが送信される場所です。つまり、工場での製造中にGETパラメータは無視されます(デフォルト値は基本的には$controller->Link($factory_name)です)。したがって、setFormActionを使用する場合は、この時点でクエリ文字列も考慮する必要があります。あなたは、<form>に結果のaction=属性が正しく反映されている限り、あなたが思いついた通りにController::join_linksを使用したり、自分で文字列を作成したりすることができます。

2番目に考慮する必要があるのは、FormActionです。これは完全にユーザ定義されており、Controller::redirectBackを使用するだけではルートを再構築するだけで、要求(AFAIK)は使用されません。上記のように今度は$request->getVarsをすべて考慮する必要があります。それを越えて、滑らかなセーリングが必要です。

+0

を共有できるリンクを持っていたいと思っています;)しかし、私は実際の例を理解することができませんでした。あなたはできる? –

1

$this->Link()を変更して、重要なget-varsを追加することができます。 Controller::join_links()は良いヘルパーです。例えば。 Controller::join_links('?foo=1', '?bar=2')?foo=1&bar=2になります。

私はかつて同じような問題があり、wrote about itでした。お使いのコントローラで

すべてのあなたのparamsを取得する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)); 
    } 
+0

['http_build_query'](http://php.net/manual/en/function.http-build-query.php)を使ってクエリを構築することをお勧めします。文字列連結のように書くのが少なくて済みません。 – bummzack

関連する問題