Passed
Pull Request — 4 (#930)
by Steve
03:03
created

ElementalAreasValidator   A

Complexity

Total Complexity 15

Size/Duplication

Total Lines 74
Duplicated Lines 0 %

Importance

Changes 1
Bugs 0 Features 0
Metric Value
eloc 41
c 1
b 0
f 0
dl 0
loc 74
rs 10
wmc 15

3 Methods

Rating   Name   Duplication   Size   Complexity  
A getElementID() 0 7 3
B php() 0 42 9
A getElementalAreaFieldNames() 0 11 3
1
<?php
2
3
namespace DNADesign\Elemental\Validators;
4
5
use DNADesign\Elemental\Models\ElementalArea;
6
use SilverStripe\Core\Config\Config;
7
use SilverStripe\Forms\Validator;
8
use SilverStripe\ORM\DataObject;
9
10
class ElementalAreasValidator extends Validator
11
{
12
    /**
13
     * @param array $data
14
     */
15
    public function php($data)
16
    {
17
        $valid = true;
18
        $areaFieldNames = $this->getElementalAreaFieldNames($data['ClassName']);
19
        foreach ($areaFieldNames as $areaFieldName) {
20
            $elementsData = $data[$areaFieldName];
21
            if (!$elementsData) {
22
                continue;
23
            }
24
            foreach (array_values($elementsData) as $elementData) {
25
                $id = $this->getElementID($elementData);
26
                $className = $elementData["PageElements_{$id}_ClassName"] ?? '';
27
                if ($className) {
28
                    continue;
29
                }
30
                /** @var BaseElement $element */
31
                $element = DataObject::get_by_id($className, $id, false);
32
                $fields = array_keys(Config::inst()->get($className, 'db'));
33
                foreach ($fields as $field) {
34
                    $fieldName = "PageElements_{$id}_{$field}";
35
                    if (!array_key_exists($fieldName, $elementData)) {
36
                        continue;
37
                    }
38
                    $element->$field = $elementData[$fieldName];
39
                }
40
                /** @var ValidationResult $validationResult */
41
                $validationResult = $element->validate();
42
                if ($validationResult->isValid()) {
43
                    continue;
44
                }
45
                foreach ($validationResult->getMessages() as $message) {
46
                    $this->validationError(
47
                        "PageElements_{$id}_{$message['fieldName']}",
48
                        $message['message'],
49
                        $message['messageType'],
50
                        $message['messageCast']
51
                    );
52
                }
53
                $valid = false;
54
            }
55
        }
56
        return $valid;
57
    }
58
59
    private function getElementID($elementData)
60
    {
61
        foreach (array_keys($elementData) as $key) {
62
            if (!preg_match('#^PageElements_([0-9]+)_(.+)$#', $key, $match)) {
63
                continue;
64
            }
65
            return $match[1];
66
        }
67
    }
68
69
    /**
70
     * @param string $parentClassName
71
     * @return array
72
     */
73
    private function getElementalAreaFieldNames(string $parentClassName): array
74
    {
75
        $fieldNames = [];
76
        $hasOnes = Config::inst()->get($parentClassName, 'has_one');
77
        foreach ($hasOnes as $fieldName => $className) {
78
            if ($className !== ElementalArea::class) {
79
                continue;
80
            }
81
            $fieldNames[] = $fieldName;
82
        }
83
        return $fieldNames;
84
    }
85
}
86