Passed
Push — release-3.0.0 ( 4d9055...2010c1 )
by Daniel
07:48
created

builder::__construct()   A

Complexity

Conditions 1
Paths 1

Size

Total Lines 13
Code Lines 11

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
cc 1
eloc 11
nc 1
nop 11
dl 0
loc 13
rs 9.9
c 0
b 0
f 0

How to fix   Many Parameters   

Many Parameters

Methods with many parameters are not only hard to understand, but their parameters also often become inconsistent when you need more, or different data.

There are several approaches to avoid long parameter lists:

1
<?php
2
3
/**
4
 *
5
 * @package sitemaker
6
 * @copyright (c) 2016 Daniel A. (blitze)
7
 * @license http://opensource.org/licenses/gpl-2.0.php GNU General Public License v2
8
 *
9
 */
10
11
namespace blitze\content\services\form;
12
13
use Cocur\Slugify\Slugify;
14
15
class builder
16
{
17
	/** @var \phpbb\auth\auth */
18
	protected $auth;
19
20
	/** @var \phpbb\event\dispatcher_interface */
21
	protected $phpbb_dispatcher;
22
23
	/** @var \phpbb\language\language */
24
	protected $language;
25
26
	/** @var \phpbb\request\request_interface */
27
	protected $request;
28
29
	/** @var \phpbb\template\context */
30
	protected $template_context;
31
32
	/** @var \phpbb\user */
33
	protected $user;
34
35
	/* @var \blitze\content\services\fields */
36
	protected $fields;
37
38
	/* @var \blitze\content\services\types */
39
	protected $types;
40
41
	/** @var \blitze\content\services\form\form */
42
	protected $form;
43
44
	/** @var string */
45
	protected $phpbb_root_path;
46
47
	/** @var string */
48
	protected $php_ext;
49
50
	/** @var string */
51
	protected $mode = '';
52
53
	/** @var int */
54
	protected $topic_time = 0;
55
56
	/** @var bool */
57
	protected $req_approval = false;
58
59
	/** @var bool */
60
	protected $req_mod_input = false;
61
62
	/** @var bool */
63
	protected $user_is_mod = false;
64
65
	/** @var array */
66
	protected $content_fields = array();
67
68
	/**
69
	 * Constructor
70
	 *
71
	 * @param \phpbb\auth\auth							$auth				Auth object
72
	 * @param \phpbb\event\dispatcher_interface			$phpbb_dispatcher	Event dispatcher object
73
	 * @param \phpbb\language\language					$language			Language object
74
	 * @param \phpbb\request\request_interface			$request			Request object
75
	 * @param \phpbb\template\context					$template_context	Template context object
76
	 * @param \phpbb\user								$user				User object
77
	 * @param \blitze\content\services\fields			$fields				Content fields object
78
	 * @param \blitze\content\services\types			$types				Content types object
79
	 * @param \blitze\content\services\form\form		$form				Form object
80
	 * @param string									$phpbb_root_path	Path to the phpbb includes directory.
81
	 * @param string									$php_ext			php file extension
82
	 */
83
	public function __construct(\phpbb\auth\auth $auth, \phpbb\event\dispatcher_interface $phpbb_dispatcher, \phpbb\language\language $language, \phpbb\request\request_interface $request, \phpbb\template\context $template_context, \phpbb\user $user, \blitze\content\services\fields $fields, \blitze\content\services\types $types, \blitze\content\services\form\form $form, $phpbb_root_path, $php_ext)
84
	{
85
		$this->auth = $auth;
86
		$this->phpbb_dispatcher = $phpbb_dispatcher;
87
		$this->language = $language;
88
		$this->request = $request;
89
		$this->template_context = $template_context;
90
		$this->user = $user;
91
		$this->fields = $fields;
92
		$this->types = $types;
93
		$this->form = $form;
94
		$this->phpbb_root_path = $phpbb_root_path;
95
		$this->php_ext = $php_ext;
96
	}
97
98
	/**
99
	 * @param int $forum_id
100
	 * @param int $topic_id
101
	 * @param string $mode
102
	 * @param bool $save_draft
103
	 * @return array
104
	 */
105
	public function init($forum_id, $topic_id, $mode, $save_draft)
106
	{
107
		$content_langname = '';
108
		if ($type = $this->types->get_forum_type($forum_id))
109
		{
110
			$this->language->add_lang('posting', 'blitze/content');
111
112
			/** @var \blitze\content\model\entity\type $entity */
113
			$entity = $this->types->get_type($type, true);
114
			$content_langname = $entity->get_content_langname();
115
			$fields_data = $entity->get_content_fields();
116
117
			/**
118
			 * Event to set the values for fields that are stored in the database, for purposes of displaying the form field
119
			 *
120
			 * @event blitze.content.builder.set_field_values
121
			 * @var int									topic_id		Current topic id
122
			 * @var array								fields_data		Array containing fields data, minus 'field_value' prop, which is what we are setting here
123
			 * @var \blitze\content\model\entity\type	entity			Content type entity
124
			 */
125
			$vars = array('topic_id', 'fields_data', 'entity');
126
			extract($this->phpbb_dispatcher->trigger_event('blitze.content.builder.set_field_values', compact($vars)));
127
128
			$this->content_fields = $fields_data;
129
			$this->user_is_mod = $this->auth->acl_get('m_', $entity->get_forum_id());
130
			$this->req_approval = $entity->get_req_approval();
131
			$this->mode = $this->request->variable('cp', ($this->user_is_mod && $mode !== 'post') ? 'mcp' : 'ucp');
132
133
			$this->form->create('postform', 'posting')
134
				->add('cp', 'hidden', array('field_value' => $this->mode))
135
				->add('redirect', 'hidden', array('field_value' => $this->get_redirect_url()));
136
137
			if ($save_draft && !$this->request->is_set('message'))
138
			{
139
				$this->request->overwrite('message', $this->generate_message());
140
			}
141
		}
142
143
		return array($type, $content_langname);
144
	}
145
146
	/**
147
	 * @return string
148
	 */
149
	public function generate_message()
150
	{
151
		$fields_data = $this->form->get_submitted_data($this->content_fields, $this->req_mod_input, $this->mode);
152
153
		$message = '';
154
		foreach ($fields_data as $field => $value)
155
		{
156
			$value = is_array($value) ? join("\n", $value) : $value;
157
			$message .= '[smcf=' . $field . ']' . $value . '[/smcf]';
158
		}
159
160
		return $message;
161
	}
162
163
	/**
164
	 * @return array
165
	 */
166
	public function get_errors()
167
	{
168
		return $this->form->get_errors();
169
	}
170
171
	/**
172
	 * @return string
173
	 */
174
	public function get_redirect_url()
175
	{
176
		return $this->request->variable('redirect', '');
177
	}
178
179
	/**
180
	 * @param string $content_type
181
	 * @param array $post_data
182
	 * @param string $view
183
	 * @return string
184
	 */
185
	public function get_content_view($content_type, array $post_data, $view)
186
	{
187
		$text = '';
188
		if ($entity = $this->types->get_type($content_type))
189
		{
190
			$fields_accessor = 'get_' . $view . '_fields';
191
			$template_accessor = 'get_' . $view . '_tpl';
192
193
			// we do this to ensure topic_id keys exists when previewing a new topic
194
			$post_data += array('topic_id' => 0);
195
196
			$this->fields->prepare_to_show($entity, array($post_data['topic_id']), $entity->$fields_accessor(), $entity->$template_accessor(), $view)
197
				->set_display_mode('preview');
198
199
			$content = $this->fields->build_content(array_change_key_case($post_data, CASE_UPPER));
200
201
			$text =  isset($content['CUSTOM_DISPLAY']) ? $content['CUSTOM_DISPLAY'] : join('', $content['FIELDS']['all']);
202
		}
203
		return $text;
204
	}
205
206
	/**
207
	 * @param string $content_type
208
	 * @param array $post_data
209
	 * @return string
210
	 */
211
	public function generate_preview($content_type, array $post_data)
212
	{
213
		$post_data['MESSAGE'] = $this->template_context->get_root_ref()['PREVIEW_MESSAGE'];
214
215
		return $this->get_content_view($content_type, $post_data, 'detail');
216
	}
217
218
	/**
219
	 * @param array $sql_data
220
	 * @return void
221
	 */
222
	public function modify_sql_data(array &$sql_data)
223
	{
224
		$slugify = new Slugify();
225
		$sql_data['topic_slug'] = $slugify->slugify($sql_data['topic_title']);
226
		$sql_data['req_mod_input'] = $this->req_mod_input;
227
	}
228
229
	/**
230
	 * @param array $topic_data
231
	 * @return void
232
	 */
233
	public function save_db_fields(array $topic_data)
234
	{
235
		$this->form->save_db_fields($topic_data, $this->content_fields);
236
	}
237
238
	/**
239
	 * @param int $topic_id
240
	 * @param array $post_data
241
	 * @param array $page_data
242
	 * @return void
243
	 */
244
	public function generate_form($topic_id, array $post_data, array $page_data = array())
245
	{
246
		$this->set_field_values($post_data['post_text']);
247
248
		foreach ($this->content_fields as $field => $field_data)
249
		{
250
			if ($field_data['field_type'] === 'textarea')
251
			{
252
				$field_data += $page_data;
253
			}
254
			$this->add_field($field, $field_data, $topic_id);
255
		}
256
	}
257
258
	/**
259
	 * @return void
260
	 */
261
	public function build_form()
262
	{
263
		$this->form->build_form(false);
264
	}
265
266
	/**
267
	 * @param string $field
268
	 * @param array $field_data
269
	 * @param int $topic_id
270
	 * @return void
271
	 */
272
	protected function add_field($field, array $field_data, $topic_id)
273
	{
274
		if (!$field_data['field_mod_only'] || $this->mode === 'mcp')
275
		{
276
			$this->form->add($field, $field_data['field_type'], $field_data, $topic_id);
277
		}
278
		else if (!empty($field_data['field_value']))
279
		{
280
			$this->form->add($field, 'hidden', $field_data, $topic_id);
281
		}
282
	}
283
284
	/**
285
	 * @param string $mode
286
	 * @param array $data
287
	 * @return void
288
	 */
289
	public function force_visibility($mode, array &$data)
290
	{
291
		if ($this->mode === 'mcp')
292
		{
293
			if ('-1' !== $visibility = $this->request->variable('force_status', ''))
294
			{
295
				$data['force_visibility'] = $visibility;
296
			}
297
		}
298
		else if ($this->force_state())
299
		{
300
			$data['force_visibility'] = ($mode == 'edit_first_post') ? ITEM_REAPPROVE : ITEM_UNAPPROVED;
301
		}
302
	}
303
304
	/**
305
	 * @return bool
306
	 */
307
	protected function force_state()
308
	{
309
		return ($this->req_approval || $this->req_mod_input);
310
	}
311
312
	/**
313
	 * @param string $post_text
314
	 * @return void
315
	 */
316
	protected function set_field_values($post_text)
317
	{
318
		$fields_data = $this->get_fields_data_from_post($post_text, array_keys($this->content_fields));
319
320
		foreach ($fields_data as $field => $value)
321
		{
322
			if (isset($this->content_fields[$field]))
323
			{
324
				$this->content_fields[$field]['field_value'] = $value;
325
			}
326
		}
327
	}
328
329
	/**
330
	 * Get fields data from post
331
	 *
332
	 * @param string $post_text
333
	 * @param array $fields
334
	 * @return array
335
	 */
336
	protected function get_fields_data_from_post($post_text, array $fields)
337
	{
338
		$fields_data = array();
339
		$find_fields = join('|', $fields);
340
341
		if (preg_match_all("/\[smcf=($find_fields)\](.*?)\[\/smcf]/s", $post_text, $matches))
342
		{
343
			$fields_data = (array) array_combine($matches[1], $matches[2]);
344
		}
345
346
		return $fields_data;
347
	}
348
349
	/**
350
	 * @param int $visibility
351
	 * @return array
352
	 */
353
	protected function get_moderator_options($visibility)
354
	{
355
		$options = array(
356
			'-1' => 'NO',
357
		);
358
359
		if ($visibility == ITEM_APPROVED)
360
		{
361
			$options[ITEM_REAPPROVE] = 'CONTENT_STATUS_REAPPROVE';
362
		}
363
		else
364
		{
365
			$options[ITEM_UNAPPROVED]	= 'CONTENT_STATUS_DISAPPROVE';
366
			$options[ITEM_APPROVED]		= 'CONTENT_STATUS_APPROVE';
367
		}
368
369
		return $options;
370
	}
371
}
372