PullField::parseImageSources()   F
last analyzed

Complexity

Conditions 24
Paths 552

Size

Total Lines 180
Code Lines 160

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
eloc 160
dl 0
loc 180
rs 0.4977
c 0
b 0
f 0
cc 24
nc 552
nop 4

How to fix   Long Method    Complexity   

Long Method

Small methods make your code easier to understand, in particular if combined with a good name. Besides, if your method is small, finding a good name is usually much easier.

For example, if you find yourself adding comments to a method's body, this is usually a good sign to extract the commented part to a new method, and use the comment as a starting point when coming up with a good name for this new method.

Commonly applied refactorings include:

1
<?php
2
/**
3
 * SEOmatic plugin for Craft CMS
4
 *
5
 * A turnkey SEO implementation for Craft CMS that is comprehensive, powerful,
6
 * and flexible
7
 *
8
 * @link      https://nystudio107.com
9
 * @copyright Copyright (c) 2017 nystudio107
10
 */
11
12
namespace nystudio107\seomatic\helpers;
13
14
/**
15
 * @author    nystudio107
16
 * @package   Seomatic
17
 * @since     3.0.0
18
 */
19
class PullField
20
{
21
    // Constants
22
    // =========================================================================
23
24
25
    public const PULL_TEXT_FIELDS = [
26
        ['fieldName' => 'seoTitle', 'seoField' => 'seoTitle'],
27
        ['fieldName' => 'siteNamePosition', 'seoField' => 'siteNamePosition'],
28
        ['fieldName' => 'seoDescription', 'seoField' => 'seoDescription'],
29
        ['fieldName' => 'seoKeywords', 'seoField' => 'seoKeywords'],
30
        ['fieldName' => 'seoImageDescription', 'seoField' => 'seoImageDescription'],
31
        ['fieldName' => 'ogTitle', 'seoField' => 'seoTitle'],
32
        ['fieldName' => 'ogSiteNamePosition', 'seoField' => 'siteNamePosition'],
33
        ['fieldName' => 'ogDescription', 'seoField' => 'seoDescription'],
34
        ['fieldName' => 'ogImageDescription', 'seoField' => 'seoImageDescription'],
35
        ['fieldName' => 'twitterTitle', 'seoField' => 'seoTitle'],
36
        ['fieldName' => 'twitterSiteNamePosition', 'seoField' => 'siteNamePosition'],
37
        ['fieldName' => 'twitterCreator', 'seoField' => 'twitterHandle'],
38
        ['fieldName' => 'twitterDescription', 'seoField' => 'seoDescription'],
39
        ['fieldName' => 'twitterImageDescription', 'seoField' => 'seoImageDescription'],
40
    ];
41
42
    public const PULL_ASSET_FIELDS = [
43
        ['fieldName' => 'seoImage', 'seoField' => 'seoImage', 'transformModeField' => 'seoImageTransformMode', 'transformName' => 'base'],
44
        ['fieldName' => 'ogImage', 'seoField' => 'seoImage', 'transformModeField' => 'ogImageTransformMode', 'transformName' => 'facebook'],
45
        ['fieldName' => 'twitterImage', 'seoField' => 'seoImage', 'transformModeField' => 'twitterImageTransformMode', 'transformName' => 'twitter'],
46
    ];
47
48
49
    // Static Methods
50
    // =========================================================================
51
52
    /**
53
     * Set the text sources depending on the field settings
54
     *
55
     * @param string $elementName
56
     * @param        $globalsSettings
57
     * @param        $bundleSettings
58
     */
59
    public static function parseTextSources(string $elementName, &$globalsSettings, &$bundleSettings)
60
    {
61
        $objectPrefix = '';
62
        if (!empty($elementName)) {
63
            $elementName .= '.';
64
            $objectPrefix = '';
65
        }
66
        foreach (self::PULL_TEXT_FIELDS as $fields) {
67
            $fieldName = $fields['fieldName'];
68
            $source = $bundleSettings[$fieldName . 'Source'] ?? '';
69
            $sourceField = $bundleSettings[$fieldName . 'Field'] ?? '';
70
            if (!empty($source)) {
71
                $seoField = $fields['seoField'];
72
                switch ($source) {
73
                    case 'sameAsSeo':
74
                        $globalsSettings[$fieldName] =
75
                            '{{ seomatic.meta.' . $seoField . ' }}';
76
                        break;
77
78
                    case 'sameAsSiteTwitter':
79
                        $globalsSettings[$fieldName] =
80
                            '{{ seomatic.site.' . $seoField . ' }}';
81
                        break;
82
83
                    case 'sameAsGlobal':
84
                        $globalsSettings[$fieldName] =
85
                            '';
86
                        break;
87
88
                    case 'fromField':
89
                        $globalsSettings[$fieldName] =
90
                            '{{ seomatic.helper.extractTextFromField('
91
                            . $objectPrefix . $elementName . $sourceField
92
                            . ') }}';
93
                        break;
94
95
                    case 'fromUserField':
96
                        $globalsSettings[$fieldName] =
97
                            '{{ seomatic.helper.extractTextFromField('
98
                            . $objectPrefix . $elementName . 'author.' . $sourceField
99
                            . ') }}';
100
                        break;
101
102
                    case 'summaryFromField':
103
                        $globalsSettings[$fieldName] =
104
                            '{{ seomatic.helper.extractSummary(seomatic.helper.extractTextFromField('
105
                            . $objectPrefix . $elementName . $sourceField
106
                            . ')) }}';
107
                        break;
108
109
                    case 'keywordsFromField':
110
                        $globalsSettings[$fieldName] =
111
                            '{{ seomatic.helper.extractKeywords(seomatic.helper.extractTextFromField('
112
                            . $objectPrefix . $elementName . $sourceField
113
                            . ')) }}';
114
                        break;
115
116
                    case 'fromCustom':
117
                        break;
118
                }
119
            }
120
        }
121
    }
122
123
    /**
124
     * Set the image sources depending on the field settings
125
     *
126
     * @param $elementName
127
     * @param $globalsSettings
128
     * @param $bundleSettings
129
     * @param $siteId
130
     */
131
    public static function parseImageSources($elementName, &$globalsSettings, &$bundleSettings, $siteId = 0)
132
    {
133
        if (empty($siteId)) {
134
            $siteId = 0;
135
        }
136
        $objectPrefix = '';
137
        if (!empty($elementName)) {
138
            $elementName .= '.';
139
            $objectPrefix = '';
140
        }
141
        foreach (self::PULL_ASSET_FIELDS as $fields) {
142
            $fieldName = $fields['fieldName'];
143
            $fieldNameWidth = $fields['fieldName'] . 'Width';
144
            $fieldNameHeight = $fields['fieldName'] . 'Height';
145
            $source = $bundleSettings[$fieldName . 'Source'] ?? '';
146
            $ids = $bundleSettings[$fieldName . 'Ids'] ?? [];
147
            $sourceField = $bundleSettings[$fieldName . 'Field'] ?? '';
148
            if (!empty($source)) {
149
                $transformImage = $bundleSettings[$fieldName . 'Transform'] ?? true;
150
                $seoField = $fields['seoField'];
151
                $tranformModeField = $fields['transformModeField'];
152
                $transformMode = $bundleSettings[$tranformModeField] ?? 'crop';
153
                if (empty($transformMode)) {
154
                    $transformMode = 'crop';
155
                }
156
                $seoFieldWidth = $fields['seoField'] . 'Width';
157
                $seoFieldHeight = $fields['seoField'] . 'Height';
158
                $transformName = $fields['transformName'];
159
                // Quote all the things here for clarity
160
                $transformName = '"' . $transformName . '"';
161
                $transformMode = '"' . $transformMode . '"';
162
                // Special-case Twitter transforms
163
                if ($fieldName === 'twitterImage') {
164
                    $transformName = 'seomatic.helper.twitterTransform()';
165
                }
166
                // Reset the fields to empty by default
167
                if ($source !== 'fromUrl') {
168
                    $globalsSettings[$fieldName] = '';
169
                }
170
                $globalsSettings[$fieldNameWidth] = '';
171
                $globalsSettings[$fieldNameHeight] = '';
172
                // Handle transformed images
173
                if ($transformImage) {
174
                    switch ($source) {
175
                        case 'sameAsSeo':
176
                            $seoSource = $bundleSettings[$seoField . 'Source'] ?? '';
177
                            $seoIds = $bundleSettings[$seoField . 'Ids'] ?? [];
178
                            $seoSourceField = $bundleSettings[$seoField . 'Field'] ?? '';
179
                            if (!empty($seoSource)) {
180
                                switch ($seoSource) {
181
                                    case 'fromField':
182
                                        if (!empty($seoSourceField)) {
183
                                            $globalsSettings[$fieldName] = '{{ seomatic.helper.socialTransform('
184
                                                . $objectPrefix . $elementName . $seoSourceField . '.collect()[0]'
185
                                                . ', ' . $transformName
186
                                                . ', ' . $siteId
187
                                                . ', ' . $transformMode
188
                                                . ') }}';
189
                                            $globalsSettings[$fieldNameWidth] = '{{ seomatic.helper.socialTransformWidth('
190
                                                . $objectPrefix . $elementName . $seoSourceField . '.collect()[0]'
191
                                                . ', ' . $transformName
192
                                                . ', ' . $siteId
193
                                                . ', ' . $transformMode
194
                                                . ') }}';
195
                                            $globalsSettings[$fieldNameHeight] = '{{ seomatic.helper.socialTransformHeight('
196
                                                . $objectPrefix . $elementName . $seoSourceField . '.collect()[0]'
197
                                                . ', ' . $transformName
198
                                                . ', ' . $siteId
199
                                                . ', ' . $transformMode
200
                                                . ') }}';
201
                                        }
202
                                        break;
203
                                    case 'fromAsset':
204
                                        if (!empty($seoIds)) {
205
                                            $globalsSettings[$fieldName] = '{{ seomatic.helper.socialTransform('
206
                                                . $seoIds[0]
207
                                                . ', ' . $transformName
208
                                                . ', ' . $siteId
209
                                                . ', ' . $transformMode
210
                                                . ') }}';
211
                                            $globalsSettings[$fieldNameWidth] = '{{ seomatic.helper.socialTransformWidth('
212
                                                . $seoIds[0]
213
                                                . ', ' . $transformName
214
                                                . ', ' . $siteId
215
                                                . ', ' . $transformMode
216
                                                . ') }}';
217
                                            $globalsSettings[$fieldNameHeight] = '{{ seomatic.helper.socialTransformHeight('
218
                                                . $seoIds[0]
219
                                                . ', ' . $transformName
220
                                                . ', ' . $siteId
221
                                                . ', ' . $transformMode
222
                                                . ') }}';
223
                                        }
224
                                        break;
225
                                    default:
226
                                        $globalsSettings[$fieldName] = '{{ seomatic.meta.' . $seoField . ' }}';
227
                                        $globalsSettings[$fieldNameWidth] = '{{ seomatic.meta.' . $seoFieldWidth . ' }}';
228
                                        $globalsSettings[$fieldNameHeight] = '{{ seomatic.meta.' . $seoFieldHeight . ' }}';
229
                                        break;
230
                                }
231
                            }
232
                            break;
233
                        case 'fromField':
234
                            if (!empty($sourceField)) {
235
                                $globalsSettings[$fieldName] = '{{ seomatic.helper.socialTransform('
236
                                    . $objectPrefix . $elementName . $sourceField . '.collect()[0]'
237
                                    . ', ' . $transformName
238
                                    . ', ' . $siteId
239
                                    . ', ' . $transformMode
240
                                    . ') }}';
241
                                $globalsSettings[$fieldNameWidth] = '{{ seomatic.helper.socialTransformWidth('
242
                                    . $objectPrefix . $elementName . $sourceField . '.collect()[0]'
243
                                    . ', ' . $transformName
244
                                    . ', ' . $siteId
245
                                    . ', ' . $transformMode
246
                                    . ') }}';
247
                                $globalsSettings[$fieldNameHeight] = '{{ seomatic.helper.socialTransformHeight('
248
                                    . $objectPrefix . $elementName . $sourceField . '.collect()[0]'
249
                                    . ', ' . $transformName
250
                                    . ', ' . $siteId
251
                                    . ', ' . $transformMode
252
                                    . ') }}';
253
                            }
254
                            break;
255
                        case 'fromAsset':
256
                            if (!empty($ids)) {
257
                                $globalsSettings[$fieldName] = '{{ seomatic.helper.socialTransform('
258
                                    . $ids[0]
259
                                    . ', ' . $transformName
260
                                    . ', ' . $siteId
261
                                    . ', ' . $transformMode
262
                                    . ') }}';
263
                                $globalsSettings[$fieldNameWidth] = '{{ seomatic.helper.socialTransformWidth('
264
                                    . $ids[0]
265
                                    . ', ' . $transformName
266
                                    . ', ' . $siteId
267
                                    . ', ' . $transformMode
268
                                    . ') }}';
269
                                $globalsSettings[$fieldNameHeight] = '{{ seomatic.helper.socialTransformHeight('
270
                                    . $ids[0]
271
                                    . ', ' . $transformName
272
                                    . ', ' . $siteId
273
                                    . ', ' . $transformMode
274
                                    . ') }}';
275
                            }
276
                            break;
277
                    }
278
                } else {
279
                    switch ($source) {
280
                        case 'sameAsSeo':
281
                            $globalsSettings[$fieldName] = '{{ seomatic.meta.' . $seoField . ' }}';
282
                            $globalsSettings[$fieldNameWidth] = '{{ seomatic.meta.' . $seoFieldWidth . ' }}';
283
                            $globalsSettings[$fieldNameHeight] = '{{ seomatic.meta.' . $seoFieldHeight . ' }}';
284
                            break;
285
                        case 'fromField':
286
                            if (!empty($sourceField)) {
287
                                $globalsSettings[$fieldName] = '{{ '
288
                                    . $elementName . $sourceField . '.collect()[0].url'
289
                                    . ' }}';
290
                                $globalsSettings[$fieldNameWidth] = '{{ '
291
                                    . $elementName . $sourceField . '.collect()[0].width'
292
                                    . ' }}';
293
                                $globalsSettings[$fieldNameHeight] = '{{ '
294
                                    . $elementName . $sourceField . '.collect()[0].height'
295
                                    . ' }}';
296
                            }
297
                            break;
298
                        case 'fromAsset':
299
                            if (!empty($ids)) {
300
                                $globalsSettings[$fieldName] = '{{ craft.app.assets.assetById('
301
                                    . $ids[0]
302
                                    . ', ' . $siteId . ').url }}';
303
                                $globalsSettings[$fieldNameWidth] = '{{ craft.app.assets.assetById('
304
                                    . $ids[0]
305
                                    . ', ' . $siteId . ').width }}';
306
                                $globalsSettings[$fieldNameHeight] = '{{ craft.app.assets.assetById('
307
                                    . $ids[0]
308
                                    . ', ' . $siteId . ').height }}';
309
                            }
310
                            break;
311
                    }
312
                }
313
            }
314
        }
315
    }
316
}
317