VersionHistoryField::getVersions()   B
last analyzed

Complexity

Conditions 6
Paths 2

Size

Total Lines 41
Code Lines 24

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
cc 6
eloc 24
nc 2
nop 0
dl 0
loc 41
rs 8.9137
c 0
b 0
f 0
1
<?php
2
3
namespace SilverCommerce\VersionHistoryField\Forms;
4
5
use SilverStripe\ORM\ArrayList;
6
use SilverStripe\Core\ClassInfo;
7
use SilverStripe\ORM\DataObject;
8
use SilverStripe\View\ArrayData;
9
use SilverStripe\Forms\FormField;
10
use SilverStripe\Versioned\Versioned;
11
use SilverStripe\Versioned\DataDifferencer;
12
13
class VersionHistoryField extends FormField
14
{
15
    /**
16
     * The dataobject that we want to se the version of
17
     * 
18
     * @var DataObject
19
     */
20
    protected $record;
21
22
    /**
23
     * Get record
24
     *
25
     * @return  DataObject
26
     */ 
27
    public function getRecord()
28
    {
29
        return $this->record;
30
    }
31
32
    /**
33
     * Set record
34
     *
35
     * @param  DataObject  $record  The dataobject that we want to se the version of
36
     *
37
     * @return  self
38
     */ 
39
    public function setRecord(DataObject $record)
40
    {
41
        $this->record = $record;
42
43
        return $this;
44
    }
45
46
    /**
47
     * Construct this field
48
     * 
49
     * @return void
50
     */
51
    public function __construct($name, $title = null, DataObject $record)
52
    {
53
        $this->setRecord($record);
54
55
        parent::__construct($name, $title);
56
    }
57
58
    /**
59
     * Get a list of versions of the current record.
60
     *
61
     * @return ArrayList
62
     */
63
    public function getVersions()
64
    {
65
        $record = $this->getRecord();
66
        $return = ArrayList::create();
67
68
        if ($record->hasExtension(Versioned::class)) {
69
            $versions = $record->AllVersions();
70
71
            foreach ($versions as $version) {
72
                $i = $version->Version;
73
                $diff = null;
74
75
                if ($i > 1) {
76
                    $frm = Versioned::get_version(
77
                        $record->ClassName,
78
                        $record->ID,
79
                        $i - 1
80
                    );
81
                    $to = Versioned::get_version(
82
                        $record->ClassName,
83
                        $record->ID,
84
                        $i
85
                    );
86
                    if ($frm && $to) {
87
                        $diff = DataDifferencer::create($frm, $to);
88
                        $diff->ignoreFields(["LastEdited"]);
89
                    }
90
                }
91
92
                $return->add(ArrayData::create(
93
                    [
94
                        "Version" => $version,
95
                        "Diff" => $diff
96
                    ]
97
                ));
98
            }
99
        }
100
101
        $this->extend("updateVersions", $versions);
102
103
        return $return;
104
    }
105
}
106