Recommended Posts

New commits to the dev branch synced. Fixed the select statements, as mentioned above (still working here). Also, if the import from ProcessRedirects gets botched somehow, you can now try again. It doesn't keep track of the state of ProcessRedirects, so if you uninstall and reinstall it, the importer will still offer you the opportunity. However, that isn't an issue in my eyes as such a process-flow is not practical.

Hoping to merge into master as soon as possible. I'll give it another day (or just less, keeping in mind the severity of the issues encountered with the current 1.1.3) for more feedback until I merge.

  • Like 1

Share this post


Link to post
Share on other sites

Before I merge, I'd actually like to discuss the behaviour of the new selectors feature.

In its current state, you specify a selector in your destination path using square brackets ([[your-selector-goes-here]]). However, you can also use multiple selectors, and prepend and append to them, which I don't think it actually the right way to do it. Prepending a string to a selector will cause a redirect to a non-existent page. As such, I propose the following:

Instead of using double-square brackets to return the URL of the new destination page (using $page->url), I think it should return the name. This is handy when you want to redirect /blog/2015/<oldname> to /journal/<newname>/, for example.

Then, to return a full URL, we should use use find: as a prefix to the selector - find: template=basic-page, legacy_name={name}, for example.

post-2289-0-13332000-1429352189_thumb.pn

What do you think?

  • Like 1

Share this post


Link to post
Share on other sites

Version Bump to 1.2.0 - Important Upgrade

  1. Destination Selectors
  2. Fix ProcessRedirects Importer
    (You can now also try the import again, if the previous import gets botched somehow)
  3. Various other enhancements and important fixes
  4. No schema changes
  • Like 2

Share this post


Link to post
Share on other sites

@Mike - this is really great, especially the new features;

and a lot of care went into the documentation, and is much appreciated.. i hope others will find this useful!

will be upgrading that site i was testing on and report back any issues.

  • Like 1

Share this post


Link to post
Share on other sites

@Macrura

Thanks - I'm glad you're liking it. Yeah, documentation is pretty important to me, and so I make sure I do it to the best of my ability. Originally, I wanted to host the documentation myself, but thought the GH wiki system would be perfect enough for the task.

Regarding the selectors, I'm going to leave the implementation as-is for now (as mentioned in the docs).

  • Like 2

Share this post


Link to post
Share on other sites

Small update committed to dev branch: Debug Mode now shows conversion notes for each wildcard, as in the example below. This gives a little more insight, which I think is quite useful.

Page not found; scanning for jumplinks...
- Checked at: Fri, 24 Apr 2015 12:18:16 +0200
- Requested URL: http://processwire.dev.local/Articles/2015/4/24/Hello%20World.HTML
- PW Version: 2.5.27

== START ==

[Checking jumplink #12]
- Original Source Path:         Articles/{year}/{month}/{day}/{all}.{ext}
- After Smart Wildcards:        Articles/{year:num}/{month:num}/{day:num}/{all:all}.{ext:ext}
- Compiled Source Path:         Articles/(\d+)/(\d+)/(\d+)/(.*).(aspx|asp|cfm|cgi|fcgi|dll|html|htm|shtml|shtm|jhtml|phtml|xhtm|xhtml|rbml|jspx|jsp|phps|php4|php)
- > Wildcard Check:             1> year = 2015 -> 2015
- > Wildcard Check:             2> month = 4 -> 4
- > Wildcard Check:             3> day = 24 -> 24
- > Wildcard Check:             4> all = Hello%20World -> hello-world
- > Wildcard Check:             5> ext = HTML -> html
- Original Destination Path:    blog/{all}/
- Compiled Destination Path:    http://processwire.dev.local/blog/hello-world/

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

- From URL:   http://processwire.dev.local/Articles/2015/4/24/Hello%20World.HTML
- To URL:     http://processwire.dev.local/blog/hello-world/

I have a few plans in the pipeline, such as the ability to use your own expressions, but not decided yet.

Lastly, an issue came up a few days ago, where a jumplink is not working. I'm sure it has something to do with timed activation, and will look into it when I have more information. Seems that the end time (when not specified) is not being calculated properly. Normally, it would create a dummy time. I may actually need to look at redoing the whole timed activation feature...

Share this post


Link to post
Share on other sites

Hi Mike, all of my jumplinks have:

2015 years ago

in the start AND end column;

but the fields are all empty, no timed activation. None of the jumplinks work, even though in debug mode it shows

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

- From URL:   http://www.ohmspeaker.com/1/Bookshelf-Speakers.html
- To URL:     http://www.ohmspeaker.com/speakers/walsh-bookshelf/
- Timed:      From Wed, 30 Nov -001 00:00:00 -0500 to Wed, 30 Nov -001 00:00:00 -0500

if i go in and set a start and end date for the jumplink, it does work! but i guess this needs to be fixed?

Share this post


Link to post
Share on other sites

Hey Macrura - yeah, this seems to be quite weird. I'm sure it has something to do with storing null dates. Can you check in phpMyAdmin (or whatever you use) what the date is in the DB?

Share this post


Link to post
Share on other sites

hi Mike - here is how the date is formatted:

0000-00-00 00:00:00

Share this post


Link to post
Share on other sites

That is indeed how it should be... I assume you're running on Linux? I develop on Windows, and it appears that most of the troubles that have come up relate to OS differences...

I think I'm going to need to spend some time refactoring Jumplinks.

Share this post


Link to post
Share on other sites

I see 2015 years ago also, but only on the Mac (localhost dev server using MAMP). On the Linux 2.4 live server the dates are correct.

Share this post


Link to post
Share on other sites

yes, linux/apache

- mySQL  5.5.40-36.1-log

- PHP 5.4.3

also, i have another site on the same server and on that one everything works fine; no dates are show in the columns, they are empty.

on the problem site which is using the dev version of the module (latest, downloaded today) these were all imported from ProcessRedirects, but then some were added after that and all of the rows show the 2015 years ago;

Share this post


Link to post
Share on other sites

also, i have another site on the same server and on that one everything works fine; no dates are show in the columns, they are empty.

Those columns shouldn't be empty at all. If no date is specified, it should use 0000-00-00 00:00:00.

on the problem site which is using the dev version of the module (latest, downloaded today) these were all imported from ProcessRedirects, but then some were added after that and all of the rows show the 2015 years ago;

Also finding that to be quite strange because both the importer and the 'editor' use the same function (commitJumplink) to insert the jumplink.

Going to test this out on my Linux server to see if I can reproduce this.

Update: Okay, I'm able to reproduce this in CloudLinux running LightSpeed (and, thus, I'm sure many other nix setups will be the same). However, in my case, the date columns are not empty, but contain the zero date. I'll try and figure out what's going on.

Share this post


Link to post
Share on other sites

Mike, just curious why you are saving a zero dates? Shouldn't empty suffice and just check if $date_start and $date_end are empty?

Share this post


Link to post
Share on other sites

Mike, just curious why you are saving a zero dates? Shouldn't empty suffice and just check if $date_start and $date_end are empty?

At first, I was using NULL dates, but that seemed to break on some systems. I then saw that PW uses zero dates, and so used them instead. As the column type is TIMESTAMP, can I even save empty strings?

Edit: Although, I see where I am perhaps wrong. PW uses the following schema

Type          Not Null   Default
TIMESTAMP     TRUE       0000-00-00 00:00:00

Whereas Jumplinks uses:

Type          Not Null   Default
TIMESTAMP     FALSE      NULL

Whilst the default is NULL, Jumplinks sends a zero date to the database.

Will work on this shortly.

Share this post


Link to post
Share on other sites

Seemingly, PW compares dates in the database to the $lowestDate of 1974-10-10.

I've updated the dev branch to do pretty much the same thing. Also, I have changed the schema of the date_start and date_end columns. The schema will update automatically. To me, this seems to be the better approach. Sure, I could use NULL dates, but recall that giving me problems before.

I have tested on Windows, CloudLinux and CentOS. I'm sure the fix will work just fine on OS X and other nix variants, but please can those affected confirm for me?

As soon as this is confirmed to be fixed, I'll push 1.2.1 to master.

Thanks.

Share this post


Link to post
Share on other sites

In the context of dates, what I really would find useful, is a date for the latest hit.

So I could, after a period of time, delete those redirects, which had no hits since that period, so those links don't seem to matter any more. That helps to keep my list short. :-)

Share this post


Link to post
Share on other sites

In the context of dates, what I really would find useful, is a date for the latest hit.

So I could, after a period of time, delete those redirects, which had no hits since that period, so those links don't seem to matter any more. That helps to keep my list short. :-)

Indeed, that could be quite useful, and is better than a full-on hit log, as I wanted to do at the beginning. This will also be helpful for an upcoming site migration, so will implement this soon.

Share this post


Link to post
Share on other sites

Those columns shouldn't be empty at all. If no date is specified, it should use 0000-00-00 00:00:00.

Update: Okay, I'm able to reproduce this in CloudLinux running LightSpeed (and, thus, I'm sure many other nix setups will be the same). However, in my case, the date columns are not empty, but contain the zero date. I'll try and figure out what's going on.

I meant that the columns in the PW admin are blank; i didn't check the dates in the database, for the particular site that works...

Share this post


Link to post
Share on other sites

I meant that the columns in the PW admin are blank; i didn't check the dates in the database, for the particular site that works...

Ah, indeed. Those should be blank when not in use.

I'm sure the latest fix will work for you - please let me know if it does. :)

Share this post


Link to post
Share on other sites

I'm getting an error with mysql version: 5.6.24

SQLSTATE[22007]: Invalid datetime format: 1292 Incorrect datetime value: 'null' for column 'date_start' at row 1

the error occurs when you don't populate either the start or end dates for a new jumplink.

Elsewhere it has been caused by mysql v5.6 being a lot stricter with datetime fields. Where previous versions have just ignored certain data, v5.6 now raises an error.

Starting mysql with the switch: --sql-mode=ALLOW_INVALID_DATES

removes the issue.

Share this post


Link to post
Share on other sites

When using mysql v5.6 with the switch: --sql-mode=ALLOW_INVALID_DATES

blank start and end dates get set to 2015 years ago, the dev branch solved this but unfortunately didn't fix the sql error.

Share this post


Link to post
Share on other sites

my issues appear to be solved.. thanks Mike! looking forward to using this a lot now!!

Share this post


Link to post
Share on other sites

I'm getting an error with mysql version: 5.6.24

the error occurs when you don't populate both either the start or end dates for a new jumplink.

Elsewhere it has been caused by mysql v5.6 being a lot stricter with datetime fields. Where previous versions have just ignored certain data, v5.6 now raises an error.

Starting mysql with the switch: --sql-mode=ALLOW_INVALID_DATES

removes the issue.

Hi guy, and thanks for bringing that up - will sort that out this afternoon.

my issues appear to be solved.. thanks Mike! looking forward to using this a lot now!!

You're very welcome. :-)

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 Rudy
      Hi,
      I am writing a custom module that requires storing array of settings in the module config/settings.
      Is there a built-in fieldtype that allows me to store settings in an array (sort of like Repeater)?
      I tried using InputfieldAceExtended and InputfieldTextarea to store JSON array. Both times, my data was stored in the module settings (in the database) but upon reload, that information was not retrieved.
      Thanks
      Rudy
       
    • By Anssi
      A simple module to enable easy navigation between the public and the admin side of the site. After installation a green bar will appear to the upper side of the screen, containing a few navigation elements and displaying the PW version number.
      Heavily inspired by @apeisa's great AdminBar (Thanks!). I needed a bit simpler tool for my projects and as a result, this was made. Available on GitHub .

    • By Sebi
      I've created a small module which lets you define a timestamp after which a page should be accessible. In addition you can define a timestamp when the release should end and the page should not be accessable any more.
      Github: https://github.com/Sebiworld/PageAccessReleasetime
      Usage
      PageAccessReleasetime can be installed like every other module in ProcessWire. Check the following guide for detailed information: How-To Install or Uninstall Modules
      After that, you will find checkboxes for activating the releasetime-fields at the settings-tab of each page. You don't need to add the fields to your templates manually.
      Check e.g. the checkbox "Activate Releasetime from?" and fill in a date in the future. The page will not be accessable for your users until the given date is reached.
      If you have $config->pagefileSecure = true, the module will protect files of unreleased pages as well.
      How it works
      This module hooks into Page::viewable to prevent users to access unreleased pages:
      public function hookPageViewable($event) { $page = $event->object; $viewable = $event->return; if($viewable){ // If the page would be viewable, additionally check Releasetime and User-Permission $viewable = $this->canUserSee($page); } $event->return = $viewable; } To prevent access to the files of unreleased pages, we hook into Page::isPublic and ProcessPageView::sendFile.
      public function hookPageIsPublic($e) { $page = $e->object; if($e->return && $this->isReleaseTimeSet($page)) { $e->return = false; } } The site/assets/files/ directory of pages, which isPublic() returns false, will get a '-' as prefix. This indicates ProcessWire (with activated $config->pagefileSecure) to check the file's permissions via PHP before delivering it to the client.
      The check wether a not-public file should be accessable happens in ProcessPageView::sendFile. We throw an 404 Exception if the current user must not see the file.
      public function hookProcessPageViewSendFile($e) { $page = $e->arguments[0]; if(!$this->canUserSee($page)) { throw new Wire404Exception('File not found'); } } Additionally we hook into ProcessPageEdit::buildForm to add the PageAccessReleasetime fields to each page and move them to the settings tab.
      Limitations
      In the current version, releasetime-protected pages will appear in wire('pages')->find() queries. If you want to display a list of pages, where pages could be releasetime-protected, you should double-check with $page->viewable() wether the page can be accessed. $page->viewable() returns false, if the page is not released yet.
      If you have an idea how unreleased pages can be filtered out of ProcessWire selector queries, feel free to write an issue, comment or make a pull request!
    • By David Karich
      Thanks to the great Pro module "RepeaterMatrix" I have the possibility to create complex repeater items. With it I have created a quite powerful page builder. Many different content modules, with many more possible design options. The RepeaterMatrix module supports the cloning of items, but only within the same page. Now I often have the case that very design-intensive pages and items are created. If you want to use this module on a different page (e.g. in the same design), you have to rebuild each item manually every time.
      With this proof of concept I have created a module which adds the feature to copy a repeater item to the clipboard so that you can paste this item to another page with the same repeater field. The module has been developed very rudimentarily so far. It is currently not possible to copy nested items. There is also no check of Min/Max. You can also only copy items that have the same field on different pages. And surely you can solve all this more elegantly with AJAX. But personally I lack the deeper understanding of the repeaters. Also missing on the Javascript side are event triggers for the repeaters, which would make it easier. Like e.g. RepeaterItemInitReady or similar.
      it would be great if @ryan would implement this functionality in the core of RepeaterMatrix. I think he has better ways to implement this. Or what do you think, Ryan?
      Everybody is welcome to work on this module and improve it, if it should not be integrated into the matrix core. Therefore I put it for testing and as download on GitHub: https://github.com/FlipZoomMedia/InputfieldRepeaterMatrixDublicate
      You can best see the functionality in the screencast: 
       
    • By anderson
      Hi,
      Please take a look at this:
      https://templatemag.com/demo/Good/
      The upper nav bar, including dropdowns like "pages" and "portfolios", what do you call this whole thing? At first I guess it's called "dropdown nav bar", but seems not.
      AND of course, what's the simplest way/module to achieve this in PW?
      Thanks in advance.