cricket,
It's not about just 'union'. I don't want to be dealing with cakephp
style quering here. I am talking about plain sql query. Passing a pure
mysql query into pagination.
I did it, and it worked. The problem however is when I am trying to go
with reqular CakePHP pagination within the same controller, for a
differect action. Because when I override those 2 functions, they now
work for all the actions in that controller (I overcame this problem
as well-> in that controller I simply use plain sql in all
paginations). Worked for me.

What I wonder is why not let people insert pure sql when needed into
pagination, why force everyone to go through tedious cakephp style
arraying sqls (with condition arrays, etc.)? My method works, but how
to enable or "disable" it per action of the same controller?


On Jan 23, 2:06 pm, cricket <[email protected]> wrote:
> On Sun, Jan 23, 2011 at 11:16 AM, mmamedov <[email protected]> wrote:
> > OK. This is getting weird.
> > Now it works for custom query, but it doesn't work when I need default
> > pagination for other actions of the same controller.
>
> > The problem is however, with the overriding paginate() and
> > paginateCount() - Cake 1.3 manual and the source code of both, are
> > different.
>
> > In Cake manual,http://book.cakephp.org/view/1237/Custom-Query-Pagination,
> > it says:
> >       function paginate($conditions, $fields, $order, $limit, $page =
> > 1, $recursive = null, $extra = array()) { ... }
> > But in the source code I see:
> >       function paginate($object = null, $scope = array(), $whitelist
> > = array()) { ...}
>
> > So which one is it? And I also seem unable to find paginateCount()
> > definition in source code (At least that's what Netbean's Find is
> > uinable to find)
>
> You're looking at the wrong class. Controller has a paginate() method,
> but Model::paginate() will be called if it exists. Sorry, it's not
> precise to say that you're overriding the method in the model. Better
> to say that you're including it. Look at Controller::paginate 
> again.http://api.cakephp.org/view_source/controller/#line-1052
>
> Line 1181 is where $scope gets folded into $conditions. Line 1197 is
> where it checks if your model has a paginateCount() and calls it if
> so. Line 1215 is where Model::paginate() is looked for.
>
>
>
> > BTW, this is how I defined them in my model:
>
> >     function paginate($conditions=null, $fields=null, $order=null,
> > $limit=null, $page = 1, $recursive = null, $extra = array()) {
> >             if (isset($conditions['sql']))
> >             {
> >                 $recursive = -1;
> >                 $query = $conditions['sql'];
> >                 unset($conditions['sql']);
> >                $query .= ' LIMIT '.($page-1)*$limit.','.$limit;
>
> >                 return $this->query($query);
> >             }
> >             else{
> >                 return parent::paginate($conditions, $fields, $order,
> > $limit, $page,$recursive, $extra);
> >             }
>
> >        }
> >        function paginateCount($conditions = null, $recursive = 0,
> > $extra = array()) {
> >            if (isset($conditions['sql']))
> >            {
> >                $sql = $this->mmPaginateCount; //I assign this from
> > controller, i need it this way.
> >                $results = $this->query($sql);
> >                return $results[0][0]['c'];
> >            }
> >            else{
> >               return  parent::paginateCount($conditions, $recursive,
> > $extra);
> >            }
>
> >        }
>
> > And this is how I settup custom plain sql from controller before
> > calling $this->paginate();
>
> > $this->paginate=array(
> >    'limit'=>Configure::read('Page.PostCount') //my appwide limit for
> > posts
> >    ,'conditions'=>array(
> >           'sql' =>"my custom query"));
>
> > Any thoughts?
>
> If you're defining $paginate as a class var (outside of the action)
> you could instead just change certain keys in $this->paginate, rather
> than re-defining the entire array. Like limit, for example.
>
> Also, the conditions could be defined within Model::paginate. If you
> need to pass certain values you could do so in the $scope array in the
> controller. As in your example:
>
> $scope = array('union' => array('Friend.user_id' => 99));
>
> $data = $this->paginate('hatever', $scope);
>
> In the model:
>
> if (exists($scope['union']))
> {
>     $conditions = array_merge($conditions, $scope['union']);
>
> This allows you to pass several params within one. You could even do
> this in the controller:
>
> $scope = array(
>         'union' => array(
>                 'conditions' => array(
>                         'Friend.user_id' => 99
>                 ),
>                 'limit' => 10,
>                 'order' => array(
>                         'Friend.last_name' => 'ASC'
>                 )
>         )
> );
>
> And then sort it out as necessary inside the model.
>
> The 'union' key is arbitrary. It could be 'foo' or whatever.

-- 
Our newest site for the community: CakePHP Video Tutorials 
http://tv.cakephp.org 
Check out the new CakePHP Questions site http://ask.cakephp.org and help others 
with their CakePHP related questions.


To unsubscribe from this group, send email to
[email protected] For more options, visit this group at 
http://groups.google.com/group/cake-php

Reply via email to