Как использовать элементы маршрута вместо аргументов строки запроса для разбивки на страницы в Cake PHP 4.x? - PullRequest
1 голос
/ 02 марта 2020

URL-адреса пагинации моего сайта работали так, но перестали работать при обновлении до 4.x - например: 1-я страница: mywebsite.com/new - 2-я страница: mywebsite.com/new/page/2, et c. Я сделал это с помощью следующего кода:

//routes.php        
$routes->connect('/new/page/:page',
        ['controller' => 'Articles', 'action' => 'latest'], [
        'pass' => [
            'page'
        ],
        'page' => '\d+'
    ]);
$routes->connect('/new', ['controller' => 'Articles', 'action' => 'latest']);

, затем в моем представлении / элементе разбиения на страницы у меня есть следующее:

//view   
$this->Paginator->options(['url' => ['controller' => 'Articles', 'action' => 'latest']]);

URL-адреса mywebsite.com/new/page/2 , 3, et c. по-прежнему работают при непосредственном доступе к ним, но ссылки, созданные с помощью пагинатора в представлении, являются mywebsite.com/new?page=2, 3 и т. д. c. когда они должны быть mywebsite.com/new/page/2, 3 и т. д. c.

Может ли кто-нибудь указать мне правильное направление?

1 Ответ

1 голос
/ 17 марта 2020

Я бы посоветовал вам рассмотреть возможность изменения схемы URL для использования стиля аргумента запроса. Использование элементов route / URI просто означает больше работы для правильной работы функций пагинатора. Кроме того, все аргументы (SEO, удобочитаемость и т. Д. c), приведенные для использования «красивых URL» для нумерации страниц, которые были так популярны в те дни, оказались ничем иным, как горячим воздухом.

С другой стороны, вам нужно будет использовать настраиваемый / расширенный помощник по разбиению на страницы, чтобы изменить способ генерации URL-адресов, поскольку по умолчанию помощник явно устанавливает параметр page (и все остальные параметры, связанные с разбиением на страницы) в качестве аргументов строки запроса. Вы можете управлять всеми сгенерированными URL-адресами, если переопределите \Cake\View\Helper\PaginatorHelper::generateUrlParams().

Быстрый и грязный пример:

// src/View/Helper/PaginatorHelper.php

/*
Load in `AppView::initialize()` via:

$this->loadHelper('Paginator', [
    'className' => \App\View\Helper\PaginatorHelper::class
]);
*/

declare(strict_types=1);

namespace App\View\Helper;

class PaginatorHelper extends \Cake\View\Helper\PaginatorHelper
{
    public function generateUrlParams(array $options = [], ?string $model = null, array $url = []): array
    {
        $params = parent::generateUrlParams($options, $model, $url);

        if (isset($params['?']['page'])) {
            $params[0] = $params['?']['page'];
            unset($params['?']['page']);
        } else {
            $params[0] = 1;
        }

        return $params;
    }
}

Это приведет к значению параметра page в массиве URL из Конфигурация строки запроса к обычному параметру URL, ie превращает

['controller' => 'Articles', 'action' => 'latest', '?' => ['page' => 1, /* ... */]]

в

['controller' => 'Articles', 'action' => 'latest', 1, '?' => [/* ... */]]

Но опять же, я настоятельно рекомендую рассмотреть возможность перехода на схему URL строки запроса .

См. Также

...