0

我试图(一如既往)在线寻找解决方案,但显然没有找到任何解决方案。

我正在使用 CakePHP,我需要在一些控制器中添加一些排序。我还想为此创建自定义路线。所以这是我的代码不起作用(分页有效,排序不):

RatesController.php:

public $paginate = array(
    'Rate' => array(
            'limit' => 10,
            'order' => array(
                    'Rate.created' => 'desc'
            ),
            'conditions' => array( 'Rate.accepted' => 1 ),
            //'fields' => array('Rate.*', 'User.username')
    ),
    'Airline' => array(
            'limit' => 50,
            /*'order' => array(
                    'Airline.rate' => 'desc',
                    'Airline.name' => 'asc'
            ),*/
            'conditions' => array(
                'Airline.rate >' => 0
            ),
            'fields' => array('Airline.id', 'Airline.name', 'Airline.image_id', 'Airline.rate', 'Image.*')
    )
);

function index($category = 'airlines'){ 
    pr($this->request);
    $data = $this->paginate('Airline');
    pr($data);
}

并认为:

$this->Paginator->options(array(
    'url' => array(
        'controller' => 'rates',
        'action' => 'index',
        'category' => $category
    )
));

echo $this->Paginator->first('«', array('escape' => false), null, array('class' => 'disabled', 'escape' => false));  
echo $this->Paginator->prev('<', array('escape' => false), null, array('class' => 'disabled', 'escape' => false));

echo $this->Paginator->numbers(array(
    'modulus' => 6,
    'separator' => false
));

echo $this->Paginator->next('>', array('escape' => false), null, array('class' => 'disabled', 'escape' => false));
echo $this->Paginator->last('»', array('escape' => false), null, array('class' => 'disabled', 'escape' => false));
echo' sort by ';
echo $this->Paginator->sort('Airline.rate');
echo' or by ';
echo $this->Paginator->sort('Airline.name');

路线:

Router::connectNamed(array('page'), array('default' => false, 'greedy' => false));
Router::connectNamed(array('sort', 'direction'), array('default' => false, 'greedy' => false));

Router::connect('/rate-airlines', array('controller' => 'rates', 'action' => 'index', 'category' => 'airlines'));
/*
Router::connect(
    '/rate-airlines/:page/',
    array('controller' => 'rates', 'action' => 'index', 'category' => 'airlines'),
    array(
        'named' => array('page' => '[a-z]+')
    )
);
Router::connect(
    '/rate-airlines/:page/:sort/:direction',
    array('controller' => 'rates', 'action' => 'index', 'category' => 'airlines'),
    array(
        'pass' => array('page', 'sort', 'direction'),
        //'id' => '[0-9]+',
        'named' => array('page' => '[\d]+', 'sort', 'direction')
    ) 
);*/
Router::connect(
    '/rate-airlines/:sort/:direction',
    array('controller' => 'rates', 'action' => 'index', 'category' => 'airlines'),
    array(
        'named' => array('sort', 'direction')
    )
);

我真的不知道为什么它不工作,我已经花了几个小时试图让它工作,寻找答案。

附言。无论我做什么,我都无法将 :sort 和 :direction 放入请求中的命名数组中:

CakeRequest Object
(
    [params] => Array
        (
            [plugin] => 
            [controller] => rates
            [action] => index
            [named] => Array
                (
                )

            [pass] => Array
                (
                )

            [sort] => Airline.rate
            [direction] => asc
            [category] => airlines
            [isAjax] => 
        )
        ...
)

请问有什么想法吗?

麦克风

4

3 回答 3

1

你真的不应该使用路由参数进行排序。CakePHP 在即将到来的 3.x 版本中删除了它们,这真是一个糟糕的主意。

相反,使用查询字符串参数。这正是它们的用途:操纵单个视图。如果您有一个列表,请在此处传递“排序”和“方向”等参数。

假设您有一个类似http://example.com/rates/?sort=name&direction=asc的 URL ,然后您可以在控制器中对其进行解析,如下所示:

<?php
class RatesController extends AppController {

    public function index() {
        $sort = isset($this->request->query['sort']) ? $this->request->query['sort'] : 'created';
        $direction = isset($this->request->query['direction']) ? $this->request->query['direction'] : 'desc';

        $this->Paginator->settings = array(
            'order' => array($sort => $direction)
        );

        $rates = $this->paginate('Rate');

        $this->set(compact('rates'));
    }
}

我还想更进一步,使用查询字符串进行分页……</p>

<?php
class AppController extends Controller {

    public $paginate = array(
        'paramType' => 'querystring'
    );
}

…但这只是个人喜好。

以上是在漫长的一天中写的。经过考虑,CakePHP 开箱即用地处理分页中的排序。您不需要手动指定包含名称参数的路由。

只要您使用 Pagination 组件和 Paginator 助手(就像您所做的那样),并为您的控制器操作定义了一个单一的路线,您就不需要做任何其他事情。在您的情况下,您的控制器将如下所示:

<?php
class RatesController extends AppController {

    public function index() {
        $rates = $this->paginate('Rate');
        $this->set(compact('rates'));
    }

}

您的视图将如下所示:

<?php echo $this->Paginator->sort('Airline.name'); ?>

如果您想将/rates重写为/rates-airlines,那么您的单一路线将如下所示:

<?php
Router::connect('/rates-airlines', array(
    'controller' => 'rates',
    'action' => 'index',
));

使用上述方法,paginate调用将考虑要排序的列和方向。

对不起,上面的复杂答案!

于 2014-07-24T14:31:45.463 回答
0

感谢您的回复。问题是我真的需要自定义路由进行分页,所以我终于设法使用以下代码实现了我想要的:

AppController.php中(请注意,添加所有 $this->request->query[...] 变量只是因为我还想通过带有 GET 方法的表单使用排序接口)

function beforeFilter() {

    if (isset($this->request->params['page'])) {

        $this->request->params['named']['page'] = $this->request->params['page'];

    }elseif( isset($this->request->query['page']) ){

        $this->request->params['named']['page'] = $this->request->query['page'];

    } 
    if (isset($this->request->params['sort'])) {

        $this->request->params['named']['sort'] = $this->request->params['sort'];

    }elseif (isset($this->request->query['sort'])) {

        $this->request->params['named']['sort'] = $this->request->query['sort'];

    }  
    if (isset($this->request->params['direction'])) {

        $this->request->params['named']['direction'] = $this->request->params['direction'];

    }elseif (isset($this->request->query['direction'])) {

        $this->request->params['named']['direction'] = $this->request->query['direction'];

    }

routes.php中

Router::connect('/rates-airlines', array('controller' => 'rates', 'action' => 'index', 'airlines'));
Router::connect(
    '/rates-airlines/:page',
    array('controller' => 'rates', 'action' => 'index', 'airlines'),
    array(
        'named' => array('page' => '[\d]+')
    )
); 
Router::connect(
    '/rates-airlines/:page/:sort/:direction',
    array('controller' => 'rates', 'action' => 'index', 'airlines'),
    array(
        'named' => array('page' => '[\d]+', 'sort', 'direction')
    )
);
Router::connect(
    '/rates-airlines/:sort/:direction',
    array('controller' => 'rates', 'action' => 'index', 'airlines'),
    array(
        'named' => array('sort', 'direction')
    )
);

希望有人会发现这很有用!

麦克风

于 2014-07-25T20:31:53.170 回答
0

有一个更简单的方法。只需使用 '/*' 再添加一条路线:

Router::connect('/rates-airlines', array('controller' => 'rates', 'action' => 'index', 'airlines'));
Router::connect('/rates-airlines/*', array('controller' => 'rates', 'action' => 'index', 'airlines'));

一切都会正常工作。

于 2019-02-17T11:04:04.840 回答