PageExtension::onAfterWrite()   A
last analyzed

Complexity

Conditions 2
Paths 2

Size

Total Lines 6
Code Lines 4

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
cc 2
eloc 4
c 0
b 0
f 0
nc 2
nop 0
dl 0
loc 6
rs 10
1
<?php
2
3
namespace Sunnysideup\ElementalTemplate\Extensions;
4
5
use SilverStripe\CMS\Model\SiteTreeExtension;
6
use SilverStripe\Core\Config\Config;
7
use SilverStripe\Core\Extension;
8
use SilverStripe\Versioned\Versioned;
9
10
/**
11
 * Class \Sunnysideup\ElementalTemplate\Extensions\PageExtension
12
 *
13
 * @property Page|PageExtension $owner
14
 */
15
class PageExtension extends Extension
16
{
17
    /**
18
     * little helper to make sure we dont loop forever.
19
     *
20
     * @var bool
21
     */
22
    private $elementalTemplateInfiniteLoopCheck = false;
23
24
    public function onAfterWrite()
25
    {
26
        $owner = $this->getOwner();
27
        if (false === $this->elementalTemplateInfiniteLoopCheck) {
28
            $this->elementalTemplateInfiniteLoopCheck = true;
29
            $owner->findOrMakeDefaultElements();
30
        }
31
    }
32
33
    public function findOrMakeDefaultElements(): void
34
    {
35
        $owner = $this->getOwner();
36
        $write = false;
37
        if ($owner->hasMethod('ElementalArea') && ! $owner->ElementalArea()->Elements()->exists()) {
38
            foreach (
39
                array_keys([
40
                    'inherited' => null,
41
                    'uninherited' => Config::UNINHERITED,
42
                ])
43
                as $topVarNameAppendix
44
            ) {
45
                $className = $owner->ClassName;
46
                $list = (array) array_filter($className::config()->get('elemental_template_' . $topVarNameAppendix, Config::UNINHERITED) ?: []);
47
                foreach ($list as $areaName => $items) {
48
                    $area = $owner->{$areaName}();
49
                    foreach (['_top', '', '_bottom'] as $innerVarNameAppendix) {
50
                        $elems = (array) array_filter($items['elements' . $innerVarNameAppendix] ?? []);
51
                        if (! empty($elems)) {
52
                            if ($this->findOrMakeDefaultElementsInner($area, $elems)) {
53
                                $write = true;
54
                            }
55
                        }
56
                    }
57
                }
58
            }
59
        }
60
61
        if ($write) {
62
            $owner->writeToStage(Versioned::DRAFT);
63
        }
64
    }
65
66
    private function findOrMakeDefaultElementsInner($area, $elems): bool
67
    {
68
        $write = false;
69
        if ($area && $area->ID) {
70
            foreach ($elems as $className) {
71
                $elem = call_user_func([$className, 'create']);
72
                $elem->Title = 'Default ' . strtolower(Config::inst()->get($className, 'singular_name'));
73
                $elem->ParentID = $area->ID;
74
                // foreach($elementValues as $field => $value) {
75
                //     $elem->$field = $value;
76
                // }
77
                $elem->writeToStage(Versioned::DRAFT);
78
                $write = true;
79
            }
80
        }
81
82
        return $write;
83
    }
84
}
85