Completed
Pull Request — master (#23)
by Mario
119:06
created

main_controller::generate_stats_percent()   B

Complexity

Conditions 6
Paths 4

Size

Total Lines 12
Code Lines 5

Duplication

Lines 0
Ratio 0 %

Importance

Changes 5
Bugs 1 Features 3
Metric Value
c 5
b 1
f 3
dl 0
loc 12
rs 8.8571
cc 6
eloc 5
nc 4
nop 0
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
	 */
427
	private function settype_dropbox_int_value($value = 0)
428
	{
429
		if (settype($value, 'integer') && $value != 0)
430
		{
431
			return $value;
432
		}
433
434
		return 0;
435
	}
436
437
	/**
438
	 * Build PayPal hidden fields
439
	 *
440
	 * @return string PayPal hidden field needed to fill PayPal forms
441
	 * @access private
442
	 */
443
	private function paypal_hidden_fields()
444
	{
445
		return build_hidden_fields(array(
446
			'cmd'           => '_donations',
447
			'business'      => $this->get_account_id(),
448
			'item_name'     => $this->user->lang['PPDE_DONATION_TITLE_HEAD'] . ' ' . $this->config['sitename'],
449
			'no_shipping'   => 1,
450
			'return'        => $this->generate_paypal_return_url('success'),
451
			'notify_url'    => $this->generate_paypal_notify_return_url(),
452
			'cancel_return' => $this->generate_paypal_return_url('cancel'),
453
			'item_number'   => 'uid_' . $this->user->data['user_id'] . '_' . time(),
454
			'tax'           => 0,
455
			'bn'            => 'Board_Donate_WPS',
456
			'charset'       => 'utf-8',
457
		));
458
	}
459
460
	/**
461
	 * Get PayPal account id
462
	 *
463
	 * @return string $this Paypal account Identifier
464
	 * @access private
465
	 */
466
	private function get_account_id()
467
	{
468
		return $this->use_sandbox() ? $this->config['ppde_sandbox_address'] : $this->config['ppde_account_id'];
469
	}
470
471
	/**
472
	 * Check if Sandbox is enabled
473
	 *
474
	 * @return bool
475
	 * @access public
476
	 */
477
	public function use_sandbox()
478
	{
479
		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']));
480
	}
481
482
	/**
483
	 * Check if IPN is enabled
484
	 *
485
	 * @return bool
486
	 * @access public
487
	 */
488
	public function use_ipn()
489
	{
490
		return !empty($this->config['ppde_enable']) && !empty($this->config['ppde_ipn_enable']) && (!empty($this->config['ppde_curl_detected']) || !empty($this->config['ppde_fsockopen_detected']));
491
	}
492
493
	/**
494
	 * Generate PayPal return URL
495
	 *
496
	 * @param string $arg
497
	 *
498
	 * @return string
499
	 * @access private
500
	 */
501
	private function generate_paypal_return_url($arg)
502
	{
503
		return generate_board_url(true) . $this->helper->route('skouat_ppde_donate', array('return' => $arg));
504
	}
505
506
	/**
507
	 * Generate PayPal return notify URL
508
	 *
509
	 * @return string
510
	 * @access private
511
	 */
512
	private function generate_paypal_notify_return_url()
513
	{
514
		return generate_board_url(true) . $this->helper->route('skouat_ppde_ipn_listener');
515
	}
516
517
	/**
518
	 * Get PayPal URL
519
	 * Used in form and in IPN process
520
	 *
521
	 * @param bool $is_test_ipn
522
	 *
523
	 * @return string
524
	 * @access public
525
	 */
526
	public function get_paypal_url($is_test_ipn = false)
527
	{
528
		return ($is_test_ipn || $this->use_sandbox()) ? 'https://www.sandbox.paypal.com/cgi-bin/webscr' : 'https://www.paypal.com/cgi-bin/webscr';
529
	}
530
531
	/**
532
	 * Assign statistics vars to the template
533
	 *
534
	 * @return null
535
	 * @access public
536
	 */
537
	public function display_stats()
538
	{
539
		if ($this->config['ppde_goal_enable'] || $this->config['ppde_raised_enable'] || $this->config['ppde_used_enable'])
540
		{
541
			// Get data from the database
542
			$default_currency_data = $this->get_default_currency_data($this->config['ppde_default_currency']);
543
544
			$this->template->assign_vars(array(
545
				'PPDE_GOAL_ENABLE'   => $this->config['ppde_goal_enable'],
546
				'PPDE_RAISED_ENABLE' => $this->config['ppde_raised_enable'],
547
				'PPDE_USED_ENABLE'   => $this->config['ppde_used_enable'],
548
549
				'L_PPDE_GOAL'        => $this->get_ppde_goal_langkey($default_currency_data[0]['currency_symbol'], (bool) $default_currency_data[0]['currency_on_left']),
550
				'L_PPDE_RAISED'      => $this->get_ppde_raised_langkey($default_currency_data[0]['currency_symbol'], (bool) $default_currency_data[0]['currency_on_left']),
551
				'L_PPDE_USED'        => $this->get_ppde_used_langkey($default_currency_data[0]['currency_symbol'], (bool) $default_currency_data[0]['currency_on_left']),
552
			));
553
554
			// Generate statistics percent for display
555
			$this->generate_stats_percent();
556
		}
557
	}
558
559
	/**
560
	 * Get default currency symbol
561
	 *
562
	 * @param int $id
563
	 *
564
	 * @return array
565
	 * @access public
566
	 */
567
	public function get_default_currency_data($id = 0)
568
	{
569
		return $this->ppde_entity_currency->get_data($this->ppde_operator_currency->build_sql_data($id, true));
570
	}
571
572
	/**
573
	 * Retrieve the language key for donation goal
574
	 *
575
	 * @param string $currency_symbol Currency symbol
576
	 * @param bool   $on_left         Symbol position
577
	 *
578
	 * @return string
579
	 * @access public
580
	 */
581
	public function get_ppde_goal_langkey($currency_symbol, $on_left = true)
582
	{
583
		if ((int) $this->config['ppde_goal'] <= 0)
584
		{
585
			$l_ppde_goal = $this->user->lang['DONATE_NO_GOAL'];
586
		}
587 View Code Duplication
		else if ((int) $this->config['ppde_goal'] < (int) $this->config['ppde_raised'])
588
		{
589
			$l_ppde_goal = $this->user->lang['DONATE_GOAL_REACHED'];
590
		}
591
		else
592
		{
593
			$l_ppde_goal = $this->user->lang('DONATE_GOAL_RAISE', $this->get_amount((int) $this->config['ppde_goal'], $currency_symbol, $on_left));
594
		}
595
596
		return $l_ppde_goal;
597
	}
598
599
	/**
600
	 * Put the currency on the left or on the right of the amount
601
	 *
602
	 * @param int    $value
603
	 * @param string $currency
604
	 * @param bool   $on_left
605
	 *
606
	 * @return string
607
	 */
608
	private function get_amount($value, $currency, $on_left = true)
609
	{
610
		return $on_left ? $currency . $value : $value . $currency;
611
	}
612
613
	/**
614
	 * Retrieve the language key for donation raised
615
	 *
616
	 * @param string $currency_symbol Currency symbol
617
	 * @param bool   $on_left         Symbol position
618
	 *
619
	 * @return string
620
	 * @access public
621
	 */
622
	public function get_ppde_raised_langkey($currency_symbol, $on_left = true)
623
	{
624 View Code Duplication
		if ((int) $this->config['ppde_raised'] <= 0)
625
		{
626
			$l_ppde_raised = $this->user->lang['DONATE_NOT_RECEIVED'];
627
		}
628
		else
629
		{
630
			$l_ppde_raised = $this->user->lang('DONATE_RECEIVED', $this->get_amount((int) $this->config['ppde_raised'], $currency_symbol, $on_left));
631
		}
632
633
		return $l_ppde_raised;
634
	}
635
636
	/**
637
	 * Retrieve the language key for donation used
638
	 *
639
	 * @param string $currency_symbol Currency symbol
640
	 * @param bool   $on_left         Symbol position
641
	 *
642
	 * @return string
643
	 * @access public
644
	 */
645
	public function get_ppde_used_langkey($currency_symbol, $on_left = true)
646
	{
647
		if ((int) $this->config['ppde_used'] <= 0)
648
		{
649
			$l_ppde_used = $this->user->lang['DONATE_NOT_USED'];
650
		}
651
		else if ((int) $this->config['ppde_used'] < (int) $this->config['ppde_raised'])
652
		{
653
			$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));
654
		}
655
		else
656
		{
657
			$l_ppde_used = $this->user->lang('DONATE_USED_EXCEEDED', $this->get_amount((int) $this->config['ppde_used'], $currency_symbol, $on_left));
658
		}
659
660
		return $l_ppde_used;
661
	}
662
663
	/**
664
	 * Generate statistics percent for display
665
	 *
666
	 * @return null
667
	 * @access private
668
	 */
669
	private function generate_stats_percent()
670
	{
671
		if ($this->config['ppde_goal_enable'] && (int) $this->config['ppde_goal'] > 0)
672
		{
673
			$this->assign_vars_stats_percent((int) $this->config['ppde_raised'], (int) $this->config['ppde_goal'], 'GOAL_NUMBER');
674
		}
675
676
		if ($this->config['ppde_used_enable'] && (int) $this->config['ppde_raised'] > 0 && (int) $this->config['ppde_used'] > 0)
677
		{
678
			$this->assign_vars_stats_percent((int) $this->config['ppde_used'], (int) $this->config['ppde_raised'], 'USED_NUMBER');
679
		}
680
	}
681
682
	/**
683
	 * Assign statistics percent vars to template
684
	 *
685
	 * @param integer $multiplicand
686
	 * @param integer $dividend
687
	 * @param string  $type
688
	 *
689
	 * @return null
690
	 * @access public
691
	 */
692
	private function assign_vars_stats_percent($multiplicand, $dividend, $type = '')
693
	{
694
		$this->template->assign_vars(array(
695
			'PPDE_' . $type => round(($multiplicand * 100) / $dividend, 2),
696
			'S_' . $type    => !empty($type) ? true : false,
697
		));
698
	}
699
700
	/**
701
	 * Send data to the template file
702
	 *
703
	 * @return \Symfony\Component\HttpFoundation\Response
704
	 * @access private
705
	 */
706
	private function send_data_to_template()
707
	{
708
		switch ($this->return_args_url)
709
		{
710
			case 'cancel':
711
			case 'success':
712
				return $this->helper->render('donate_body.html', $this->user->lang('PPDE_' . strtoupper($this->return_args_url) . '_TITLE'));
713
			case 'donorlist':
714
				return $this->helper->render('donorlist_body.html', $this->user->lang('PPDE_DONORLIST_TITLE'));
715
			default:
716
				return $this->helper->render('donate_body.html', $this->user->lang('PPDE_DONATION_TITLE'));
717
		}
718
	}
719
720
	/**
721
	 * Check if cURL is available
722
	 *
723
	 * @return bool
724
	 * @access public
725
	 */
726
	public function check_curl()
727
	{
728
		if (function_exists('curl_init') && function_exists('curl_exec'))
729
		{
730
			$this->get_ext_meta();
731
732
			$ch = curl_init($this->ext_meta['extra']['version-check']['host']);
733
734
			curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
735
736
			$response = curl_exec($ch);
737
			$response_status = strval(curl_getinfo($ch, CURLINFO_HTTP_CODE));
738
739
			curl_close($ch);
740
741
			return ($response !== false || $response_status !== '0') ? true : false;
742
		}
743
744
		return false;
745
	}
746
747
	/**
748
	 * Get extension metadata
749
	 *
750
	 * @return null
751
	 * @access protected
752
	 */
753
	protected function get_ext_meta()
754
	{
755
		if (empty($this->ext_meta))
756
		{
757
			$this->load_metadata();
758
		}
759
	}
760
761
	/**
762
	 * Load metadata for this extension
763
	 *
764
	 * @return array
765
	 * @access public
766
	 */
767
	public function load_metadata()
768
	{
769
		// Retrieve the extension name based on the namespace of this file
770
		$this->retrieve_ext_name();
771
772
		// If they've specified an extension, let's load the metadata manager and validate it.
773
		if ($this->ext_name)
774
		{
775
			$md_manager = new \phpbb\extension\metadata_manager($this->ext_name, $this->config, $this->extension_manager, $this->template, $this->user, $this->root_path);
776
777
			try
778
			{
779
				$this->ext_meta = $md_manager->get_metadata('all');
780
			}
781
			catch (\phpbb\extension\exception $e)
782
			{
783
				trigger_error($e, E_USER_WARNING);
784
			}
785
		}
786
787
		return $this->ext_meta;
788
	}
789
790
	/**
791
	 * Retrieve the extension name
792
	 *
793
	 * @return null
794
	 * @access protected
795
	 */
796
	protected function retrieve_ext_name()
797
	{
798
		$namespace_ary = explode('\\', __NAMESPACE__);
799
		$this->ext_name = $namespace_ary[0] . '/' . $namespace_ary[1];
800
	}
801
802
	/**
803
	 * Check if fsockopen is available
804
	 *
805
	 * @return bool
806
	 * @access public
807
	 */
808
	public function check_fsockopen()
809
	{
810
		if (function_exists('fsockopen'))
811
		{
812
			$this->get_ext_meta();
813
814
			$url = parse_url($this->ext_meta['extra']['version-check']['host']);
815
816
			$fp = @fsockopen($url['path'], 80);
817
818
			return ($fp !== false) ? true : false;
819
		}
820
821
		return false;
822
	}
823
}
824