Jump to content

Jumplinks


Mike Rockett

Recommended Posts

34 minutes ago, Jason Huck said:

An option to automatically pass along (but otherwise not match on) query strings would be ideal...

Yeah, it can be quite a tough subject - but a checkbox should cover it well-enough. That said, do we trim out any included query string so it does not get matched if the checkbox is selected?

34 minutes ago, Jason Huck said:

A configuration option to automatically assume trailing slashes are optional would also be very handy, for the same reason. That way admins wouldn't have to remember to append ? to the end of every source URL.

This is a good idea, but I can imagine some would want a little control over it. Perhaps a global strict mode for trailing slashes (off by default, allowing both to match)?

34 minutes ago, Jason Huck said:

Another issue is that source URLs are URL encoded when stored

Jumplinks 2 no longer encodes the URI/Ls, and it is like this by default as Eloquent is used for DB interactions. However, JL1 should be decoding properly - I'll look into this. (Update, see next post)

Edited by Mike Rockett
Link to comment
Share on other sites

31 minutes ago, Jason Huck said:

path/to/this,that&theother/

This wouldn't get matched anyway - PW only allows certain characters in page names (via htaccess), and so this wouldn't be picked up. That said, JL2 has support for unicode, provided that rule 16b is turned on in htaccess. However, commas are still not supported, nor are ampersands. This rule does not apply to query strings, however.

Link to comment
Share on other sites

17 hours ago, Mike Rockett said:

Yeah, it can be quite a tough subject - but a checkbox should cover it well-enough. That said, do we trim out any included query string so it does not get matched if the checkbox is selected?

Perhaps two options when creating a new rule:

[x] Source URL may include a query string.
    [x] Append query string to target URL.

You would only use these options if you did not need to match on the contents of the query string or use it to determine the correct target URL.

 

18 hours ago, Mike Rockett said:

This is a good idea, but I can imagine some would want a little control over it. Perhaps a global strict mode for trailing slashes (off by default, allowing both to match)?

Perhaps global options like so:

[x] Trailing slash is optional for source URLs which do not end with the following extensions:
    [.html, .htm, .php, .aspx, .cfml, .pdf ...]

I suppose you could include the ability to override at the rule level, but would it even be necessary?

 

Link to comment
Share on other sites

7 minutes ago, Mike Rockett said:

Regarding the first one, perhaps those options should become unavailable the second the question mark is entered?

How would you distinguish between a literal question mark and its current use to make the previous character optional? Would it have to be escaped, or is that syntax changing in v2?

 

9 minutes ago, Mike Rockett said:

I did think about that second one, but didn't think about filtering extensions. Perhaps a simple check for \.([a-z0-9-]{3,5})...?

I configurable list of allowed extensions would ultimately be safer and more flexible. People create all sorts of crazy URLs, and we don't know what someone might need to allow/disallow.

 

Link to comment
Share on other sites

Just now, Jason Huck said:

How would you distinguish between a literal question mark and its current use to make the previous character optional? Would it have to be escaped, or is that syntax changing in v2?

Because FastRoute is being used, only [/] will work in Jumplinks 2 - however, the migrator will automatically convert any saved in the old format to the new format. In fact, JL1 was only using the new format before, but then support for /? was added later on.

2 minutes ago, Jason Huck said:

I configurable list of allowed extensions would ultimately be safer and more flexible. People create all sorts of crazy URLs, and we don't know what someone might need to allow/disallow.

Also true... Perhaps I should then default it to the ext parameter type then?

Link to comment
Share on other sites

26 minutes ago, Jason Huck said:

Makes sense to use the same list for both purposes, as long as it's configurable. For instance, in a current project we have to handle requests for .pdf files that are now served via a PW-powered download page.

Yeah, we should just default to whatever ext uses. :)

Link to comment
Share on other sites

Hi @Mike Rockett and thanks you again for your effort for solving my previous problem, but here goes new one.

Old site urls:

products/poulty.html
en/products/poulty.html

New site urls:

products/poulty/
en/products/poulty/

On new site just "products" is real page, poulty is url segment and I redirect usr segments without ending slash to url with ending slash. That is way I use ending slash in wildcards. 

Wildcard

Source: products/{name}.html/
Destination: products/{name}/

In this way it works as expected, but it doesn't cover multilaguage urls, so I try to use additional wildcard

Sorce: {lg}/products/{name}.html/
Destination: {lg}/products/{name}

I get in debug

404 Page Not Found
Checked Mon, 17 Oct 2016 15:16:23 +0300
Request: http://site.dev/en/en/products/sheep.html/
ProcessWire Version: 3.0.37

Scanning for jumplinks...

[Checking jumplink #1]
- Original Source Path:       about-us.html
- Compiled Source Path:       about-us.html

No match there...

[Checking jumplink #3]
- Original Source Path:       products/{name}.html/
- After Smart Wildcards:      products/{name:segment}.html/
- Compiled Source Path:       products/([\w_-]+).html/

No match there...

[Checking jumplink #4]
- Original Source Path:       {lg}/products/{name}.html/
- After Smart Wildcards:      {lg}/products/{name:segment}.html/
- Compiled Source Path:       {lg}/products/([\w_-]+).html/

No match there...

No matches, sorry. We'll let your 404 error page take over when Debug Mode is turned off.

As you can see in request url I have this (double "en" slug) 

Request: http://site.dev/en/en/products/sheep.html/

insted of url in address bar 

http://site.dev/en/products/sheep.html/

I don't have a clue why urs changes in request url. 

What do you think about that? Maybe I do something wrong in wildcard?  

Link to comment
Share on other sites

@Zeka - Jumplinks currently doesn't have support for multi-language sites. This will change with Jumplinks 2, where multilanguage will be implemented and quite helpful for most scenarios.

I'm not 100% sure what's happening in your case, but is it safe of me to say that Enlglish is not the default language on your site? I ask because Jumplinks uses the following piece of code to determine the site root (to prepend to the request URI) and the site root is being detected in a language that is not the default, which adds an extra en/ as that is the English site root.

$siteRoot = rtrim($this->pages->get(1)->httpUrl, '/');

So, in your case, $siteroot is en/ and the request URI is en/products/sheep.html/, which will cause the double en/. If this is the case, then I will need to change the way the module picks up on the site root.

Link to comment
Share on other sites

1 hour ago, Zeka said:

So if I have understood you correctly, the best workarout in my case is to use separete wildcards for non default languages? 

Unfortunately not - as you have experienced already, this will cause the language segment to duplicate because the way I see it, the site root URI for the English language is en/ and not /. So even if you have separate jumplinks to match your default language and other languages, you will have the duplication issue.

I will need to push a fix for this as soon as I can. But first, I need to replicate your issue on my end.

Link to comment
Share on other sites

@Zeka - As I've been focused on Jumplinks 2, I completely missed that you are declaring your wildcards incorrectly. {lg} is not a valid wildcard in Jumplinks 1, and so it is treated as a string literal. You need to add :segment to that in the source only, and it should work. So your new source would become:

{lg:segment}/products/{name}.html/

In Jumplinks 2, {lg} will be a valid wildcard, and will default to the [^/]+ regular expression.

Please try the above and let me know if it works. Thanks.

 

For reference, this is the result on my side:

404 Page Not Found
Checked Mon, 17 Oct 2016 18:06:32 +0200
Request: http://playground.local/fi/product/chair.html/
ProcessWire Version: 3.0.36

Scanning for jumplinks...

[Checking jumplink #2]
- Original Source Path:       products/{name}.html/
- After Smart Wildcards:      products/{name:segment}.html/
- Compiled Source Path:       products/([\w_-]+).html/

No match there...

[Checking jumplink #1]
- Original Source Path:       {lang:segment}/product/{name}.html/
- After Smart Wildcards:      {lang:segment}/product/{name:segment}.html/
- Compiled Source Path:       ([\w_-]+)/product/([\w_-]+).html/
- - Wildcard Check:           1> lang = fi -> fi
- - Wildcard Check:           2> name = chair -> chair
- Original Destination Path:  {lang}/products/{name}/
- Compiled Destination Path:  /fi/products/chair/

Match found! We'll do the following redirect (301, permanent) when Debug Mode has been turned off:

- From URL:                   http://playground.local/fi/product/chair.html/
- To URL:                     /fi/products/chair/

 

Link to comment
Share on other sites

Hi!

I have a jumplink with wildcard:

source: index.php?id={id}
destination: {id|oldsiteid}

I don't know when (after PW3 update, or Jumplinks module update), but this jumplink stopped working,
site.com/index.id=123 just redirects to site.com now.

Any ideas why it's happens?

Link to comment
Share on other sites

2 hours ago, k07n said:

Hi!

I have a jumplink with wildcard:


source: index.php?id={id}
destination: {id|oldsiteid}

I don't know when (after PW3 update, or Jumplinks module update), but this jumplink stopped working,
site.com/index.id=123 just redirects to site.com now.

Any ideas why it's happens?

These kinds of redirects become somewhat tricky as requesting index.php is the same as requesting the root of the site. I have worked around this, but it would still be better to do this via an htaccess redirect. Unfortunately, it would be mean two redirects as you are using a mapping collection.

Just after line 129 of your htaccess file (part 13, regarding "www"), add the following:

RewriteCond %{REQUEST_URI} ^\/index\.php [NC]
RewriteCond %{QUERY_STRING} ^id=(\d+) [NC]
RewriteRule ^ /index_php/%1? [R,L]

This will redirect, for example, /index.php?id=321 to /index_php/321.

Now, change your jumplink source to /index_php/{id}.

 

Link to comment
Share on other sites

3 hours ago, Mike Rockett said:

These kinds of redirects become somewhat tricky as requesting index.php is the same as requesting the root of the site. I have worked around this, but it would still be better to do this via an htaccess redirect. Unfortunately, it would be mean two redirects as you are using a mapping collection.

Just after line 129 of your htaccess file (part 13, regarding "www"), add the following:


RewriteCond %{REQUEST_URI} ^\/index\.php [NC]
RewriteCond %{QUERY_STRING} ^id=(\d+) [NC]
RewriteRule ^ /index_php/%1? [R,L]

This will redirect, for example, /index.php?id=321 to /index_php/321.

Now, change your jumplink source to /index_php/{id}.

 

Thanks. I use nginx, but I get the idea.

  • Like 1
Link to comment
Share on other sites

  • 3 weeks later...

Hi @Mike Rockett

If I have 2 non ProcessWire files on my site and want to redirect A to B, will PW handle that for me?

I'm guessing not and that I need to manually edit their html or the .htaccess file?

Just assumed that they would be redirected as even though they're not PW pages, they're served up within a PW site.

Link to comment
Share on other sites

I tried to use "|" in the selector but didn't worked:

[[template=tutor|event,name={pagename}]]

Result:

domain.com/[[template=tutor%7Cevent,name=...]]

Using only "tutor" or "event" works fine though. Is this a bug or is this not supported? (v1.5)

Plus a question to v2: will it have a feature to add a name to each jumplink? That would make it easier to see what the jumplink does, e.g "Redirect old events to page Events". They would be even searchable using the browser search feature or with filterbox feature of AdminOnSteroids.

Link to comment
Share on other sites

3 hours ago, tpr said:

I tried to use "|" in the selector but didn't worked

Sorry about that - more than likely an oversight on my end. Will review and see what can be done.

3 hours ago, tpr said:

will it have a feature to add a name to each jumplink?

When I began working on this module, naming support was present. In the first alphas, however, it was indicated that this was not the greatest idea, and so the feature was removed.

Jumplinks 2 uses Datatables with a filterbox. Most of the time, you would find that a name contains a keyword from either the source or the destination, and so you could enter that specific keyword into the filter box. Per your example, that title would have the keyword event in it - searching for that would yield pretty much the same result. As such, I don't plan on adding name support, especially considering the bulk it adds to the user interface.

  • Like 1
Link to comment
Share on other sites

9 minutes ago, tpr said:

Thanks, works like charm!

As for the names I trust your experience :) Anyway, such names (descriptions?) wouldn't do so much harm to the UI.

jumplinks-title.png

Interestingly, that does look quite nice. I've emulated that with one row on the new design, and it would definitely need a little tweaking. My issue, though, is that the UI would like quite inconsistent, as you can tell, when some links have descriptions and others do not.

scrn_jumplinks.rockettpw.local-2016-12-12-15-10-45.png

(Note: The Type column has not been finalised yet - there will be SVG icons there, as per previous screenshots.)

I know this is maybe not the perfect idea, but what about a tooltip? That way, it doesn't reduce the density of the table, and you can still easily see the description of a link if it is not easily understood.

  • Like 1
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.
      Screenshots
      Example of menu items

      Module config for the menus

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

      Advanced
      Setting child menu items dynamically
      If needed you can set the child menu items dynamically using a hook.
      Example:
      $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; } } });  
      https://github.com/Toutouwai/CustomAdminMenus
      https://processwire.com/modules/custom-admin-menus/
    • 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.
      Settings
      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:
      https://processwire.com/modules/login-fail-notifier/
      Link to github.com:
      https://github.com/techcnet/LoginFailNotifier
    • 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
       
      Requirements:
      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
      Documentation
      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...