Jump to content

Pagetree Add New Child Reverse (on Top)


horst
 Share

Recommended Posts

Pagetree Add New Child Reverse

New Pages in Descending Sortorder (newest first) while sortmode can be "Manual Drag-n-Drop"
 
When a site display an overview of the latest posts, news, image-albums, etc. the newest entries should be on top of the list. We can achieve that by using an automated setting for the sortfield e.g. when the page was created = "-created".
 
But this way we are not able to manually move a single page in the tree.
 
This module enables us to do exactly that. It works with manually created pages, with pages created via the API, also when bootstrapped by importer scripts.
 
 
 
Pagetree "Newsitems" with 3 newsitems sorted in descending order.

PageTreeAddNewChildsReverse_1.jpg

 
New created item 4 is added to the top.
 
PageTreeAddNewChildsReverse_2.jpg

 
To change the order click item 3 and drag it to the top and drop it.
 
PageTreeAddNewChildsReverse_3.jpg
 
PageTreeAddNewChildsReverse_4.jpg

PageTreeAddNewChildsReverse_5.jpg
 

How to use it

Download the module into your site/modules/ directory and install it.
 
In the config page you find a single textarea field. Here you can enter the templatename or page-ID of the page which children should get reverse added, - optionally followed by a comma and the child-templatename if you need a more precise selector.
 
You can add as many parents as you like, but only one on each line and in this format:
TEMPLATE-NAME or PAGE-ID[,CHILDTEMPLATE-NAME].
 
A few examples:

newsitems
posts,post
1042
1033,album

 
You want set your template(s) sortfield(s) to 'Manual drag-n-drop' if not have done already.

 
ATTENTION
 
You need to setup the TreeParent and the module config when there are no children in it! Otherwise it will not work!
 
Also disabling the module once you have added children and then add one new page to it will mess up all!
(You may think about to install the module as permanent in critical situations.?! see below ->)

If you need to install it in a site for an already existing branch, you can do it this way:

  1. move / rename your existing branch
  2. create a new (empty) branch with the original name
  3. move your childpages into the new branch
  4. remove the renamed (and now empty) old branch

 
 
DOWNLOAD   -  Version 1.0.2

 
 
Want to make it bulletproof?
 
If you are concerned that the module settings could be dropped by other users or that the module itself could be uninstalled by accident, you may edit the module file directly:

This way the permanent settings couldn't be dropped by accident. To change it you first need to edit the modules file again.

Example:

You have two settings in the inputfield of the modules config, without permanent setting:

parenttemplate1,childtemplate1
parenttemplate2,childtemplate2

Now you want to have the the first setting become bulletproof permanent:

a) you enable the setting in the getModuleInfo, (uncomment setting for permanent)

b) you write your permanent settings under the constant permanentValue

const permanentValue = "parenttemplate1,childtemplate1";

After both steps, the module cannot get uninstalled anymore (Step a), and the first setting cannot get deleted anymore (Step b), as it is recreated with every call of the configscreen. (See first code line of method getModuleConfigInputfields)

If you want to keep both definitions permanent, write them separated with a newline character "\n" :

const permanentValue = "parenttemplate1,childtemplate1\nparenttemplate2,childtemplate2";




History of origins

Edited by horst
added example how to make it permanent
  • Like 12
Link to comment
Share on other sites

This does look great horst.

I think it is something I am going to have to be aware of though as my page tree migrator module gets closer to release. I can see it being an issue if migrating pages from a site that has this installed, or to one that has it installed if the other doesn't. Not sure how to handle that, but we'll see :)

Just curious - did you test the idea of negative number indexing? Might be opening another can of worms though!

  • Like 1
Link to comment
Share on other sites

 ... Just curious - did you test the idea of negative number indexing? Might be opening another can of worms though!

It doesn't work with negative numbers. They get corrected to 0 (zero) at some other points in PW, not only at Pages::setupNew() :(

  • Like 1
Link to comment
Share on other sites

  • 1 year later...

I have template pr-index, children (template pr-item) are reverse sorted by pubdate (Datetime field in pr-item), not reverse sorted by created date. Is it possible to have manual drag-n-drop in this situation? 

Link to comment
Share on other sites

  • 6 months later...
  • 4 months later...
  • 6 months later...
On 10/18/2013 at 4:34 PM, horst said:

ATTENTION
 
You need to setup the TreeParent and the module config when there are no children in it! Otherwise it will not work!

So I can't use this module on a production site? What if I unpublish the children?

Link to comment
Share on other sites

Based on the suggestion by @abdus, put this in your ready.php file:

$this->addHookAfter("Pages::saved", function($event) {
    $this->pages->sort($event->arguments[0], 0);
});

Note that $event->arguments[0] returns the page that was just saved.

Perhaps it would be a good idea to resort all other children too - have a read more about this here:
https://processwire.com/api/ref/pages/sort/

I think in this use case you'd actually want to use the parent of the saved page so that all child pages are sorted. I honestly have played around with this, so not sure if it matters or not.

  • Like 3
Link to comment
Share on other sites

Quote
5 minutes ago, adrian said:

Perhaps it would be a good idea to resort all other children too

Thanks for the quick solution, @adrian

I'm not sure if we're talking about the same thing, but docs mention that these methods modify other siblings to accept new order.

Quote

$pages->sort($page, $n)
This method sets and saves the sort value of $page to integer $n (0 based), and then also adjusts the sort values of all sibling pages as needed to ensure consistent order.

  • Like 1
Link to comment
Share on other sites

25 minutes ago, abdus said:

I'm not sure if we're talking about the same thing, but docs mention that these methods modify other siblings to accept new order.

Yeah, I agree that it sounds like it should take care of it (and it appears to work just fine), but I guess I am wondering what the point of this is:

// re-build sort values for children of $page, removing duplicates and gaps
$pages->sort($page, true);

Why would there be duplicates/gaps in the first place if the main sort() method works as expected? Maybe it's to clean things up if you did some manual changes? I am really not sure, but it seems like it shouldn't be necessary.

Link to comment
Share on other sites

1 hour ago, PWaddict said:

So I can't use this module on a production site? What if I unpublish the children?

unpublishing doesn't help. You need to start with an empty parent!

  • once I moved all children to a temporary parent,
  • installed and configured the module,
  • and then moved the children back.

But please, do a BACKUP of your DB before!

Link to comment
Share on other sites

I don't know. What comes to my mind, and thats why I posted this to @PWaddict, is, that with my module simply the next free number (counted down!) is put onto the new page. No need to resort all other siblings!

With a huge amount of sibling pages, the new sort function may slow down the process. But I haven't tested it.

Link to comment
Share on other sites

1 minute ago, horst said:

the new sort function may slow down the process

I haven't tested at scale, but Ryan notes:

Quote

One nice thing about the sort() method is that it doesn't actually load any pages to do its job. It handles it all at the database level, so it can do it's job quickly regardless of scale.

https://processwire.com/blog/posts/pw-3.0.46-stocking-stuffers/#new-pages-api-manipulation-methods

  • Like 1
Link to comment
Share on other sites

14 minutes ago, adrian said:

does the use of the new sort() method in a Pages::saved hook (like my example above) make this module obsolete or is there another scenario I am not thinking of?

What about sites that still use PW 2.7? :):'(

  • Like 1
Link to comment
Share on other sites

Just now, kongondo said:

What about sites that still use PW 2.7? :):'(

Sure, but why not update the site to 3.x or at least 2.8 :) I have updated all my old sites and most involved no code changes. Only a couple of sites needed some work with bootstrapped ajax calls etc, but that was it.

Just so you know, I am not trying to say that this module should be removed, but perhaps it might be possible to say it is no longer required with PW 3. Obviously a little more testing would be beneficial - just wanting to start the dialog. 

 

Link to comment
Share on other sites

3 minutes ago, adrian said:

Sure, but why not update the site to 3.x or at least 2.8 :) I have updated all my old sites and most involved no code changes. Only a couple of sites needed some work with bootstrapped ajax calls etc, but that was it.

Just so you know, I am not trying to say that this module should be removed, but perhaps it might be possible to say it is no longer required with PW 3. Obviously a little more testing would be beneficial - just wanting to start the dialog. 

^-^:)

Link to comment
Share on other sites

5 minutes ago, adrian said:

Sure, but why not update the site to 3.x or at least 2.8 :) I have updated all my old sites and most involved no code changes. Only a couple of sites needed some work with bootstrapped ajax calls etc, but that was it.

I do not update all sites to 3.x or 2.8.x. I have sites from 2.4, 2.5, 2.6, 2.7, and some different 3.0.x. Only one of version 2.8!
(never touch a running system) :)

  • Like 1
Link to comment
Share on other sites

3 minutes ago, horst said:

never touch a running system

Hope you're still enjoying Windows 3.1 then :) Sorry I couldn't resist ... ha ha ha - not really very funny I know :)

We are obviously getting way OT, but I guess the key thing for me is that there is now an option with $pages->sort() to easily add reverse order functionality after a site is already set up if we decide it would be a better UX.

I like having options!

  • Like 1
  • Haha 1
Link to comment
Share on other sites

@PWaddict change $templates as necessary

$this->addHookAfter("Pages::saved", function($event) {
    $templates = ['product', 'post' ];
    $page = $event->arguments[0];

    if (! in_array($page->template->name, $templates)) return;

    $this->pages->sort($page, 0);
});
  • Like 3
Link to comment
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
 Share

×
×
  • Create New...