Programatically update blocks in a layout

Still trying to work this out, here is my latest code. @bastianallgeier is this nearly right?

if (Custom\App\App::fieldValuesChanged($oldMediaBlocks->toJson(), $newMediaBlocks->toJson()) ){
  $layoutArray = array();
  foreach ($newPage->layout()->toLayouts() as $layout){
    $columnsArray = array();
    foreach ($layout->columns() as $column){
      $blocksArray = array();
      foreach ($column->blocks() as $block){
        if($block->type() === "media"){
          $old = $block->toArray();
          if ( $block->primaryVideoId()->isNotEmpty() ){
            $data = Custom\App\App::getVideoData($block->primaryVideoId()->value(), $block->primaryVideoResolution()->value());

            $old['content']['primaryVideoThumbnailLink'] = $data['thumbnailLink'];
            $old['content']['primaryVideoLink'] =  $data['fileLink'];
          } else {
            $old['content']['primaryVideoThumbnailLink'] = '';
            $old['content']['primaryVideoLink'] = '';
          }
          $new[] = new Kirby\Cms\Block($old);
          array_push($blocksArray, $new[0]);
        } else {
          $new[] = new Kirby\Cms\Block($block->toArray());
          array_push($blocksArray, $new[0]);
        }
      }
      $newBlocks = new Kirby\Cms\Blocks($blocksArray ?? []);
      $newColumn = new Kirby\Cms\LayoutColumn(
        [
          'blocks' => $newBlocks->toArray(),
        ]
      );
      array_push($columnsArray, $newColumn);
    }
    $newLayoutColumns = new Kirby\Cms\LayoutColumns( $columnsArray );
    $newLayout = Kirby\Cms\Layout::factory(
      [
        'columns' => $newLayoutColumns->toArray(),
      ]
    );
    array_push($layoutArray, $newLayout);
  }
  $newLayouts = new Kirby\Cms\Layouts( $layoutArray );

  // $newPage->update([
  //   'layout' => json_encode($nothing),
  // ]);
}
1 Like