Completed
Push — master ( 0d72ed...db6a9f )
by Henry
14:21 queued 04:57
created

includes/Bootstrap/Content.php (2 issues)

Check for loose comparison of strings.

Best Practice Bug Major

Upgrade to new PHP Analysis Engine

These results are based on our legacy PHP analysis, consider migrating to our new PHP analysis engine instead. Learn more

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'))
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
98
		/* set the registry */
99
100 5
		if ($thirdParameter)
101
		{
102 1
			$this->_registry->set('thirdTable', $contentModel->getTableByAlias($thirdParameter));
103 1
			if ($this->_registry->get('thirdTable'))
104
			{
105 1
				$this->_registry->set('lastTable', $this->_registry->get('thirdTable'));
106 1
				$this->_registry->set('secondTable', $contentModel->getTableByAlias($secondParameter));
107 1
				if ($this->_registry->get('secondTable'))
108
				{
109 1
					$this->_registry->set('firstTable', $contentModel->getTableByAlias($firstParameter));
110
				}
111
			}
112
		}
113 4
		else if ($secondParameter)
114
		{
115 2
			$this->_registry->set('secondTable', $contentModel->getTableByAlias($secondParameter));
116 2
			if ($this->_registry->get('secondTable'))
117
			{
118 2
				$this->_registry->set('lastTable', $this->_registry->get('secondTable'));
119 2
				$this->_registry->set('firstTable', $contentModel->getTableByAlias($firstParameter));
120
			}
121
		}
122 2
		else if ($firstParameter)
123
		{
124 2
			$this->_registry->set('firstTable', $contentModel->getTableByAlias($firstParameter));
125 2
			if ($this->_registry->get('firstTable'))
126
			{
127 1
				$this->_registry->set('lastTable', $this->_registry->get('firstTable'));
128
			}
129
		}
130 5
	}
131
132
	/**
133
	 * set the id by root
134
	 *
135
	 * @since 3.3.0
136
	 */
137
138 3
	protected function _setIdByRoot() : void
139
	{
140 3
		$settingModel = new Model\Setting();
141 3
		$homepageId = $settingModel->get('homepage');
142 3
		$order = $settingModel->get('order');
143 3
		$lastTable = $this->_registry->get('lastTable');
144 3
		$content = Db::forTablePrefix($lastTable);
145
146
		/* set by homepage */
147
148 3
		if ($homepageId > 0)
149
		{
150 1
			$this->_registry->set('articleId', $homepageId);
151 1
			$this->_registry->set('lastId', $homepageId);
152
		}
153
154
		/* set by order */
155
156 2
		else if ($order === 'asc')
157
		{
158 1
			$this->_setId($lastTable,
159
			[
160 1
				'rank' => $content->min('rank')
161
			]);
162
		}
163 1
		else if ($order === 'desc')
164
		{
165 1
			$this->_setId($lastTable,
166
			[
167 1
				'rank' => $content->max('rank')
168
			]);
169
		}
170 3
	}
171
172
	/**
173
	 * set the id by parameter
174
	 *
175
	 * @since 3.1.0
176
	 */
177
178 5
	protected function _setIdByParameter() : void
179
	{
180 5
		$categoryModel = new Model\Category();
181 5
		$firstTable = $this->_registry->get('firstTable');
182 5
		$secondTable = $this->_registry->get('secondTable');
183 5
		$thirdTable = $this->_registry->get('thirdTable');
184 5
		$firstParameter = $this->_registry->get('firstParameter');
185 5
		$secondParameter = $this->_registry->get('secondParameter');
186 5
		$thirdParameter = $this->_registry->get('thirdParameter');
187
188
		/* set by third table */
189
190 5
		if ($thirdTable === 'articles')
191
		{
192 1
			$this->_setId('articles',
193
			[
194 1
				'alias' => $thirdParameter,
195 1
				'category' => $categoryModel->query()->where('alias', $secondParameter)->findOne()->id
196
			]);
197
		}
198
199
		/* set by second table */
200
201 4
		else if ($secondTable === 'categories')
202
		{
203 1
			$this->_setId('categories',
204
			[
205 1
				'alias' => $secondParameter,
206 1
				'parent' => $categoryModel->query()->where('alias', $firstParameter)->findOne()->id
207
			]);
208
		}
209 3
		else if ($secondTable === 'articles')
210
		{
211 1
			$this->_setId('articles',
212
			[
213 1
				'alias' => $secondParameter,
214 1
				'category' => $categoryModel->query()->where('alias', $firstParameter)->findOne()->id
215
			]);
216
		}
217
218
		/* set by first table */
219
220 2
		else if ($firstTable === 'categories')
221
		{
222 1
			$this->_setId('categories',
223
			[
224 1
				'alias' => $firstParameter
225 1
			], 'parent');
226
		}
227 1
		else if ($firstTable === 'articles')
228
		{
229
			$this->_setId('articles',
230
			[
231
				'alias' => $firstParameter
232
			], 'category');
233
		}
234 5
	}
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 6
	protected function _setId(string $table = null, array $whereArray = [], string $whereNull = null) : void
247
	{
248 6
		$categoryModel = new Model\Category();
249 6
		$articleModel = new Model\Article();
250
251
		/* set the registry */
252
253 6
		if ($table === 'categories')
254
		{
255 4
			$category = $categoryModel->query()->where($whereArray)->where('status', 1);
256 4
			if ($whereNull)
0 ignored issues
show
Bug Best Practice introduced by
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 1
				$category->whereNull($whereNull);
259
			}
260 4
			$category = $category->findOne();
261 4
			$this->_registry->set('categoryId', $category->id);
262 4
			$this->_registry->set('lastId', $category->id);
263
		}
264 6
		if ($table === 'articles')
265
		{
266 2
			$article = $articleModel->query()->where($whereArray)->where('status', 1);
267 2
			if ($whereNull)
0 ignored issues
show
Bug Best Practice introduced by
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 2
			$article = $article->findOne();
272 2
			$this->_registry->set('articleId', $article->id);
273 2
			$this->_registry->set('lastId', $article->id);
274
		}
275 6
	}
276
}
277