Jump to content

Module: AdminSaveActions


Recommended Posts


(Was: After Save Actions - guess why the rename?)

Admin Save Actions adds the possibility to choose where the browser gets redirected after saving a page, template or field. Admin save actions are displayed just before the save button in a collapsed container.

Chosen action can be saved in a cookie for current user by checking "Remember this setting". By leaving this option unchecked upon save, the chosen action will not become the default.


Some of you wanted something like this to exists in ProcessWire - and so did I. I've read discussions here, here, here and here carefully trying to cover at least most of the options discussed. I know this implementation wont satisfy all the needs, but I'm looking into adding some things afterwards to cover even more of them.

I called the first version of this module PageEditRedirects but decided to to change the name in to a more descriptive one. So that module got deprecated as of now (and does not exists at GitHub anymore). This new version also does not require PW 2.3 but works just fine on PW 2.2 as well.

Special thanks

A module by Adam Kiss (ListAfterSave) implemented some of these actions a long time ago. Thanks to Adam for letting me use the ideas introduced by his module. There are actually some things there my module isn't going to cover even in future versions.


AdminSaveActions can be found from the modules section.

AdminSaveAction is downloadable from GitHub.

(Edit: added link to the modules section. Edit 2: Implemented config option + version bump. Edit 3: Removed feature list - see GitHub.)

  • Like 16
Link to comment
Share on other sites

Nik: this seems to be great! although I am having little problem on my localhost when testing. I get this error msg after page save:

Unknown page

And url on address bar is this:


I have just installed the module, not touched anything. This happen always when saving. Tried uninstall / install, saving multiple times etc, but same thing.

PS: I read the name After Shave Actions (whatever that means :rolleyes:) "After" actually feels little strange as module "headline" - how about AdminSaveActions? Admin would be general enough to keep more modules of this kind.

  • Like 1
Link to comment
Share on other sites

@apeisa: Damned, I did a little 'refactoring' just before committing... Seems I've broken it down, have to take a look at it a bit later (found one bug right away, but it didn't fix the whole issue).

Sorry everyone. Fail. 

And that naming. I couldn't come up with a good name - but it was too obvious. We'll see if this module gets a third name before it becomes stable.

  • Like 1
Link to comment
Share on other sites

Nik, don't worry It sounds very familar to myself, ... before release some refactoring (ah lets change those var names before release lol) and best of is you recognize it immediately after releasing. :)

Link to comment
Share on other sites

Phew, sleeping is overrated. Coding is much more fun.

@Antti: I just pushed a new version to GitHub and the bug you reported should be fixed now.

@Pete: As an added bonus I added the option to choose between radios in a container and a dropdown near the save button. This latter behaviour is somewhat experimental as I could use half a year trying to style the dropdown (+checkbox) and still get it awfully wrong. So there it is, plain and simple. Feel free to suggest (anyone?) suitable markup for the dropdown version. I just might give it a try myself someday, but I doubt it will become anything suitable for anyone not wanting to damage their eyes.

@Soma: And I even managed to do it at such a time I was going away from the computer for some time. Plain stupid of me. But hey, didn't I say some time ago I'd try to publish stuff sooner than later: "if you’re not embarrassed when you ship your first version you waited too long". Check. And it wasn't even first version I messed up with  :D.

  • Like 2
Link to comment
Share on other sites

  • 4 months later...

Thanks for the report guys!

Redirect url on page save has changed a couple of months ago a bit and my regex was too picky. This is fixed now. I also fixed the action when field is being edited in some other context than default one. Module version is now 0.0.7 both in GitHub and modules directory.

  • Like 2
Link to comment
Share on other sites

  • 1 month later...

@kongondo: Thanks for the request - and sorry for the delay. I've been a bit too busy lately and unfortunately will be in the near future as well. That feature has been on my todo-list since the first version of this module though. While it's straightforward to add, I'd like to come up with a decent solution for situations where there are a lot of siblings as well.

I'll try and find some time to try this out as soon as possible.

  • Like 1
Link to comment
Share on other sites

  • 6 months later...

Feature request: ( Same as Kongondo )

For the select / radio options.

Edit next / previous sibling, include all. (hidden, unpublished etc.)

side note: Don't know if that is possible with $page->next, (does that include all ?)

But could be done with $page->next($page->siblings("include=all")) for sure.

  • Like 1
Link to comment
Share on other sites

Sorry Nik, didn't read your post very well. I agree on the sibling issue.


ps, customised your wonderful Module, ( + added some permission related things in it only useful in this instance )

I called it afterShaveActions.

Thanks for creating AfterSaveActions.

Love your coding style !

Edited by Martijn Geerts
  • Like 4
Link to comment
Share on other sites

Thanks Martijn!

I really should look into adding "edit next sibling" as it probably works just fine in most cases (I forgot kongondo's feature request, sorry!). And maybe I should also go with Antti's suggestion and rename the module to AdminSaveActions - I thinks there's been enough of after shave already ;).

I'll take a better look at this after work/shave today.

  • Like 4
Link to comment
Share on other sites

  • 3 weeks later...

...I went ahead and hackishly implemented my feature request (edit next sibling) :-X  :-[ . Seems to work OK?
Code: Github
Short demo:

Feature only implemented for pages minus "home", "hidden" and "unpublished". User is redirected (with a status message) to the page list when there is no next sibling to edit...I used page->next.
Btw, I don't understand this quote

†The siblings, next and prev properties and methods may not be efficient to use when the page has a lot of siblings. Care should be taken on large sites in consideration of the fact that these properties will load all sibling pages. In large scale use, you should make use of the function/method equivalent versions: siblings(selector), next(pageArray), and prev(pageArray), so that you can control the number of pages loaded.

...I thought page->next will only grab one page (i.e. it is not an array but an object?)...

  • Like 3
Link to comment
Share on other sites

Siblings are all loaded in memory. Say you have hundreds of siblings, next & prev has to find out where it is compared to his brothers.

So have to load them all. If the list contains not much siblings, there's nothing wrong. 

A real time case case ( you actually build it  ) will point out if it's still functioning well or not. It's not unlikely that we see more problems then that there actually are.

The thing I needed, was the next unpublished sibling, as those pages came from automatic import (cron).

  • Like 1
Link to comment
Share on other sites

Thanks for the explanation Martijn....then as suggested in the docs, this is the way to go, no? [to make it foolproof]




Can limit to 1, etc....

Edited by kongondo
  • Like 1
Link to comment
Share on other sites

Thanks for the input guys!

I made a (classic, for me at least) mistake trying to make other modifications at the same time and ended up not publishing any of my changes. But Kongondo's code and Martijn's comments both revealed some things I hadn't taken into account. I'll try and publish the changes as soon as possible but I won't promise anything as it seems I never keep them anyway. Sorry.

That possible performance issue is not solved just by using selector version of next(). The problem is we've got no general form of selector that would for sure limit the pages getting loaded there. Like Martijn explained, all the siblings have to be loaded to find out the current page's place among them before it's possible to say which page would be the next (no way to do this in the database, without stored procedures at least ;) ). So using "limit" is not the answer here as you'd only get an incomplete PageArray possibly not even including the current page.

I'm trying to get there by offering "edit next sibling page" as an option only if there are less than 100 siblings (could be made configurable of course). This way there's always a safe net to make sure editing a page doesn't slow down too much because of this module.

  • Like 2
Link to comment
Share on other sites

There you go.

Pushed a new version to GitHub and updated modules directory + opening post accordingly.

Changed the name to Admin Save Actions (though the damage has been done). Don't know how this affects those trying to update the module via ModulesManager - probably you need to remove and reinstall the module, sorry for that.

Added "edit next sibling page" as described in some of the earlier posts. Basically does what Kongondo's version does too - a bit different route though. There's also a config option to set a safety net for this: option will not be show if there are more siblings (defaults to 100). Option is not shown also when there is no next sibling available (root page or last visible and published page under this parent).

@Martijn: I didn't go for hidden/unpublished pages at this time. But I'm thinking of modifying this a bit so that when the edited page is hidden/unpublished also siblings are searched with "include=all". Do you think that would be logical?

  • Like 5
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

  • Recently Browsing   0 members

    • No registered users viewing this page.
  • Similar Content

    • By MarkE
      This fieldtype and inputfield bundle was built for storing measurement values within a field, rendering them in a variety of formats and converting them to other units or otherwise modifying them via the API.
      The API consists of a number of predefined functions, some of which include...
      render() for rendering the measurement object, valueAs() for converting the value to another unit value, convertTo() for converting the whole measurement object to different units, and add() and subtract() for for modifying the stored value by the value (converted as required) in another measurement. In the admin the inputfield includes a checkbox (which can be optionally disabled) for converting values on page save. For an example if a value was typed in as centimeters, the unit was changed to metres, and the page saved with this checkbox selected, said value would be automatically converted so that e.g. 170 cm becomes 1.7 m.

      A simple length field using Fieldtype Measurement and Inputfield Measurement.
      Combination units (e.g. feet and inches) are also supported.
      Please note that this module is 'proof of concept' at the moment - there are limited units available and quite a lot of code tidying to do. More units will be added shortly.
      See the GitHub at https://github.com/MetaTunes/FieldtypeMeasurement for full details and updates.
    • By tcnet
      File Manager for ProcessWire is a module to manager files and folders from the CMS backend. It supports creating, deleting, renaming, packing, unpacking, uploading, downloading and editing of files and folders. The integrated code editor ACE supports highlighting of all common programming languages.

      This module is probably the most powerful module. You might destroy your processwire installation if you don't exactly know what you doing. Be careful and use it at your own risk!
      ACE code editor
      This module uses ACE code editor available from: https://github.com/ajaxorg/ace

      This module uses the JavaScript dragscroll available from: http://github.com/asvd/dragscroll. Dragscroll adds the ability to drag the table horizontally with the mouse pointer.
      PHP File Manager
      This module uses a modified version of PHP File Manager available from: https://github.com/alexantr/filemanager
    • By tcnet
      This module implements the website live chat service from tawk.to. Actually the module doesn't have to do much. It just need to inserted a few lines of JavaScript just before the closing body tag </body> on each side. However, the module offers additional options to display the widget only on certain pages.
      Create an account
      Visit https://www.tawk.to and create an account. It's free! At some point you will reach a page where you can copy the required JavaScript-code.

      Open the module settings and paste the JavaScript-code into the field as shown below. Click "Submit" and that's all.

      Open the module settings
      The settings for this module are located int the menu Modules=>Configure=>LiveChatTawkTo.

    • By tcnet
      Session Viewer is a module for ProcessWire to list session files and display session data. This module is helpful to display the session data of a specific session or to kick out a logged in user by simply delete his session file. After installation the module is available in the Setup menu.

      The following conditions must be met for the module to work properly:
      Session files
      Session data must be stored in session files, which is the default way in ProcessWire. Sessions stored in the database are not supported by this module. The path to the directory where the session files are stored must be declared in the ProcessWire configuration which is by default: site/assets/sessions.
      Serialize handler
      In order to transform session data easier back to a PHP array, the session data is stored serialized. PHP offers a way to declare a custom serialize handler. This module supports only the default serialize handlers: php, php_binary and php_serialize. WDDX was dropped in PHP 7.4.0 and is therefore not supported by this module as well as any other custom serialize handler. Which serialize handler is actually used you can find out in the module configuration which is available under Modules=>Configure=>SessionViewer.

      Session data
      The session data can be displayed in two different ways. PHP's default output for arrays print_r() or by default for this module nice_r() offered on github: https://github.com/uuf6429/nice_r. There is a setting in the module configuration if someone prefers print_r(). Apart from the better handling and overview of the folded session data the output of nice_r() looks indeed nicer.

      ProcessWire module directory
    • By Robin S
      Repeater Easy Sort
      Adds a compact "easy-sort" mode to Repeater and Repeater Matrix, making those fields easier to sort when there are a large number of items.
      The module also enhances Repeater Matrix by allowing a colour to be set for each matrix type. This colour is used in the item headers and in the "add new" links, to help visually distinguish different matrix types in the inputfield.
      A Repeater field

      A Repeater Matrix field with custom header colours

      Easy-sort mode
      Each Repeater/Matrix item gets an double-arrow icon in the item header. Click this icon to enter easy-sort mode.
      While in easy-sort mode:
      The items will reduce in width so that more items can be shown on the screen at once. The minimum width is configurable in the field settings. Any items that were in an open state are collapsed, but when you exit easy-sort mode the previously open items will be reopened. You can drag an item left/right/up/down to sort it within the items. The item that you clicked the icon for is shown with a black background. This makes it easier to find the item you want to move in easy-sort mode. You can click an item header to open the item. An "Exit easy-sort mode" button appears at the bottom of the inputfield. Configuration
      In the field settings for Repeater and Repeater Matrix fields you can define a minimum width in pixels for items in easy-sort mode. While in easy-sort mode the items will be sized to neatly fill the available width on any screen size but will never be narrower than the width you set here.
      In the field settings for Repeater Matrix you can define a custom header colour for each matrix type using an HTML "color" type input. The default colour for this type of input is black, so when black is selected in the input it means that no custom colour will be applied to the header.
      The easy-sort mode is only possible on Repeater/Matrix fields that do not use the "item depth" option.
  • Create New...