diff --git a/migrations/fix_why_band_position.php b/migrations/fix_why_band_position.php new file mode 100644 index 0000000..0d7e81c --- /dev/null +++ b/migrations/fix_why_band_position.php @@ -0,0 +1,134 @@ + Why-VITEC-Band -> "Product range" -> Produktkarten. + * + * php migrations/fix_why_band_position.php # INSPECT (default) + * php migrations/fix_why_band_position.php --apply # schreibt + */ + +declare(strict_types=1); + +$apply = in_array('--apply', $argv, true); + +$settings = require __DIR__ . '/../config/system/settings.php'; +$db = $settings['DB']['Connections']['Default']; +$pdo = new PDO( + sprintf('mysql:host=%s;dbname=%s;charset=utf8mb4', $db['host'], $db['dbname']), + $db['user'], + $db['password'], + [PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION] +); + +echo $apply ? "APPLY\n\n" : "INSPECT - nichts wird geschrieben (--apply zum Schreiben)\n\n"; + +$slugs = [ + '/products/activesqx', + '/products/aetria', + '/products/aligo', + '/products/avedia-modular-system', + '/products/image-graphics-cards', + '/products/operator-workstations', + '/products/prism-transcoder', +]; + +$moved = 0; +foreach ($slugs as $slug) { + $page = $pdo->prepare('SELECT uid, title FROM pages WHERE deleted = 0 AND slug = ?'); + $page->execute([$slug]); + $page = $page->fetch(PDO::FETCH_ASSOC); + if ($page === false) { + echo "$slug: Seite NICHT gefunden - uebersprungen\n\n"; + continue; + } + $pid = (int)$page['uid']; + + $stmt = $pdo->prepare( + 'SELECT uid, CType, header, sorting, hidden FROM tt_content + WHERE pid = ? AND deleted = 0 AND colPos = 0 + AND (tx_container_parent IS NULL OR tx_container_parent = 0) + ORDER BY sorting, uid' + ); + $stmt->execute([$pid]); + $elements = $stmt->fetchAll(PDO::FETCH_ASSOC); + + // Band finden: "Why VITEC?"-Intro + direkt folgende vitec_card-Elemente + $bandStart = null; + foreach ($elements as $i => $el) { + if ($el['CType'] === 'vitec_introparagraph' && trim((string)$el['header']) === 'Why VITEC?') { + $bandStart = $i; + break; + } + } + if ($bandStart === null) { + echo "$slug (pid $pid): kein 'Why VITEC?'-Intro - uebersprungen\n\n"; + continue; + } + $bandEnd = $bandStart; + while (isset($elements[$bandEnd + 1]) && $elements[$bandEnd + 1]['CType'] === 'vitec_card') { + $bandEnd++; + } + + // Ziel: das erste andere Intro ("Product range") + $target = null; + foreach ($elements as $i => $el) { + if ($i >= $bandStart && $i <= $bandEnd) { + continue; + } + if ($el['CType'] === 'vitec_introparagraph') { + $target = $i; + break; + } + } + if ($target === null) { + echo "$slug (pid $pid): kein zweites Intro gefunden - uebersprungen\n\n"; + continue; + } + + echo "$slug (pid $pid) - Band: Elemente " . ($bandEnd - $bandStart + 1) + . " (#" . $elements[$bandStart]['uid'] . "..#" . $elements[$bandEnd]['uid'] . ")" + . ", Ziel-Intro: #" . $elements[$target]['uid'] . " \"" . $elements[$target]['header'] . "\"\n"; + + if ($target > $bandEnd) { + echo " Band steht bereits VOR dem Ziel-Intro - nichts zu tun\n\n"; + continue; + } + + // neue Reihenfolge: Band raus, vor das Ziel-Intro wieder rein + $band = array_slice($elements, $bandStart, $bandEnd - $bandStart + 1); + $rest = array_merge(array_slice($elements, 0, $bandStart), array_slice($elements, $bandEnd + 1)); + $newOrder = []; + foreach ($rest as $el) { + if ((int)$el['uid'] === (int)$elements[$target]['uid']) { + foreach ($band as $b) { + $newOrder[] = $b; + } + } + $newOrder[] = $el; + } + + echo " Neue Reihenfolge:\n"; + $sorting = 0; + foreach ($newOrder as $el) { + $sorting += 256; + printf(" %5d #%-6d %-24s %s\n", $sorting, $el['uid'], $el['CType'], (string)$el['header']); + if ($apply) { + $pdo->prepare('UPDATE tt_content SET sorting = ? WHERE uid = ?')->execute([$sorting, (int)$el['uid']]); + } + } + $moved++; + echo "\n"; +} + +echo ($apply ? "FERTIG" : "WUERDE") . ": $moved Seite(n) umsortiert.\n"; +if ($apply && $moved > 0) { + echo "Danach: vendor/bin/typo3 cache:flush\n"; +}