Kohana 3.3 - 分页缺失动作参数

时间:2013-08-05 20:29:05

标签: pagination kohana render

Bootstap:

Route::set('user', 'user/<username>(/<action>)')
->defaults(array(
    'controller' => 'user',
    'username' => '\d+',
));

控制器用户:

public function action_cget(){
        $page_num = @$_GET['page']? $_GET['page'] : 1;
        $per_page = 5;
        $offset = ($page_num - 1) * $per_page;
        $username = $this->request->param('username'); 

        $session = Session::instance();
        $mUser = Model::factory('User');
        $id = $mUser->getID($username);
        $view = View::factory('index');

        $total = DB::query(Database::SELECT, 'SELECT * FROM `comments` WHERE `post_id` IN('.$ids.')')->execute()->as_array();

        $q = DB::query(Database::SELECT, 'SELECT * FROM `comments` WHERE `post_id` IN('.$ids.') LIMIT '.$per_page.' OFFSET '.$offset)->execute()->as_array();
        $pagination = Pagination::factory(array(
            'total_items' => count($total),
            'current_page' => array('source' => 'query_string', 'key' => 'page'),
            'items_per_page' => $per_page,
            'view' => 'pagination/basic'));



        $view->content = View::factory('user/cget');
        $view->content->comments = $q;
        $view->content->pagi = $pagination;
        $this->response->body($view);

(我删除了更多代码)

一切正常,但分页渲染不好 - 渲染没有动作。

我在页面http://mysite.com/user/NetJaro/cget

和分页呈现像http://mysite.com/user/NetJaro?page=2这样的链接(没有动作,比如“cget”)。

有人可以帮助我吗? :)

谢谢!

1 个答案:

答案 0 :(得分:0)

我首先要做一些常规修复。

首先,Kohana是一个HMVC框架。这意味着任何Request都可以调用任意数量的“子请求”。您的代码不是HMVC - 友好。假设您希望以正确的方式将此操作称为子请求。

 echo Request::Factory('user/NetJaro/cget')
      ->query(array('some' => 'some-query-parameters', ...))
      ->execute();

这不起作用!即使您将查询参数放在请求中!这是因为这条线使用了超级全局,它从未在子请求中设置:

$page_num = @$_GET['page']? $_GET['page'] : 1;

它应该是以下内容,它完全相同并且是子请求友好。

$page_num = Arr::get($this->request->query(), 'page', 1);

接下来我看了一下你的路线。并注意到用户名'username' => '\d+',的正则表达式。你只允许数字?不应该是[a-zA-Z0-9]允许用户名可能构成的所有常规字符?

然后,我们来看以下几行:

$mUser = Model::factory('User');
$id = $mUser->getID($username);

如果我是正确的,你创建一个用户对象,然后单独获取ID。你为什么不用:

$user = ORM::factory('User', array('username' => $username));
$user_id = $user->id;

向数据库查询具有该用户名的用户。

接下来我们来看一些内容。

$total = DB::query(Database::SELECT, 'SELECT * FROM `comments` WHERE `post_id` IN('.$ids.')')->execute()->as_array();

$ids来自哪里?为什么不使用ORM?

$total = ORM::factory('Comment')->where('post_id', 'IN', $ids)->count_all();

下一个查询也一样。

$q = ORM::factory('Comment')
    ->where('post_id', 'IN', $ids)
    ->limit($per_page)
    ->offset($offset)
    ->find_all();

现在您不必担心SQL注入或其他任何问题。您创建的模型是ORM模型,为您提供该模型所需的所有功能!

最后,我们来找你的错误。这可能是因为那里没有回应任何动作。无论您回复这些网址,只需添加:<?php echo Request::$initial->action(); ?>。但是我看不到分页的代码。所以我无法确定。