Непосредственное использование пагинатора не распознает конфигурацию - PullRequest
0 голосов
/ 29 мая 2020

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.

1 Ответ

0 голосов
/ 29 мая 2020

Исправление немного дорого и не идеально, но оно работает. Делаю редирект при начальной загрузке. В основном отправляйте форму для поиска, а затем перенаправляйте обратно на поиск. IE:

if ($this->request->getQuery('initial') === 'yes') {

    $redirect = $this->request->getQuery('redirect', [
        'action' => 'search',
         '?' => [
             'method' => 'search',
             'column' => $this->getColumn(),
             'input' => $this->getInput(),
             'page' => $this->getPage(),
             'sort' => $this->getSort(),
             'direction' => $this->getDirection(),
             'limit' => $this->getLimit(),
             'filter' => $this->getFilter(),
         ]
    ]);

    return $this->redirect($redirect);
    exit(0);

}

$config = $this->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'
     ],
     'page' => $this->getPage(),
     'sort' => $this->getSort(),
     'direction' => $this->getDirection(),
     'limit' => $this->getLimit()
 ];

 $tasks = $this->Paginator->paginate($query, $config);
 $this->set(compact('tasks'));

Теперь сортировка выполняется по имени_задачи.

Это устраняет проблему начальной загрузки и имитирует использование после начальной загрузки страницы, где, как я знаю, сортировка работает.

...