Tree reorder tweaking

View: New views
7 Messages — Rating Filter:   Alert me  

Tree reorder tweaking

by MonkeyGirl :: Rate this Message:

Reply to Author | View Threaded | Show Only this Message


Hi.

I'm trying to order a tree such that for any given node on the tree,
all its children appear alphabetically, including the top level.

If I understand the reorder() method correctly (it has sparse
documentation at http://book.cakephp.org/view/229/Advanced-Usage#reorder-518
but the API at http://api.cakephp.org/class/tree-behavior#method-TreeBehaviorreorder
is more informative), then you need to pass it the IDs that need
editing.  I want to reorder the whole entire tree though, so I made my
own reorderAll() method in /app/app_model.php:

  function reorderAll($options = array()) {
    $parentIDs = $this->find('list', array(
      'fields' => array(
        'parent_id'
      )
    ));

    $parentIDs = array_unique($parentIDs);

    foreach ($parentIDs as $parentID) {
      if (!empty($parentID)) {
        $options['id'] = $parentID;
        $this->reorder($options);
      }
    }
  }

Is this a good way of approaching it?  The most obvious problem I can
see at the moment is that the top level still isn't getting
alphabetised, and I'm not sure how to do this.  I'm also still not
sure if reorder() recurses as far as it can, or just one level.

Thanks for any help or suggestions!

Zoe.
--~--~---------~--~----~------------~-------~--~----~
You received this message because you are subscribed to the Google Groups "CakePHP" group.
To post to this group, send email to cake-php@...
To unsubscribe from this group, send email to cake-php+unsubscribe@...
For more options, visit this group at http://groups.google.com/group/cake-php?hl=en
-~----------~----~----~----~------~----~------~--~---


Re: Tree reorder tweaking

by Kerr-3 :: Rate this Message:

Reply to Author | View Threaded | Show Only this Message


Hi, I've been playing around with the tree functionality as well.
Looking at the code, you'll notice that the reorder method calls
itself recursively.  If you want to reorder the entire tree, simply
pass no arguments... e.g.

$this->reorder();

  Overall, I'm pretty impressed so far with how easy the tree methods
make it to deal with the adjacency list hierarchy model.  I've had to
code this kind of stuff from the ground up in SQL Server, and it was a
major PITA.

On Oct 29, 5:27 am, MonkeyGirl <z...@...> wrote:

> Hi.
>
> I'm trying to order atreesuch that for any given node on thetree,
> all its children appear alphabetically, including the top level.
>
> If I understand thereorder() method correctly (it has sparse
> documentation athttp://book.cakephp.org/view/229/Advanced-Usage#reorder-518
> but the API athttp://api.cakephp.org/class/tree-behavior#method-TreeBehaviorreorder
> is more informative), then you need to pass it the IDs that need
> editing.  I want toreorderthe whole entiretreethough, so I made my
> own reorderAll() method in /app/app_model.php:
>
>   function reorderAll($options = array()) {
>     $parentIDs = $this->find('list', array(
>       'fields' => array(
>         'parent_id'
>       )
>     ));
>
>     $parentIDs = array_unique($parentIDs);
>
>     foreach ($parentIDs as $parentID) {
>       if (!empty($parentID)) {
>         $options['id'] = $parentID;
>         $this->reorder($options);
>       }
>     }
>   }
>
> Is this a good way of approaching it?  The most obvious problem I can
> see at the moment is that the top level still isn't getting
> alphabetised, and I'm not sure how to do this.  I'm also still not
> sure ifreorder() recurses as far as it can, or just one level.
>
> Thanks for any help or suggestions!
>
> Zoe.
--~--~---------~--~----~------------~-------~--~----~
You received this message because you are subscribed to the Google Groups "CakePHP" group.
To post to this group, send email to cake-php@...
To unsubscribe from this group, send email to cake-php+unsubscribe@...
For more options, visit this group at http://groups.google.com/group/cake-php?hl=en
-~----------~----~----~----~------~----~------~--~---


Re: Tree reorder tweaking

by Kerr-3 :: Rate this Message:

Reply to Author | View Threaded | Show Only this Message


To be more specific in addressing, "I'm also still not
sure if reorder() recurses as far as it can, or just one level. " --
Yes, it will recurse the tree until it finds no children in all
affected branches.


On Nov 2, 8:25 pm, Kerr <hayl...@...> wrote:

> Hi, I've been playing around with thetreefunctionality as well.
> Looking at the code, you'll notice that thereordermethod calls
> itself recursively.  If you want toreorderthe entiretree, simply
> pass no arguments... e.g.
>
> $this->reorder();
>
>   Overall, I'm pretty impressed so far with how easy thetreemethods
> make it to deal with the adjacency list hierarchy model.  I've had to
> code this kind of stuff from the ground up in SQL Server, and it was a
> major PITA.
>
> On Oct 29, 5:27 am, MonkeyGirl <z...@...> wrote:
>
> > Hi.
>
> > I'm trying to order atreesuch that for any given node on thetree,
> > all its children appear alphabetically, including the top level.
>
> > If I understand thereorder() method correctly (it has sparse
> > documentation athttp://book.cakephp.org/view/229/Advanced-Usage#reorder-518
> > but the API athttp://api.cakephp.org/class/tree-behavior#method-TreeBehaviorreorder
> > is more informative), then you need to pass it the IDs that need
> > editing.  I want toreorderthe whole entiretreethough, so I made my
> > own reorderAll() method in /app/app_model.php:
>
> >   function reorderAll($options = array()) {
> >     $parentIDs = $this->find('list', array(
> >       'fields' => array(
> >         'parent_id'
> >       )
> >     ));
>
> >     $parentIDs = array_unique($parentIDs);
>
> >     foreach ($parentIDs as $parentID) {
> >       if (!empty($parentID)) {
> >         $options['id'] = $parentID;
> >         $this->reorder($options);
> >       }
> >     }
> >   }
>
> > Is this a good way of approaching it?  The most obvious problem I can
> > see at the moment is that the top level still isn't getting
> > alphabetised, and I'm not sure how to do this.  I'm also still not
> > sure ifreorder() recurses as far as it can, or just one level.
>
> > Thanks for any help or suggestions!
>
> > Zoe.
--~--~---------~--~----~------------~-------~--~----~
You received this message because you are subscribed to the Google Groups "CakePHP" group.
To post to this group, send email to cake-php@...
To unsubscribe from this group, send email to cake-php+unsubscribe@...
For more options, visit this group at http://groups.google.com/group/cake-php?hl=en
-~----------~----~----~----~------~----~------~--~---


Re: Tree reorder tweaking

by Robert P :: Rate this Message:

Reply to Author | View Threaded | Show Only this Message


Also note that one issue with your reorderAll() function is that it
loops through all non-empty parent IDs. The only problem with this is
that top-level items WILL have an empty parent.

On Nov 3, 10:27 am, Kerr <hayl...@...> wrote:

> To be more specific in addressing, "I'm also still not
> sure if reorder() recurses as far as it can, or just one level. " --
> Yes, it will recurse the tree until it finds no children in all
> affected branches.
>
> On Nov 2, 8:25 pm, Kerr <hayl...@...> wrote:
>
> > Hi, I've been playing around with thetreefunctionality as well.
> > Looking at the code, you'll notice that thereordermethod calls
> > itself recursively.  If you want toreorderthe entiretree, simply
> > pass no arguments... e.g.
>
> > $this->reorder();
>
> >   Overall, I'm pretty impressed so far with how easy thetreemethods
> > make it to deal with the adjacency list hierarchy model.  I've had to
> > code this kind of stuff from the ground up in SQL Server, and it was a
> > major PITA.
>
> > On Oct 29, 5:27 am, MonkeyGirl <z...@...> wrote:
>
> > > Hi.
>
> > > I'm trying to order atreesuch that for any given node on thetree,
> > > all its children appear alphabetically, including the top level.
>
> > > If I understand thereorder() method correctly (it has sparse
> > > documentation athttp://book.cakephp.org/view/229/Advanced-Usage#reorder-518
> > > but the API athttp://api.cakephp.org/class/tree-behavior#method-TreeBehaviorreorder
> > > is more informative), then you need to pass it the IDs that need
> > > editing.  I want toreorderthe whole entiretreethough, so I made my
> > > own reorderAll() method in /app/app_model.php:
>
> > >   function reorderAll($options = array()) {
> > >     $parentIDs = $this->find('list', array(
> > >       'fields' => array(
> > >         'parent_id'
> > >       )
> > >     ));
>
> > >     $parentIDs = array_unique($parentIDs);
>
> > >     foreach ($parentIDs as $parentID) {
> > >       if (!empty($parentID)) {
> > >         $options['id'] = $parentID;
> > >         $this->reorder($options);
> > >       }
> > >     }
> > >   }
>
> > > Is this a good way of approaching it?  The most obvious problem I can
> > > see at the moment is that the top level still isn't getting
> > > alphabetised, and I'm not sure how to do this.  I'm also still not
> > > sure ifreorder() recurses as far as it can, or just one level.
>
> > > Thanks for any help or suggestions!
>
> > > Zoe.
--~--~---------~--~----~------------~-------~--~----~
You received this message because you are subscribed to the Google Groups "CakePHP" group.
To post to this group, send email to cake-php@...
To unsubscribe from this group, send email to cake-php+unsubscribe@...
For more options, visit this group at http://groups.google.com/group/cake-php?hl=en
-~----------~----~----~----~------~----~------~--~---


Re: Tree reorder tweaking

by Kerr-3 :: Rate this Message:

Reply to Author | View Threaded | Show Only this Message


One more note, MonkeyGirl, and I'm sure we're already on the same
page, but the syntax should be $this->ModelName->reorder();  Using the
categories example from http://book.cakephp.org/view/228/Basic-Usage
, the syntax to reorder the entire tree by name is $this->Category-
>reorder();

On Nov 2, 9:22 pm, Robert P <shiftyrobs...@...> wrote:

> Also note that one issue with your reorderAll() function is that it
> loops through all non-empty parent IDs. The only problem with this is
> that top-level items WILL have an empty parent.
>
> On Nov 3, 10:27 am, Kerr <hayl...@...> wrote:
>
> > To be more specific in addressing, "I'm also still not
> > sure ifreorder() recurses as far as it can, or just one level. " --
> > Yes, it will recurse thetreeuntil it finds no children in all
> > affected branches.
>
> > On Nov 2, 8:25 pm, Kerr <hayl...@...> wrote:
>
> > > Hi, I've been playing around with thetreefunctionality as well.
> > > Looking at the code, you'll notice that thereordermethod calls
> > > itself recursively.  If you want toreorderthe entiretree, simply
> > > pass no arguments... e.g.
>
> > > $this->reorder();
>
> > >   Overall, I'm pretty impressed so far with how easy thetreemethods
> > > make it to deal with the adjacency list hierarchy model.  I've had to
> > > code this kind of stuff from the ground up in SQL Server, and it was a
> > > major PITA.
>
> > > On Oct 29, 5:27 am, MonkeyGirl <z...@...> wrote:
>
> > > > Hi.
>
> > > > I'm trying to order atreesuch that for any given node on thetree,
> > > > all its children appear alphabetically, including the top level.
>
> > > > If I understand thereorder() method correctly (it has sparse
> > > > documentation athttp://book.cakephp.org/view/229/Advanced-Usage#reorder-518
> > > > but the API athttp://api.cakephp.org/class/tree-behavior#method-TreeBehaviorreorder
> > > > is more informative), then you need to pass it the IDs that need
> > > > editing.  I want toreorderthe whole entiretreethough, so I made my
> > > > own reorderAll() method in /app/app_model.php:
>
> > > >   function reorderAll($options = array()) {
> > > >     $parentIDs = $this->find('list', array(
> > > >       'fields' => array(
> > > >         'parent_id'
> > > >       )
> > > >     ));
>
> > > >     $parentIDs = array_unique($parentIDs);
>
> > > >     foreach ($parentIDs as $parentID) {
> > > >       if (!empty($parentID)) {
> > > >         $options['id'] = $parentID;
> > > >         $this->reorder($options);
> > > >       }
> > > >     }
> > > >   }
>
> > > > Is this a good way of approaching it?  The most obvious problem I can
> > > > see at the moment is that the top level still isn't getting
> > > > alphabetised, and I'm not sure how to do this.  I'm also still not
> > > > sure ifreorder() recurses as far as it can, or just one level.
>
> > > > Thanks for any help or suggestions!
>
> > > > Zoe.
--~--~---------~--~----~------------~-------~--~----~
You received this message because you are subscribed to the Google Groups "CakePHP" group.
To post to this group, send email to cake-php@...
To unsubscribe from this group, send email to cake-php+unsubscribe@...
For more options, visit this group at http://groups.google.com/group/cake-php?hl=en
-~----------~----~----~----~------~----~------~--~---


Re: Tree reorder tweaking

by MonkeyGirl :: Rate this Message:

Reply to Author | View Threaded | Show Only this Message


OK, so using $this->Category->reorder(); reorders all the children of
a given category (in this example), and their children, and so on, but
is there any way to reorder _all_ the categories, including the top
level ones?

I see now the point about my code not doing anything more than the
original CakePHP code, as either way, nothing's reorganising the top
level categories.  Either I'm missing something or that functionality
simply isn't available, is that right?

It's good to know that it's recursive though, that's great.

Thanks,
Zoe.
--~--~---------~--~----~------------~-------~--~----~
You received this message because you are subscribed to the Google Groups "CakePHP" group.
To post to this group, send email to cake-php@...
To unsubscribe from this group, send email to cake-php+unsubscribe@...
For more options, visit this group at http://groups.google.com/group/cake-php?hl=en
-~----------~----~----~----~------~----~------~--~---


Re: Tree reorder tweaking

by Kerr-3 :: Rate this Message:

Reply to Author | View Threaded | Show Only this Message

Zoe -- Sorry, I just now saw your reply!  You can use $this->Category-
>reorder(); just like that to reorder the entire tree from top to
bottom... very handy!

On Nov 9, 10:19 am, MonkeyGirl <z...@...> wrote:

> OK, so using $this->Category->reorder(); reorders all the children of
> a given category (in this example), and their children, and so on, but
> is there any way to reorder _all_ the categories, including the top
> level ones?
>
> I see now the point about my code not doing anything more than the
> original CakePHP code, as either way, nothing's reorganising the top
> level categories.  Either I'm missing something or that functionality
> simply isn't available, is that right?
>
> It's good to know that it's recursive though, that's great.
>
> Thanks,
> Zoe.

--

You received this message because you are subscribed to the Google Groups "CakePHP" group.
To post to this group, send email to cake-php@....
To unsubscribe from this group, send email to cake-php+unsubscribe@....
For more options, visit this group at http://groups.google.com/group/cake-php?hl=.