FieldLayoutMutatorTrait   A
last analyzed

Complexity

Total Complexity 27

Size/Duplication

Total Lines 190
Duplicated Lines 0 %

Coupling/Cohesion

Components 1
Dependencies 2

Test Coverage

Coverage 0%

Importance

Changes 0
Metric Value
wmc 27
lcom 1
cbo 2
dl 0
loc 190
ccs 0
cts 96
cp 0
rs 10
c 0
b 0
f 0

14 Methods

Rating   Name   Duplication   Size   Complexity  
fieldLayoutType() 0 1 ?
internalSetFieldLayoutId() 0 1 ?
internalGetFieldLayoutId() 0 1 ?
A isFieldLayoutSet() 0 4 1
A setFieldLayoutId() 0 10 3
A getFieldLayoutId() 0 8 3
A setFieldLayout() 0 12 2
A getFieldLayout() 0 22 5
A setTypeOnFieldLayout() 0 6 2
A resolveFieldLayout() 0 8 2
A resolveFieldLayoutFromId() 0 8 2
A resolveFieldLayoutFromType() 0 6 1
A createFieldLayout() 0 8 1
A verifyFieldLayout() 0 20 5
1
<?php
2
3
/**
4
 * @copyright  Copyright (c) Flipbox Digital Limited
5
 * @license    https://github.com/flipboxfactory/craft-ember/blob/master/LICENSE
6
 * @link       https://github.com/flipboxfactory/craft-ember/
7
 */
8
9
namespace flipbox\craft\ember\objects;
10
11
use Craft;
12
use craft\models\FieldLayout;
13
14
/**
15
 * This trait accepts both an FieldLayout or and FieldLayout Id and ensures that the both
16
 * the FieldLayout and the Id are in sync. If one changes (and does not match the other) it
17
 * resolves (removes / updates) the other.
18
 *
19
 * In addition, this trait is primarily useful when a new FieldLayout is set and saved; the FieldLayout
20
 * Id can be retrieved without needing to explicitly set the newly created Id.
21
 *
22
 * @property FieldLayout|null $fieldLayout
23
 *
24
 * @author Flipbox Factory <[email protected]>
25
 * @since 2.0.0
26
 */
27
trait FieldLayoutMutatorTrait
28
{
29
    /**
30
     * @var FieldLayout|null
31
     */
32
    private $fieldLayout;
33
34
    /**
35
     * @return string
36
     */
37
    abstract protected static function fieldLayoutType(): string;
38
39
    /**
40
     * Internally set the FieldLayout Id.  This can be overridden. A record for example
41
     * should use `setAttribute`.
42
     *
43
     * @param int|null $id
44
     * @return $this
45
     */
46
    abstract protected function internalSetFieldLayoutId(int $id = null);
47
48
    /**
49
     * Internally get the FieldLayout Id.  This can be overridden.  A record for example
50
     * should use `getAttribute`.
51
     *
52
     * @return int|null
53
     */
54
    abstract protected function internalGetFieldLayoutId();
55
56
    /**
57
     * @return bool
58
     */
59
    public function isFieldLayoutSet(): bool
60
    {
61
        return null !== $this->fieldLayout;
62
    }
63
64
    /**
65
     * @param $id
66
     * @return $this
67
     */
68
    public function setFieldLayoutId(int $id)
69
    {
70
        $this->internalSetFieldLayoutId($id);
71
72
        if (null !== $this->fieldLayout && $id != $this->fieldLayout->id) {
73
            $this->fieldLayout = null;
74
        }
75
76
        return $this;
77
    }
78
79
    /**
80
     * Get associated fieldLayoutId
81
     *
82
     * @return int|null
83
     */
84
    public function getFieldLayoutId()
85
    {
86
        if (null === $this->internalGetFieldLayoutId() && null !== $this->fieldLayout) {
87
            $this->setFieldLayoutId($this->fieldLayout->id);
88
        }
89
90
        return $this->internalGetFieldLayoutId();
91
    }
92
93
    /**
94
     * @param mixed $fieldLayout
95
     * @return $this
96
     */
97
    public function setFieldLayout($fieldLayout = null)
98
    {
99
        $this->fieldLayout = null;
100
        $this->internalSetFieldLayoutId(null);
101
102
        if (null !== ($fieldLayout = $this->verifyFieldLayout($fieldLayout))) {
103
            $this->fieldLayout = $fieldLayout;
104
            $this->internalSetFieldLayoutId($fieldLayout->id);
105
        }
106
107
        return $this;
108
    }
109
110
    /**
111
     * @return FieldLayout
112
     */
113
    public function getFieldLayout(): FieldLayout
114
    {
115
        if ($this->fieldLayout === null) {
116
            if (!$fieldLayout = $this->resolveFieldLayout()) {
117
                $fieldLayout = $this->createFieldLayout();
118
            }
119
120
            $this->setFieldLayout($fieldLayout)
121
                ->setTypeOnFieldLayout($fieldLayout);
122
123
            return $fieldLayout;
124
        }
125
126
        $fieldLayoutId = $this->internalGetFieldLayoutId();
127
        if ($fieldLayoutId !== null && $fieldLayoutId != $this->fieldLayout->id) {
128
            $this->fieldLayout = null;
129
            return $this->getFieldLayout();
130
        }
131
132
        $this->setTypeOnFieldLayout($this->fieldLayout);
133
        return $this->fieldLayout;
134
    }
135
136
    /**
137
     * @param FieldLayout $fieldLayout
138
     */
139
    protected function setTypeOnFieldLayout(FieldLayout $fieldLayout)
140
    {
141
        if ($fieldLayout->type === null) {
142
            $fieldLayout->type = static::fieldLayoutType();
143
        }
144
    }
145
146
    /**
147
     * @return FieldLayout|null
148
     */
149
    protected function resolveFieldLayout()
150
    {
151
        if ($fieldLayout = $this->resolveFieldLayoutFromId()) {
152
            return $fieldLayout;
153
        }
154
155
        return $this->resolveFieldLayoutFromType();
156
    }
157
158
    /**
159
     * @return FieldLayout|null
160
     */
161
    private function resolveFieldLayoutFromId()
162
    {
163
        if (null === ($fieldLayoutId = $this->internalGetFieldLayoutId())) {
164
            return null;
165
        }
166
167
        return Craft::$app->getFields()->getLayoutById($fieldLayoutId);
168
    }
169
170
    /**
171
     * @return FieldLayout|null
172
     */
173
    private function resolveFieldLayoutFromType()
174
    {
175
        return Craft::$app->getFields()->getLayoutByType(
176
            static::fieldLayoutType()
177
        );
178
    }
179
180
    /**
181
     * @return FieldLayout
182
     */
183
    private function createFieldLayout(): FieldLayout
184
    {
185
        $fieldLayoutModel = new FieldLayout([
186
            'type' => $this->fieldLayoutType()
187
        ]);
188
189
        return $fieldLayoutModel;
190
    }
191
192
    /**
193
     * @param $fieldLayout
194
     * @return FieldLayout|null
195
     */
196
    protected function verifyFieldLayout($fieldLayout = null): FieldLayout
197
    {
198
        if (null === $fieldLayout) {
199
            return null;
200
        }
201
202
        if ($fieldLayout instanceof FieldLayout) {
203
            return $fieldLayout;
204
        }
205
206
        if (is_numeric($fieldLayout)) {
207
            return Craft::$app->getFields()->getLayoutById($fieldLayout);
208
        }
209
210
        if (is_string($fieldLayout)) {
211
            return Craft::$app->getFields()->getLayoutByType($fieldLayout);
212
        }
213
214
        return null;
215
    }
216
}
217