【问题标题】:CakePHP Routing with pagination带分页的 CakePHP 路由
【发布时间】:2012-01-02 07:18:58
【问题描述】:

这似乎已经出现在其他用户身上,但我还没有看到与我想要实现的目标相关的答案。

所以基本上我在/admin/portfolio/ 有一个用于我的投资组合的管理面板

当我转到下一页时,我得到了这个:/admin/portfolio/index/page:2/admin/portfolio/index/page:1

1.) 如何从 url 中删除索引?所以只是/admin/portfolio/page:2

2.) 我如何使page:1 只是/admin/portfolio/,如果有人试图转到第 1 页,那么它只会更改 url / 将它们重定向到没有参数的索引。否则这意味着我的第一页有重复。

正如我之前所说,我在网上查看了一些示例,但它们看起来都非常混乱,并且与我使用的代码不同(见下文),所以我不确定如何实现我正在做的事情。

    <?php echo $this->Paginator->numbers(); ?>

    <?php echo $this->Paginator->prev('« Previous', null, null, array('class' => 'disabled')); ?>
    <?php echo $this->Paginator->next('Next »', null, null, array('class' => 'disabled')); ?> 

    <?php echo $this->Paginator->counter(); ?>

我试过这个:

<?php $this->Paginator->options(array('url'=>array(
'admin'=>true,
'controller' => 'portfolio', 
  'action' => 'index'))); ?>

但我还是得到了 url 中的索引

但是添加这个:Router::connect('/admin/portfolio/*',array('admin'=&gt;true,'controller'=&gt;'portfolio','action'=&gt;'index')); 确实从 url 中删除了索引,但这会导致第二个问题,即任何内容都可以添加到 url,因此不再严格并且在查看虚假页面时显示 404

所以我也试过了:

Router::connect('/admin/portfolio/:page',
                    array('admin'=>true,'controller'=>'portfolio','action'=>'index',
                    array(
                     'pass' => array('page'),
                     'page'=> '[0-9]+'
                      )));

但这也不起作用,因为路由看不到页面!

【问题讨论】:

  • 任何更新,因为我真的很难过:/谢谢

标签: cakephp routing pagination


【解决方案1】:

我建议明确声明您的 portfolio 路线。这样,您就不会干扰应用程序中的任何其他控制器/操作。

考虑到这一点,您的应用程序组合部分的路由定义如下所示:

/**
 * add, edit and delete actions
 */
Router::connect('/admin/portfolio/add', array(
  'controller' => 'portfolio', 'action' => 'add', 'admin' => true
));
Router::connect('/admin/portfolio/delete/:id', array(
  'controller' => 'portfolio', 'action' => 'delete', 'admin' => true), array(
    'pass' => array('id')
  )
);
Router::connect('/admin/portfolio/edit/:id', array(
  'controller' => 'portfolio', 'action' => 'edit', 'admin' => true), array(
    'pass' => array('id')
  )
);

/**
 * index action
 */
Router::connect('/admin/portfolio', array(
  'controller' => 'portfolio', 'action' => 'index', 'admin' => true, 'page' => 1
));
Router::connect('/admin/portfolio/*', array(
  'controller' => 'portfolio', 'action' => 'index', 'admin' => true), array(
    'named' =>
      array('page' => '[\d]+'),
  )
);

【讨论】:

  • 唯一的问题是它意味着假网址可以工作,例如/admin/portfolio/fake-url 并且不显示 404
  • 另外 page:1 仍然有效,并且不会重定向以修复 url 重复
  • @Cameron 您可以通过检查命名参数 'page' 或默认值 'page' 是否始终存在来克服控制器中的 'bogus url' - 如果不存在,请发出 404或例外。关于您的第二条评论,分页不会输出此网址。您可以手动访问它,是的,但只有您自己知道。
  • 在您的 admin_index() 操作中: if (empty($this->request->params['named']['page']) && empty($this->request->params[ 'page'])) { throw new NotFoundException(__('Invalid page')); }
  • 如何在 1.3 中做到这一点?像这样的请求在 2.0 中是新的吧?
猜你喜欢
  • 2012-09-26
  • 2012-07-01
  • 2013-02-15
  • 1970-01-01
  • 2011-06-29
  • 1970-01-01
  • 1970-01-01
  • 2011-05-25
  • 1970-01-01
相关资源
最近更新 更多