Completed
Push — master ( 0ea243...da58d4 )
by Henry
10:25 queued 33s
created

Content::_setIdByParameter()   B

Complexity

Conditions 6
Paths 6

Size

Total Lines 57

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 12
CRAP Score 6

Importance

Changes 0
Metric Value
dl 0
loc 57
ccs 12
cts 12
cp 1
rs 8.3158
c 0
b 0
f 0
cc 6
nc 6
nop 0
crap 6

How to fix   Long Method   

Long Method

Small methods make your code easier to understand, in particular if combined with a good name. Besides, if your method is small, finding a good name is usually much easier.

For example, if you find yourself adding comments to a method's body, this is usually a good sign to extract the commented part to a new method, and use the comment as a starting point when coming up with a good name for this new method.

Commonly applied refactorings include:

1
<?php
2
namespace Redaxscript\Bootstrap;
3
4
use Redaxscript\Db;
5
use Redaxscript\Model;
6
use Redaxscript\Validator;
7
8
/**
9
 * children class to boot the content
10
 *
11
 * @since 3.1.0
12
 *
13
 * @package Redaxscript
14
 * @category Bootstrap
15
 * @author Henry Ruhs
16
 */
17
18
class Content extends BootstrapAbstract
19
{
20
	/**
21
	 * automate run
22
	 *
23
	 * @since 3.1.0
24
	 */
25
26 9
	public function autorun() : void
27
	{
28 9
		if ($this->_registry->get('dbStatus') === 2)
29
		{
30 9
			$this->_setContent();
31
		}
32 9
	}
33
34
	/**
35
	 * set the content
36
	 *
37
	 * @since 3.1.0
38
	 */
39
40 9
	protected function _setContent() : void
41
	{
42 9
		$aliasValidator = new Validator\Alias();
43 9
		$firstParameter = $this->_registry->get('firstParameter');
44 9
		$secondParameter = $this->_registry->get('secondParameter');
45 9
		$lastParameter = $this->_registry->get('lastParameter');
46 9
		$lastSubParameter = $this->_registry->get('lastSubParameter');
47 9
		$isRoot = !$lastParameter && !$lastSubParameter;
48 9
		$isAdmin = $firstParameter === 'admin' && !$secondParameter;
49
50
		/* set by the root */
51
52 9
		if ($isRoot || $isAdmin)
53
		{
54 3
			$this->_setTableByRoot();
55 3
			$this->_setIdByRoot();
56
		}
57
58
		/* else set by the parameter */
59
60 6
		else if (!$aliasValidator->validate($firstParameter, 'system'))
0 ignored issues
show
Bug introduced by redaxmedia
It seems like $firstParameter defined by $this->_registry->get('firstParameter') on line 43 can also be of type array; however, Redaxscript\Validator\Alias::validate() does only seem to accept null|string, maybe add an additional type check?

If a method or function can return multiple different values and unless you are sure that you only can receive a single value in this context, we recommend to add an additional type check:

/**
 * @return array|string
 */
function returnsDifferentValues($x) {
    if ($x) {
        return 'foo';
    }

    return array();
}

$x = returnsDifferentValues($y);
if (is_array($x)) {
    // $x is an array.
}

If this a common case that PHP Analyzer should handle natively, please let us know by opening an issue.

Loading history...
61
		{
62 5
			$this->_setTableByParameter();
63 5
			$this->_setIdByParameter();
64
		}
65 9
	}
66
67
	/**
68
	 * set the table by root
69
	 *
70
	 * @since 3.1.0
71
	 */
72
73 3
	protected function _setTableByRoot() : void
74
	{
75 3
		$settingModel = new Model\Setting();
76 3
		$homepageId = $settingModel->get('homepage');
77 3
		$table = $homepageId > 0 ? 'articles' : 'categories';
78
79
		/* set the registry */
80
81 3
		$this->_registry->set('firstTable', $table);
82 3
		$this->_registry->set('lastTable', $table);
83 3
	}
84
85
	/**
86
	 * set the table by parameter
87
	 *
88
	 * @since 3.1.0
89
	 */
90
91 5
	protected function _setTableByParameter() : void
92
	{
93 5
		$contentModel = new Model\Content();
94 5
		$firstParameter = $this->_registry->get('firstParameter');
95 5
		$secondParameter = $this->_registry->get('secondParameter');
96 5
		$thirdParameter = $this->_registry->get('thirdParameter');
97 5
98
		/* set the registry */
99
100
		if ($thirdParameter)
101 5
		{
102 5
			$this->_registry->set('thirdTable', $contentModel->getTableByAlias($thirdParameter));
0 ignored issues
show
Bug introduced by redaxmedia
It seems like $thirdParameter defined by $this->_registry->get('thirdParameter') on line 96 can also be of type array; however, Redaxscript\Model\Content::getTableByAlias() does only seem to accept null|string, maybe add an additional type check?

If a method or function can return multiple different values and unless you are sure that you only can receive a single value in this context, we recommend to add an additional type check:

/**
 * @return array|string
 */
function returnsDifferentValues($x) {
    if ($x) {
        return 'foo';
    }

    return array();
}

$x = returnsDifferentValues($y);
if (is_array($x)) {
    // $x is an array.
}

If this a common case that PHP Analyzer should handle natively, please let us know by opening an issue.

Loading history...
103
			if ($this->_registry->get('thirdTable'))
104 4
			{
105
				$this->_registry->set('lastTable', $this->_registry->get('thirdTable'));
106 5
				$this->_registry->set('secondTable', $contentModel->getTableByAlias($secondParameter));
0 ignored issues
show
Bug introduced by redaxmedia
It seems like $secondParameter defined by $this->_registry->get('secondParameter') on line 95 can also be of type array; however, Redaxscript\Model\Content::getTableByAlias() does only seem to accept null|string, maybe add an additional type check?

If a method or function can return multiple different values and unless you are sure that you only can receive a single value in this context, we recommend to add an additional type check:

/**
 * @return array|string
 */
function returnsDifferentValues($x) {
    if ($x) {
        return 'foo';
    }

    return array();
}

$x = returnsDifferentValues($y);
if (is_array($x)) {
    // $x is an array.
}

If this a common case that PHP Analyzer should handle natively, please let us know by opening an issue.

Loading history...
107
				if ($this->_registry->get('secondTable'))
108 3
				{
109
					$this->_registry->set('firstTable', $contentModel->getTableByAlias($firstParameter));
0 ignored issues
show
Bug introduced by redaxmedia
It seems like $firstParameter defined by $this->_registry->get('firstParameter') on line 94 can also be of type array; however, Redaxscript\Model\Content::getTableByAlias() does only seem to accept null|string, maybe add an additional type check?

If a method or function can return multiple different values and unless you are sure that you only can receive a single value in this context, we recommend to add an additional type check:

/**
 * @return array|string
 */
function returnsDifferentValues($x) {
    if ($x) {
        return 'foo';
    }

    return array();
}

$x = returnsDifferentValues($y);
if (is_array($x)) {
    // $x is an array.
}

If this a common case that PHP Analyzer should handle natively, please let us know by opening an issue.

Loading history...
110 5
				}
111
			}
112 5
		}
113
		else if ($secondParameter)
114 5
		{
115
			$this->_registry->set('secondTable', $contentModel->getTableByAlias($secondParameter));
0 ignored issues
show
Bug introduced by Henry Ruhs
It seems like $secondParameter defined by $this->_registry->get('secondParameter') on line 95 can also be of type array; however, Redaxscript\Model\Content::getTableByAlias() does only seem to accept null|string, maybe add an additional type check?

If a method or function can return multiple different values and unless you are sure that you only can receive a single value in this context, we recommend to add an additional type check:

/**
 * @return array|string
 */
function returnsDifferentValues($x) {
    if ($x) {
        return 'foo';
    }

    return array();
}

$x = returnsDifferentValues($y);
if (is_array($x)) {
    // $x is an array.
}

If this a common case that PHP Analyzer should handle natively, please let us know by opening an issue.

Loading history...
116
			if ($this->_registry->get('secondTable'))
117
			{
118
				$this->_registry->set('lastTable', $this->_registry->get('secondTable'));
119
				$this->_registry->set('firstTable', $contentModel->getTableByAlias($firstParameter));
0 ignored issues
show
Bug introduced by redaxmedia
It seems like $firstParameter defined by $this->_registry->get('firstParameter') on line 94 can also be of type array; however, Redaxscript\Model\Content::getTableByAlias() does only seem to accept null|string, maybe add an additional type check?

If a method or function can return multiple different values and unless you are sure that you only can receive a single value in this context, we recommend to add an additional type check:

/**
 * @return array|string
 */
function returnsDifferentValues($x) {
    if ($x) {
        return 'foo';
    }

    return array();
}

$x = returnsDifferentValues($y);
if (is_array($x)) {
    // $x is an array.
}

If this a common case that PHP Analyzer should handle natively, please let us know by opening an issue.

Loading history...
120
			}
121
		}
122 3
		else if ($firstParameter)
123
		{
124 3
			$this->_registry->set('firstTable', $contentModel->getTableByAlias($firstParameter));
0 ignored issues
show
Bug introduced by redaxmedia
It seems like $firstParameter defined by $this->_registry->get('firstParameter') on line 94 can also be of type array; however, Redaxscript\Model\Content::getTableByAlias() does only seem to accept null|string, maybe add an additional type check?

If a method or function can return multiple different values and unless you are sure that you only can receive a single value in this context, we recommend to add an additional type check:

/**
 * @return array|string
 */
function returnsDifferentValues($x) {
    if ($x) {
        return 'foo';
    }

    return array();
}

$x = returnsDifferentValues($y);
if (is_array($x)) {
    // $x is an array.
}

If this a common case that PHP Analyzer should handle natively, please let us know by opening an issue.

Loading history...
125 3
			if ($this->_registry->get('firstTable'))
126 3
			{
127 3
				$this->_registry->set('lastTable', $this->_registry->get('firstTable'));
128
			}
129
		}
130
	}
131 3
132
	/**
133 2
	 * set the id by root
134
	 *
135 2
	 * @since 3.3.0
136 2
	 */
137
138
	protected function _setIdByRoot() : void
139 3
	{
140
		$settingModel = new Model\Setting();
141 1
		$homepageId = $settingModel->get('homepage');
142
		$order = $settingModel->get('order');
143 1
		$lastTable = $this->_registry->get('lastTable');
144 1
		$content = Db::forTablePrefix($lastTable);
145
146
		/* set by homepage */
147 3
148
		if ($homepageId > 0)
149
		{
150
			$this->_registry->set('articleId', $homepageId);
151
			$this->_registry->set('lastId', $homepageId);
152
		}
153
154
		/* set by order */
155 5
156
		else if ($order === 'asc')
157 5
		{
158 5
			$this->_setId($lastTable,
0 ignored issues
show
Bug introduced by redaxmedia
It seems like $lastTable defined by $this->_registry->get('lastTable') on line 143 can also be of type array; however, Redaxscript\Bootstrap\Content::_setId() does only seem to accept null|string, maybe add an additional type check?

If a method or function can return multiple different values and unless you are sure that you only can receive a single value in this context, we recommend to add an additional type check:

/**
 * @return array|string
 */
function returnsDifferentValues($x) {
    if ($x) {
        return 'foo';
    }

    return array();
}

$x = returnsDifferentValues($y);
if (is_array($x)) {
    // $x is an array.
}

If this a common case that PHP Analyzer should handle natively, please let us know by opening an issue.

Loading history...
159
			[
160 5
				'rank' => $content->min('rank')
161
			]);
162 5
		}
163 5
		else if ($order === 'desc')
164
		{
165
			$this->_setId($lastTable,
0 ignored issues
show
Bug introduced by redaxmedia
It seems like $lastTable defined by $this->_registry->get('lastTable') on line 143 can also be of type array; however, Redaxscript\Bootstrap\Content::_setId() does only seem to accept null|string, maybe add an additional type check?

If a method or function can return multiple different values and unless you are sure that you only can receive a single value in this context, we recommend to add an additional type check:

/**
 * @return array|string
 */
function returnsDifferentValues($x) {
    if ($x) {
        return 'foo';
    }

    return array();
}

$x = returnsDifferentValues($y);
if (is_array($x)) {
    // $x is an array.
}

If this a common case that PHP Analyzer should handle natively, please let us know by opening an issue.

Loading history...
166 5
			[
167
				'rank' => $content->max('rank')
168
			]);
169
		}
170
	}
171
172
	/**
173
	 * set the id by parameter
174
	 *
175
	 * @since 3.1.0
176 8
	 */
177
178 8
	protected function _setIdByParameter() : void
179 8
	{
180 8
		$categoryModel = new Model\Category();
181
		$firstTable = $this->_registry->get('firstTable');
182
		$secondTable = $this->_registry->get('secondTable');
183
		$thirdTable = $this->_registry->get('thirdTable');
184 8
		$firstParameter = $this->_registry->get('firstParameter');
185
		$secondParameter = $this->_registry->get('secondParameter');
186 4
		$thirdParameter = $this->_registry->get('thirdParameter');
187 4
188 4
		/* set by third table */
189
190 8
		if ($thirdTable === 'articles')
191
		{
192 3
			$this->_setId('articles',
193 3
			[
194 3
				'alias' => $thirdParameter,
195
				'category' => $categoryModel->query()->where('alias', $secondParameter)->findOne()->id
196 8
			]);
197
		}
198
199
		/* set by second table */
200
201
		else if ($secondTable === 'categories')
202
		{
203
			$this->_setId('categories',
204
			[
205
				'alias' => $secondParameter,
206
				'parent' => $categoryModel->query()->where('alias', $firstParameter)->findOne()->id
207
			]);
208
		}
209
		else if ($secondTable === 'articles')
210
		{
211
			$this->_setId('articles',
212
			[
213
				'alias' => $secondParameter,
214
				'category' => $categoryModel->query()->where('alias', $firstParameter)->findOne()->id
215
			]);
216
		}
217
218
		/* set by first table */
219
220
		else if ($firstTable === 'categories')
221
		{
222
			$this->_setId('categories',
223
			[
224
				'alias' => $firstParameter
225
			], 'parent');
226
		}
227
		else if ($firstTable === 'articles')
228
		{
229
			$this->_setId('articles',
230
			[
231
				'alias' => $firstParameter
232
			], 'category');
233
		}
234
	}
235
236
	/**
237
	 * set the id
238
	 *
239
	 * @since 3.1.0
240
	 *
241
	 * @param string $table
242
	 * @param array $whereArray
243
	 * @param string $whereNull
244
	 */
245
246
	protected function _setId(string $table = null, array $whereArray = [], string $whereNull = null) : void
247
	{
248
		$categoryModel = new Model\Category();
249
		$articleModel = new Model\Article();
250
251
		/* set the registry */
252
253
		if ($table === 'categories')
254
		{
255
			$category = $categoryModel->query()->where($whereArray)->where('status', 1);
256
			if ($whereNull)
0 ignored issues
show
Bug Best Practice introduced by redaxmedia
The expression $whereNull of type null|string is loosely compared to true; this is ambiguous if the string can be empty. You might want to explicitly use !== null instead.

In PHP, under loose comparison (like ==, or !=, or switch conditions), values of different types might be equal.

For string values, the empty string '' is a special case, in particular the following results might be unexpected:

''   == false // true
''   == null  // true
'ab' == false // false
'ab' == null  // false

// It is often better to use strict comparison
'' === false // false
'' === null  // false
Loading history...
257
			{
258
				$category->whereNull($whereNull);
259
			}
260
			$category = $category->findOne();
261
			$this->_registry->set('categoryId', $category->id);
262
			$this->_registry->set('lastId', $category->id);
263
		}
264
		if ($table === 'articles')
265
		{
266
			$article = $articleModel->query()->where($whereArray)->where('status', 1);
267
			if ($whereNull)
0 ignored issues
show
Bug Best Practice introduced by redaxmedia
The expression $whereNull of type null|string is loosely compared to true; this is ambiguous if the string can be empty. You might want to explicitly use !== null instead.

In PHP, under loose comparison (like ==, or !=, or switch conditions), values of different types might be equal.

For string values, the empty string '' is a special case, in particular the following results might be unexpected:

''   == false // true
''   == null  // true
'ab' == false // false
'ab' == null  // false

// It is often better to use strict comparison
'' === false // false
'' === null  // false
Loading history...
268
			{
269
				$article->whereNull($whereNull);
270
			}
271
			$article = $article->findOne();
272
			$this->_registry->set('articleId', $article->id);
273
			$this->_registry->set('lastId', $article->id);
274
		}
275
	}
276
}
277