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

ElementalAreaField::getReadOnlyBlockReducer()   B

Complexity

Conditions 4
Paths 1

Size

Total Lines 35
Code Lines 22

Duplication

Lines 0
Ratio 0 %

Importance

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