私は、cakephpアプリの結果ページにある「検索」ボックスを構築しようとしています。このページでは、cakePHPページネーションコンポーネントを使用して、結果を表示および「ページング」します。これは完璧ですが、次の部分を機能させるのに苦労しています。
望ましい結果:
- 入力ボックスといくつかの選択ボックスを備えたcakephpフォーム(投稿)。日付セレクターを含むため、日付を選択できます。ユーザーはこれらのフィールドに入力して送信できる必要があります
- 送信時に、ユーザーの選択により、コントローラーのcakePHPページネーション条件を変更する必要があります
- ビューでは、ページネーションバーにユーザーの選択を記録して、さまざまなページをフィルター処理したときにユーザーが検索し続けるようにします。これは$this->passedArgsを使用して実現できることを理解しています。したがって、postを使用してgetを使用しないのはなぜですか。
コード:
// Form:
<?php
echo $this->Form->create('search', array('class' => false));
echo $this->Form->input('searchFor');
echo $this->Form->input('dateFrom');
echo $this->Form->input('dateTo');
echo $this->Form->end();
?>
// Controller:
if($this->request->is("post")) {
$filters = $this->request->data["search"];
$this->passedArgs["searchFor"] = $filters["searchFor"];
$this->passedArgs["dateFrom"] = $filters["dateFrom"]." 00:00:00";
$this->passedArgs["dateTo"] = $filters["dateTo"]." 00:00:00";
// Assign search parameters:
if($this->passedArgs["searchFor"] != "") {
$conditions["Model.field LIKE"] = "%".$this->passedArgs["searchFor"]."%";
}
$conditions["Model.created >="] = $this->passedArgs["dateFrom"];
$conditions["Model.created <="] = $this->passedArgs["dateTo"];
} else {
$conditions = array("Result.status_id >=" => 12);
}
$this->paginate = array(
'conditions' => $conditions,
'order' => array('Result.created ASC'),
'limit' => 20
);
$this->set("results",$this->paginate("Model");
// The view file:
<?php
$this->Paginator->options(array('url' => $this->passedArgs));
?>
私が今いる場所:
- 最初のページにすべての結果が読み込まれます
- 検索ボックスにデータを入力すると、結果が返されます
問題:
- a)結果が投稿されているかどうか、b)passedArgsが利用可能かどうかを確認するために、2つのチェックを行う必要があるため、私はそれを行う方法が正しくないと確信しています。私はこれが正しいやり方ではないと100%確信しています。
たとえば、名前と名前の2つの自由形式のフィールドを検索するとします。名前を空白のままにすると、URLは次のようになりますが、これは正しくないように見えます。つまり、以下の項目が発生しないようにデフォルト値を割り当てる必要がありますが、これはあまり動的ではないようです。
http:// localhost / site / controller / action / surname:0 / name:John / date:0 /
- 更新すると、投稿された値が使用できなくなったため、ページが存在しないことが示されます。