Cake PHP Версия: 4.0.1
Введение
У меня есть 2 метода, которые используют индексное представление, index и поиск . В индексе столбец может быть выбран из списка выбора, а значение может быть введено через элемент управления формой ввода, позволяющий выполнять поиск по столбцу и значению. Эти данные отправляются через GET в метод поиска, где проверяются пустые значения, выполняется запрос и отображается представление индекса.
В более поздних версиях 3x с конфигурацией ниже представление индекса выполняло сортировку по selected column, для чего он предназначен.
IE: представление индекса имеет due_date, отсортированную при начальной загрузке, и я выбираю task_name, а затем отправляю форму в метод поиска. Имя_задачи имеет сортировку при отображении представления.
КОНТРОЛЛЕР ЗАДАЧ
Publi c свойство разбивки на страницы:
public $paginate = [
'sortWhitelist' => [
'Tasks.due_date',
'Tasks.task_name',
'Tasks.type',
'Tasks.priority',
'Tasks.related_to_name',
'Contacts.first_name',
'Contacts.last_name',
'Accounts.account_name',
'Tasks.task_desc'
]
];
Метод поиска
Я инициализирую данные, полученные из метода индекса, и применяю конфигурацию к свойству разбивки на страницы и отправляю объект запроса в представление.
$this->setPage('');
$this->setSort($this->request->getQuery('column'));
$this->setDirection('asc');
// Validation of the page, sort, direction and limit is done here.
// IE: The $this->getSort() must be a string and not be numeric and has a strlen check
// and the $this->getDirection() can only be a string with values 'asc' or 'desc' etc.
if (!empty($this->getPage())) {
$this->paginate['page'] = $this->getPage();
}
$this->paginate['sort'] = $this->getSort();
$this->paginate['direction'] = $this->getDirection();
$this->paginate['limit'] = $this->getLimit();
debug($this->paginate);
$tasks = $this->paginate($query);
$this->set(compact('tasks'));
Результат отладки:
[
'sortWhitelist' => [
(int) 0 => 'Tasks.due_date',
(int) 1 => 'Tasks.task_name',
(int) 2 => 'Tasks.type',
(int) 3 => 'Tasks.priority',
(int) 4 => 'Tasks.related_to_name',
(int) 5 => 'Contacts.first_name',
(int) 6 => 'Contacts.last_name',
(int) 7 => 'Accounts.account_name',
(int) 8 => 'Tasks.task_desc'
],
'sort' => 'Tasks.task_name',
'direction' => 'asc',
'limit' => (int) 25
]
Результат Сортировка выполняется по имени_задачи.
Через пару месяцев go Я обновился до 4 и только что пересмотрел эту функцию, чтобы найти сортировку по столбцу, который присутствовал в индексе, а не по выбранный столбец. Я попробовал следующее, чтобы исправить проблему:
Я сослался на эту информацию в кулинарной книге. И это из SO.
$config = $this->paginate = [
'page' => $this->getPage(),
'sort' => $this->getSort(),
'direction' => $this->getDirection(),
'limit' => $this->getLimit()
];
debug($config);
$tasks = $this->Paginator->paginate($query, $config);
debug($this->Paginator);
$this->set(compact('tasks'));
Результат отладки $ config:
[
'page' => '',
'sort' => 'Tasks.task_name',
'direction' => 'asc',
'limit' => (int) 25
]
Результат отладки $ this-> Paginator:
object(Cake\Controller\Component\PaginatorComponent) {
'components' => [],
'implementedEvents' => [],
'_config' => [
'page' => (int) 1,
'limit' => (int) 20,
'maxLimit' => (int) 100,
'whitelist' => [
(int) 0 => 'limit',
(int) 1 => 'sort',
(int) 2 => 'page',
(int) 3 => 'direction'
]
]
}
ПРИМЕЧАНИЕ. Белый список содержит ограничение, сортировку, страницу и направление? И лимит 20, а у меня даже нет выбора 20?
Результат Сортировка выполняется в due_date, и мне она нужна в task_name.
Дополнительная информация Если затем щелкнуть сортировку по task_name, сортировка будет по task_name. Всякие работают только не на начальной загрузке?
Вопрос Как мне настроить свойство разбиения на страницы так, чтобы сортировка выполнялась по task_name из начальной загрузки метода поиска.
Спасибо Z.