Skip to content

Commit 2e488e2

Browse files
authored
feature #322 [SFBundle] Easier translation of order-field (sstok)
This PR was merged into the 2.0-dev branch. Discussion ---------- | Q | A | ------------- | --- | Bug fix? | no | New feature? |yes | BC breaks? | yes/no | Deprecations? | no | Tickets | | License | MIT When the field is an order field but the translated label doesn't begin with an-`@` prepend the `@`-sign. Commits ------- c4d054b [SFBundle] Easier translation of order-field
2 parents 9381a80 + c4d054b commit 2e488e2

File tree

2 files changed

+93
-6
lines changed

2 files changed

+93
-6
lines changed
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,85 @@
1+
<?php
2+
3+
declare(strict_types=1);
4+
5+
/*
6+
* This file is part of the RollerworksSearch package.
7+
*
8+
* (c) Sebastiaan Stok <[email protected]>
9+
*
10+
* This source file is subject to the MIT license that is bundled
11+
* with this source code in the file LICENSE.
12+
*/
13+
14+
namespace Rollerworks\Bundle\SearchBundle\Tests;
15+
16+
use Prophecy\Argument;
17+
use Prophecy\PhpUnit\ProphecyTrait;
18+
use Rollerworks\Bundle\SearchBundle\TranslatorBasedAliasResolver;
19+
use Rollerworks\Bundle\SearchBundle\Type\TranslatableFieldTypeExtension;
20+
use Rollerworks\Bundle\SearchBundle\Type\TranslatableOrderFieldTypeExtension;
21+
use Rollerworks\Component\Search\Extension\Core\Type\TextType;
22+
use Rollerworks\Component\Search\Field\OrderFieldType;
23+
use Rollerworks\Component\Search\Test\SearchIntegrationTestCase;
24+
use Symfony\Component\Translation\TranslatableMessage;
25+
use Symfony\Contracts\Translation\TranslatorInterface;
26+
27+
/**
28+
* @internal
29+
*/
30+
final class TranslatorBasedAliasResolverTest extends SearchIntegrationTestCase
31+
{
32+
use ProphecyTrait;
33+
34+
/** @test */
35+
public function it_uses_field_name_when_label_is_empty(): void
36+
{
37+
$translator = $this->createMock(TranslatorInterface::class);
38+
$translator->expects($this->never())->method('trans');
39+
40+
$resolver = new TranslatorBasedAliasResolver($translator);
41+
$searchFactory = $this->getFactory();
42+
43+
$this->assertEquals('id', $resolver($searchFactory->createField('id', TextType::class)));
44+
$this->assertEquals('name', $resolver($searchFactory->createField('name', TextType::class)));
45+
$this->assertEquals('@id', $resolver($searchFactory->createField('@id', OrderFieldType::class)));
46+
}
47+
48+
/** @test */
49+
public function it_keeps_label_as_is_when_not_translatable(): void
50+
{
51+
$translator = $this->createMock(TranslatorInterface::class);
52+
$translator->expects($this->never())->method('trans');
53+
54+
$resolver = new TranslatorBasedAliasResolver($translator);
55+
$searchFactory = $this->getFactory();
56+
57+
$this->assertEquals('id2', $resolver($searchFactory->createField('id', TextType::class, ['label' => 'id2'])));
58+
$this->assertEquals('name2', $resolver($searchFactory->createField('name', TextType::class, ['label' => 'name2'])));
59+
$this->assertEquals('@id2', $resolver($searchFactory->createField('@id', OrderFieldType::class, ['label' => '@id2'])));
60+
$this->assertEquals('@id2', $resolver($searchFactory->createField('@id', OrderFieldType::class, ['label' => 'id2'])));
61+
}
62+
63+
/** @test */
64+
public function it_translates_label_when_translatable(): void
65+
{
66+
$translator = $this->prophesize(TranslatorInterface::class);
67+
$translator->trans(Argument::cetera())->will(static fn(array $args): string => $args[0][0] === '@' ? $args[0] . 'T' : 'T' . $args[0]);
68+
69+
$resolver = new TranslatorBasedAliasResolver($translator->reveal());
70+
$searchFactory = $this->getFactory();
71+
72+
$this->assertEquals('Tid2', $resolver($searchFactory->createField('id', TextType::class, ['label' => new TranslatableMessage('id2')])));
73+
$this->assertEquals('Tname2', $resolver($searchFactory->createField('name', TextType::class, ['label' => new TranslatableMessage('name2')])));
74+
$this->assertEquals('@id2T', $resolver($searchFactory->createField('@id', OrderFieldType::class, ['label' => new TranslatableMessage('@id2')])));
75+
$this->assertEquals('@Tid2', $resolver($searchFactory->createField('@id', OrderFieldType::class, ['label' => new TranslatableMessage('id2')])));
76+
}
77+
78+
protected function getTypeExtensions(): array
79+
{
80+
return [
81+
new TranslatableFieldTypeExtension(),
82+
new TranslatableOrderFieldTypeExtension(),
83+
];
84+
}
85+
}

lib/Symfony/SearchBundle/TranslatorBasedAliasResolver.php

+8-6
Original file line numberDiff line numberDiff line change
@@ -14,19 +14,17 @@
1414
namespace Rollerworks\Bundle\SearchBundle;
1515

1616
use Rollerworks\Component\Search\Field\FieldConfig;
17+
use Rollerworks\Component\Search\Field\OrderField;
1718
use Symfony\Contracts\Translation\TranslatableInterface;
1819
use Symfony\Contracts\Translation\TranslatorInterface;
1920

2021
final class TranslatorBasedAliasResolver
2122
{
22-
private TranslatorInterface $translator;
23-
24-
public function __construct(TranslatorInterface $translator)
23+
public function __construct(private TranslatorInterface $translator)
2524
{
26-
$this->translator = $translator;
2725
}
2826

29-
public function __invoke(FieldConfig $field)
27+
public function __invoke(FieldConfig $field): string
3028
{
3129
$label = $field->getOption('label');
3230

@@ -35,7 +33,11 @@ public function __invoke(FieldConfig $field)
3533
}
3634

3735
if ($label instanceof TranslatableInterface) {
38-
return $label->trans($this->translator);
36+
$label = $label->trans($this->translator);
37+
}
38+
39+
if ($field instanceof OrderField && $label[0] !== '@') {
40+
$label = '@' . $label;
3941
}
4042

4143
return $label;

0 commit comments

Comments
 (0)