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.

Share this post


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

Share this post


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

Share this post


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

Share this post


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

Share this post


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

Share this post


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

Share this post


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

Share this post


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

Share this post


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

Share this post


Link to post
Share on other sites

right - yes it must be a case sensing issue with MySQL. this one i'm running is 5.5.40-36.1-log

processRedirects does fail if i rename the table to all lowercase

Share this post


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

Share this post


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

Share this post


Link to post
Share on other sites

wow amazing.. will test asap.

Great!

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.

Share this post


Link to post
Share on other sites

ok thanks - sorry didn't see those instructions; will be back on this tonight and will report back...

  • Like 1

Share this post


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

store_item_detail.cfm?item_ID={id}

and this entered in the  destination:

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

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;

Share this post


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

Share this post


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

Share this post


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

Share this post


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

Share this post


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

Share this post


Link to post
Share on other sites

i think the selector redirect is working, wow that's so cool; and i'm seeing the debug log now.

  • Like 1

Share this post


Link to post
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");
$redirectsTableNameQuery->execute(array(
	'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

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 Robin S
      Another little admin helper module...
      Template Field Widths
      Adds a "Field widths" field to Edit Template that allows you to quickly set the widths of inputfields in the template.

      Why?
      When setting up a new template or trying out different field layouts I find it a bit slow and tedious to have to open each field individually in a modal just to set the width. This module speeds up the process.
      Installation
      Install the Template Field Widths module.
      Config options
      You can set the default presentation of the "Field widths" field to collapsed or open. You can choose Name or Label as the primary identifier shown for the field. The unchosen alternative will become the title attribute shown on hover. You can choose to show the original field width next to the template context field width.  
      https://github.com/Toutouwai/TemplateFieldWidths
      https://modules.processwire.com/modules/template-field-widths/
    • By horst
      Croppable Image 3
      for PW 3.0.20+
      Module Version 1.1.16
      Sponsored by http://dreikon.de/, many thanks Timo & Niko!
      You can get it in the modules directory!
      Please refer to the readme on github for instructions.
       
      -------------------------------------------------------------------------
       
      Updating from prior versions:
       
      Updating from Croppable Image 3 with versions prior to 1.1.7, please do this as a one time step:
      In the PW Admin, go to side -> modules -> new, use "install via ClassName" and use CroppableImage3 for the Module Class Name. This will update your existing CroppableImage3 module sub directory, even if it is called a new install. After that, the module will be recogniced by the PW updater module, what makes it a lot easier on further updates.
      -------------------------------------------------------------------------
       
      For updating from the legacy Thumbnail / CropImage to CroppableImage3 read on here.
       
      -------------------------------------------------------------------------
       
    • By MoritzLost
      UPDATE: I have published a stable version of this module!
      Discussion thread:
      Github: https://github.com/MoritzLost/TextformatterPageTitleLinks
      ---
      Hello there,
      I'm working on a tiny textformatter module that searches the text for titles of other pages on your site and creates hyperlinks to them. I'm not sure if something like this exists already, but I haven't found anything in the module directory, so I wrote my own solution 🙂
      It's not properly tested yet and is still missing some functionality I would like to implement, so at the moment it should be considered in BETA. Features include limiting the pages that will get searched by template, and adding a custom CSS class to the generated hyperlinks. As I'm writing this I noticed that it will probably include unpublished and hidden pages at the moment, so yeah ... it's still in development alright 😅
      You can download the module from Github:
      https://github.com/MoritzLost/TextformatterPageTitleLinks
      There's some more information in the readme as well.
      Anyway, let me know what you think! I'm happy about any feedback, possible improvements or ideas on how to improve the module. Cheers.
    • By blad
      Hi guys!
      I just uploaded a module to explore files based on elFinder. By default it will show the "Files" folder.
      Screenshots:

      Video:
       
      To do:
       More options To fix:
       The function of rotating or scaling an image fails  Image editors V 1.01 (view issue)
      Fixed the bug working with the Multi-Language support ( translation of folders ). Fixed the name of elfinder.en  Github:
      https://github.com/LuisSantiago/ProcessElFinder/
      I hope you like it.
    • By BitPoet
      I'm really in love with FormBuilder, but the one thing missing to match all my end users' expectations were repeatable field groups. Think repeaters, in ProcessWire terms. Our primary application of PW is our corporate intranet, so "lines" of fields are quite common in the forms I build. We have all kinds of request forms where the information for a varying number of colleagues needs to be entered (from meal order to flight booking request) and where it is simply impractical to send a form for each, and I don't want to clutter my forms with multiple instances of fields that may only get used ten percent of the time.
      That's why I started to build FormBuilderMultiplier (link to GitHub).
      What it does:
      Adds an option to make a regular Fieldgroup repeatable Lets you limit the number of instances of a Fieldgroup on the form Adds an "Add row" button the form that adds another instance of the Fieldgroup's fields Adds a counter suffix at the end of every affected field's label Stores the entered values just like regular fields Makes the entered values available in preview and email notifications Supports most text based fields, textareas and selects (really, I haven't had enough time to test all the available choices yet) What it doesn't do (yet):
      Support saving to ProcessWire pages (i.e. real Repeaters) I haven't tested all the validation stuff, Date/Time inputs etc. yet, but since I'm utterly swamped with other stuff at work, I didn't want to wait until I have it polished. Any feedback is welcome. There might also be some issues with different output frameworks that I haven't encountered yet. The forms I work with mostly use UIKit.
      Status:
      Still alpha, so test well before using it in the field.
      Known issues:
      When rows are added, the form's iframe needs to be resized, which isn't completely clean yet.
      How it works:
      The Fieldgroup settings are added through regular hooks, as is the logic that adds the necessary field copies for processing the form and displaying previews.
      "Multiplied" field instances are suffixed with _NUM, where NUM is an incremental integer starting from 1. So if you have add two fields named "surname" and "givenname" to a fieldgroup and check the "multiply" checkbox, the form will initially have "surname_1" and "givenname_1" field (I'm still considering changing that to make the risk to shoot oneself into the foot by having a regular "surname_1" field somewhere else in the form less likely).
      When a "row" is added, the first row is cloned through JS and the counter in the fields' IDs, names and "for" attributes as well as the counter in the label are incremented before appending the copies to the Fieldset container in the form.
      To keep backend and frontend in sync, a hidden field named [name of the fieldset]__multiplier_rows is added to the form. Both the backend and the frontend script use this to store and retrieve the number of "rows".
      ToDo:
      Naturally, add the option to store the data in real repeaters when saving to pages. Do a lot of testing (and likely fixing). Make a few things (like the "Add row" button label etc.) configurable in field(set) context. Add a smooth API to retrieve the multiplied values as WireArrays. The mandatory moving screenshot: