2017-05-12 93 views
2

版本:3.3 *cakephp3-表格排序工作不

我使用$ paginator-> sort()方法創建的列標題在我的CMS分頁搜索結果表的鏈接。您應該可以單擊一次以升序排序,然後再次單擊以降序排列。但相反,我從來沒有工作。

但這並非適用於所有領域。假設我有5個領域。

<tr class="design"> 
    <th scope="col"><?= $this->Paginator->sort('Students.id','Id',array('class'=>'link')); ?></th> 
    <th scope="col"><?php echo $this->Paginator->sort('Students.userName','Name',array('class'=>'link')); ?></th> 
    <th scope="col"><?php echo $this->Paginator->sort('Students.age','Age',array('class'=>'link')); ?></th> 
    <th scope="col"><?php echo $this->Paginator->sort('Students.currentClass','Class',array('class'=>'link')); ?></th> 
    <th scope="col"><?php echo $this->Paginator->sort('Students.dateJoined','Joined Date',array('class'=>'link')); ?></th> 
</tr> 

我可以使用usernameageschool但不使用idjoined排序表兩種方式。當我最初獲取列表時,我已經在我的模型函數中指定按照idjoined的升序獲取結果。 是因爲這個原因,我無法按降序排序嗎?

有什麼辦法可以實現這個目標嗎?

控制器功能

public function index() 
{ 
    //Listing Students 
    $this->paginate = [ 
         'finder'  => 'ListStudents', 
         'sortWhitelist' => ['Students.id', 
              'Students.userName', 
              'Students.age', 
              'Students.currentClass', 
              'Students.dateJoined',], 
         'limit'   => 25, 
         ]; 
    $students = $this->paginate($this->Students); 
    $this->set(compact('students')); 
    $this->set('_serialize', ['students']); 
} 

型號功能

public function findListStudents(Query $query, array $options) 
{ 
    $query 
      ->select(['id','userName','age','currentClass','dateJoined' 
       ]) 
    $query->group('Students.id'); 

    $query->order(['status' => 'asc']); 
    $query->order(['Students.dateJoined' => 'asc']); 
    $query->order(['Students.id' => 'asc']); 
    return $query; 
} 

在此link提到的問題是一個類似於我facing.I試圖在裏面提到的解決方案,但它不工作。

+1

你問是否在您的自定義查找指定的排序順序可能是問題。看起來這對你自己來測試會是一件非常微不足道的事情? –

回答

1

要做到這一點,你必須修改你的控制器和模型功能的一點點。

首先,加extraOptions到您的控制器功能

public function index() 
{ 
    //Listing Students 
    $this->paginate = [ 
         'finder'  => 'ListStudents', 
         'sortWhitelist' => ['Students.id', 
              'Students.userName', 
              'Students.age', 
              'Students.currentClass', 
              'Students.dateJoined',], 
         'limit'   => 25, 
         'extraOptions' =>[ 
        'params' => $params          ] 
         ]; 
    $students = $this->paginate($this->Students); 
    $this->set(compact('students')); 
    $this->set('_serialize', ['students']); 
} 

現在,你需要重寫你的dateJoinedid排序順序。默認情況下,其asc。 如果用戶通過一個特定的方向,應該採取。所以,爲此你需要修改一下你的模型函數。

public function findListStudents(Query $query, array $options) 
{ 
    $query 
      ->select(['id','userName','age','currentClass','dateJoined' 
       ]) 
    $query->group('Students.id'); 
    $direction = (!empty($options['extraOptions']['params']['direction'])) ? $options['extraOptions']['params']['direction'] : 'asc'; 
    $query->order(['status' => 'asc']); 
    $query->order(['Students.dateJoined' => $direction]); 
    $query->order(['Students.id' => $direction]); 
    return $query; 
} 

現在,當您傳遞特定方向時,排序會正常工作。

+0

'$ params'未定義。 – ndm

1

當我最初獲取列表時,我在我的模型函數 中指定了基於id獲取結果並按升序加入。因爲這個,是不是 ,我無法按降序對它進行排序?

是的,是這樣。您可以通過在自定義查找程序方法中註釋$query->order聲明來驗證該聲明。你會發現那個分類排序Students.id會工作。

我建議只需將整理出的自定義查找方法和定義默認配置您$paginate變量,而不是當排序選項。

StudentsController

public function index() 
{ 
    $this->paginate = [ 
     'finder' => 'ListStudents', 
     'sortWhitelist' => [ 
      'Students.id', 
      'Students.userName', 
      'Students.age', 
      'Students.currentClass', 
      'Students.dateJoined' 
     ], 
     'limit' => 25, 

     // add custom sorting options here 
     'order' => [ 
      'Students.status' => 'asc', 
      'Students.dateJoined' => 'asc', 
      'Students.id' => 'asc' 
     ] 
    ]; 
    $students = $this->paginate($this->Students); 
    $this->set(compact('students')); 
    $this->set('_serialize', ['students']); 
} 

StudentsTable

public function findListStudents(Query $query, array $options) 
{ 
    $query ->select([ 
     'id', 'userName', 'age', 'currentClass', 'dateJoined' 
    ]); 
    $query->group('Students.id'); 

    // remove the sorting here 
    /* 
    $query->order(['status' => 'asc']); 
    $query->order(['Students.dateJoined' => 'asc']); 
    $query->order(['Students.id' => 'asc']); 
    */ 

    return $query; 
}