Passed
Pull Request — master (#25)
by Jacques
08:40 queued 03:46
created

AbstractUiElement::getUiElementName()   A

Complexity

Conditions 1
Paths 1

Size

Total Lines 3
Code Lines 1

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
eloc 1
c 0
b 0
f 0
dl 0
loc 3
rs 10
cc 1
nc 1
nop 0
1
<?php
2
3
declare(strict_types=1);
4
5
namespace MonsieurBiz\SyliusRichEditorPlugin\UiElement;
6
7
use MonsieurBiz\SyliusRichEditorPlugin\Exception\UndefinedUiElementTypeException;
8
use Symfony\Contracts\Translation\TranslatorInterface;
9
10
abstract class AbstractUiElement implements UiElementInterface, NameableInterface
11
{
12
    const TRANSLATION_PREFIX = 'monsieurbiz_richeditor_plugin.ui_element';
13
14
    /**
15
     * @var string
16
     */
17
    protected $type = '';
18
19
    /**
20
     * @var TranslatorInterface
21
     */
22
    private $translator;
23
24
    /**
25
     * @var string|null
26
     */
27
    private $uiElementName;
28
29
    /**
30
     * AbstractUiElement constructor.
31
     * @param TranslatorInterface $translator
32
     */
33
    public function __construct(TranslatorInterface $translator)
34
    {
35
        $this->translator = $translator;
36
    }
37
38
    /**
39
     * @return TranslatorInterface
40
     */
41
    public function getTranslator(): TranslatorInterface
42
    {
43
        return $this->translator;
44
    }
45
46
    /**
47
     * @return string
48
     * @throws UndefinedUiElementTypeException
49
     * @throws \ReflectionException
50
     */
51
    public function getType(): string
52
    {
53
        if (empty($this->type)) {
54
            $reflection = new \ReflectionClass(get_class($this));
55
            throw new UndefinedUiElementTypeException(sprintf(
56
                'Please add a type to your UI Element in class "%s". You can try to add this property `protected $type = \'%s\';`',
57
                $reflection->getName(),
58
                strtolower($reflection->getShortName()) // @TODO we can improve it with snakeCaseToCamelCaseNameConverter
59
            ));
60
        }
61
        return $this->type;
62
    }
63
64
    /**
65
     * @return string
66
     * @throws UndefinedUiElementTypeException
67
     */
68
    public function getTitle(): string
69
    {
70
        return $this->getTranslation('title');
71
    }
72
73
    /**
74
     * @return string
75
     * @throws UndefinedUiElementTypeException
76
     */
77
    public function getShortDescription(): string
78
    {
79
        return $this->getTranslation('short_description');
80
    }
81
82
    /**
83
     * @return string
84
     * @throws UndefinedUiElementTypeException
85
     */
86
    public function getDescription(): string
87
    {
88
        return $this->getTranslation('description');
89
    }
90
91
    /**
92
     * @param string $key
93
     *
94
     * @return string
95
     * @throws UndefinedUiElementTypeException
96
     */
97
    private function getTranslation(string $key): string
98
    {
99
        $translationKey = sprintf('%s.%s.%s', self::TRANSLATION_PREFIX, $this->getType(), $key);
100
        return $this->getTranslator()->trans($translationKey) ?? $translationKey;
101
    }
102
103
    /**
104
     * @return array
105
     */
106
    public function jsonSerialize(): array
107
    {
108
        return [
109
            'short_description' => $this->getShortDescription(),
110
            'description' => $this->getDescription(),
111
            'title' => $this->getTitle(),
112
            'image' => $this->getImage(),
113
            'fields' => $this->getFields(),
114
            'name' => $this->getUiElementName(),
115
        ];
116
    }
117
118
    /**
119
     * @return string
120
     * @throws UndefinedUiElementTypeException
121
     */
122
    public function getTemplate(): string
123
    {
124
        return sprintf('@MonsieurBizSyliusRichEditorPlugin/UiElement/%s.html.twig', $this->getType());
125
    }
126
127
    /**
128
     * @return string
129
     */
130
    public function getImage(): string
131
    {
132
        return '/bundles/monsieurbizsyliusricheditorplugin/images/ui_elements/default.svg';
133
    }
134
135
    /**
136
     * {@inheritDoc}
137
     */
138
    public function setUiElementName(string $name): void
139
    {
140
        $this->uiElementName = $name;
141
    }
142
143
    /**
144
     * {@inheritDoc}
145
     */
146
    public function getUiElementName(): ?string
147
    {
148
        return $this->uiElementName;
149
    }
150
151
}
152