diff --git a/src/Integrations/Divi/Compose/LoopScope.php b/src/Integrations/Divi/Compose/LoopScope.php index 394ea57..7e08473 100644 --- a/src/Integrations/Divi/Compose/LoopScope.php +++ b/src/Integrations/Divi/Compose/LoopScope.php @@ -132,6 +132,17 @@ final class LoopScope return $kind === null ? (string) $this->queryType : self::LABELS[$kind]; } + /** label() of the whole chain, outermost first ("Terme > Beiträge"); an unknown outer loop shows as "?". */ + public function chainLabel(): string + { + $labels = array_map( + static fn (?string $kind): string => $kind === null ? '?' : self::LABELS[$kind], + array_slice($this->kinds(), 1) + ); + + return implode(' > ', [...array_reverse($labels), $this->label()]); + } + /** * Whether the loop_* option $option belongs to this loop's kind – a meta key option (loop__meta_key_*) * to the kind of every loop of the chain (audit M1), since Divi reads meta by the ID of whatever loop diff --git a/src/Integrations/Divi/Pages/DiviWriteAbility.php b/src/Integrations/Divi/Pages/DiviWriteAbility.php index 7c927b8..8d0795e 100644 --- a/src/Integrations/Divi/Pages/DiviWriteAbility.php +++ b/src/Integrations/Divi/Pages/DiviWriteAbility.php @@ -191,23 +191,33 @@ abstract class DiviWriteAbility implements Ability, RequiresDiviFeatures /** @param list $names */ protected static function loopWarning(array $names, LoopScope $from, LoopScope $to): string { - $where = $to->queryType() === null - ? 'jetzt außerhalb jeder Divi-Schleife; Divi zeigt sie dort leer' - : ($to->active() ? sprintf( - 'jetzt in einer Divi-Schleife vom Typ: %s (vorher: %s); passen sie nicht zu dieser Art, zeigt Divi ' - . 'sie leer oder mit Daten eines anderen Objekts mit derselben ID', - $to->label(), - $from->active() ? $from->label() : 'keine Schleife' - ) : sprintf( - 'jetzt in einer Divi-Schleife, die dieses Werkzeug nicht unterstützt (Typ: %s); Divi kann Daten ' - . 'eines anderen Objekts zeigen', - $to->label() - )); - return sprintf( 'Schleifen-Inhalte (%s) liegen %s. Zurückverschieben oder die Inhalte anpassen.', implode(', ', $names), - $where + self::loopWhere($from, $to) + ); + } + + /** Where the content sits after the change, in words; names the whole chain of loops. */ + private static function loopWhere(LoopScope $from, LoopScope $to): string + { + if ($to->queryType() === null) { + return 'jetzt außerhalb jeder Divi-Schleife; Divi zeigt sie dort leer'; + } + + if (! $to->active()) { + return sprintf( + 'jetzt in einer Divi-Schleife, die dieses Werkzeug nicht unterstützt (Typ: %s); Divi kann Daten ' + . 'eines anderen Objekts zeigen', + $to->chainLabel() + ); + } + + return sprintf( + 'jetzt in einer Divi-Schleife vom Typ: %s (vorher: %s); passen sie nicht zu dieser Art, zeigt Divi ' + . 'sie leer oder mit Daten eines anderen Objekts mit derselben ID', + $to->chainLabel(), + $from->active() ? $from->chainLabel() : 'keine Schleife' ); } } diff --git a/tests/Unit/Integrations/Divi/Pages/DiviLoopWriteTest.php b/tests/Unit/Integrations/Divi/Pages/DiviLoopWriteTest.php index 276124e..1365ef7 100644 --- a/tests/Unit/Integrations/Divi/Pages/DiviLoopWriteTest.php +++ b/tests/Unit/Integrations/Divi/Pages/DiviLoopWriteTest.php @@ -423,7 +423,9 @@ final class DiviLoopWriteTest extends DiviWriteAbilityTestCase ]); self::assertTrue($result['ok'], (string) json_encode($result)); - self::assertStringContainsString('loop_post_meta_key_manual_custom_field', implode(' | ', $result['warnings'])); + $warnings = implode(' | ', $result['warnings']); + self::assertStringContainsString('loop_post_meta_key_manual_custom_field', $warnings); + self::assertStringContainsString('Typ: Terme > Beiträge (vorher: Beiträge > Beiträge)', $warnings); } /** Audit L2: "terms" is a term loop for Divi, an unsupported target "can show data of another object". */ @@ -531,7 +533,9 @@ final class DiviLoopWriteTest extends DiviWriteAbilityTestCase $result = $this->moveNode(['id' => 's0.r0.c0.m0', 'parent' => 's0.r0.c1']); self::assertTrue($result['ok'], (string) json_encode($result)); - self::assertStringContainsString('loop_post_meta_key_manual_custom_field', implode(' | ', $result['warnings'])); + $warnings = implode(' | ', $result['warnings']); + self::assertStringContainsString('loop_post_meta_key_manual_custom_field', $warnings); + self::assertStringContainsString('Typ: Terme > Beiträge (vorher: Beiträge)', $warnings); } /** Two sections: a post loop on its own, and a post loop inside a term loop (s1). */