Completed
Push — master ( b75468...77a8d7 )
by Timo
04:41
created

DataComponent::remember()   A

Complexity

Conditions 1
Paths 1

Size

Total Lines 6
Code Lines 3

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 3
CRAP Score 1

Importance

Changes 0
Metric Value
dl 0
loc 6
ccs 3
cts 3
cp 1
rs 9.4285
c 0
b 0
f 0
cc 1
eloc 3
nc 1
nop 0
crap 1
1
<?php
2
3
namespace hamburgscleanest\DataTables\Models;
4
5
use hamburgscleanest\DataTables\Facades\SessionHelper;
6
use Illuminate\Database\Eloquent\Builder;
7
use Illuminate\Http\Request;
8
9
/**
10
 * Class DataComponent
11
 * @package hamburgscleanest\DataTables\Models
12
 */
13
abstract class DataComponent {
14
15
    /** @var Builder */
16
    protected $_queryBuilder;
17
18
    /** @var Request */
19
    protected $_request;
20
21
    /** @var bool */
22
    protected $_rememberState = false;
23
24
    /** @var string */
25
    protected $_rememberKey = 'global';
26
27
    /**
28
     * You cannot count the data when ordering.
29
     * Disables ordering temporary.
30
     *
31
     * @return int
32
     */
33 6
    public function getQueryCount(): int
34
    {
35
        /** @var \Illuminate\Database\Query\Builder $query */
36 6
        $query = $this->_queryBuilder->getQuery();
37
38 6
        $oldOrders = $query->orders;
39 6
        $oldLimit = $query->limit;
40 6
        $oldOffset = $query->offset;
41
42 6
        $query->orders = null;
43 6
        $query->limit = null;
44 6
        $query->offset = null;
45
46 6
        $dataCount = $query->count();
47
48 6
        $query->orders = $oldOrders;
49 6
        $query->limit = $oldLimit;
50 6
        $query->offset = $oldOffset;
51
52 6
        return $dataCount;
53
    }
54
55
    /**
56
     * @param Builder $queryBuilder
57
     * @param Request $request
58
     */
59 24
    public function init(Builder $queryBuilder, Request $request)
60
    {
61 24
        $this->_request = $request;
62 24
        $this->_queryBuilder = $queryBuilder;
63
64 24
        if ($this->_rememberState)
65
        {
66 3
            $this->_readFromSession();
67
        }
68 24
        $this->_afterInit();
69 24
    }
70
71
    /**
72
     * Everything that needs to be read when the state is remembered.
73
     * Is called before _afterInit(), so that session values can be overriden.
74
     */
75 2
    protected function _readFromSession()
76
    {
77
78 2
    }
79
80
    /**
81
     * Initalize fields after the query builder instance and the request is set.
82
     *
83
     * TODO: Refactor..
84
     */
85 3
    protected function _afterInit()
86
    {
87
88 3
    }
89
90
    /**
91
     * Remember the state of the data component.
92
     *
93
     * @return DataComponent
94
     */
95 3
    public function remember(): DataComponent
96
    {
97 3
        $this->_rememberState = true;
98
99 3
        return $this;
100
    }
101
102
    /**
103
     * Forget the state of the data component.
104
     *
105
     * @return DataComponent
106
     */
107 1
    public function forget(): DataComponent
108
    {
109 1
        $this->_rememberState = false;
110 1
        if ($this->_request !== null)
111
        {
112 1
            SessionHelper::removeState($this->_request, $this->_rememberKey);
113
        }
114
115 1
        return $this;
116
    }
117
118 13
    public function transformData()
119
    {
120 13
        if ($this->_rememberState)
121
        {
122 2
            $this->_storeInSession();
123
        }
124 13
        $this->_shapeData();
125 13
    }
126
127
    /**
128
     * Use this function to save your state in the session.
129
     * This is called just before rendering, so all dynamically added stuff etc. is considered.
130
     */
131 1
    protected function _storeInSession()
132
    {
133
134 1
    }
135
136
    /**
137
     * @return Builder
138
     */
139
    abstract protected function _shapeData(): Builder;
140
141
    /**
142
     * @return string
143
     */
144
    abstract public function render(): string;
145
}