diff --git a/src/lib/MVC/Symfony/Templating/Twig/Extension/ContentExtension.php b/src/lib/MVC/Symfony/Templating/Twig/Extension/ContentExtension.php index 0de15736a9..348a7cd7e4 100644 --- a/src/lib/MVC/Symfony/Templating/Twig/Extension/ContentExtension.php +++ b/src/lib/MVC/Symfony/Templating/Twig/Extension/ContentExtension.php @@ -13,6 +13,7 @@ use Ibexa\Contracts\Core\Repository\Values\ValueObject; use Ibexa\Core\Base\Exceptions\InvalidArgumentType; use Ibexa\Core\Helper\FieldHelper; +use Ibexa\Core\Helper\FieldsGroups\FieldsGroupsList; use Ibexa\Core\Helper\TranslationHelper; use Psr\Log\LoggerInterface; use Twig\Extension\AbstractExtension; @@ -33,6 +34,8 @@ class ContentExtension extends AbstractExtension /** @var \Ibexa\Core\Helper\FieldHelper */ protected $fieldHelper; + private FieldsGroupsList $fieldsGroupsList; + /** @var \Psr\Log\LoggerInterface */ protected $logger; @@ -40,11 +43,13 @@ public function __construct( Repository $repository, TranslationHelper $translationHelper, FieldHelper $fieldHelper, + FieldsGroupsList $fieldsGroupsList, LoggerInterface $logger = null ) { $this->repository = $repository; $this->translationHelper = $translationHelper; $this->fieldHelper = $fieldHelper; + $this->fieldsGroupsList = $fieldsGroupsList; $this->logger = $logger; } @@ -132,6 +137,10 @@ public function getFunctions() 'ibexa_field_description', [$this, 'getTranslatedFieldDefinitionDescription'] ), + new TwigFunction( + 'ibexa_field_group_name', + [$this, 'getFieldGroupName'] + ), new TwigFunction( 'ez_content_field_identifier_first_filled_image', [$this, 'getFirstFilledImageFieldIdentifier'], @@ -252,6 +261,11 @@ public function hasField(Content $content, string $fieldDefIdentifier): bool return $content->getContentType()->hasFieldDefinition($fieldDefIdentifier); } + public function getFieldGroupName(string $identifier): ?string + { + return $this->fieldsGroupsList->getGroups()[$identifier] ?? null; + } + /** * Checks if a given field is considered empty. * This method accepts field as Objects or by identifiers. diff --git a/tests/lib/MVC/Symfony/Templating/Twig/Extension/ContentExtensionTest.php b/tests/lib/MVC/Symfony/Templating/Twig/Extension/ContentExtensionTest.php index d37ee68e55..7696b0ab8d 100644 --- a/tests/lib/MVC/Symfony/Templating/Twig/Extension/ContentExtensionTest.php +++ b/tests/lib/MVC/Symfony/Templating/Twig/Extension/ContentExtensionTest.php @@ -13,6 +13,7 @@ use Ibexa\Contracts\Core\Repository\Values\Content\Field; use Ibexa\Contracts\Core\SiteAccess\ConfigResolverInterface; use Ibexa\Core\Helper\FieldHelper; +use Ibexa\Core\Helper\FieldsGroups\FieldsGroupsList; use Ibexa\Core\Helper\TranslationHelper; use Ibexa\Core\MVC\Symfony\Templating\Twig\Extension\ContentExtension; use Ibexa\Core\Repository\Values\Content\Content; @@ -52,7 +53,8 @@ public function getExtensions() [], $this->createMock(LoggerInterface::class) ), - $this->fieldHelperMock + $this->fieldHelperMock, + $this->getFieldsGroupsListMock() ), ]; } @@ -146,6 +148,16 @@ private function getConfigResolverMock() return $mock; } + private function getFieldsGroupsListMock(): FieldsGroupsList + { + $fieldsGroupsList = $this->createMock(FieldsGroupsList::class); + $fieldsGroupsList->method('getGroups')->willReturn([ + 'content' => 'Content', + ]); + + return $fieldsGroupsList; + } + protected function getField($isEmpty) { $field = new Field(['fieldDefIdentifier' => 'testfield', 'value' => null]); diff --git a/tests/lib/MVC/Symfony/Templating/Twig/Extension/_fixtures/content_functions/ibexa_field_group_name.test b/tests/lib/MVC/Symfony/Templating/Twig/Extension/_fixtures/content_functions/ibexa_field_group_name.test new file mode 100644 index 0000000000..d90488afc7 --- /dev/null +++ b/tests/lib/MVC/Symfony/Templating/Twig/Extension/_fixtures/content_functions/ibexa_field_group_name.test @@ -0,0 +1,8 @@ +--TEST-- +"ibexa_field_group_name" function +--TEMPLATE-- +{{ ibexa_field_group_name('content') }} +--DATA-- +return []; +--EXPECT-- +Content