From 7df579e87a5c000824c41f9d3e8cb6efb35324e3 Mon Sep 17 00:00:00 2001 From: Ivo Valchev Date: Wed, 15 Apr 2020 13:07:52 +0200 Subject: [PATCH] Display records in the backend in appropriate language --- src/Twig/JsonExtension.php | 36 ++++++++++++++----- .../_partials/_content_listing.html.twig | 2 +- 2 files changed, 28 insertions(+), 10 deletions(-) diff --git a/src/Twig/JsonExtension.php b/src/Twig/JsonExtension.php index d3bb2d8d..8dc016f4 100644 --- a/src/Twig/JsonExtension.php +++ b/src/Twig/JsonExtension.php @@ -6,6 +6,7 @@ namespace Bolt\Twig; use Bolt\Common\Json; use Bolt\Entity\Content; +use Bolt\Entity\Field; use Symfony\Component\Serializer\Normalizer\NormalizerInterface; use Twig\Extension\AbstractExtension; use Twig\TwigFilter; @@ -48,20 +49,20 @@ class JsonExtension extends AbstractExtension ]; } - public function jsonRecords($records, ?bool $includeDefinition = true, int $options = 0): string + public function jsonRecords($records, ?bool $includeDefinition = true, int $options = 0, string $locale = ''): string { $this->includeDefinition = $includeDefinition; - return Json::json_encode($this->normalizeRecords($records), $options); + return Json::json_encode($this->normalizeRecords($records, $locale), $options); } /** * @param Content|array|\Traversable $records */ - public function normalizeRecords($records): array + public function normalizeRecords($records, string $locale = ''): array { if ($records instanceof Content) { - return $this->contentToArray($records); + return $this->contentToArray($records, $locale); } if (is_array($records)) { @@ -70,10 +71,12 @@ class JsonExtension extends AbstractExtension $normalizedRecords = iterator_to_array($records); } - return array_map([$this, 'contentToArray'], $normalizedRecords); + return array_map(function ($record) use ($locale) { + return $this->contentToArray($record, $locale); + }, $normalizedRecords); } - private function contentToArray(Content $content): array + private function contentToArray(Content $content, string $locale = ''): array { $group = [self::SERIALIZE_GROUP]; @@ -81,11 +84,26 @@ class JsonExtension extends AbstractExtension $group[] = self::SERIALIZE_GROUP_DEFINITION; } - // we do it that way because in current API Platform version a Resource - // can't implement \JsonSerializable - return $this->normalizer->normalize($content, null, [ + if (! empty($locale)) { + // Set all translatable fields to the requested locale + array_map(function (Field $field) use ($locale): void { + if ($field->isTranslatable()) { + $field->setLocale($locale); + } + }, $content->getRawFields()->toArray()); + } + + // Get extras with the correct locales before normalizer overrides them + // todo: Fix this :-) + $extras = $content->getExtras(); + + $result = $this->normalizer->normalize($content, null, [ 'groups' => $group, ]); + + $result['extras'] = $extras; + + return $result; } /** diff --git a/templates/_partials/_content_listing.html.twig b/templates/_partials/_content_listing.html.twig index d15f9877..a5c48666 100644 --- a/templates/_partials/_content_listing.html.twig +++ b/templates/_partials/_content_listing.html.twig @@ -3,7 +3,7 @@