Completed
Push — develop ( 6ab4f3...bb7547 )
by Mario
02:35
created

main_controller::__construct()   A

Complexity

Conditions 1
Paths 1

Size

Total Lines 19
Code Lines 17

Duplication

Lines 0
Ratio 0 %

Importance

Changes 7
Bugs 1 Features 1
Metric Value
c 7
b 1
f 1
dl 0
loc 19
rs 9.4285
cc 1
eloc 17
nc 1
nop 16

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
 * PayPal Donation extension for the phpBB Forum Software package.
5
 *
6
 * @copyright (c) 2015 Skouat
7
 * @license GNU General Public License, version 2 (GPL-2.0)
8
 *
9
 */
10
11
namespace skouat\ppde\controller;
12
13
use Symfony\Component\DependencyInjection\ContainerInterface;
14
15
class main_controller
16
{
17
	protected $auth;
18
	protected $config;
19
	protected $container;
20
	protected $extension_manager;
21
	protected $helper;
22
	protected $ppde_entity_currency;
23
	protected $ppde_entity_donation_pages;
24
	protected $ppde_entity_transactions;
25
	protected $ppde_operator_currency;
26
	protected $ppde_operator_donation_pages;
27
	protected $ppde_operator_transactions;
28
	protected $request;
29
	protected $template;
30
	protected $user;
31
	protected $root_path;
32
	protected $php_ext;
33
	/** @var array */
34
	protected $ext_meta = array();
35
	/** @var string */
36
	protected $ext_name;
37
	/** @var string */
38
	private $donation_body;
39
	/** @var array */
40
	private $donation_content_data;
41
	/** @var string */
42
	private $return_args_url;
43
	/** @var string */
44
	private $u_action;
45
46
	/**
47
	 * Constructor
48
	 *
49
	 * @param \phpbb\auth\auth                      $auth                         Auth object
50
	 * @param \phpbb\config\config                  $config                       Config object
51
	 * @param ContainerInterface                    $container                    Service container interface
52
	 * @param \phpbb\extension\manager              $extension_manager            An instance of the phpBB extension
53
	 *                                                                            manager
54
	 * @param \phpbb\controller\helper              $helper                       Controller helper object
55
	 * @param \skouat\ppde\entity\currency          $ppde_entity_currency         Currency entity object
56
	 * @param \skouat\ppde\entity\donation_pages    $ppde_entity_donation_pages   Donation pages entity object
57
	 * @param \skouat\ppde\entity\transactions      $ppde_entity_transactions     Transactions log entity object
58
	 * @param \skouat\ppde\operators\currency       $ppde_operator_currency       Currency operator object
59
	 * @param \skouat\ppde\operators\donation_pages $ppde_operator_donation_pages Donation pages operator object
60
	 * @param \skouat\ppde\operators\transactions   $ppde_operator_transactions   Transactions log operator object
61
	 * @param \phpbb\request\request                $request                      Request object
62
	 * @param \phpbb\template\template              $template                     Template object
63
	 * @param \phpbb\user                           $user                         User object
64
	 * @param string                                $root_path                    phpBB root path
65
	 * @param string                                $php_ext                      phpEx
66
	 *
67
	 * @return \skouat\ppde\controller\main_controller
68
	 * @access public
69
	 */
70
	public function __construct(\phpbb\auth\auth $auth, \phpbb\config\config $config, ContainerInterface $container, \phpbb\extension\manager $extension_manager, \phpbb\controller\helper $helper, \skouat\ppde\entity\currency $ppde_entity_currency, \skouat\ppde\entity\donation_pages $ppde_entity_donation_pages, \skouat\ppde\entity\transactions $ppde_entity_transactions, \skouat\ppde\operators\currency $ppde_operator_currency, \skouat\ppde\operators\donation_pages $ppde_operator_donation_pages, \skouat\ppde\operators\transactions $ppde_operator_transactions, \phpbb\request\request $request, \phpbb\template\template $template, \phpbb\user $user, $root_path, $php_ext)
71
	{
72
		$this->auth = $auth;
73
		$this->config = $config;
74
		$this->container = $container;
75
		$this->extension_manager = $extension_manager;
76
		$this->helper = $helper;
77
		$this->ppde_entity_currency = $ppde_entity_currency;
78
		$this->ppde_entity_donation_pages = $ppde_entity_donation_pages;
79
		$this->ppde_entity_transactions = $ppde_entity_transactions;
80
		$this->ppde_operator_currency = $ppde_operator_currency;
81
		$this->ppde_operator_donation_pages = $ppde_operator_donation_pages;
82
		$this->ppde_operator_transactions = $ppde_operator_transactions;
83
		$this->request = $request;
84
		$this->template = $template;
85
		$this->user = $user;
86
		$this->root_path = $root_path;
87
		$this->php_ext = $php_ext;
88
	}
89
90
	public function handle()
91
	{
92
		// When this extension is disabled, redirect users back to the forum index
93
		// Else if user is not allowed to use it, disallow access to the extension main page
94
		if (empty($this->config['ppde_enable']))
95
		{
96
			redirect(append_sid("{$this->root_path}index.{$this->php_ext}"));
97
		}
98
		else if (!$this->can_use_ppde())
99
		{
100
			trigger_error('NOT_AUTHORISED');
101
		}
102
103
		$entity = $this->container->get('skouat.ppde.entity.donation_pages');
104
		$this->set_return_args_url($this->request->variable('return', 'body'));
105
106
		// Prepare message for display
107
		if ($this->get_donation_content_data($this->return_args_url))
108
		{
109
			$entity->get_vars();
110
			$this->donation_body = $entity->replace_template_vars($entity->get_message_for_display(
111
				$this->donation_content_data[0]['page_content'],
112
				$this->donation_content_data[0]['page_content_bbcode_uid'],
113
				$this->donation_content_data[0]['page_content_bbcode_bitfield'],
114
				$this->donation_content_data[0]['page_content_bbcode_options']
115
			));
116
		}
117
118
		$this->template->assign_vars(array(
119
			'DEFAULT_CURRENCY'   => $this->build_currency_select_menu($this->config['ppde_default_currency']),
120
			'DONATION_BODY'      => $this->donation_body,
121
			'IMG_LOADER'         => '<img src="' . $this->root_path . '../ext/skouat/ppde/images/loader.gif' . '" />',
122
			'PPDE_DEFAULT_VALUE' => $this->config['ppde_default_value'] ? $this->config['ppde_default_value'] : 0,
123
			'PPDE_LIST_VALUE'    => $this->build_currency_value_select_menu(),
124
125
			'S_HIDDEN_FIELDS'    => $this->paypal_hidden_fields(),
126
			'S_PPDE_FORM_ACTION' => $this->get_paypal_url(),
127
			'S_RETURN_ARGS'      => $this->return_args_url,
128
			'S_SANDBOX'          => $this->use_sandbox(),
129
		));
130
131
		$this->display_stats();
132
133
		// Send all data to the template file
134
		return $this->send_data_to_template();
135
	}
136
137
	public function donorlist_handle()
138
	{
139
		// When this extension is disabled, redirect users back to the forum index
140
		// Else if user is not allowed to view the donors list, disallow access to the extension page
141
		if (!$this->use_ipn())
142
		{
143
			redirect(append_sid($this->root_path . 'index.' . $this->php_ext));
144
		}
145
		else if (!$this->can_view_ppde_donorlist())
146
		{
147
			trigger_error('NOT_AUTHORISED');
148
		}
149
150
		// Get needed container
151
		/** @type \phpbb\pagination $pagination */
152
		$pagination = $this->container->get('pagination');
153
		/** @type \phpbb\path_helper $path_helper */
154
		$path_helper = $this->container->get('path_helper');
155
156
		// Set up general vars
157
		$default_key = 'd';
158
		$sort_key = $this->request->variable('sk', $default_key);
159
		$sort_dir = $this->request->variable('sd', 'd');
160
		$start = $this->request->variable('start', 0);
161
162
		// Sorting and order
163
		$sort_key_sql = array('a' => 'amount', 'd' => 'txn.payment_date', 'u' => 'u.username_clean');
164
165
		if (!isset($sort_key_sql[$sort_key]))
166
		{
167
			$sort_key = $default_key;
168
		}
169
170
		$order_by = $sort_key_sql[$sort_key] . ' ' . (($sort_dir == 'a') ? 'ASC' : 'DESC');
171
172
		// Build a relevant pagination_url and sort_url
173
		// We do not use request_var() here directly to save some calls (not all variables are set)
174
		$check_params = array(
175
			'sk'    => array('sk', $default_key),
176
			'sd'    => array('sd', 'a'),
177
			'start' => array('start', 0),
178
		);
179
180
		$params = $this->check_params($check_params, array('start'));
181
		$sort_params = $this->check_params($check_params, array('sk', 'sd'));
182
183
		// Set '$this->u_action'
184
		$use_page = ($this->u_action) ? $this->u_action : $this->user->page['page_name'];
185
		$this->u_action = reapply_sid($path_helper->get_valid_page($use_page, $this->config['enable_mod_rewrite']));
186
187
		$pagination_url = append_sid($this->u_action, implode('&amp;', $params), true, false, true);
188
		$sort_url = $this->set_url_delim(append_sid($this->u_action, implode('&amp;', $sort_params), true, false, true), $sort_params);
189
190
		$get_donorlist_sql_ary = $this->ppde_operator_transactions->get_sql_donorlist_ary(false, $order_by);
191
		$total_donors = $this->ppde_operator_transactions->query_sql_count($get_donorlist_sql_ary, 'txn.user_id');
192
		$start = $pagination->validate_start($start, $this->config['topics_per_page'], $total_donors);
193
194
		$pagination->generate_template_pagination($pagination_url, 'pagination', 'start', $total_donors, $this->config['topics_per_page'], $start);
195
196
		// adds fields to the table schema needed by entity->import()
197
		$additional_table_schema = array(
198
			'item_username'    => array('name' => 'username', 'type' => 'string'),
199
			'item_user_colour' => array('name' => 'user_colour', 'type' => 'string'),
200
			'item_amount'      => array('name' => 'amount', 'type' => 'float'),
201
			'item_max_txn_id'  => array('name' => 'max_txn_id', 'type' => 'integer'),
202
		);
203
204
		$data_ary = $this->ppde_entity_transactions->get_data($this->ppde_operator_transactions->build_sql_donorlist_data($get_donorlist_sql_ary), $additional_table_schema, $this->config['topics_per_page'], $start);
205
206
		// Get default currency data from the database
207
		$default_currency_data = $this->get_default_currency_data($this->config['ppde_default_currency']);
208
		$this->template->assign_vars(array(
209
			'TOTAL_DONORS'    => $this->user->lang('PPDE_DONORS', $total_donors),
210
			'U_SORT_AMOUNT'   => $sort_url . 'sk=a&amp;sd=' . $this->set_sort_key($sort_key, 'a', $sort_dir),
211
			'U_SORT_DONATED'  => $sort_url . 'sk=d&amp;sd=' . $this->set_sort_key($sort_key, 'd', $sort_dir),
212
			'U_SORT_USERNAME' => $sort_url . 'sk=u&amp;sd=' . $this->set_sort_key($sort_key, 'u', $sort_dir),
213
		));
214
215
		foreach ($data_ary as $data)
216
		{
217
			$get_last_transaction_sql_ary = $this->ppde_operator_transactions->get_sql_donorlist_ary($data['max_txn_id']);
218
			$last_donation_data = $this->ppde_entity_transactions->get_data($this->ppde_operator_transactions->build_sql_donorlist_data($get_last_transaction_sql_ary));
219
			$this->template->assign_block_vars('donorrow', array(
220
				'PPDE_DONOR_USERNAME'       => get_username_string('full', $data['user_id'], $data['username'], $data['user_colour']),
221
				'PPDE_LAST_DONATED_AMOUNT'  => $this->get_amount(number_format($last_donation_data[0]['mc_gross'], 2), $default_currency_data[0]['currency_symbol'], (bool) $default_currency_data[0]['currency_on_left']),
222
				'PPDE_LAST_PAYMENT_DATE'    => $this->user->format_date($last_donation_data[0]['payment_date']),
223
				'PPDE_TOTAL_DONATED_AMOUNT' => $this->get_amount(number_format($data['amount'], 2), $default_currency_data[0]['currency_symbol'], (bool) $default_currency_data[0]['currency_on_left']),
224
			));
225
		}
226
227
		// Set "return_args_url" object before sending data to template
228
		$this->set_return_args_url('donorlist');
229
230
		// Send all data to the template file
231
		return $this->send_data_to_template();
232
	}
233
234
	/**
235
	 * Set the sort key value
236
	 *
237
	 * @param string $sk
238
	 * @param string $sk_comp
239
	 * @param string $sd
240
	 *
241
	 * @return string
242
	 * @access private
243
	 */
244
	private function set_sort_key($sk, $sk_comp, $sd)
245
	{
246
		return ($sk == $sk_comp && $sd == 'a') ? 'd' : 'a';
247
	}
248
249
	/**
250
	 * Simply adds an url or &amp; delimiter to the url when params is empty
251
	 *
252
	 * @param $url
253
	 * @param $params
254
	 *
255
	 * @return string
256
	 * @access private
257
	 */
258
	private function set_url_delim($url, $params)
259
	{
260
		return (empty($params)) ? $url . '?' : $url . '&amp;';
261
	}
262
263
	/**
264
	 * @param array    $params_ary
265
	 * @param string[] $excluded_keys
266
	 *
267
	 * @return array
268
	 * @access private
269
	 */
270
	private function check_params($params_ary, $excluded_keys)
271
	{
272
		$params = array();
273
274
		foreach ($params_ary as $key => $call)
275
		{
276
			if (!isset($_REQUEST[$key]))
277
			{
278
				continue;
279
			}
280
281
			$param = call_user_func_array('request_var', $call);
282
			$param = urlencode($key) . '=' . ((is_string($param)) ? urlencode($param) : $param);
283
284
			if (!in_array($key, $excluded_keys))
285
			{
286
				$params[] = $param;
287
			}
288
		}
289
290
		return $params;
291
	}
292
293
	/**
294
	 * @return bool
295
	 * @access public
296
	 */
297
	public function can_use_ppde()
298
	{
299
		return $this->auth->acl_get('u_ppde_use');
300
	}
301
302
	/**
303
	 * @return bool
304
	 * @access public
305
	 */
306
	public function can_view_ppde_donorlist()
307
	{
308
		return $this->auth->acl_get('u_ppde_view_donorlist');
309
	}
310
311
	/**
312
	 * @param string $set_return_args_url
313
	 *
314
	 * @return null
315
	 * @access private
316
	 */
317
	private function set_return_args_url($set_return_args_url)
318
	{
319
		switch ($set_return_args_url)
320
		{
321
			case 'cancel':
322
			case 'success':
323
				$this->template->assign_vars(array(
324
					'L_PPDE_DONATION_TITLE' => $this->user->lang['PPDE_' . strtoupper($set_return_args_url) . '_TITLE'],
325
				));
326
				$this->return_args_url = $set_return_args_url;
327
				break;
328
			case 'donorlist':
329
				$this->template->assign_vars(array(
330
					'L_PPDE_DONORLIST_TITLE' => $this->user->lang['PPDE_DONORLIST_TITLE'],
331
				));
332
				$this->return_args_url = $set_return_args_url;
333
				break;
334
			default:
335
				$this->return_args_url = 'body';
336
		}
337
338
	}
339
340
	/**
341
	 * Get content of current donation pages
342
	 *
343
	 * @param string $return_args_url
344
	 *
345
	 * @return array
346
	 * @access private
347
	 */
348
	private function get_donation_content_data($return_args_url)
349
	{
350
		return $this->donation_content_data =
351
			$this->ppde_entity_donation_pages->get_data(
352
				$this->ppde_operator_donation_pages->build_sql_data($this->user->get_iso_lang_id(), $return_args_url));
353
	}
354
355
	/**
356
	 * Build pull down menu options of available currency
357
	 *
358
	 * @param int $config_value Currency identifier; default: 0
359
	 *
360
	 * @return null
361
	 * @access public
362
	 */
363
	public function build_currency_select_menu($config_value = 0)
364
	{
365
		// Grab the list of all enabled currencies; 0 is for all data
366
		$currency_items = $this->ppde_entity_currency->get_data($this->ppde_operator_currency->build_sql_data(0, true));
367
368
		// Process each rule menu item for pull-down
369
		foreach ($currency_items as $currency_item)
370
		{
371
			// Set output block vars for display in the template
372
			$this->template->assign_block_vars('options', array(
373
				'CURRENCY_ID'        => (int) $currency_item['currency_id'],
374
				'CURRENCY_ISO_CODE'  => $currency_item['currency_iso_code'],
375
				'CURRENCY_NAME'      => $currency_item['currency_name'],
376
				'CURRENCY_SYMBOL'    => $currency_item['currency_symbol'],
377
378
				'S_CURRENCY_DEFAULT' => $config_value == $currency_item['currency_id'],
379
			));
380
		}
381
		unset ($currency_items, $currency_item);
382
	}
383
384
	/**
385
	 * Build pull down menu options of available currency value
386
	 *
387
	 * @return string List of currency value set in ACP for dropdown menu
388
	 * @access private
389
	 */
390
	private function build_currency_value_select_menu()
391
	{
392
		$list_donation_value = '';
393
394
		if ($this->get_dropbox_status())
395
		{
396
			$donation_ary_value = explode(',', $this->config['ppde_dropbox_value']);
397
398
			foreach ($donation_ary_value as $value)
399
			{
400
				$int_value = $this->settype_dropbox_int_value($value);
401
				$list_donation_value .= !empty($int_value) ? '<option value="' . $int_value . '">' . $int_value . '</option>' : '';
402
			}
403
			unset($value);
404
		}
405
406
		return $list_donation_value;
407
	}
408
409
	/**
410
	 * Get dropbox config value
411
	 *
412
	 * @return bool
413
	 * @access private
414
	 */
415
	private function get_dropbox_status()
416
	{
417
		return $this->config['ppde_dropbox_enable'] && $this->config['ppde_dropbox_value'];
418
	}
419
420
	/**
421
	 * Force dropbox value to integer
422
	 *
423
	 * @param int $value
424
	 *
425
	 * @return int
426
	 * @access private
427
	 */
428
	private function settype_dropbox_int_value($value = 0)
429
	{
430
		if (settype($value, 'integer') && $value != 0)
431
		{
432
			return $value;
433
		}
434
435
		return 0;
436
	}
437
438
	/**
439
	 * Build PayPal hidden fields
440
	 *
441
	 * @return string PayPal hidden field needed to fill PayPal forms
442
	 * @access private
443
	 */
444
	private function paypal_hidden_fields()
445
	{
446
		return build_hidden_fields(array(
447
			'cmd'           => '_donations',
448
			'business'      => $this->get_account_id(),
449
			'item_name'     => $this->user->lang['PPDE_DONATION_TITLE_HEAD'] . ' ' . $this->config['sitename'],
450
			'no_shipping'   => 1,
451
			'return'        => $this->generate_paypal_return_url('success'),
452
			'notify_url'    => $this->generate_paypal_notify_return_url(),
453
			'cancel_return' => $this->generate_paypal_return_url('cancel'),
454
			'item_number'   => 'uid_' . $this->user->data['user_id'] . '_' . time(),
455
			'tax'           => 0,
456
			'bn'            => 'Board_Donate_WPS',
457
			'charset'       => 'utf-8',
458
		));
459
	}
460
461
	/**
462
	 * Get PayPal account id
463
	 *
464
	 * @return string $this Paypal account Identifier
465
	 * @access private
466
	 */
467
	private function get_account_id()
468
	{
469
		return $this->use_sandbox() ? $this->config['ppde_sandbox_address'] : $this->config['ppde_account_id'];
470
	}
471
472
	/**
473
	 * Check if Sandbox is enabled
474
	 *
475
	 * @return bool
476
	 * @access public
477
	 */
478
	public function use_sandbox()
479
	{
480
		return !empty($this->config['ppde_sandbox_enable']) && (!empty($this->config['ppde_sandbox_founder_enable']) && ($this->user->data['user_type'] == USER_FOUNDER) || empty($this->config['ppde_sandbox_founder_enable']));
481
	}
482
483
	/**
484
	 * Check if IPN is enabled
485
	 *
486
	 * @return bool
487
	 * @access public
488
	 */
489
	public function use_ipn()
490
	{
491
		return !empty($this->config['ppde_enable']) && !empty($this->config['ppde_ipn_enable']) && (!empty($this->config['ppde_curl_detected']) || !empty($this->config['ppde_fsockopen_detected']));
492
	}
493
494
	/**
495
	 * Generate PayPal return URL
496
	 *
497
	 * @param string $arg
498
	 *
499
	 * @return string
500
	 * @access private
501
	 */
502
	private function generate_paypal_return_url($arg)
503
	{
504
		return generate_board_url(true) . $this->helper->route('skouat_ppde_donate', array('return' => $arg));
505
	}
506
507
	/**
508
	 * Generate PayPal return notify URL
509
	 *
510
	 * @return string
511
	 * @access private
512
	 */
513
	private function generate_paypal_notify_return_url()
514
	{
515
		return generate_board_url(true) . $this->helper->route('skouat_ppde_ipn_listener');
516
	}
517
518
	/**
519
	 * Get PayPal URL
520
	 * Used in form and in IPN process
521
	 *
522
	 * @param bool $is_test_ipn
523
	 *
524
	 * @return string
525
	 * @access public
526
	 */
527
	public function get_paypal_url($is_test_ipn = false)
528
	{
529
		return ($is_test_ipn || $this->use_sandbox()) ? 'https://www.sandbox.paypal.com/cgi-bin/webscr' : 'https://www.paypal.com/cgi-bin/webscr';
530
	}
531
532
	/**
533
	 * Assign statistics vars to the template
534
	 *
535
	 * @return null
536
	 * @access public
537
	 */
538
	public function display_stats()
539
	{
540
		if ($this->config['ppde_goal_enable'] || $this->config['ppde_raised_enable'] || $this->config['ppde_used_enable'])
541
		{
542
			// Get data from the database
543
			$default_currency_data = $this->get_default_currency_data($this->config['ppde_default_currency']);
544
545
			$this->template->assign_vars(array(
546
				'PPDE_GOAL_ENABLE'   => $this->config['ppde_goal_enable'],
547
				'PPDE_RAISED_ENABLE' => $this->config['ppde_raised_enable'],
548
				'PPDE_USED_ENABLE'   => $this->config['ppde_used_enable'],
549
550
				'L_PPDE_GOAL'        => $this->get_ppde_goal_langkey($default_currency_data[0]['currency_symbol'], (bool) $default_currency_data[0]['currency_on_left']),
551
				'L_PPDE_RAISED'      => $this->get_ppde_raised_langkey($default_currency_data[0]['currency_symbol'], (bool) $default_currency_data[0]['currency_on_left']),
552
				'L_PPDE_USED'        => $this->get_ppde_used_langkey($default_currency_data[0]['currency_symbol'], (bool) $default_currency_data[0]['currency_on_left']),
553
			));
554
555
			// Generate statistics percent for display
556
			$this->generate_stats_percent();
557
		}
558
	}
559
560
	/**
561
	 * Get default currency symbol
562
	 *
563
	 * @param int $id
564
	 *
565
	 * @return array
566
	 * @access public
567
	 */
568
	public function get_default_currency_data($id = 0)
569
	{
570
		return $this->ppde_entity_currency->get_data($this->ppde_operator_currency->build_sql_data($id, true));
571
	}
572
573
	/**
574
	 * Retrieve the language key for donation goal
575
	 *
576
	 * @param string $currency_symbol Currency symbol
577
	 * @param bool   $on_left         Symbol position
578
	 *
579
	 * @return string
580
	 * @access public
581
	 */
582
	public function get_ppde_goal_langkey($currency_symbol, $on_left = true)
583
	{
584
		if ((int) $this->config['ppde_goal'] <= 0)
585
		{
586
			$l_ppde_goal = $this->user->lang['DONATE_NO_GOAL'];
587
		}
588 View Code Duplication
		else if ((int) $this->config['ppde_goal'] < (int) $this->config['ppde_raised'])
589
		{
590
			$l_ppde_goal = $this->user->lang['DONATE_GOAL_REACHED'];
591
		}
592
		else
593
		{
594
			$l_ppde_goal = $this->user->lang('DONATE_GOAL_RAISE', $this->get_amount((int) $this->config['ppde_goal'], $currency_symbol, $on_left));
595
		}
596
597
		return $l_ppde_goal;
598
	}
599
600
	/**
601
	 * Put the currency on the left or on the right of the amount
602
	 *
603
	 * @param int    $value
604
	 * @param string $currency
605
	 * @param bool   $on_left
606
	 *
607
	 * @return string
608
	 * @access private
609
	 */
610
	private function get_amount($value, $currency, $on_left = true)
611
	{
612
		return $on_left ? $currency . $value : $value . $currency;
613
	}
614
615
	/**
616
	 * Retrieve the language key for donation raised
617
	 *
618
	 * @param string $currency_symbol Currency symbol
619
	 * @param bool   $on_left         Symbol position
620
	 *
621
	 * @return string
622
	 * @access public
623
	 */
624
	public function get_ppde_raised_langkey($currency_symbol, $on_left = true)
625
	{
626 View Code Duplication
		if ((int) $this->config['ppde_raised'] <= 0)
627
		{
628
			$l_ppde_raised = $this->user->lang['DONATE_NOT_RECEIVED'];
629
		}
630
		else
631
		{
632
			$l_ppde_raised = $this->user->lang('DONATE_RECEIVED', $this->get_amount((int) $this->config['ppde_raised'], $currency_symbol, $on_left));
633
		}
634
635
		return $l_ppde_raised;
636
	}
637
638
	/**
639
	 * Retrieve the language key for donation used
640
	 *
641
	 * @param string $currency_symbol Currency symbol
642
	 * @param bool   $on_left         Symbol position
643
	 *
644
	 * @return string
645
	 * @access public
646
	 */
647
	public function get_ppde_used_langkey($currency_symbol, $on_left = true)
648
	{
649
		if ((int) $this->config['ppde_used'] <= 0)
650
		{
651
			$l_ppde_used = $this->user->lang['DONATE_NOT_USED'];
652
		}
653
		else if ((int) $this->config['ppde_used'] < (int) $this->config['ppde_raised'])
654
		{
655
			$l_ppde_used = $this->user->lang('DONATE_USED', $this->get_amount((int) $this->config['ppde_used'], $currency_symbol, $on_left), $this->get_amount((int) $this->config['ppde_raised'], $currency_symbol, $on_left));
656
		}
657
		else
658
		{
659
			$l_ppde_used = $this->user->lang('DONATE_USED_EXCEEDED', $this->get_amount((int) $this->config['ppde_used'], $currency_symbol, $on_left));
660
		}
661
662
		return $l_ppde_used;
663
	}
664
665
	/**
666
	 * Generate statistics percent for display
667
	 *
668
	 * @return null
669
	 * @access private
670
	 */
671
	private function generate_stats_percent()
672
	{
673
		if ($this->config['ppde_goal_enable'] && (int) $this->config['ppde_goal'] > 0)
674
		{
675
			$this->assign_vars_stats_percent((int) $this->config['ppde_raised'], (int) $this->config['ppde_goal'], 'GOAL_NUMBER');
676
		}
677
678
		if ($this->config['ppde_used_enable'] && (int) $this->config['ppde_raised'] > 0 && (int) $this->config['ppde_used'] > 0)
679
		{
680
			$this->assign_vars_stats_percent((int) $this->config['ppde_used'], (int) $this->config['ppde_raised'], 'USED_NUMBER');
681
		}
682
	}
683
684
	/**
685
	 * Assign statistics percent vars to template
686
	 *
687
	 * @param integer $multiplicand
688
	 * @param integer $dividend
689
	 * @param string  $type
690
	 *
691
	 * @return null
692
	 * @access private
693
	 */
694
	private function assign_vars_stats_percent($multiplicand, $dividend, $type = '')
695
	{
696
		$this->template->assign_vars(array(
697
			'PPDE_' . $type => round(($multiplicand * 100) / $dividend, 2),
698
			'S_' . $type    => !empty($type) ? true : false,
699
		));
700
	}
701
702
	/**
703
	 * Send data to the template file
704
	 *
705
	 * @return \Symfony\Component\HttpFoundation\Response
706
	 * @access private
707
	 */
708
	private function send_data_to_template()
709
	{
710
		switch ($this->return_args_url)
711
		{
712
			case 'cancel':
713
			case 'success':
714
				return $this->helper->render('donate_body.html', $this->user->lang('PPDE_' . strtoupper($this->return_args_url) . '_TITLE'));
715
			case 'donorlist':
716
				return $this->helper->render('donorlist_body.html', $this->user->lang('PPDE_DONORLIST_TITLE'));
717
			default:
718
				return $this->helper->render('donate_body.html', $this->user->lang('PPDE_DONATION_TITLE'));
719
		}
720
	}
721
722
	/**
723
	 * Do action if it's the first time the extension is accessed
724
	 *
725
	 * @return null
726
	 * @access public
727
	 */
728
	public function first_start()
729
	{
730
		if ($this->config['ppde_first_start'])
731
		{
732
			$this->set_curl_info();
733
			$this->set_remote_detected();
734
			$this->config['ppde_first_start'] = false;
735
		}
736
	}
737
738
	/**
739
	 * Check if cURL is available
740
	 *
741
	 * @param bool $check_version
742
	 *
743
	 * @return array|bool
744
	 * @access public
745
	 */
746
	public function check_curl($check_version = false)
747
	{
748
		if (function_exists('curl_version') && $check_version)
749
		{
750
			return curl_version();
751
		}
752
753
		if (function_exists('curl_init') && function_exists('curl_exec'))
754
		{
755
			$this->get_ext_meta();
756
757
			$ch = curl_init($this->ext_meta['extra']['version-check']['host']);
758
759
			curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
760
761
			$response = curl_exec($ch);
762
			$response_status = strval(curl_getinfo($ch, CURLINFO_HTTP_CODE));
763
764
			curl_close($ch);
765
766
			return ($response !== false || $response_status !== '0') ? true : false;
767
		}
768
769
		return false;
770
	}
771
772
	/**
773
	 * Set config value for cURL version
774
	 *
775
	 * @return null
776
	 * @access public
777
	 */
778
	public function set_curl_info()
779
	{
780
		// Get cURL version informations
781
		if ($curl_info = $this->check_curl(true))
782
		{
783
			$this->config->set('ppde_curl_version', $curl_info['version']);
784
			$this->config->set('ppde_curl_ssl_version', $curl_info['ssl_version']);
785
		}
786
	}
787
788
	/**
789
	 * Set config value for cURL and fsockopen
790
	 *
791
	 * @return null
792
	 * @access public
793
	 */
794
	public function set_remote_detected()
795
	{
796
		$this->config->set('ppde_curl_detected', $this->check_curl());
797
		$this->config->set('ppde_fsock_detected', $this->check_fsockopen());
798
	}
799
800
	/**
801
	 * Get extension metadata
802
	 *
803
	 * @return null
804
	 * @access protected
805
	 */
806
	protected function get_ext_meta()
807
	{
808
		if (empty($this->ext_meta))
809
		{
810
			$this->load_metadata();
811
		}
812
	}
813
814
	/**
815
	 * Load metadata for this extension
816
	 *
817
	 * @return array
818
	 * @access public
819
	 */
820
	public function load_metadata()
821
	{
822
		// Retrieve the extension name based on the namespace of this file
823
		$this->retrieve_ext_name();
824
825
		// If they've specified an extension, let's load the metadata manager and validate it.
826
		if ($this->ext_name)
827
		{
828
			$md_manager = new \phpbb\extension\metadata_manager($this->ext_name, $this->config, $this->extension_manager, $this->template, $this->user, $this->root_path);
829
830
			try
831
			{
832
				$this->ext_meta = $md_manager->get_metadata('all');
833
			}
834
			catch (\phpbb\extension\exception $e)
835
			{
836
				trigger_error($e, E_USER_WARNING);
837
			}
838
		}
839
840
		return $this->ext_meta;
841
	}
842
843
	/**
844
	 * Retrieve the extension name
845
	 *
846
	 * @return null
847
	 * @access protected
848
	 */
849
	protected function retrieve_ext_name()
850
	{
851
		$namespace_ary = explode('\\', __NAMESPACE__);
852
		$this->ext_name = $namespace_ary[0] . '/' . $namespace_ary[1];
853
	}
854
855
	/**
856
	 * Check if fsockopen is available
857
	 *
858
	 * @return bool
859
	 * @access public
860
	 */
861
	public function check_fsockopen()
862
	{
863
		if (function_exists('fsockopen'))
864
		{
865
			$this->get_ext_meta();
866
867
			$url = parse_url($this->ext_meta['extra']['version-check']['host']);
868
869
			$fp = @fsockopen($url['path'], 80);
870
871
			return ($fp !== false) ? true : false;
872
		}
873
874
		return false;
875
	}
876
}
877