これは、cakePHP で作成した最初のページであり、次の問題/シナリオがあります。
指定されたデータベースがさまざまなテーブルの情報を提供するため、さまざまなモデルを使用してハイスコアページを作成しています。ページネーションと 2 つのコンボボックスを備えたフォームを使用して、特別な属性を選択できるようにしています。フィルター条件を設定するには、beforeFilter() 関数を使用し、条件 (および結合) を動的に設定します。ページネーションのために条件を保持するため、すべての条件もセッションに保存されます。これはすべて正常に機能します。
私の問題は次のとおりです。フォームを送信すると、結果が正しくなくなり、選択したオプションでコンボボックスが事前に選択されます。page2/3/... に切り替えると、コンボボックスの選択が緩んでいて、空のオプションになっています。
ページネーションで選択を維持するにはどうすればよいですか?
私のコントローラ beforeFilter() 関数
// Highscorefilter
public function beforeFilter()
{
parent::beforeFilter();
// Dropdown für Rassen
$this->set('racelist', $this->Race->getRaceList());
// Dropdown für Galaxien
$this->set('galaxylist', $this->Galaxy->getGalaxyList());
// Initialisierung
$filter_conditions = array();
$joins = array();
$filter = FALSE;
if($this->request->is('post'))
{
// Um die Filter richtig zu erkennen brauchen wir den Modelnamen :/
switch($this->action)
{
case "imperium":
$model = "HighscoreImperiumUser";
break;
case "quest":
$model = "HighscoreQuestUser";
break;
case "war":
$model = "HighscoreWarUser";
break;
case "trade":
$model = "HighscoreTradeUser";
break;
case "overall":
default:
$model = "HighscoreOverallUser";
break;
}
// Filter auslesen und setzen
$data = $this->request->data;
if(isset($data[$model]['race_id']) && !empty($data[$model]['race_id']))
{
// WHERE-Bedingung race_id setzen
$tmpstr = sprintf("%s.race_id", $model);
$filter_conditions[$tmpstr] = $data[$model]['race_id'];
// Joins setzten wir in diesem Fall auf ein leeres array. Das wird ggf. nachher überschrieben
$joins = array();
}
if(isset($data[$model]['gala']) && !empty($data[$model]['gala']))
{
// WHERE-Bedingung gala setzen
$tmpstr = sprintf("ug.gala", $model);
$filter_conditions[$tmpstr] = $data[$model]['gala'];
// WHERE-Bedingung für Join bauen und Join konstruieren
$tmpstr = sprintf("ug.userid = %s.id", $model);
$join = array( 'alias' => 'ug',
'table' => 'user_gala',
'type' => 'INNER',
'conditions' => $tmpstr);
$joins[] = $join;
}
// Filterinformationen für Seitenwechsel in Session schreiben
$this->Session->delete('_indexConditions');
$this->Session->delete('_indexJoins');
$this->Session->write('_indexConditions', $filter_conditions);
$this->Session->write('_indexJoins', $joins);
$filter = TRUE;
}
else if(!empty($this->request->params['named']['page']))
{ // Filterinformationen aus der Session holen
$filter_conditions = (array)$this->Session->read('_indexConditions');
$joins = (array)$this->Session->read('_indexJoins');
$filter = TRUE;
}
if($filter)
{
// set filter conditions of each pagination model
$this->paginate = Hash::insert($this->paginate, '{s}.conditions', $filter_conditions);
$this->paginate = Hash::insert($this->paginate, '{s}.joins', $joins);
}
}
「実際の」コントローラー機能の 1 つ (それらはすべて、異なるモデルを使用するだけで、すべて順応性があります)
// Overall (Default) Highscore
public function overall()
{
// Paginate der Highscore
$highscoreusers = $this->paginate('HighscoreOverallUser');
$this->set('highscoreusers', $highscoreusers);
// Variablen für View setzen
$this->set('model', 'HighscoreOverallUser');
$this->set('title', __d('highscore', 'Overall score'));
// Index-View benutzen
$this->render('index');
}
私のビューフォーム
= $this->Form->create($model, array('type' => 'post', 'url' => array('action' => $this->request['action'], 'controller' => $this->request['controller'])))
%table
%tr
%td{:width => "200px"}
= $this->Form->label('race_id', __d('highscore', 'Only show race:'))
%td{:width => "100px"}
= $this->Form->select('race_id', $racelist, array('legend' => false, 'class' => 'select', 'empty' => __d('highscore', 'All races') ))
%td{:width => "200px"}
= $this->Form->label('gala', __d('highscore', 'Only show players in galaxy:'))
%td{:width => "100px"}
= $this->Form->select('gala', $galaxylist, array('legend' => false, 'class' => 'select', 'empty' => __d('highscore', 'All galaxies') ))
= $this->Form->end(__d('highscore', 'Activate filter'))