0

これは、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'))
4

1 に答える 1

0

問題は、paginator でページを切り替えた後、cakePHP のデータ値 (例: "data[HighscoreOverallUser][race_id]") が設定されないことです。

そのため、手動で設定する必要があります。次のコードは私にとってはうまくいきました。確かに、設定されたデータを上書きしないように注意する必要がありますが、ページネーターを使用した後、データは常に設定されていません。

if(!$this->data->HighscoreOverallUser)
{
  $data['HighscoreOverallUser']['race_id'] = $filter_conditions['HighscoreOverallUser.race_id'];
  $this->data = $data;
}
于 2013-07-21T09:24:36.863 に答える