2013-03-11 47 views
0

的選擇,這是我使用CakePHP創建我的第一頁,我有以下問題/情形:CakePHP的組合框失去對分頁

我使用不同的模型作爲給定databaes創造高分頁提供的信息不同的表格。我正在使用分頁和帶有兩個組合框的表單來允許選擇特殊屬性。要設置過濾條件,我使用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);   
    } 
} 

一個 「真正的」 -controller功能的(它們都是straith-forwand,只是用不同型號)

// 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'); 
}  

我view-Form

= $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')) 
+0

請附上您的有問題的實際組合框的代碼。 – Dave 2013-03-11 19:50:23

+0

添加了整個表單,包括兩個使用的組合框 – bish 2013-03-12 14:12:20

回答

0

問題是,數據值(例如「data [HighscoreOverallUser] [race_id]」)的用paginator切換頁面後,CakePHP沒有設置。

所以他們必須手動設置。以下代碼適用於我。當然,你必須要小心,不要覆蓋一組數據,但據我現在可以說,使用分頁程序後的數據總是不設置

if(!$this->data->HighscoreOverallUser) 
{ 
    $data['HighscoreOverallUser']['race_id'] = $filter_conditions['HighscoreOverallUser.race_id']; 
    $this->data = $data; 
}