Jump to content


Mike Rockett

Recommended Posts

Tonight I restored the database to get JumpLinks back and tried a bit further.

To get some traffic on the site, I used a dead link checker with some threats (not to many) to challenge it. Then the trouble started.

The problem I got indicated an unnormal behavior like a loop. Too many requests.

I found out that it is not the links.

I had an entry in the module's Legacy Domain field. Example: http://domain.de/drupal/.

There might have been a loop, maybe simply because the new site is https://domain.de only.

Or there is some other problem with that field (or a misunderstanding from my side, what it does).

Removing that entry (I forgot about that entry this morning - since the field is always collapsed) cured the issue, I think.

Site and server are up to speed, regardless of running the link-checker again.

Link to comment
Share on other sites

Essentially, that field is checked every time a a 404 is hit and you haven't defined a jumplink for it - it checks to see if https://domain.de/foo exists at http://domain.de/drupal/foo. As such, one should only specify a Legacy Domain when they're performing a slow migration to ProcessWire. That way, visitors and users can still access content if it hasn't been moved yet. Then, when everything has moved, you can strip away the Legacy Domain.

I collapsed the field by default as it isn't often used, and don't want it to get in the way. If I try to make it so the group expands if one of its fields contains data, it will always expand as status code field contains data by default. That said, I'll probably land up keeping it expanded anyway.

With all of that to one side, I'd still like to know how those particular errors came about... I assuming some kind of infinite loop took place, but don't know exactly what that entails. Perhaps someone with extensive knowledge of how PageFinder works could enlighten me?

Link to comment
Share on other sites

i have a site which was using redirects and am migrating those into Jumplinks.

when i try to import, i get errors and can't import..

Table 'walsh_prowire26.processredirects' doesn't exist SELECT * FROM processredirects ORDER BY redirect_from#0 [internal function]: Database->query('SELECT * FROM p...')

this is an older site but it does show i'm running the latest process redirects module

Link to comment
Share on other sites

i have a site which was using redirects and am migrating those into Jumplinks.

when i try to import, i get errors and can't import..

Table 'walsh_prowire26.processredirects' doesn't exist SELECT * FROM processredirects ORDER BY redirect_from#0 [internal function]: Database->query('SELECT * FROM p...')

this is an older site but it does show i'm running the latest process redirects module

Hmm, weird. Have you confirmed that the table actually exists using phpMyAdmin or similar?

Link to comment
Share on other sites

for some reason the table in my install is upper camel case, so the table is called ProcessRedirects.. i wonder if i should try changing it

on another note - is there any functionality to find a page based on a field - for example, i have the legacy IDs stored with the pages themselves, and i was using get vars on a template to redirect to the page; wondering if JL can handle this.

so instead of a mapping collection you would have a selector?

template=product-legacy, legacy_item_id={id}

one last thing - the start and end both say 2015 years ago

Link to comment
Share on other sites

That's more than likely it - changing it shouldn't be a problem, especially if you're migrating.

I quite like that idea, albeit being a little out of the ordinary (who likes ordinary anyway?). I'd probably have to set it up so that get: prefaces the selector. That way, we can tell if you're using one. So, in your case, it would be get: template=product-legacy, legacy_item_id={id}.

Lemme give that a bash quickly.

Link to comment
Share on other sites

ok - i renamed it then ran the import; that seemed to have worked, but then when i renamed it back to ProcessRedirects, Jumplinks doesn't show those anymore

ok i didn't actually click the final import button; so i went into the jumplinks module, renamed the tables to ProcessRedirects, and then ran the import but it only took the first redirect; now it won't let me do it over

Link to comment
Share on other sites

That's even weirder - they're completely independent of each other... Are you saying that the jumplinks don't show after the import?

Oh, that's a nice whoops right there. Happened to me too at some point during testing. To solve it:

  1. Make sure that the table is named processredirects.
  2. Go into the modules table and check for "redirectsImported":true in the data column for the ProcessJumplinks row.
  3. Change it to false.

Then you should be able to do the import again.

I'll be changing this behaviour soon to help this along automatically. There'll probably be a new button (or link) to say "No, wait! It didn't work."

Link to comment
Share on other sites

yeah - sorry - to clarify and answer the above post, i failed to click the last import button, so no problem there;

on my 2nd try i renamed the database in the Jumplinks Module wherever it said processredirects i renamed to ProcessRedirects; then i ran the import but it only imported the first one;

i can't see how JL queries would have worked because looking at the Redirect module, (unless for some reason i have a legacy version that isn't showing it needs to be updated), it uses $this->className for the queries

Link to comment
Share on other sites

I used the raw table name (processredirects) as that what was in my database when I wrote the module. In fact, I've just installed a fresh copy of it, and the table is called "processredirects". Perhaps this could be different versions of MySQL changing the case at runtime?

Link to comment
Share on other sites

Fascinating - I never thought such an issue would come up. (Not a brightspark when it comes to things like that. And case-sensitive stuff never impacts me as I use Windows. In fact, that could even be the issue - though, I doubt it because only Unix filesystems are sensitive; I wouldn't think that would expand to MySQL.)

Anyways, I've just attempted the selector idea, currently on the dev branch. Basically, you can to define your destination path like so:

[[template=product-legacy, legacy_item_id={id}]]

So that means that anything in double-square-brackets is to be treated as a selector.

I've used the following to check - hopefully it is enough...

$convertedWildcards = preg_replace_callback("~\[\[([\w-_\/\s=\",.']+)\]\]~i", function ($mapCaptures) {
	$page = $this->pages->get($mapCaptures[1]);
	if ($page->id) {
		return ltrim($page->url, '/');
}, $convertedWildcards);

My test yielded the following log:

Page not found; scanning for jumplinks...
- Checked at: Thu, 16 Apr 2015 17:30:56 +0200
- Requested URL: http://processwire.dev.local/legacy?id=43
- PW Version: 2.5.26

== START ==

[Checking jumplink #177]
- Original Source Path:         legacy?id={id}
- Escaped Source Path:          legacy\?id={id}
- After Smart Wildcards:        legacy\?id={id:num}
- Compiled Source Path:         legacy\?id=(\d+)
- Original Destination Path:    [[template=basic-page,legacy_item_id={id}]]
- Compiled Destination Path:    http://processwire.dev.local/testing-this-page/

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

- From URL:   http://processwire.dev.local/legacy?id=43
- To URL:     http://processwire.dev.local/testing-this-page/

Which means it works. Nonetheless, please give it a test-run and let me know if you run into any issues, or if anything needs to be enhanced.

Once we're all happy, I'll pull to master and update the docs.

  • Like 2
Link to comment
Share on other sites

wow amazing.. will test asap.


how can i reset things and try the import again - still the issue that my PR import failed...

You could either do as I suggested before and set the redirectsImported setting to false or, if that fails, re-install the module and repeat.

Edit: It seems that MySQL table names are case-sensitive on most Unix-varieties. That said, I don't understand why the table is being created as processredirects and not ProcessRedirects on my system, when it is clearly instructed to use the latter...

Can anyone point me in the right direction with this? I don't think it would be wise to change it unless there's a better way.

Link to comment
Share on other sites

it will only import 1 link at a time from the redirects module;

i was able to get 2 of them imported by importing then going to the database, changing the setting to false, importing the next one, etc.. but there must be some problem;

also, i can't get the selector to work; i have this entered in the source:


and this entered in the  destination:


but no luck in terms of it forwarding to the page, just getting 404 and no log with debug on, and the forward doesn't work with debug off;

Link to comment
Share on other sites

@All: I have just submitted a fix to the dev branch relating to this issue. It will be merged in soon with the other commits.

@Macrura: Something must have broken with the import feature -- I will look into that this evening. Regarding the selector, there must be something shown in the debug log - it can never be empty. The following should happen: if a selector is found, it will check to see if a page by that selector exists. If one doesn't it will skip the jumplink. If debug mode is turned on in the module's config, then it will tell you that it found a selector, but it doesn't map to a page. Please could you double-check the log, and paste its content here?

Update: Confirmed, I can reproduce the import problem. Will fix that shortly.

Fixed: Okay, I've fixed the import issue (dev branch). Was an oversight when moving to prepared statements. So that's working now. :-)

Link to comment
Share on other sites

hi mike - where should i look for the log, checked the module, and site/assets, but not seeing any logs;

also getting this...

Mysqli was instantiated and queries were made. These should ideally be converted to PDO ($database). Here are the queries:

0 SELECT * FROM process_jumplinks ORDER BY source [4 rows] [0.0321s, 0.0321s, 0.0365979671478s] 1 SELECT * FROM process_jumplinks_mc ORDER BY collection_name [0 rows] [0.0181s, 0.0502s, 0.136598110199s]
Link to comment
Share on other sites

When you turn on debug mode and request the URI in your browser, the log will appear there instead of redirecting.

Interesting - I haven't seen that before. I'll have a look at it now now.

Edit: Ah, I see. I'm using the db object. Changing it will mean a little bit of refactoring and more testing, so I'll have a look at that tomorrow - have had quite a long day.

Link to comment
Share on other sites

also, i'm still needing to rename the tables in the module to ProcessRedirects, since i'm on unix..

But now it worked, so all of my original redirects are now imported- thanks!

will carry on testing the selector redirect now..

Link to comment
Share on other sites

also, i'm still needing to rename the tables in the module to ProcessRedirects, since i'm on unix

I find it interesting that it is specifically making the table name lower case on my side. I'm going to need to look at this properly as well. I think I'll land up just doing a test at runtime to see which one it is...

Link to comment
Share on other sites

Okay, I hope I've fixed this (dev branch). Unfortunately not able to test as my tables are always lower case. An initial import run still works on my side. If you don't mind, please could you test it on yours?
For reference, I've used the following to ensure the correct case is being used. If anyone thinks this can be optimised, please let me know. Thanks.

// Get the correct table name for ProcessRedirects
$redirectsTableNameQuery = $this->database->prepare("SELECT TABLE_NAME FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_SCHEMA = :db_name AND TABLE_NAME LIKE :table_name");
	'db_name' => $this->config->dbName,
	'table_name' => $this->redirectsTableName, // defaults to ProcessRedirects; which we use to check
$redirectsTableNameResult = $redirectsTableNameQuery->fetch(PDO::FETCH_OBJ)->TABLE_NAME;
if ($this->redirectsTableName == $redirectsTableNameResult || strtolower($this->redirectsTableName) == $redirectsTableNameResult) {
	$this->redirectsTableName = $redirectsTableNameResult;

Edit: My bad, didn't actually change the select statements. Shall commit that shortly, along with some other enhancements.

  • 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 Marco Ro
      Hi guys!
      I'm a bit anxious because this is the first module I present! (beta modulo) But I will finally be able to share something with the community too! :)
      This is a BETA version of the PayPal payment system called: PayPal Commerce Platform.
      It is an advanced system (Business Pro account is needed) that brings various benefits in terms of fees and above all integrates direct payment with credit/debit cards. 
      The module integrates with Padloper 0.0.2, which is the current installation I'm using.
      This system integrates the classic PayPal buy button, the alternative or local payment method and the new payment system: credit/debit cards that doesn't go through the PayPal account. It is a Stripe-style payment, it connects directly with the bank and integrates 3D security validation.
      I say that it is a BETA because this module currently only works with Sandbox account, to put it live you need to change API url manually (manually for the moment).
      Because this module is not ready for live:
      I would like to have your opinion on how I built the module (is the first one I do). I don't want to share something that is not fish but I need a comparison with someone more experienced than me, for be sure that this is the best way to code the module.
      If you want to try this I created a git, you will find all the instructions for installation and correct operation. (Git has a MIT licensed)
      https://github.com/MarcooRo/processwire-PayPal-Commerce-Platform I hope I did something that you guys can like :)
    • By monollonom
      (once again I was surprised to see a work of mine pop up in the newsletter, this time without even listing the module on PW modules website 😅. Thx @teppo !)
      Github: https://github.com/romaincazier/FieldtypeQRCode
      Modules directory: https://processwire.com/modules/fieldtype-qrcode/
      A simple fieldtype generating a QR Code from the public URL of the page, and more.
      Using the PHP library QR Code Generator by Kazuhiko Arase.

      In the field’s Details tab you can change between .gif or .svg formats. If you select .svg you will have the option to directly output the markup instead of a base64 image. SVG is the default.
      You can also change what is used to generate the QR code and even have several sources. The accepted sources (separated by a comma) are: httpUrl, editUrl, or the name of any text/URL/file/image field.
      If LanguageSupport is installed the compatible sources (httpUrl, text field, ...) will return as many QR codes as there are languages. Note however that when outputting on the front-end, only the languages visible to the user will be generated.
      Unformatted value
      When using $page->getUnformatted("qrcode_field") it returns an array with the following structure:
      [ [ "label" => string, // label used in the admin "qr" => string, // the qrcode image "source" => string, // the source, as defined in the configuration "text" => string // and the text used to generate the qrcode ], ... ] Formatted value
      The formatted value is an <img>/<svg> (or several right next to each other). There is no other markup.
      Should you need the same markup as in the admin you could use:
      $field = $fields->get("qrcode_field"); $field->type->markupValue($page, $field, $page->getUnformatted("qrcode_field")); But it’s a bit cumbersome, plus you need to import the FieldtypeQRCode's css/js. Best is to make your own markup using the unformatted value.
      Static QR code generator
      You can call FieldtypeQRCode::generateQRCode to generate any QR code you want. Its arguments are:
      string $text bool $svg Generate the QR code as svg instead of gif ? (default=true) bool $markup If svg, output its markup instead of a base64 ? (default=false) Hooks
      Please have a look at the source code for more details about the hookable functions.
      $wire->addHookAfter("FieldtypeQRCode::getQRText", function($event) { $page = $event->arguments("page"); $event->return = $page->title; // or could be: $event->return = "Your custom text"; }) $wire->addHookAfter("FieldtypeQRCode::generateQRCodes", function($event) { $qrcodes = $event->return; // keep everything except the QR codes generated from editUrl foreach($qrcodes as $key => &$qrcode) { if($qrcode["source"] === "editUrl") { unset($qrcodes[$key]); } } unset($qrcode); $event->return = $qrcodes; })
    • By Sebi
      AppApiFile adds the /file endpoint to the AppApi routes definition. Makes it possible to query files via the api. 
      This module relies on the base module AppApi, which must be installed before AppApiFile can do its work.
      You can access all files that are uploaded at any ProcessWire page. Call api/file/route/in/pagetree?file=test.jpg to access a page via its route in the page tree. Alternatively you can call api/file/4242?file=test.jpg (e.g.,) to access a page by its id. The module will make sure that the page is accessible by the active user.
      The GET-param "file" defines the basename of the file which you want to get.
      The following GET-params (optional) can be used to manipulate an image:
      width height maxwidth maxheight cropX cropY Use GET-Param format=base64 to receive the file in base64 format.
    • 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
  • Create New...