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

ElementalAreasValidator::php()   B

Complexity

Conditions 8
Paths 3

Size

Total Lines 39
Code Lines 27

Duplication

Lines 0
Ratio 0 %

Importance

Changes 1
Bugs 0 Features 0
Metric Value
cc 8
eloc 27
c 1
b 0
f 0
nc 3
nop 1
dl 0
loc 39
rs 8.4444
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 = '3'; // TODO
26
                $className = $elementData['PageElements_3_ClassName']; // TODO
27
                /** @var BaseElement $element */
28
                $element = DataObject::get_by_id($className, $id, false);
0 ignored issues
show
Bug introduced by
$id of type string is incompatible with the type boolean|integer expected by parameter $idOrCache of SilverStripe\ORM\DataObject::get_by_id(). ( Ignorable by Annotation )

If this is a false-positive, you can also ignore this issue in your code via the ignore-type  annotation

28
                $element = DataObject::get_by_id($className, /** @scrutinizer ignore-type */ $id, false);
Loading history...
29
                $fields = array_keys(Config::inst()->get($className, 'db'));
30
                foreach ($fields as $field) {
31
                    if (!array_key_exists('PageElements_3_' . $field, $elementData)) { // TODO
32
                        continue;
33
                    }
34
                    $value = $elementData['PageElements_3_' . $field]; // TODO
35
                    $element->$field = $value;
36
                }
37
                /** @var ValidationResult $validationResult */
38
                $validationResult = $element->validate();
39
                if ($validationResult->isValid()) {
40
                    continue;
41
                }
42
                foreach ($validationResult->getMessages() as $message) {
43
                    $this->validationError(
44
                        'PageElements_3_' . $message['fieldName'], // TODO
45
                        $message['message'],
46
                        $message['messageType'],
47
                        $message['messageCast']
48
                    );
49
                }
50
                $valid = false;
51
            }
52
        }
53
        return $valid;
54
    }
55
56
    /**
57
     * @param string $parentClassName
58
     * @return array
59
     */
60
    private function getElementalAreaFieldNames(string $parentClassName): array
61
    {
62
        $fieldNames = [];
63
        $hasOnes = Config::inst()->get($parentClassName, 'has_one');
64
        foreach ($hasOnes as $fieldName => $className) {
65
            if ($className !== ElementalArea::class) {
66
                continue;
67
            }
68
            $fieldNames[] = $fieldName;
69
        }
70
        return $fieldNames;
71
    }
72
}
73