writable = $writable ?? static fn (): bool => true; } public function available(): bool { return DiviModules::isAvailable(); } public function writable(): bool { return ($this->writable)(); } public function check(string $postType, array $sections): ?WP_Error { if (! $this->schema->diviEnabled($postType)) { return Errors::invalidInput( 'Für diesen Inhaltstyp ist der Divi-Builder nicht aktiviert; nichts wurde angelegt.', ['divi' => sprintf('Divi-Builder für "%s" nicht aktiv', $postType)] ); } $layout = LayoutBuilder::build($this->composition->forPost(0), $sections, 'divi'); return $layout instanceof WP_Error ? $layout : null; } public function write(int $postId, string $postType, array $sections): array|WP_Error { $composition = $this->composition->forPost($postId); $layout = LayoutBuilder::build($composition, $sections, 'divi'); if ($layout instanceof WP_Error) { return $layout; } $index = NodeIndex::build($layout['document']); $warnings = $composition->warnings()->collect($index, $layout['blocks']); $outline = (new Outline($this->design->read()->presetNames()))->summary($index); if ($outline['truncated']) { $warnings[] = DiviWriter::OUTLINE_TRUNCATED; } $saved = $this->saver->saveNew($postId, Serializer::document($layout['document'])); return [ 'warnings' => array_merge($warnings, $saved), 'outline' => (string) $outline['text'], 'edit_url' => DiviPage::builderUrl($postId), ]; } }