[ 'routes' => [ [ 'pattern' => 'smart-forests/image-usage/(:any)', 'method' => 'GET', 'action' => function (string $encodedId) { $kirby = kirby(); // Panel encodes page IDs with + instead of / $pageId = str_replace('+', '/', rawurldecode($encodedId)); $page = $kirby->page($pageId); if (!$page) { return ['error' => 'Page not found: ' . $pageId]; } // Build UUID → filename map for all files on this page $uuidMap = []; foreach ($page->files() as $file) { $uuid = $file->content()->get('uuid')->value(); if ($uuid) { $uuidMap[$uuid] = $file->filename(); } } if (empty($uuidMap)) { return (object)[]; } // Scan all content .txt files once for file:// UUID references $usedUuids = []; $contentRoot = $kirby->root('content'); $iter = new RecursiveIteratorIterator( new RecursiveDirectoryIterator( $contentRoot, RecursiveDirectoryIterator::SKIP_DOTS ) ); foreach ($iter as $fsFile) { // Stop early when all UUIDs are accounted for if (count($usedUuids) === count($uuidMap)) { break; } if ($fsFile->getExtension() !== 'txt') { continue; } $content = file_get_contents($fsFile->getPathname()); foreach ($uuidMap as $uuid => $_) { if (!isset($usedUuids[$uuid]) && strpos($content, 'file://' . $uuid) !== false) { $usedUuids[$uuid] = true; } } } // Return filename => isUsed boolean $result = []; foreach ($uuidMap as $uuid => $filename) { $result[$filename] = isset($usedUuids[$uuid]); } return $result; } ] ] ] ]);