Jump to content


Mike Rockett

Recommended Posts

@owzim - It's a third-party parser that I chose as it has automatic delimiter detection. I read somewhere that str_getcsv is not RFC-compliant, but more importantly, it doesn't escape quotes correctly. That said, I might look into it and see what workarounds are worth the switch.

Regarding your issue, I'll need to look into it further - I don't know where those dates are even coming from, or why it's even trying to set dates at all (in the first instance); it could be something to do with the SQL defaults. What version of MySQL are you using?

Link to comment
Share on other sites

Interesting, when I use foo;bar, it translates uses that as the source and / as the destination, even though it has been set up to detect the delimiter. Anyways, I've never really liked that parser, so will switch to League\Csv shortly, especially since it will be used in v2. It could well fix the issue you have.

Link to comment
Share on other sites

Bumped to 1.5.48: Now using League\Csv for CSV importing. Note that delimeters are no longer automatically detected, and you need to specify your delimeter and enclosure characters separately. Blank lines are now also ignored.

@owzim - This might fix your issue as the importer now delegates the start and end times to the same method used for the main jumplink editor. If that works for you, then this will as well. If it doesn't fix the problem, then I'll need to investigate further. On my side, however, all looks good.

  • Like 2
Link to comment
Share on other sites

Hehe, 404 replies!


(Wonder why the topic tags are stretched out like that...)

Anyways, for those of you who have not seen this yet, here's an update on progress. When v2 is ready for a release of any kind, I'll create a new thread for it. v1 will continue to be supported for those who still use PW 2.7- (for everyone using 2.8+, there will be no reason to stay on v1). v2 will have it's own repo (or perhaps I'll have v1 have it's own branch, and v2 will be dev/master -- maybe that's better).

  • Like 1
Link to comment
Share on other sites

What's the best way to handle spaces in the original URL? (and whitespace in general)

I found that if the requested URL contains spaces, the plugin won't start at all, i.e. there's also no debug screen on matches or compiled jumplinks even when debug mode is turned on. It doesn't seem to make a difference if the links are requested with spaces intact or by directly typing in %20 instead. Also, the pattern itself doesn't make a difference. I tried:

  • GEORGIA{space:any}GARDNER{space:any}GRAY.html

Is there a preferred way of handling this or am I missing something obvious?

Thanks :)

Link to comment
Share on other sites

@d'Hinnisdaël - The htaccess ruleset doesn't allow spaces in URIs as ProcessWire doesn't use them. However, this can easily be modified. Open the htaccess file and go to rules 16a and 16b. The default installation uses 16a by default, and you should switch to 16b if you require UTF-8 URIs. At the beginning of each character class (inside the square brackets), add \s to allow spaces. So, if you are using 16a:

RewriteCond %{REQUEST_URI} "^/~?[\s-_.a-zA-Z0-9/]*$"

(This assumes you are using the latest versions of PW - that is, 2.8 or 3.0.)

You can then just use normal spaces in your jumplinks, and they will be detected just fine, provided the correct wildcard type is used.

  • Like 1
Link to comment
Share on other sites

  • 3 weeks later...
1 hour ago, quickjeff said:

Hi Mike, any progress in the export functionality, I installed the latest version of Jumplinks on a site that was already using your older version. however the jump links got all wiped out. I need to get the old ones back in. :-)

Hi Jeff - it's been a busy while for me, so dev is paused at this stage. Exporting will definitely be in v2, as well as a v1 to v2 migrator; no plans to add an exporter to v1. Hoping to get back into it soon, though I can already see the next few weeks being quite busy.

Link to comment
Share on other sites

  • 4 weeks later...

Hi @kater, you're most welcome.

A plain query string request to the root of the site won't get caught by Jumplinks. You would be better off using htaccess to convert these to request URIs and then having Jumplinks process them.

RewriteEngine on

# These should go directly after the above
RewriteCond %{QUERY_STRING} ^q=(.+)$ [NC]
RewriteRule ^$ /%1 [R,L]

(Haven't actually tested it, but it should redirect /?q=something/else to /something/else with a 302 status code.)

Then omit ?q= from the source.

  • Like 1
Link to comment
Share on other sites

1 hour ago, Mike Rockett said:



RewriteEngine on

# These should go directly after the above
RewriteCond %{QUERY_STRING} ^q=(.+)$ [NC]
RewriteRule ^$ /%1? [R,L]


Works perfectly (little adjustment "?" to avoid passing through of query).
I've seen this solution in your former post but hoped there is a more direct way :)

  • Like 1
Link to comment
Share on other sites

@kater - Yeah, I thought I'd said it before, just wasn't going to go find it. Thanks for pointing that out. I might find a way to resolve this with v2 (when I get back into its development). I could probably use an early hook (instead of the pageNotFound hook) for jumplinks that require it. Just a thought from the top of my head.

Link to comment
Share on other sites

  • 1 month later...

I have resolved my case with nginx maps, maybe someone finds this usefull.

Put all redirects to site-redirect.map

map $request_uri $redirect_uri {
    /index.php?id=1     /page/;
    /index.php?id=53    /another/page/;
    /index.php?id=62    /and/so/on/;

Nginx looks thru the list, and if it finds $request_uri match line in left column - it set $redirect_uri = value of right side of line ($redirect_uri var can be named as you want).

Then include site-redirect.map in http section of nginx config.
Now we must check for $redirect_uri in server section and if it is set - redirect to new URI, just like that:

include site-redirect.map;
server {
    # …
    if ( $redirect_uri ) {
        return 301 $redirect_uri;

If map is big enought you may need to set map_hash_bucket_size to bigger value (in http section).

Here is some more examples to play with:

map $request_uri $redirect_uri {
    # ...
    ~/post-(?<id>\d+)\.html            /post/$id/;
    ~*/catalog/(?<page>.+)\.html?$     /goods/$page/;


Link to comment
Share on other sites

Hi All,

I know I've been distant, but work has kept creeping up on me and I simply haven't been able to commit time to continue work on Jumplinks 2. At this stage, it's difficult to tell when I'll be able to continue, but I do hope it will be soon as I'd like to deprecate v1 as v2 is already so much better.

Again, truly sorry for the delays...

  • Like 7
Link to comment
Share on other sites

  • 1 month later...

Hi Mike, appreciate your work, even with tight time budget, thank you so much!

I'd like to leave a comment on your suggestion to focus module development on PW V3 for future releases.

As long as new PW versions are being released in the 2.8 branch, module support for this branch would be desireable, IMHO.

Thanks for considering!

Link to comment
Share on other sites

2 hours ago, HerTha said:

Hi Mike, appreciate your work, even with tight time budget, thank you so much!

I'd like to leave a comment on your suggestion to focus module development on PW V3 for future releases.

As long as new PW versions are being released in the 2.8 branch, module support for this branch would be desireable, IMHO.

Thanks for considering!

You're welcome. :) I can do that, considering that it is already implemented. It's a workaround that I'm not particularly fond of though (from a namespace point of view). I'll keep it in until an alpha release, at which point maybe someone has a better alternative that can be used instead - so we can take it from there.

Are you using the legacy branch?

Link to comment
Share on other sites

On 15.6.2017 at 1:54 PM, Mike Rockett said:

Are you using the legacy branch?

Thanks, Mike!

Not sure what's the overall statistics (all users/installs), but for me it's still 100% 2.8.x

(never touch a running system :-) )

  • Like 1
Link to comment
Share on other sites


I have installed this on one site with no issues, but running into a problems on another:

 Module reported error during install (ProcessJumplinks): SQLSTATE[HY000]: General error: 1293 Incorrect table definition; there can be only one TIMESTAMP column with CURRENT_TIMESTAMP in DEFAULT or ON UPDATE clause

 Failed to init module: ProcessJumplinks - SQLSTATE[42S02]: Base table or view not found: 1146 Table 'db-name.process_jumplinks' doesn't exist

I uninstalled and reinstalled and no joy.

I am on PW 3.0.64

I had redirects installed previously, but uninstalled first.

Any thoughts?

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 Robin S
      This module lets you add some custom menu items to the main admin menu, and you can set the dropdown links dynamically in a hook if needed.
      Sidenote: the module config uses some repeatable/sortable rows for the child link settings, similar to the ProFields Table interface. The data gets saved as JSON in a hidden textarea field. Might be interesting to other module developers?
      Custom Admin Menus
      Adds up to three custom menu items with optional dropdowns to the main admin menu.
      The menu items can link to admin pages, front-end pages, or pages on external websites.
      The links can be set to open in a new browser tab, and child links in the dropdown can be given an icon.
      Requires ProcessWire v3.0.178 or newer.
      Example of menu items

      Module config for the menus

      Link list shown when parent menu item is not given a URL

      Setting child menu items dynamically
      If needed you can set the child menu items dynamically using a hook.
      $wire->addHookAfter('CustomAdminMenus::getMenuChildren', function(HookEvent $event) { // The menu number is the first argument $menu_number = $event->arguments(0); if($menu_number === 1) { $colours = $event->wire()->pages->findRaw('template=colour', ['title', 'url', 'page_icon']); $children = []; foreach($colours as $colour) { // Each child item should be an array with the following keys $children[] = [ 'icon' => $colour['page_icon'], 'label' => $colour['title'], 'url' => $colour['url'], 'newtab' => false, ]; } $event->return = $children; } }); Create multiple levels of flyout menus
      It's also possible to create multiple levels of flyout submenus using a hook.

      For each level a submenu can be defined in a "children" item. Example:
      $wire->addHookAfter('CustomAdminMenus::getMenuChildren', function(HookEvent $event) { // The menu number is the first argument $menu_number = $event->arguments(0); if($menu_number === 1) { $children = [ [ 'icon' => 'adjust', 'label' => 'One', 'url' => '/one/', 'newtab' => false, ], [ 'icon' => 'anchor', 'label' => 'Two', 'url' => '/two/', 'newtab' => false, 'children' => [ [ 'icon' => 'child', 'label' => 'Red', 'url' => '/red/', 'newtab' => false, ], [ 'icon' => 'bullhorn', 'label' => 'Green', 'url' => '/green/', 'newtab' => false, 'children' => [ [ 'icon' => 'wifi', 'label' => 'Small', 'url' => '/small/', 'newtab' => true, ], [ 'icon' => 'codepen', 'label' => 'Medium', 'url' => '/medium/', 'newtab' => false, ], [ 'icon' => 'cogs', 'label' => 'Large', 'url' => '/large/', 'newtab' => false, ], ] ], [ 'icon' => 'futbol-o', 'label' => 'Blue', 'url' => '/blue/', 'newtab' => true, ], ] ], [ 'icon' => 'hand-o-left', 'label' => 'Three', 'url' => '/three/', 'newtab' => false, ], ]; $event->return = $children; } }); Showing/hiding menus according to user role
      You can determine which menu items can be seen by a role by checking the user's role in the hook.
      For example, if a user has or lacks a role you could include different child menu items in the hook return value. Or if you want to conditionally hide a custom menu altogether you can set the return value to false. Example:
      $wire->addHookAfter('CustomAdminMenus::getMenuChildren', function(HookEvent $event) { // The menu number is the first argument $menu_number = $event->arguments(0); $user = $event->wire()->user; // For custom menu number 1... if($menu_number === 1) { // ...if user does not have some particular role... if(!$user->hasRole('foo')) { // ...do not show the menu $event->return = false; } } });  
    • By tcnet
      This module for ProcessWire sends a notification email for each failed login attempt. Similar modules exists already in the module directory of ProcessWire. However, this module is designed to notify, even if specified user doesn't exist.
      The settings for this module are located in the menu Modules=>Configure=>LoginFailNotifier.
      Notification email
      Specifies the email address to which the notification emails should be sent.
        Email subject
      Specifies the subject line for the notification email.
        Post variables
      Specifies the $_POST variables to be included in the notification email. Each variable must be separated by a comma. For example: login_name,login_pass
        Server variables
      Specifies the $_SERVER variables to be included in the notification email. Each variable must be separated by a comma. For example: REMOTE_ADDR,HTTP_USER_AGENT
      Link to ProcessWire module directory:
      Link to github.com:
    • By Fokke
      ProcessWire 3.x markup module for rendering meta tags in HTML document head section. Note that this module is not a full-blown SEO solution, but rather a simple tool for rendering meta tags based on module configuration. Adding custom meta tags is also supported.
      Built-in meta tags
      The following meta tags are supported out-of-the-box:
      Document title consisting of page title and site name Character set Canonical Viewport Description Keywords Hreflang tags Open Graph og:title og:site_name og:type og:url og:description og:image og:image:width og:image:height Twitter meta tags twitter:card twitter:site twitter:creator twitter:title twitter:description twitter:image Facebook meta tags fb:app_id The full documentation with configurable options can be found here: https://github.com/Fokke-/MarkupMetadata
      ProcessWire>=3.0.0 PHP >=7.1 Installation using Composer
      composer require fokke/markup-metadata Manual installation
      Download latest version from https://github.com/Fokke-/MarkupMetadata/archive/master.zip Extract module files to site/modules/MarkupMetadata directory.
    • By m.sieber
      ITRK-Service for ProcessWire
      Module for the automated transfer of imprint, data protection declaration and terms and conditions from IT-Recht Kanzlei to your ProcessWire installation
      What is ITRK Service for ProcessWire?
      ITRK-Service for ProcessWire is a free module for ProcessWire CMS. It provides an interface to the update service of IT-Recht Kanzlei, via which the legal texts of your online presence are automatically updated. In this way, the texts remain legally secure and warning-proof in the long term. Imprint, data protection declaration, revocation and general terms and conditions are currently supported.
      You can find our documentation (in german language) here: https://www.pupit.de/itrk-service-for-processwire/dokumentation/

      Download: https://www.pupit.de/itrk-service-for-processwire/
      Github: https://github.com/pupit-de/pwItrkServiceConnector
    • By LuisM
      Symprowire is a PHP MVC Framework based and built on Symfony using ProcessWire 3.x as DBAL and Service-Provider
      It acts as a Drop-In Replacement Module to handle the Request/Response outside the ProcessWire Admin. Even tough Symfony or any other mature MVC Framework could be intimidating at first, Symprowire tries to abstract Configuration and Symfony Internals away as much as possible to give you a quick start and lift the heavy work for you.
      The main Goal is to give an easy path to follow an MVC Approach during development with ProcessWire and open up the available eco-system.
      You can find the GitHub Repo and more Information here: https://github.com/Luis85/symprowire
      The Symprowire Wiki https://github.com/Luis85/symprowire/wiki How to create a simple Blog with Symprowire https://github.com/Luis85/symprowire/wiki/Symprowire-Blog-Tutorial Last Update
      16.07.2021 // RC 1 v0.6.0 centralized ProcessWire access trough out the Application by wrapping to a Service https://github.com/Luis85/symprowire/releases/tag/v0.6.0-rc-1 Requirements
      PHP ^7.4 Fresh ProcessWire ^3.0.181 with a Blank Profile Composer 2 (v1 should work, not recommended) The usual Symfony Requirements Features
      Twig Dependency Injection Monolog for Symprowire Support for .env YAML Configuration Symfony Console and Console Commands Symfony Webprofiler Full ProcessWire access inside your Controller and Services Webpack Encore support Caveats
      Symfony is no small Framework and will come with a price in terms of Memory Usage and added Overhead. To give you a taste I installed Tracy Debugger alongside to compare ProcessWire profiling with the included Symfony Webprofiler

      So in a fresh install Symprowire would atleast add another 2MB of Memory usage and around 40ms in response time, should be less in production due to the added overhead of the Webprofiler in dev env
  • Create New...