Thanks,
ProcessPageView::pageNotFound is definitely the right spot, I came up with this method, don't know if it has any access rights implications:
public function hook_ProcessPageView_pageNotFound(HookEvent $event)
{
$page = $event->arguments('page');
$page->template->filename = 'path/to/existing/file';
if ($page->viewable()) {
$event->return = $page->render();
$event->replace = true;
}
}
Page render actually outputs something, because I hook into it. But just not with a template file.

Hi, I ran into this issue a while back and remember fixing it but haven't pushed to master. I will have to look into it. I think it might work on the dev branch, not sure though.
Edit: yup it's fixed on the dev branch. I use it on a production site, but I appreciate any quick testing in your environments, so that I can merge it into master, if no further issues arise.
Thanks for reporting!

Thanks for the update @Mike Rockett. After the update: without trailing delimiters (foo;bar) I get:
ProcessJumplinks: SQLSTATE[22007]: Invalid datetime format: 1292 Incorrect datetime value: '-0001-11-30 00:00:00' for column 'date_start' at row 1
With trailing delimiters (foo;bar;;) I get:
Notice: Undefined index: date_end
ProcessJumplinks: SQLSTATE[22007]: Invalid datetime format: 1292 Incorrect datetime value: '-0001-11-30 00:00:00' for column 'date_start' at row 1
This only happens if I input more than one line. If it's only one line, it works. If it's only one line, both values separated by the delimiter land in the source field, destination stays empty.
Is there a reason, why you rolled your own CSV parser instead of using str_getcsv?

Thanks @Mike Rockett, the implicit option with {all} will suffice.
I haven't dug too deep into all the options, but it would be great if mapping could be done without collections:
source: project?id={someCustomField} dest: projects/{someCustomField}
So that someCustomField would be a field of projects/ child pages, like $pages->get('/projects/')->children('someCustomField={value}');
This way one could simply migrate the ids of the old site over.
source: project?id={oldID} dest: projects/{oldID}
$pages->get('/projects/')->children('oldID={id}');

Hi @Mike Rockett, this module is awesome, thanks!
I have this collection thing going on:
example source: project?id=1&foo=bar
So I set it up like this: source: project?id={id}&foo=bar dest: projects/{id|projects}
Works!
But, when &foo=bar is omitted this does not work:
project?id=1
How to make anything after id optional, I tried brackets, but it does not work.
source: project?id={id}[anything here, but optional]
Thanks!