0

私の質問は:

検索ボタンをクリックした後に、検索/フィルター/順序付けフィールドをリンクに表示できるようにするにはどうすればよいですか。モデルコントローラービューレイアウトファイルがあります。モデル ファイルでは、必要なフィールドが populateState 関数の状態変数として設定され、buildWhereQuery 関数によって取得され、クエリ文字列で使用できるようになります。この時点まで、すべてが正しく進んでいます。しかし、今から私の問題は、ユーザーがリストのリンクを友人に送信して同じリストを表示したい場合に発生します。この目的のためのリンクを設定する必要がありますが、その方法がわかりません。

ビューファイルでこの関数を次のように記述しましたが、この作成されたリンクを使用して機能させる方法がわかりませんでした。(変数 query は、JObject の形式で $query = $this->get('state'); です。

protected function preQuery($query){
    $params = array();
    foreach ($query as $key => $value) {
        if(!isset($query->$key) || empty($value) || $value == ''){
            unset($query->$key);
        }else{
            if(strpos($key,'filter') || in_array($key, array('limit','limitstart','order','order_Dir'))){
                $params[$key] = $value;
            }else{
                unset($query->$key);
            }                    
        }
    }
    $que = JURI::buildQuery($params);
    $cur = JURI::current();
    return (strpos($cur,'?') ? ($cur.'&'. $que) : ($cur.'?'.$que));
}

編集:

レイアウト ファイルには、joomla が必要とするビュー タスク レイアウト コンポーネントのようなリダイレクト用のすべての入力を含むフォームが含まれています。フィルタリングまたは検索用の一部。そのため、フォームにGETメソッドを使用できませんでした:/

4

1 に答える 1

0

検索はフォームから開始しています。これで 2 つのケースができました。

フォームから直接ビューを呼び出す場合は、フォーム メソッドを (デフォルトの POST ではなく) GET に変更するだけで、フォームは次のようになります。

<form method="GET" ....

ただし、コントローラーを呼び出していて、コントローラーがフォームにリダイレクトする場合は、いくつかのロジックを変更する必要がある場合があります。この後者の場合、コントローラーの呼び出しに POST を使用するか GET を使用するかは問題ではありません。ただし、コントローラーはユーザー状態変数を設定してはいけません。代わりに、リダイレクト先の URL にパラメーターを追加してください。

setRedirect(JRoute::_("index.php?option=com_something&view=results&param1=SOMETHING etc.

コメントの後の最終的な代替手段: ビューを直接指していると仮定して、URL にいくつかのフィールドのみを含めるには:

<form method="POST" action="<?php echo JRoute::_("index.php?option=com_yourcomponent&view=yourview&explicit_param_1=something&explicit_param_2=somethingelse
<input type="hidden" ...

しかし、ユーザーが URL を共有している場合には存在しない余分なパラメーターの有無にかかわらず、ページが機能する必要があるため、これはより多くの問題を引き起こします。リダイレクトなしで (サブ) コントローラーでこれを処理する方がよい場合があります (呼び出されるコントローラー関数でビューとその表示メソッドをインスタンス化するだけです)。

URL を短縮する構文 task=subcontroller.task を使用できることを覚えておいてください。

于 2013-09-12T07:10:36.530 に答える