5use dbx\dbxContent\dbxContentMediaUsageScope;
8 'id' =>
'core-4.1.0-media-usage-language',
10 'description' =>
'Sprachsichere und idempotente Medienverwendung.',
11 'affected_dd' => array(
'dbx|dbxMediaUsage'),
12 'operations' => array(
13 array(
'type' =>
'sync_dd',
'dd' =>
'dbx|dbxMediaUsage'),
15 'up' =>
static function(
$db,
$dd):
void {
16 require_once dirname(__DIR__, 2) .
'/dbxContent/include/dbxContent_bootstrap_sync.php';
20 require_once dirname(__DIR__, 2) .
'/dbxContent/include/dbxContentMediaUsageScope.class.php';
22 $languages = array_values(array_unique(array_map(
23 static fn(
$lng):
string => dbxContentMediaUsageScope::language((
string)
$lng),
24 dbxContentLngSync::accessibleLngs()
27 $master = dbxContentMediaUsageScope::language(dbxContentLngSync::masterLng());
30 $folderCache = array();
32 $pageCache[
$lng] = array();
33 $folderCache[
$lng] = array();
34 $pages =
$db->select(dbxContentLng::ddContent(
$lng),
'',
'id,folder,hero_image_id,content',
'id',
'ASC',
'', 0, 0, 0);
36 if (is_array(
$page) && (
int)(
$page[
'id'] ?? 0) > 0) {
40 $folders =
$db->select(dbxContentLng::ddFolder(
$lng),
'',
'id,hero_image_id',
'id',
'ASC',
'', 0, 0, 0);
41 foreach (is_array($folders) ? $folders : array() as $folder) {
42 if (is_array($folder) && (
int)($folder[
'id'] ?? 0) > 0) {
43 $folderCache[
$lng][(int)$folder[
'id']] = $folder;
48 $containsMedia =
static function(
string $html,
int $mediaId): bool {
50 return preg_match(
'/data-cms-media-id=["\']?' .
$mediaId .
'(?:["\'\s>]|$)/i',
$html) === 1
51 || preg_match(
'/(?:dbx_mid|media_id)=' .
$mediaId .
'(?:[^0-9]|$)/i',
$html) === 1;
54 $rows =
$db->select(
'dbxMediaUsage',
'',
'*',
'id',
'ASC',
'', 0, 0, 0);
56 foreach (is_array(
$rows) ?
$rows : array() as $row) {
57 if (!is_array($row))
continue;
58 $id = (int)($row[
'id'] ?? 0);
59 if ($id <= 0)
continue;
60 if ((
int)($row[
'active'] ?? 0) !== 1) {
61 $db->delete(
'dbxMediaUsage', $id, 1, 0);
65 $mediaId = (int)($row[
'media_id'] ?? 0);
66 $contentId = (int)($row[
'content_id'] ?? 0);
67 $folderId = (int)($row[
'folder_id'] ?? 0);
68 $slot = strtolower(trim((
string)($row[
'slot'] ??
'')));
71 if ($slot ===
'shop') {
73 } elseif ($contentId > 0) {
75 $page = $pageCache[
$lng][$contentId] ??
null;
76 if (!is_array(
$page))
continue;
77 if ($folderId > 0 && (
int)(
$page[
'folder'] ?? 0) !== $folderId)
continue;
78 if ($slot ===
'hero' && (
int)(
$page[
'hero_image_id'] ?? 0) !==
$mediaId)
continue;
79 if ($slot ===
'inline' && !$containsMedia((
string)(
$page[
'content'] ??
''),
$mediaId))
continue;
87 } elseif ($folderId > 0) {
89 $folder = $folderCache[
$lng][$folderId] ??
null;
90 if (!is_array($folder))
continue;
91 if ($slot ===
'hero' && (
int)($folder[
'hero_image_id'] ?? 0) !==
$mediaId)
continue;
104 $key =
$lng .
':' . $contentId .
':' . $folderId .
':' . $slot .
':' .
$mediaId;
105 if (isset($seen[$key])) {
106 $db->delete(
'dbxMediaUsage', $id, 1, 0);
110 if ((
string)($row[
'content_lng'] ??
'') !==
$lng) {
111 $db->update(
'dbxMediaUsage', array(
'content_lng' =>
$lng), $id, 0, 1, 1, 0);
if(!defined( 'IMG_WEBP')) define( 'IMG_WEBP'
foreach($help->topics() as $topic=> $meta) $languages
if($cinematic===''||!str_contains($cinematic, 'data-dbx-cinema')) $page