*/ private array $brandFields = [ 'name', 'tagline', 'teaser', 'summary', 'description', 'widget_label', 'cta_title', 'cta_text', 'origin_city', 'origin_distance', 'origin_role', 'highlights', 'services', 'sections', 'gallery', ]; /** @var list */ private array $articleFields = ['title', 'subtitle', 'content']; /** * @param array $replacements * @param array $exact * @return int Anzahl geänderter Textstellen */ protected function replaceCmsTexts(array $replacements, array $exact = []): int { $count = 0; $groups = []; foreach (CmsContent::query()->get() as $row) { $changes = 0; $row->value = $this->replaceDeep($row->getTranslations('value'), $replacements, $exact, $changes); if ($changes > 0) { $row->save(); $groups[$row->group] = true; $count += $changes; } } foreach (array_keys($groups) as $group) { app(CmsContentService::class)->clearCache($group); } foreach (CmsBrand::query()->get() as $brand) { $count += $this->replaceInModel($brand, $this->brandFields, $replacements, $exact); } foreach (CmsArticle::query()->get() as $article) { $count += $this->replaceInModel($article, $this->articleFields, $replacements, $exact); } return $count; } /** * @param list $fields * @param array $replacements * @param array $exact */ private function replaceInModel(Model $model, array $fields, array $replacements, array $exact): int { $changes = 0; $translatable = property_exists($model, 'translatable') ? $model->translatable : []; foreach ($fields as $field) { $isTranslatable = in_array($field, $translatable, true); $value = $isTranslatable ? $model->getTranslations($field) : $model->getAttribute($field); if (! is_array($value)) { continue; } $before = $changes; $value = $this->replaceDeep($value, $replacements, $exact, $changes); if ($changes > $before) { $isTranslatable ? $model->setTranslations($field, $value) : $model->setAttribute($field, $value); } } if ($changes > 0) { $model->save(); } return $changes; } /** * @param array $data * @param array $replacements * @param array $exact * @return array */ private function replaceDeep(array $data, array $replacements, array $exact, int &$count): array { foreach ($data as $key => $item) { if (is_array($item)) { $data[$key] = $this->replaceDeep($item, $replacements, $exact, $count); continue; } if (! is_string($item)) { continue; } $replaced = $exact[$item] ?? strtr($item, $replacements); if ($replaced !== $item) { $data[$key] = $replaced; $count++; } } return $data; } }