horst Posted October 18, 2013 Share Posted October 18, 2013 (edited) Pagetree Add New Child ReverseNew 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. New created item 4 is added to the top. To change the order click item 3 and drag it to the top and drop it. 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: move / rename your existing branch create a new (empty) branch with the original name move your childpages into the new branch remove the renamed (and now empty) old branch DOWNLOAD - Version 1.0.2 get it from the Modules Directory 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: add the settings to the class constant permanentValue uncomment setting for permanent in the ModuleInfo 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 create pages via API, how add to the top of tree? Create new child as top sibling rather than bottom? New page on top? Pin Page to Top of Page Tree? move and sort pages with the API Edited February 4, 2017 by horst added example how to make it permanent 12 Link to comment Share on other sites More sharing options...
Martijn Geerts Posted October 18, 2013 Share Posted October 18, 2013 (edited) Wow, I can't wrap my mind around this. How is this possible without heavy overhead. Great work Horst, thank You ! Sneakpeeked at the code... clever Edited October 18, 2013 by Martijn Geerts 1 Link to comment Share on other sites More sharing options...
adrian Posted October 18, 2013 Share Posted October 18, 2013 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! 1 Link to comment Share on other sites More sharing options...
horst Posted October 18, 2013 Author Share Posted October 18, 2013 ... 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() 1 Link to comment Share on other sites More sharing options...
matjazp Posted March 18, 2015 Share Posted March 18, 2015 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 More sharing options...
horst Posted March 18, 2015 Author Share Posted March 18, 2015 No sorry, this isn't possible. Link to comment Share on other sites More sharing options...
Pierre-Luc Posted September 29, 2015 Share Posted September 29, 2015 Hey, love the plugin but this would really benefit from using the Selector inputfield as a selector instead of the textarea. 1 Link to comment Share on other sites More sharing options...
horst Posted February 7, 2016 Author Share Posted February 7, 2016 Successfully tested with PW 3.0 today 3 Link to comment Share on other sites More sharing options...
PWaddict Posted August 23, 2017 Share Posted August 23, 2017 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 More sharing options...
abdus Posted August 23, 2017 Share Posted August 23, 2017 @PWaddict after v3.0.46, there're $pages->sort() and similar methods to move pages and change their order I haven't tried this, but from what I understand from the docs, $pages->sort($pageToTop, 0); moves a page to top of its siblings. https://processwire.com/blog/posts/pw-3.0.46-stocking-stuffers/ 2 Link to comment Share on other sites More sharing options...
adrian Posted August 23, 2017 Share Posted August 23, 2017 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. 3 Link to comment Share on other sites More sharing options...
abdus Posted August 23, 2017 Share Posted August 23, 2017 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. 1 Link to comment Share on other sites More sharing options...
adrian Posted August 23, 2017 Share Posted August 23, 2017 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 More sharing options...
horst Posted August 23, 2017 Author Share Posted August 23, 2017 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 More sharing options...
adrian Posted August 23, 2017 Share Posted August 23, 2017 @horst - what do you think - 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? Link to comment Share on other sites More sharing options...
horst Posted August 23, 2017 Author Share Posted August 23, 2017 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 More sharing options...
adrian Posted August 23, 2017 Share Posted August 23, 2017 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 1 Link to comment Share on other sites More sharing options...
kongondo Posted August 23, 2017 Share Posted August 23, 2017 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? 1 Link to comment Share on other sites More sharing options...
adrian Posted August 23, 2017 Share Posted August 23, 2017 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 More sharing options...
kongondo Posted August 23, 2017 Share Posted August 23, 2017 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 More sharing options...
horst Posted August 23, 2017 Author Share Posted August 23, 2017 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) 1 Link to comment Share on other sites More sharing options...
adrian Posted August 23, 2017 Share Posted August 23, 2017 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! 1 1 Link to comment Share on other sites More sharing options...
PWaddict Posted August 24, 2017 Share Posted August 24, 2017 14 hours ago, adrian said: $this->addHookAfter("Pages::saved", function($event) { $this->pages->sort($event->arguments[0], 0); }); I'm gonna test this soon. How can I apply it only to 1 or 2 specific templates? Link to comment Share on other sites More sharing options...
abdus Posted August 24, 2017 Share Posted August 24, 2017 @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); }); 3 Link to comment Share on other sites More sharing options...
PWaddict Posted August 24, 2017 Share Posted August 24, 2017 I just test it and it works great. I replaced "saved" with "published" otherwise everytime my client will edit the pages sorting will applied. So for PW 3.0.46+ no need this module. 4 Link to comment Share on other sites More sharing options...
Recommended Posts
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 accountSign in
Already have an account? Sign in here.
Sign In Now