Итак, в моем ItemsController есть эта симпатичная маленькая индексная функция:

public function index() {
        $this->Item->recursive = 2;
        $this->set('items', $this->paginate());
    }

Это так, потому что я делаю кучу вычислений на afterFind (добавляю поле и сортирую по нему)

Но я хочу отсортировать на уровне контроллера, чтобы у меня было последнее () и т. Д. Если я сортирую на уровне afterFind, он будет сортировать так каждый раз, независимо от того, какой контроллер - так что это нехорошо.

Как мне отсортировать на уровне контроллера и по-прежнему иметь возможность правильно использовать $ this-> paginate ()?

К вашему сведению, вот некоторые из моих AfterFind:

public function afterFind($results, $primary = false){
    parent::afterFind($results, $primary);
    foreach ($results as $key => $val) {
        // my foreach logic calculating Item.score  
    }
// the stuff I should be doing on a controller-to-controller basis:
    $results = Set::sort($results, '{n}.Item.score', 'desc'); 
    return $results;
}
2
itamar 2 Мар 2015 в 19:41

2 ответа

Лучший ответ

Вот как вы используете сортировку с помощью Paginator

public function index() {
  $this->paginate = array(
    'limit' => 10,
    'order' => array( // sets a default order to sort by
      'Item.name' => 'asc'
    )
  );
  $items = $this->paginate('Item');
  $this->set(compact('items'));
}

На ваш взгляд:

<div class="sort-buttons">
  Sort by
  <?php echo $this->Paginator->sort('name', 'By Name', array('class' => 'button')); ?>
  <?php echo $this->Paginator->sort('score', 'By Score', array('class' => 'button')); ?>
  <?php echo $this->Paginator->sort('date', 'By Date', array('class' => 'button')); ?>
</div><!-- /.sort-buttons -->

Или, если используется для создания REST API, используйте строки запроса:

http://myapp.dev/items/index?sort=score&direction=desc
4
Chris Vogt 2 Мар 2015 в 20:56

Для меня рабочий способ был в контроллере:

/******************************************************************
 * 
 ******************************************************************/
function admin_index() {
    $this->paginate = array(
        'News' => array(
            'order' => array(
                'News.created' =>  'DESC'
            )
        )
    );
    $data = $this->paginate('News');
    $this->set('news', $data);
}
1
Pipo 2 Фев 2016 в 09:04