Completed
Push — master ( a52438...bf8826 )
by Henry
06:30
created

modules/Archive/Archive.php (1 issue)

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\Modules\Archive;
3
4
use Redaxscript\Dater;
5
use Redaxscript\Db;
6
use Redaxscript\Html;
7
use Redaxscript\Model;
8
use Redaxscript\Module;
9
use function strtotime;
10
11
/**
12
 * archive ordered by years and months
13
 *
14
 * @since 2.2.0
15
 *
16
 * @package Redaxscript
17
 * @category Modules
18
 * @author Henry Ruhs
19
 */
20
21
class Archive extends Module\Module
22
{
23
	/**
24
	 * array of the module
25
	 *
26
	 * @var array
27
	 */
28
29
	protected static $_moduleArray =
30
	[
31
		'name' => 'Archive',
32
		'alias' => 'Archive',
33
		'author' => 'Redaxmedia',
34
		'description' => 'Archive ordered by years and months',
35
		'version' => '5.0.0',
36
		'license' => 'MIT'
37
	];
38
39
	/**
40
	 * array of the option
41
	 *
42
	 * @var array
43
	 */
44
45
	protected $_optionArray =
46
	[
47
		'className' =>
48
		[
49
			'title' => 'rs-title-content-sub rs-title-archive',
50
			'list' => 'rs-list-archive'
51
		]
52
	];
53
54
	/**
55
	 * render
56
	 *
57
	 * @since 2.2.0
58
	 *
59
	 * @return string
60
	 */
61
62
	public function render() : string
63
	{
64
		$output = null;
65
		$outputItem = null;
66
		$error = null;
67
		$articleModel = new Model\Article();
68
		$dater = new Dater();
69
70
		/* html element */
71
72
		$element = new Html\Element();
73
		$titleElement = $element
74
			->copy()
75
			->init('h3',
76
			[
77
				'class' => $this->_optionArray['className']['title']
78
			]);
79
		$listElement = $element
80
			->copy()
81
			->init('ul',
82
			[
83
				'class' => $this->_optionArray['className']['list']
84
			]);
85
		$itemElement = $element->copy()->init('li');
86
		$linkElement = $element->copy()->init('a');
87
88
		/* query articles */
89
90
		$monthArray = $this->_getMonthArrayByLanguage($this->_registry->get('language'));
91
92
		/* process articles */
93
94
		if (!$monthArray)
95
		{
96
			$error = $this->_language->get('article_no') . $this->_language->get('point');
97
		}
98
		else
99
		{
100
			foreach ($monthArray as $key => $articles)
101
			{
102
				foreach ($articles as $value)
103
				{
104
					$outputItem .= $itemElement
105
						->copy()
106
						->html($linkElement
107
							->copy()
108
							->attr('href', $this->_registry->get('parameterRoute') . $articleModel->getRouteById($value->id))
109
							->text($value->title)
110
						);
111
				}
112
113
				/* collect output */
114
115
				$dater->init(strtotime($key));
116
				$month = $dater->getDateTime()->format('n') - 1;
117
				$output .= $titleElement->text($this->_language->get('_month', $month) . ' ' . $dater->getDateTime()->format('Y'));
118
				$output .= $listElement->html($outputItem);
119
				$outputItem = null;
120
			}
121
		}
122
123
		/* handle error */
124
125
		if ($error)
0 ignored issues
show
Bug Best Practice introduced by
The expression $error of type string|null 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...
126
		{
127
			$output = $listElement->html(
128
				$itemElement->html($error)
129
			);
130
		}
131
		return $output;
132
	}
133
134
	/**
135
	 * get month array by language
136
	 *
137
	 * @since 3.3.0
138
	 *
139
	 * @param string $language
140
	 *
141
	 * @return array
142
	 */
143
144
	protected function _getMonthArrayByLanguage(string $language = null) : array
145
	{
146
		$monthArray = [];
147
		$dater = new Dater();
148
		$articles = Db::forTablePrefix('articles')
149
			->whereLanguageIs($language)
150
			->whereNull('access')
151
			->where('status', 1)
152
			->orderByDesc('date')
153
			->findMany();
154
155
		/* process article */
156
157
		foreach ($articles as $value)
158
		{
159
			$dater->init($value->date);
160
			$dateKey = $dater->getDateTime()->format('Y-m');
161
			$monthArray[$dateKey][] = $value;
162
		}
163
		return $monthArray;
164
	}
165
}
166