Passed
Pull Request — master (#224)
by
unknown
02:53
created

performReadonlyTransformation()   A

Complexity

Conditions 1
Paths 1

Size

Total Lines 14
Code Lines 10

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
cc 1
eloc 10
nc 1
nop 0
dl 0
loc 14
rs 9.4285
c 0
b 0
f 0
1
<?php
2
3
namespace DNADesign\Elemental\Forms;
4
5
use SilverStripe\Forms\GridField\GridField;
6
use SilverStripe\Forms\CompositeField;
7
use SilverStripe\Forms\FieldGroup;
8
use SilverStripe\Forms\FieldList;
9
use SilverStripe\Forms\TabSet;
10
use SilverStripe\Forms\ReadonlyTransformation;
11
12
class ElementalAreaField extends GridField
13
{
14
    protected function getReadOnlyBlockReducer()
15
    {
16
        return function ($element) {
17
            $parentName = 'Element' . $element->ID;
18
            $elementFields = $element->getCMSFields();
19
            // Obtain highest impact fields for a summary (e.g. Title & Content)
20
            foreach ($elementFields as $field) {
21
                if (is_object($field) && $field instanceof TabSet) {
22
                    // Assign the fields of the first Tab in the TabSet - most regularly 'Root.Main'
23
                    $elementFields = $field->FieldList()->first()->FieldList();
24
                    break;
25
                }
26
            }
27
            // Set values (before names don't match anymore)
28
            $elementFields->setValues($element->getQueriedDatabaseFields());
29
            // Ensure field names are unique between elements on parent form
30
            $elementFields->recursiveWalk(function ($field) use ($parentName) {
31
                $field->setName($parentName . '_' . $field->getName());
32
            });
33
            // Combine into an appropriately named group
34
            $elementGroup = FieldGroup::create($elementFields);
35
            $elementGroup->setName($parentName);
36
            $elementGroup->addExtraClass('elemental-area__element--historic');
37
            // Also set the important data for the rendering Component
38
            $elementGroup->setSchemaData([
39
                'data' => [
40
                    'ElementID' => $element->ID,
41
                    'ElementType' => $element->getType(),
42
                    'ElementIcon' => $element->config()->icon,
43
                    'ElementTitle' => $element->Title,
44
                    'ElementEditLink' => $element->CMSEditLink(),
45
                    'extraContext' => 'HistoricElementView'
46
                ]
47
            ]);
48
49
            return $elementGroup;
50
        };
51
    }
52
53
    public function performReadonlyTransformation()
54
    {
55
        $readOnlyField = $this->castedCopy(CompositeField::class);
56
        $blockReducer = $this->getReadOnlyBlockReducer();
57
        $readOnlyField->setChildren(
58
            FieldList::create(
59
                array_map($blockReducer, $this->getList()->toArray())
60
            )
61
        );
62
        $readOnlyField = $readOnlyField->transform(new ReadonlyTransformation());
63
        $readOnlyField->setReadOnly(true);
64
        $readOnlyField->setName($this->getName());
65
        $readOnlyField->addExtraClass('elemental-area--read-only');
66
        return $readOnlyField;
67
    }
68
}
69