bnomei / kirby3-autoid

Automatic unique ID for Pages, Files and Structures including performant helpers to retrieve them. Bonus: Tiny-URL.
https://forum.getkirby.com/t/kirby3-autoid-plugin/23572
MIT License
80 stars 8 forks source link

Can't programmatically reference a new file in a file field in a new page #86

Open JerikoOne opened 2 years ago

JerikoOne commented 2 years ago

What I want to achieve is programmatically update or add new pages, add a file to these pages if it doesn't exist yet and reference it in a files field. Blueprints for the page and the file are correctly set up.

$pageData = [...];

if( $pageDoesNotExist == true ) :
  $page = $parent->createChild([ 'slug' => ..., 'template' => 'template', 'content' => $pageData ]);
  $page = $page->changeStatus('listed');
else:
  $page = $page->update( $pageData );
endif;

if( $fileDoesNotExist == true ) :
  $file = $page->createFile(...) // Array with required properties and such
  $page = $page->update([ 'files_field' => $file->id() ]);
endif;

I can only assume that it's some sort of caching issue with the SQlite database, however I couldn't figure it out myself.

JerikoOne commented 2 years ago

Small update: basically I can't update a newly programmatically created page in the same call, it's not limited to files or the files field.

bnomei commented 2 years ago

sorry for the late response i was on vacation.

the sqlite database only stores information about the id, template and paths but nothing about about the pages data so i am very sure its not a caching issue.

most likely this is caused by how autoid writes the id to the content file using a hook. it should not however block updating further calls - at least there is nothing i can do as a plugin developer here.

my suggestion would be you try to actively refetch the page object instead of relying on the return value. i know it looks a bit silly to do $page = page($page->id()); but i think its worth a try.

$pageData = [...];

if( $pageDoesNotExist == true ) :
  $page = $parent->createChild([ 'slug' => ..., 'template' => 'template', 'content' => $pageData ]);
  $page = $page->changeStatus('listed');
else:
  $page = $page->update( $pageData );
endif;

$page = page($page->id());

if( $fileDoesNotExist == true ) :
  $file = $page->createFile(...) // Array with required properties and such
  $page = $page->update([ 'files_field' => $file->id() ]);
endif;
bnomei commented 2 years ago

or https://github.com/bnomei/kirby3-autoid/wiki/PHP:-autoid(),-Field-Method-fromAutoID()#create-a-pagefile-programmatically-and-retrieve-autoid $page = autoid($page);