Completed
Pull Request — develop (#22)
by Mario
02:37 queued 10s
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.4286
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()
1 ignored issue
show
Coding Style introduced by
donorlist_handle uses the super-global variable $_REQUEST which is generally not recommended.

Instead of super-globals, we recommend to explicitly inject the dependencies of your class. This makes your code less dependent on global state and it becomes generally more testable:

// Bad
class Router
{
    public function generate($path)
    {
        return $_SERVER['HOST'].$path;
    }
}

// Better
class Router
{
    private $host;

    public function __construct($host)
    {
        $this->host = $host;
    }

    public function generate($path)
    {
        return $this->host.$path;
    }
}

class Controller
{
    public function myAction(Request $request)
    {
        // Instead of
        $page = isset($_GET['page']) ? intval($_GET['page']) : 1;

        // Better (assuming you use the Symfony2 request)
        $page = $request->query->get('page', 1);
    }
}
Loading history...
138
	{
139
		// When this extension is disabled, redirect users back to the forum index
140
		// Else if user is not allowed to use it, disallow access to the extension main 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
		$start = $this->request->variable('start', 0);
159
160
		// Build a relevant pagination_url
161
		$params = $sort_params = array();
0 ignored issues
show
Unused Code introduced by
$sort_params is not used, you could remove the assignment.

This check looks for variable assignements that are either overwritten by other assignments or where the variable is not used subsequently.

$myVar = 'Value';
$higher = false;

if (rand(1, 6) > 3) {
    $higher = true;
} else {
    $higher = false;
}

Both the $myVar assignment in line 1 and the $higher assignment in line 2 are dead. The first because $myVar is never used and the second because $higher is always overwritten for every possible time line.

Loading history...
162
163
		// We do not use request_var() here directly to save some calls (not all variables are set)
164
		$check_params = array(
165
			'sk'    => array('sk', $default_key),
166
			'sd'    => array('sd', 'a'),
167
		);
168
169
		foreach ($check_params as $key => $call)
170
		{
171
			if (!isset($_REQUEST[$key]))
172
			{
173
				continue;
174
			}
175
176
			$param = call_user_func_array('request_var', $call);
177
			$param = urlencode($key) . '=' . ((is_string($param)) ? urlencode($param) : $param);
178
			$params[] = $param;
179
		}
180
181
		// Set '$this->u_action'
182
		$use_page = ($this->u_action) ? $this->u_action : $this->user->page['page_name'];
183
		$this->u_action = reapply_sid($path_helper->get_valid_page($use_page, $this->config['enable_mod_rewrite']));
184
185
		$get_donorlist_sql_ary = $this->ppde_operator_transactions->get_sql_donorlist_ary();
186
		$count = $this->ppde_operator_transactions->query_sql_count($get_donorlist_sql_ary, 'txn.user_id');
187
		$start = $pagination->validate_start($start, $this->config['topics_per_page'], $count);
188
189
		$pagination_url = $this->u_action . implode('&amp;', $params);
190
		$pagination->generate_template_pagination($pagination_url, 'pagination', 'start', $count, $this->config['topics_per_page'], $start);
191
192
		// adds fields to the table schema needed by entity->import()
193
		$additional_table_schema = array(
194
			'item_username'    => array('name' => 'username', 'type' => 'string'),
195
			'item_user_colour' => array('name' => 'user_colour', 'type' => 'string'),
196
			'item_amount'      => array('name' => 'amount', 'type' => 'string'),
197
			'item_last_date'   => array('name' => 'date', 'type' => 'string'),
198
		);
199
200
		$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);
201
202
		foreach ($data_ary as $data)
203
		{
204
			// Get default currency data from the database
205
			$default_currency_data = $this->get_default_currency_data($this->config['ppde_default_currency']);
206
207
			$this->template->assign_block_vars('donorrow', array(
208
				'PPDE_DONOR_USERNAME'    => get_username_string('full', $data['user_id'], $data['username'], $data['user_colour']),
209
				'PPDE_DONATED_AMOUNT'    => $this->get_amount($data['amount'], $default_currency_data[0]['currency_symbol'], (bool) $default_currency_data[0]['currency_on_left']),
210
				'PPDE_LAST_PAYMENT_DATE' => $this->user->format_date($data['date']),
211
			));
212
		}
213
214
		// Set "return_args_url" object before sending data to template
215
		$this->set_return_args_url('donorlist');
216
217
		// Send all data to the template file
218
		return $this->send_data_to_template();
219
	}
220
221
	/**
222
	 * @return bool
223
	 * @access public
224
	 */
225
	public function can_use_ppde()
226
	{
227
		return $this->auth->acl_get('u_ppde_use');
228
	}
229
230
	/**
231
	 * @return bool
232
	 * @access public
233
	 */
234
	public function can_view_ppde_donorlist()
235
	{
236
		return $this->auth->acl_get('u_ppde_view_donorlist');
237
	}
238
239
	/**
240
	 * @param string $set_return_args_url
241
	 *
242
	 * @return null
243
	 * @access private
244
	 */
245
	private function set_return_args_url($set_return_args_url)
246
	{
247
		switch ($set_return_args_url)
248
		{
249
			case 'cancel':
250
			case 'success':
251
				$this->template->assign_vars(array(
252
					'L_PPDE_DONATION_TITLE' => $this->user->lang['PPDE_' . strtoupper($set_return_args_url) . '_TITLE'],
253
				));
254
				$this->return_args_url = $set_return_args_url;
255
				break;
256
			case 'donorlist':
257
				$this->template->assign_vars(array(
258
					'L_PPDE_DONORLIST_TITLE' => $this->user->lang['PPDE_DONORLIST_TITLE'],
259
				));
260
				$this->return_args_url = $set_return_args_url;
261
				break;
262
			default:
263
				$this->return_args_url = 'body';
264
		}
265
266
	}
267
268
	/**
269
	 * Get content of current donation pages
270
	 *
271
	 * @param string $return_args_url
272
	 *
273
	 * @return array
274
	 * @access private
275
	 */
276
	private function get_donation_content_data($return_args_url)
277
	{
278
		return $this->donation_content_data =
279
			$this->ppde_entity_donation_pages->get_data(
280
				$this->ppde_operator_donation_pages->build_sql_data($this->user->get_iso_lang_id(), $return_args_url));
281
	}
282
283
	/**
284
	 * Build pull down menu options of available currency
285
	 *
286
	 * @param int $config_value Currency identifier; default: 0
287
	 *
288
	 * @return null
289
	 * @access public
290
	 */
291
	public function build_currency_select_menu($config_value = 0)
292
	{
293
		// Grab the list of all enabled currencies; 0 is for all data
294
		$currency_items = $this->ppde_entity_currency->get_data($this->ppde_operator_currency->build_sql_data(0, true));
295
296
		// Process each rule menu item for pull-down
297
		foreach ($currency_items as $currency_item)
298
		{
299
			// Set output block vars for display in the template
300
			$this->template->assign_block_vars('options', array(
301
				'CURRENCY_ID'        => (int) $currency_item['currency_id'],
302
				'CURRENCY_ISO_CODE'  => $currency_item['currency_iso_code'],
303
				'CURRENCY_NAME'      => $currency_item['currency_name'],
304
				'CURRENCY_SYMBOL'    => $currency_item['currency_symbol'],
305
306
				'S_CURRENCY_DEFAULT' => $config_value == $currency_item['currency_id'],
307
			));
308
		}
309
		unset ($currency_items, $currency_item);
310
	}
311
312
	/**
313
	 * Build pull down menu options of available currency value
314
	 *
315
	 * @return string List of currency value set in ACP for dropdown menu
316
	 * @access private
317
	 */
318
	private function build_currency_value_select_menu()
319
	{
320
		$list_donation_value = '';
321
322
		if ($this->get_dropbox_status())
323
		{
324
			$donation_ary_value = explode(',', $this->config['ppde_dropbox_value']);
325
326
			foreach ($donation_ary_value as $value)
327
			{
328
				$int_value = $this->settype_dropbox_int_value($value);
329
				$list_donation_value .= !empty($int_value) ? '<option value="' . $int_value . '">' . $int_value . '</option>' : '';
330
			}
331
			unset($value);
332
		}
333
334
		return $list_donation_value;
335
	}
336
337
	/**
338
	 * Get dropbox config value
339
	 *
340
	 * @return bool
341
	 * @access private
342
	 */
343
	private function get_dropbox_status()
344
	{
345
		return $this->config['ppde_dropbox_enable'] && $this->config['ppde_dropbox_value'];
346
	}
347
348
	/**
349
	 * Force dropbox value to integer
350
	 *
351
	 * @param int $value
352
	 *
353
	 * @return int
354
	 */
355
	private function settype_dropbox_int_value($value = 0)
356
	{
357
		if (settype($value, 'integer') && $value != 0)
358
		{
359
			return $value;
360
		}
361
362
		return 0;
363
	}
364
365
	/**
366
	 * Build PayPal hidden fields
367
	 *
368
	 * @return string PayPal hidden field needed to fill PayPal forms
369
	 * @access private
370
	 */
371
	private function paypal_hidden_fields()
372
	{
373
		return build_hidden_fields(array(
374
			'cmd'           => '_donations',
375
			'business'      => $this->get_account_id(),
376
			'item_name'     => $this->user->lang['PPDE_DONATION_TITLE_HEAD'] . ' ' . $this->config['sitename'],
377
			'no_shipping'   => 1,
378
			'return'        => $this->generate_paypal_return_url('success'),
379
			'notify_url'    => $this->generate_paypal_notify_return_url(),
380
			'cancel_return' => $this->generate_paypal_return_url('cancel'),
381
			'item_number'   => 'uid_' . $this->user->data['user_id'] . '_' . time(),
382
			'tax'           => 0,
383
			'bn'            => 'Board_Donate_WPS',
384
			'charset'       => 'utf-8',
385
		));
386
	}
387
388
	/**
389
	 * Get PayPal account id
390
	 *
391
	 * @return string $this Paypal account Identifier
392
	 * @access private
393
	 */
394
	private function get_account_id()
395
	{
396
		return $this->use_sandbox() ? $this->config['ppde_sandbox_address'] : $this->config['ppde_account_id'];
397
	}
398
399
	/**
400
	 * Check if Sandbox is enabled
401
	 *
402
	 * @return bool
403
	 * @access public
404
	 */
405
	public function use_sandbox()
406
	{
407
		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']));
408
	}
409
410
	/**
411
	 * Check if IPN is enabled
412
	 *
413
	 * @return bool
414
	 * @access public
415
	 */
416
	public function use_ipn()
417
	{
418
		return !empty($this->config['ppde_enable']) && !empty($this->config['ppde_ipn_enable']) && (!empty($this->config['ppde_curl_detected']) || !empty($this->config['ppde_fsockopen_detected']));
419
	}
420
421
	/**
422
	 * Generate PayPal return URL
423
	 *
424
	 * @param string $arg
425
	 *
426
	 * @return string
427
	 * @access private
428
	 */
429
	private function generate_paypal_return_url($arg)
430
	{
431
		return generate_board_url(true) . $this->helper->route('skouat_ppde_donate', array('return' => $arg));
432
	}
433
434
	/**
435
	 * Generate PayPal return notify URL
436
	 *
437
	 * @return string
438
	 * @access private
439
	 */
440
	private function generate_paypal_notify_return_url()
441
	{
442
		return generate_board_url(true) . $this->helper->route('skouat_ppde_ipn_listener');
443
	}
444
445
	/**
446
	 * Get PayPal URL
447
	 * Used in form and in IPN process
448
	 *
449
	 * @param bool $is_test_ipn
450
	 *
451
	 * @return string
452
	 * @access public
453
	 */
454
	public function get_paypal_url($is_test_ipn = false)
455
	{
456
		return ($is_test_ipn || $this->use_sandbox()) ? 'https://www.sandbox.paypal.com/cgi-bin/webscr' : 'https://www.paypal.com/cgi-bin/webscr';
457
	}
458
459
	/**
460
	 * Assign statistics vars to the template
461
	 *
462
	 * @return null
463
	 * @access public
464
	 */
465
	public function display_stats()
466
	{
467
		if ($this->config['ppde_goal_enable'] || $this->config['ppde_raised_enable'] || $this->config['ppde_used_enable'])
468
		{
469
			// Get data from the database
470
			$default_currency_data = $this->get_default_currency_data($this->config['ppde_default_currency']);
471
472
			$this->template->assign_vars(array(
473
				'PPDE_GOAL_ENABLE'   => $this->config['ppde_goal_enable'],
474
				'PPDE_RAISED_ENABLE' => $this->config['ppde_raised_enable'],
475
				'PPDE_USED_ENABLE'   => $this->config['ppde_used_enable'],
476
477
				'L_PPDE_GOAL'        => $this->get_ppde_goal_langkey($default_currency_data[0]['currency_symbol'], (bool) $default_currency_data[0]['currency_on_left']),
478
				'L_PPDE_RAISED'      => $this->get_ppde_raised_langkey($default_currency_data[0]['currency_symbol'], (bool) $default_currency_data[0]['currency_on_left']),
479
				'L_PPDE_USED'        => $this->get_ppde_used_langkey($default_currency_data[0]['currency_symbol'], (bool) $default_currency_data[0]['currency_on_left']),
480
			));
481
482
			// Generate statistics percent for display
483
			$this->generate_stats_percent();
484
		}
485
	}
486
487
	/**
488
	 * Get default currency symbol
489
	 *
490
	 * @param int $id
491
	 *
492
	 * @return array
493
	 * @access public
494
	 */
495
	public function get_default_currency_data($id = 0)
496
	{
497
		return $this->ppde_entity_currency->get_data($this->ppde_operator_currency->build_sql_data($id, true));
498
	}
499
500
	/**
501
	 * Retrieve the language key for donation goal
502
	 *
503
	 * @param string $currency_symbol Currency symbol
504
	 * @param bool   $on_left         Symbol position
505
	 *
506
	 * @return string
507
	 * @access public
508
	 */
509
	public function get_ppde_goal_langkey($currency_symbol, $on_left = true)
510
	{
511
		if ((int) $this->config['ppde_goal'] <= 0)
512
		{
513
			$l_ppde_goal = $this->user->lang['DONATE_NO_GOAL'];
514
		}
515 View Code Duplication
		else if ((int) $this->config['ppde_goal'] < (int) $this->config['ppde_raised'])
516
		{
517
			$l_ppde_goal = $this->user->lang['DONATE_GOAL_REACHED'];
518
		}
519
		else
520
		{
521
			$l_ppde_goal = $this->user->lang('DONATE_GOAL_RAISE', $this->get_amount((int) $this->config['ppde_goal'], $currency_symbol, $on_left));
522
		}
523
524
		return $l_ppde_goal;
525
	}
526
527
	/**
528
	 * Put the currency on the left or on the right of the amount
529
	 *
530
	 * @param int    $value
531
	 * @param string $currency
532
	 * @param bool   $on_left
533
	 *
534
	 * @return string
535
	 */
536
	private function get_amount($value, $currency, $on_left = true)
537
	{
538
		return $on_left ? $currency . $value : $value . $currency;
539
	}
540
541
	/**
542
	 * Retrieve the language key for donation raised
543
	 *
544
	 * @param string $currency_symbol Currency symbol
545
	 * @param bool   $on_left         Symbol position
546
	 *
547
	 * @return string
548
	 * @access public
549
	 */
550
	public function get_ppde_raised_langkey($currency_symbol, $on_left = true)
551
	{
552 View Code Duplication
		if ((int) $this->config['ppde_raised'] <= 0)
553
		{
554
			$l_ppde_raised = $this->user->lang['DONATE_NOT_RECEIVED'];
555
		}
556
		else
557
		{
558
			$l_ppde_raised = $this->user->lang('DONATE_RECEIVED', $this->get_amount((int) $this->config['ppde_raised'], $currency_symbol, $on_left));
559
		}
560
561
		return $l_ppde_raised;
562
	}
563
564
	/**
565
	 * Retrieve the language key for donation used
566
	 *
567
	 * @param string $currency_symbol Currency symbol
568
	 * @param bool   $on_left         Symbol position
569
	 *
570
	 * @return string
571
	 * @access public
572
	 */
573
	public function get_ppde_used_langkey($currency_symbol, $on_left = true)
574
	{
575
		if ((int) $this->config['ppde_used'] <= 0)
576
		{
577
			$l_ppde_used = $this->user->lang['DONATE_NOT_USED'];
578
		}
579
		else if ((int) $this->config['ppde_used'] < (int) $this->config['ppde_raised'])
580
		{
581
			$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));
582
		}
583
		else
584
		{
585
			$l_ppde_used = $this->user->lang('DONATE_USED_EXCEEDED', $this->get_amount((int) $this->config['ppde_used'], $currency_symbol, $on_left));
586
		}
587
588
		return $l_ppde_used;
589
	}
590
591
	/**
592
	 * Generate statistics percent for display
593
	 *
594
	 * @return null
595
	 * @access private
596
	 */
597
	private function generate_stats_percent()
598
	{
599
		if ($this->config['ppde_goal_enable'] && (int) $this->config['ppde_goal'] > 0)
600
		{
601
			$this->assign_vars_stats_percent((int) $this->config['ppde_raised'], (int) $this->config['ppde_goal'], 'GOAL_NUMBER');
602
		}
603
604
		if ($this->config['ppde_used_enable'] && (int) $this->config['ppde_raised'] > 0 && (int) $this->config['ppde_used'] > 0)
605
		{
606
			$this->assign_vars_stats_percent((int) $this->config['ppde_used'], (int) $this->config['ppde_raised'], 'USED_NUMBER');
607
		}
608
	}
609
610
	/**
611
	 * Assign statistics percent vars to template
612
	 *
613
	 * @param integer $multiplicand
614
	 * @param integer $dividend
615
	 * @param string  $type
616
	 *
617
	 * @return null
618
	 * @access public
619
	 */
620
	private function assign_vars_stats_percent($multiplicand, $dividend, $type = '')
621
	{
622
		$this->template->assign_vars(array(
623
			'PPDE_' . $type => round(($multiplicand * 100) / $dividend, 2),
624
			'S_' . $type    => !empty($type) ? true : false,
625
		));
626
	}
627
628
	/**
629
	 * Send data to the template file
630
	 *
631
	 * @return \Symfony\Component\HttpFoundation\Response
632
	 * @access private
633
	 */
634
	private function send_data_to_template()
635
	{
636
		switch ($this->return_args_url)
637
		{
638
			case 'cancel':
639
			case 'success':
640
				return $this->helper->render('donate_body.html', $this->user->lang('PPDE_' . strtoupper($this->return_args_url) . '_TITLE'));
641
			case 'donorlist':
642
				return $this->helper->render('donorlist_body.html', $this->user->lang('PPDE_DONORLIST_TITLE'));
643
			default:
644
				return $this->helper->render('donate_body.html', $this->user->lang('PPDE_DONATION_TITLE'));
645
		}
646
	}
647
648
	/**
649
	 * Check if cURL is available
650
	 *
651
	 * @return bool
652
	 * @access public
653
	 */
654
	public function check_curl()
655
	{
656
		if (function_exists('curl_init') && function_exists('curl_exec'))
657
		{
658
			$this->get_ext_meta();
659
660
			$ch = curl_init($this->ext_meta['extra']['version-check']['host']);
661
662
			curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
663
664
			$response = curl_exec($ch);
665
			$response_status = strval(curl_getinfo($ch, CURLINFO_HTTP_CODE));
666
667
			curl_close($ch);
668
669
			return ($response !== false || $response_status !== '0') ? true : false;
670
		}
671
672
		return false;
673
	}
674
675
	/**
676
	 * Get extension metadata
677
	 *
678
	 * @return null
679
	 * @access protected
680
	 */
681
	protected function get_ext_meta()
682
	{
683
		if (empty($this->ext_meta))
684
		{
685
			$this->load_metadata();
686
		}
687
	}
688
689
	/**
690
	 * Load metadata for this extension
691
	 *
692
	 * @return array
693
	 * @access public
694
	 */
695
	public function load_metadata()
696
	{
697
		// Retrieve the extension name based on the namespace of this file
698
		$this->retrieve_ext_name();
699
700
		// If they've specified an extension, let's load the metadata manager and validate it.
701
		if ($this->ext_name)
702
		{
703
			$md_manager = new \phpbb\extension\metadata_manager($this->ext_name, $this->config, $this->extension_manager, $this->template, $this->user, $this->root_path);
704
705
			try
706
			{
707
				$this->ext_meta = $md_manager->get_metadata('all');
708
			}
709
			catch (\phpbb\extension\exception $e)
710
			{
711
				trigger_error($e, E_USER_WARNING);
712
			}
713
		}
714
715
		return $this->ext_meta;
716
	}
717
718
	/**
719
	 * Retrieve the extension name
720
	 *
721
	 * @return null
722
	 * @access protected
723
	 */
724
	protected function retrieve_ext_name()
725
	{
726
		$namespace_ary = explode('\\', __NAMESPACE__);
727
		$this->ext_name = $namespace_ary[0] . '/' . $namespace_ary[1];
728
	}
729
730
	/**
731
	 * Check if fsockopen is available
732
	 *
733
	 * @return bool
734
	 * @access public
735
	 */
736
	public function check_fsockopen()
737
	{
738
		if (function_exists('fsockopen'))
739
		{
740
			$this->get_ext_meta();
741
742
			$url = parse_url($this->ext_meta['extra']['version-check']['host']);
743
744
			$fp = @fsockopen($url['path'], 80);
745
746
			return ($fp !== false) ? true : false;
747
		}
748
749
		return false;
750
	}
751
}
752