kirby3-autoid icon indicating copy to clipboard operation
kirby3-autoid copied to clipboard

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

Open JerikoOne opened this issue 1 year ago • 3 comments

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;
  • Auto ID is added to the page and file as expected.
  • If the page already exists everything works as expected, the file get's referenced in the files field from that page.
  • If the page is newly created however the file doesn't get referenced in the files field from that page.
  • If I remove the plugin everything works as expected, also with newly created pages.

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 avatar Sep 14 '22 05:09 JerikoOne

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.

JerikoOne avatar Sep 14 '22 14:09 JerikoOne

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 avatar Oct 06 '22 12:10 bnomei

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

bnomei avatar Oct 06 '22 12:10 bnomei