Test Failed
Push — v4 ( 40e661...e320c9 )
by Andrew
44:16 queued 21:15
created

EagerLoad::matrixFieldEagerLoadMap()   A

Complexity

Conditions 5
Paths 5

Size

Total Lines 19
Code Lines 12

Duplication

Lines 0
Ratio 0 %

Importance

Changes 2
Bugs 0 Features 0
Metric Value
eloc 12
c 2
b 0
f 0
dl 0
loc 19
rs 9.5555
cc 5
nc 5
nop 2
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) nystudio107
10
 */
11
12
namespace nystudio107\seomatic\helpers;
13
14
use craft\fields\Matrix;
15
use craft\models\FieldLayout;
16
use craft\models\Section;
17
use nystudio107\seomatic\helpers\Field as FieldHelper;
18
use nystudio107\seomatic\models\MetaBundle;
19
use nystudio107\seomatic\Seomatic;
20
21
/**
22
 * @author    nystudio107
23
 * @package   Seomatic
24
 * @since     4.1.11
25
 */
26
class EagerLoad
27
{
28
    /**
29
     * Build an eager loading map based on the field layouts from the $metaBundle's
30
     * "Section"
31
     *
32
     * @param MetaBundle $metaBundle
33
     * @return array
34
     */
35
    public static function sitemapEagerLoadMap($metaBundle): array
36
    {
37
        $eagerLoadMap = [];
38
        $transform = $metaBundle->metaSitemapVars->sitemapAssetTransform;
39
        if ($transform === 'null' || empty($transform)) {
40
            $transform = null;
41
        }
42
        $seoElement = Seomatic::$plugin->seoElements->getSeoElementByMetaBundleType($metaBundle->sourceBundleType);
43
        /** @var Section $section */
44
        $section = $seoElement::sourceModelFromHandle($metaBundle->sourceHandle);
45
        if (method_exists($section, 'getEntryTypes')) {
46
            $entryTypes = $section->getEntryTypes();
47
            foreach ($entryTypes as $entryType) {
48
                $layout = $entryType->getFieldLayout();
49
                $eagerLoadMap[] = self::assetFieldEagerLoadMap($layout, $transform);
50
                $eagerLoadMap[] = self::matrixFieldEagerLoadMap($layout, $transform);
51
            }
52
        }
53
        if (method_exists($section, 'getFieldLayout')) {
54
            $layout = $section->getFieldLayout();
55
            $eagerLoadMap[] = self::assetFieldEagerLoadMap($layout, $transform);
56
            $eagerLoadMap[] = self::matrixFieldEagerLoadMap($layout, $transform);
57
        }
58
        // Flatten the array
59
        return array_merge([], ...$eagerLoadMap);
60
    }
61
62
    /**
63
     * Return an array of field handles for eager loading .with() in Element queries
64
     *
65
     * @param FieldLayout $layout
66
     * @param ?string $transform
67
     * @return array
68
     */
69
    public static function assetFieldEagerLoadMap($layout, $transform): array
70
    {
71
        $fieldMap = [];
72
        $assetFields = FieldHelper::fieldsOfTypeFromLayout(FieldHelper::ASSET_FIELD_CLASS_KEY, $layout);
73
        foreach ($assetFields as $assetFieldHandle) {
74
            $fieldMap[] = empty($transform) ? $assetFieldHandle : [$assetFieldHandle, ['withTransforms' => $transform]];
75
        }
76
77
        return $fieldMap;
78
    }
79
80
    /**
81
     * Return an array of field handles for eager loading .with() in Element queries
82
     *
83
     * @param FieldLayout $layout
84
     * @param ?string $transform
85
     * @return array
86
     */
87
    public static function matrixFieldEagerLoadMap($layout, $transform): array
88
    {
89
        $fieldMap = [];
90
        $matrixFields = FieldHelper::fieldsOfTypeFromLayout(FieldHelper::BLOCK_FIELD_CLASS_KEY, $layout);
91
        foreach ($matrixFields as $matrixFieldHandle) {
92
            /** @var Matrix $matrixField */
93
            $matrixField = $layout->getFieldByHandle($matrixFieldHandle);
94
            $blockTypes = $matrixField->getBlockTypes();
95
            foreach ($blockTypes as $blockType) {
96
                $blockName = $blockType->handle;
0 ignored issues
show
Unused Code introduced by
The assignment to $blockName is dead and can be removed.
Loading history...
97
                $matrixLayout = $blockType->getFieldLayout();
98
                $assetFields = FieldHelper::fieldsOfTypeFromLayout(FieldHelper::ASSET_FIELD_CLASS_KEY, $matrixLayout);
99
                foreach ($assetFields as $assetFieldHandle) {
100
                    $fieldMap[] = empty($transform) ? "$matrixFieldHandle.$assetFieldHandle" : ["$matrixFieldHandle.$assetFieldHandle", ['withTransforms' => $transform]];
101
                }
102
            }
103
        }
104
105
        return $fieldMap;
106
    }
107
}
108