horst

Pagetree Add New Child Reverse (on Top)

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 11

Share this post


Link to post
Share on other sites

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 by Martijn Geerts
  • Like 1

Share this post


Link to post
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

Share this post


Link to post
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

Share this post


Link to post
Share on other sites

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? 

Share this post


Link to post
Share on other sites
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?

Share this post


Link to post
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 2

Share this post


Link to post
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

Share this post


Link to post
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.

Share this post


Link to post
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!

Share this post


Link to post
Share on other sites

@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?

Share this post


Link to post
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.

Share this post


Link to post
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

Share this post


Link to post
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

Share this post


Link to post
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. 

 

Share this post


Link to post
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. 

^-^:)

Share this post


Link to post
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

Share this post


Link to post
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

Share this post


Link to post
Share on other sites
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?

Share this post


Link to post
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 2

Share this post


Link to post
Share on other sites

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.

  • Like 3

Share this post


Link to post
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


  • Recently Browsing   0 members

    No registered users viewing this page.

  • Similar Content

    • By flydev
      PulsewayPush
      Send "push" from ProcessWire to Pulseway.
       
      Description
      PulsewayPush simply send a push to a Pulseway instance. If you are using this module, you probably installed Pulseway on your mobile device: you will receive notification on your mobile.
      To get more information about Pulseway, please visit their website.
      Note
      They have a free plan which include 10 notifications (push) each day.
       
      Usage
      Install the PulsewayPush module.
      Then call the module where you like in your module/template code :
      <?php $modules->get("PulsewayPush")->push("The title", "The notification message.", "elevated"); ?>  
      Hookable function
      ___push() ___notify() (the two function do the same thing)
       
      Download
      Github:  https://github.com/flydev-fr/PulsewayPush Modules Directory: https://modules.processwire.com/modules/pulseway-push/  
      Examples of use case
      I needed for our work a system which send notification to mobile device in case of a client request immediate support. Pulseway was choosen because it is already used to monitor our infrastructure.
      An idea, you could use the free plan to monitor your blog or website regarding the number of failed logins attempts (hooking Login/Register?), the automated tool then block the attacker's IP with firewall rules and send you a notification.
       

       
      - - - - - - - - - - - - - -
      11-22-2017: added the module to the modules directory
       
    • By netcarver
      Part 1 of a 2 part Module & Service Reveal.
      I'm currently working on a new module: ModuleReleaseNotes that was inspired by the work I originally did on making Ryan's ProcessWireUpgrades module "release" aware. In the end, I decided to ditch the approach I was originally taking and instead work on a module that hooked in to the UpgradeConfirmation dialog and the module edit page.
      Aims
      My aims for this module are as follows...
      Make discovery of a module's changes prior to an upgrade a trivial task. Make breaking changes very obvious. Make reading of a module's support documentation post-install a trivial task. Make module authors start to think about how they can improve the change discovery process for their modules. Make sure the display of information from the module support files/commit messages doesn't introduce a vulnerability. Looking at these in turn...
      Making discovery of a module's changes prior to upgrade a trivial task.
      This is done by adding a "What's changed section" to the upgrade confirmation dialog.  This section takes a best-effort approach to showing what's changed between the installed version and the updated version that's available via the module repository.
      At present, it is only able to talk to github-hosted repositories in order to ask them for the release notes, the changelog file (if present) and a list of commits between the git tag that matches the installed version and the tag matching the latest version.
      It will display the Release Notes (if the author is using the feature), else it will display the commits between the tags (if tagging is used by the module author) else it will show the changelog file (if present) else it will show the latest N commits on the master branch (N, of course, being configurable to your liking.)
      An example of the Github Release Notes pulled in for you, taken from Mike Rockett's TextformatterTypographer Module...

      An example of a tag-to-tag commit list from the same module...

      An example of a changelog - formatted to show just the changes (formatting styles will change)...

      Finally, an example of a fallback list of commits - sorry Adrian ...

       
      Making breaking changes obvious.
      This is currently done by searching for a set of configurable search strings. Later versions may be able to support breaking change detection via use of Semantic Versioning - but this may require some way of signalling the use of this versioning standard on a module-by-module basis.
      For now, then, you can customise the default set of change markers. Here I have added my own alias to the list of breaking change markers and the changes section of the changelog is styled accordingly (these will be improved)...

       
      Make reading of a module's support documentation, post-install, a trivial task.
      This is done by making some of the support files (like the README, CHANGELOG and LICENSE files) readable from the module's information/settings screen. There is an option to control the initial open/closed state of this section...

      Here is Tracy's README file from within the module settings page... 

       
      Make module authors start to think about how they can improve the change discovery process for their modules.
      There are notes in each of the sections displayed on the upgrade confirmation page that help authors use each of the features...

       
      Make sure display of external information doesn't introduce a vulnerability.
      This is an ongoing concern, and is the thing that is most likely to delay or prevent this module's release lead to this module's withdrawl should a vulnerability be found. Currently, output is formatted either via Markdown + HTML Purifier (if it was originally a Markdown file) or via htmlspecialchars() if it has come from a plaintext file.
      If you discover a vulnerability, please get in contact with me via the forum PM system.
       
      Ongoing...
      For now, I've concentrated on integration with GitHub, as most people use that platform to host their code. I know a few people are hosting their repositories with BitBucket (PWFoo comes to mind) and some with GitLab (Mike Rockett?) and I would eventually like to have adaptor implementations for these providers (and perhaps GitKraken) - but for now, GitHub rules and the other hosts are unsupported.
       
      Links
      Github: ModuleReleaseNotes
      PW Module Repository: Here
    • By FrancisChung
      Hi,
      I was wondering if anyone knew what this did? 

      If so, do you know what modules it actually impacts? Is there another log that lists the action it took?

      I'm having some weird problems with PHP duplicate declaration per link below, since this module was run.
       
       
    • By tpr
      AdminOnSteroids
      Various admin tweaks to enhance ProcessWire admin.
      http://modules.processwire.com/modules/admin-on-steroids/
      https://github.com/rolandtoth/AdminOnSteroids