Completed
Pull Request — master (#23)
by Mario
02:57
created

main_controller::get_ppde_goal_langkey()   A

Complexity

Conditions 3
Paths 3

Size

Total Lines 17
Code Lines 8

Duplication

Lines 8
Ratio 47.06 %

Importance

Changes 4
Bugs 1 Features 3
Metric Value
c 4
b 1
f 3
dl 8
loc 17
rs 9.4285
cc 3
eloc 8
nc 3
nop 2
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 $params
265
	 *
266
	 * @return array
267
	 * @access private
268
	 */
269
	private function check_params($params_ary, $excluded_keys)
270
	{
271
		$params = array();
272
273
		foreach ($params_ary as $key => $call)
274
		{
275
			if (!isset($_REQUEST[$key]))
276
			{
277
				continue;
278
			}
279
280
			$param = call_user_func_array('request_var', $call);
281
			$param = urlencode($key) . '=' . ((is_string($param)) ? urlencode($param) : $param);
282
283
			if (!in_array($key, $excluded_keys))
284
			{
285
				$params[] = $param;
286
			}
287
		}
288
289
		return $params;
290
	}
291
292
	/**
293
	 * @return bool
294
	 * @access public
295
	 */
296
	public function can_use_ppde()
297
	{
298
		return $this->auth->acl_get('u_ppde_use');
299
	}
300
301
	/**
302
	 * @return bool
303
	 * @access public
304
	 */
305
	public function can_view_ppde_donorlist()
306
	{
307
		return $this->auth->acl_get('u_ppde_view_donorlist');
308
	}
309
310
	/**
311
	 * @param string $set_return_args_url
312
	 *
313
	 * @return null
314
	 * @access private
315
	 */
316
	private function set_return_args_url($set_return_args_url)
317
	{
318
		switch ($set_return_args_url)
319
		{
320
			case 'cancel':
321
			case 'success':
322
				$this->template->assign_vars(array(
323
					'L_PPDE_DONATION_TITLE' => $this->user->lang['PPDE_' . strtoupper($set_return_args_url) . '_TITLE'],
324
				));
325
				$this->return_args_url = $set_return_args_url;
326
				break;
327
			case 'donorlist':
328
				$this->template->assign_vars(array(
329
					'L_PPDE_DONORLIST_TITLE' => $this->user->lang['PPDE_DONORLIST_TITLE'],
330
				));
331
				$this->return_args_url = $set_return_args_url;
332
				break;
333
			default:
334
				$this->return_args_url = 'body';
335
		}
336
337
	}
338
339
	/**
340
	 * Get content of current donation pages
341
	 *
342
	 * @param string $return_args_url
343
	 *
344
	 * @return array
345
	 * @access private
346
	 */
347
	private function get_donation_content_data($return_args_url)
348
	{
349
		return $this->donation_content_data =
350
			$this->ppde_entity_donation_pages->get_data(
351
				$this->ppde_operator_donation_pages->build_sql_data($this->user->get_iso_lang_id(), $return_args_url));
352
	}
353
354
	/**
355
	 * Build pull down menu options of available currency
356
	 *
357
	 * @param int $config_value Currency identifier; default: 0
358
	 *
359
	 * @return null
360
	 * @access public
361
	 */
362
	public function build_currency_select_menu($config_value = 0)
363
	{
364
		// Grab the list of all enabled currencies; 0 is for all data
365
		$currency_items = $this->ppde_entity_currency->get_data($this->ppde_operator_currency->build_sql_data(0, true));
366
367
		// Process each rule menu item for pull-down
368
		foreach ($currency_items as $currency_item)
369
		{
370
			// Set output block vars for display in the template
371
			$this->template->assign_block_vars('options', array(
372
				'CURRENCY_ID'        => (int) $currency_item['currency_id'],
373
				'CURRENCY_ISO_CODE'  => $currency_item['currency_iso_code'],
374
				'CURRENCY_NAME'      => $currency_item['currency_name'],
375
				'CURRENCY_SYMBOL'    => $currency_item['currency_symbol'],
376
377
				'S_CURRENCY_DEFAULT' => $config_value == $currency_item['currency_id'],
378
			));
379
		}
380
		unset ($currency_items, $currency_item);
381
	}
382
383
	/**
384
	 * Build pull down menu options of available currency value
385
	 *
386
	 * @return string List of currency value set in ACP for dropdown menu
387
	 * @access private
388
	 */
389
	private function build_currency_value_select_menu()
390
	{
391
		$list_donation_value = '';
392
393
		if ($this->get_dropbox_status())
394
		{
395
			$donation_ary_value = explode(',', $this->config['ppde_dropbox_value']);
396
397
			foreach ($donation_ary_value as $value)
398
			{
399
				$int_value = $this->settype_dropbox_int_value($value);
400
				$list_donation_value .= !empty($int_value) ? '<option value="' . $int_value . '">' . $int_value . '</option>' : '';
401
			}
402
			unset($value);
403
		}
404
405
		return $list_donation_value;
406
	}
407
408
	/**
409
	 * Get dropbox config value
410
	 *
411
	 * @return bool
412
	 * @access private
413
	 */
414
	private function get_dropbox_status()
415
	{
416
		return $this->config['ppde_dropbox_enable'] && $this->config['ppde_dropbox_value'];
417
	}
418
419
	/**
420
	 * Force dropbox value to integer
421
	 *
422
	 * @param int $value
423
	 *
424
	 * @return int
425
	 */
426
	private function settype_dropbox_int_value($value = 0)
427
	{
428
		if (settype($value, 'integer') && $value != 0)
429
		{
430
			return $value;
431
		}
432
433
		return 0;
434
	}
435
436
	/**
437
	 * Build PayPal hidden fields
438
	 *
439
	 * @return string PayPal hidden field needed to fill PayPal forms
440
	 * @access private
441
	 */
442
	private function paypal_hidden_fields()
443
	{
444
		return build_hidden_fields(array(
445
			'cmd'           => '_donations',
446
			'business'      => $this->get_account_id(),
447
			'item_name'     => $this->user->lang['PPDE_DONATION_TITLE_HEAD'] . ' ' . $this->config['sitename'],
448
			'no_shipping'   => 1,
449
			'return'        => $this->generate_paypal_return_url('success'),
450
			'notify_url'    => $this->generate_paypal_notify_return_url(),
451
			'cancel_return' => $this->generate_paypal_return_url('cancel'),
452
			'item_number'   => 'uid_' . $this->user->data['user_id'] . '_' . time(),
453
			'tax'           => 0,
454
			'bn'            => 'Board_Donate_WPS',
455
			'charset'       => 'utf-8',
456
		));
457
	}
458
459
	/**
460
	 * Get PayPal account id
461
	 *
462
	 * @return string $this Paypal account Identifier
463
	 * @access private
464
	 */
465
	private function get_account_id()
466
	{
467
		return $this->use_sandbox() ? $this->config['ppde_sandbox_address'] : $this->config['ppde_account_id'];
468
	}
469
470
	/**
471
	 * Check if Sandbox is enabled
472
	 *
473
	 * @return bool
474
	 * @access public
475
	 */
476
	public function use_sandbox()
477
	{
478
		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']));
479
	}
480
481
	/**
482
	 * Check if IPN is enabled
483
	 *
484
	 * @return bool
485
	 * @access public
486
	 */
487
	public function use_ipn()
488
	{
489
		return !empty($this->config['ppde_enable']) && !empty($this->config['ppde_ipn_enable']) && (!empty($this->config['ppde_curl_detected']) || !empty($this->config['ppde_fsockopen_detected']));
490
	}
491
492
	/**
493
	 * Generate PayPal return URL
494
	 *
495
	 * @param string $arg
496
	 *
497
	 * @return string
498
	 * @access private
499
	 */
500
	private function generate_paypal_return_url($arg)
501
	{
502
		return generate_board_url(true) . $this->helper->route('skouat_ppde_donate', array('return' => $arg));
503
	}
504
505
	/**
506
	 * Generate PayPal return notify URL
507
	 *
508
	 * @return string
509
	 * @access private
510
	 */
511
	private function generate_paypal_notify_return_url()
512
	{
513
		return generate_board_url(true) . $this->helper->route('skouat_ppde_ipn_listener');
514
	}
515
516
	/**
517
	 * Get PayPal URL
518
	 * Used in form and in IPN process
519
	 *
520
	 * @param bool $is_test_ipn
521
	 *
522
	 * @return string
523
	 * @access public
524
	 */
525
	public function get_paypal_url($is_test_ipn = false)
526
	{
527
		return ($is_test_ipn || $this->use_sandbox()) ? 'https://www.sandbox.paypal.com/cgi-bin/webscr' : 'https://www.paypal.com/cgi-bin/webscr';
528
	}
529
530
	/**
531
	 * Assign statistics vars to the template
532
	 *
533
	 * @return null
534
	 * @access public
535
	 */
536
	public function display_stats()
537
	{
538
		if ($this->config['ppde_goal_enable'] || $this->config['ppde_raised_enable'] || $this->config['ppde_used_enable'])
539
		{
540
			// Get data from the database
541
			$default_currency_data = $this->get_default_currency_data($this->config['ppde_default_currency']);
542
543
			$this->template->assign_vars(array(
544
				'PPDE_GOAL_ENABLE'   => $this->config['ppde_goal_enable'],
545
				'PPDE_RAISED_ENABLE' => $this->config['ppde_raised_enable'],
546
				'PPDE_USED_ENABLE'   => $this->config['ppde_used_enable'],
547
548
				'L_PPDE_GOAL'        => $this->get_ppde_goal_langkey($default_currency_data[0]['currency_symbol'], (bool) $default_currency_data[0]['currency_on_left']),
549
				'L_PPDE_RAISED'      => $this->get_ppde_raised_langkey($default_currency_data[0]['currency_symbol'], (bool) $default_currency_data[0]['currency_on_left']),
550
				'L_PPDE_USED'        => $this->get_ppde_used_langkey($default_currency_data[0]['currency_symbol'], (bool) $default_currency_data[0]['currency_on_left']),
551
			));
552
553
			// Generate statistics percent for display
554
			$this->generate_stats_percent();
555
		}
556
	}
557
558
	/**
559
	 * Get default currency symbol
560
	 *
561
	 * @param int $id
562
	 *
563
	 * @return array
564
	 * @access public
565
	 */
566
	public function get_default_currency_data($id = 0)
567
	{
568
		return $this->ppde_entity_currency->get_data($this->ppde_operator_currency->build_sql_data($id, true));
569
	}
570
571
	/**
572
	 * Retrieve the language key for donation goal
573
	 *
574
	 * @param string $currency_symbol Currency symbol
575
	 * @param bool   $on_left         Symbol position
576
	 *
577
	 * @return string
578
	 * @access public
579
	 */
580
	public function get_ppde_goal_langkey($currency_symbol, $on_left = true)
581
	{
582
		if ((int) $this->config['ppde_goal'] <= 0)
583
		{
584
			$l_ppde_goal = $this->user->lang['DONATE_NO_GOAL'];
585
		}
586 View Code Duplication
		else if ((int) $this->config['ppde_goal'] < (int) $this->config['ppde_raised'])
587
		{
588
			$l_ppde_goal = $this->user->lang['DONATE_GOAL_REACHED'];
589
		}
590
		else
591
		{
592
			$l_ppde_goal = $this->user->lang('DONATE_GOAL_RAISE', $this->get_amount((int) $this->config['ppde_goal'], $currency_symbol, $on_left));
593
		}
594
595
		return $l_ppde_goal;
596
	}
597
598
	/**
599
	 * Put the currency on the left or on the right of the amount
600
	 *
601
	 * @param int    $value
602
	 * @param string $currency
603
	 * @param bool   $on_left
604
	 *
605
	 * @return string
606
	 */
607
	private function get_amount($value, $currency, $on_left = true)
608
	{
609
		return $on_left ? $currency . $value : $value . $currency;
610
	}
611
612
	/**
613
	 * Retrieve the language key for donation raised
614
	 *
615
	 * @param string $currency_symbol Currency symbol
616
	 * @param bool   $on_left         Symbol position
617
	 *
618
	 * @return string
619
	 * @access public
620
	 */
621
	public function get_ppde_raised_langkey($currency_symbol, $on_left = true)
622
	{
623 View Code Duplication
		if ((int) $this->config['ppde_raised'] <= 0)
624
		{
625
			$l_ppde_raised = $this->user->lang['DONATE_NOT_RECEIVED'];
626
		}
627
		else
628
		{
629
			$l_ppde_raised = $this->user->lang('DONATE_RECEIVED', $this->get_amount((int) $this->config['ppde_raised'], $currency_symbol, $on_left));
630
		}
631
632
		return $l_ppde_raised;
633
	}
634
635
	/**
636
	 * Retrieve the language key for donation used
637
	 *
638
	 * @param string $currency_symbol Currency symbol
639
	 * @param bool   $on_left         Symbol position
640
	 *
641
	 * @return string
642
	 * @access public
643
	 */
644
	public function get_ppde_used_langkey($currency_symbol, $on_left = true)
645
	{
646
		if ((int) $this->config['ppde_used'] <= 0)
647
		{
648
			$l_ppde_used = $this->user->lang['DONATE_NOT_USED'];
649
		}
650
		else if ((int) $this->config['ppde_used'] < (int) $this->config['ppde_raised'])
651
		{
652
			$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));
653
		}
654
		else
655
		{
656
			$l_ppde_used = $this->user->lang('DONATE_USED_EXCEEDED', $this->get_amount((int) $this->config['ppde_used'], $currency_symbol, $on_left));
657
		}
658
659
		return $l_ppde_used;
660
	}
661
662
	/**
663
	 * Generate statistics percent for display
664
	 *
665
	 * @return null
666
	 * @access private
667
	 */
668
	private function generate_stats_percent()
669
	{
670
		if ($this->config['ppde_goal_enable'] && (int) $this->config['ppde_goal'] > 0)
671
		{
672
			$this->assign_vars_stats_percent((int) $this->config['ppde_raised'], (int) $this->config['ppde_goal'], 'GOAL_NUMBER');
673
		}
674
675
		if ($this->config['ppde_used_enable'] && (int) $this->config['ppde_raised'] > 0 && (int) $this->config['ppde_used'] > 0)
676
		{
677
			$this->assign_vars_stats_percent((int) $this->config['ppde_used'], (int) $this->config['ppde_raised'], 'USED_NUMBER');
678
		}
679
	}
680
681
	/**
682
	 * Assign statistics percent vars to template
683
	 *
684
	 * @param integer $multiplicand
685
	 * @param integer $dividend
686
	 * @param string  $type
687
	 *
688
	 * @return null
689
	 * @access public
690
	 */
691
	private function assign_vars_stats_percent($multiplicand, $dividend, $type = '')
692
	{
693
		$this->template->assign_vars(array(
694
			'PPDE_' . $type => round(($multiplicand * 100) / $dividend, 2),
695
			'S_' . $type    => !empty($type) ? true : false,
696
		));
697
	}
698
699
	/**
700
	 * Send data to the template file
701
	 *
702
	 * @return \Symfony\Component\HttpFoundation\Response
703
	 * @access private
704
	 */
705
	private function send_data_to_template()
706
	{
707
		switch ($this->return_args_url)
708
		{
709
			case 'cancel':
710
			case 'success':
711
				return $this->helper->render('donate_body.html', $this->user->lang('PPDE_' . strtoupper($this->return_args_url) . '_TITLE'));
712
			case 'donorlist':
713
				return $this->helper->render('donorlist_body.html', $this->user->lang('PPDE_DONORLIST_TITLE'));
714
			default:
715
				return $this->helper->render('donate_body.html', $this->user->lang('PPDE_DONATION_TITLE'));
716
		}
717
	}
718
719
	/**
720
	 * Check if cURL is available
721
	 *
722
	 * @return bool
723
	 * @access public
724
	 */
725
	public function check_curl()
726
	{
727
		if (function_exists('curl_init') && function_exists('curl_exec'))
728
		{
729
			$this->get_ext_meta();
730
731
			$ch = curl_init($this->ext_meta['extra']['version-check']['host']);
732
733
			curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
734
735
			$response = curl_exec($ch);
736
			$response_status = strval(curl_getinfo($ch, CURLINFO_HTTP_CODE));
737
738
			curl_close($ch);
739
740
			return ($response !== false || $response_status !== '0') ? true : false;
741
		}
742
743
		return false;
744
	}
745
746
	/**
747
	 * Get extension metadata
748
	 *
749
	 * @return null
750
	 * @access protected
751
	 */
752
	protected function get_ext_meta()
753
	{
754
		if (empty($this->ext_meta))
755
		{
756
			$this->load_metadata();
757
		}
758
	}
759
760
	/**
761
	 * Load metadata for this extension
762
	 *
763
	 * @return array
764
	 * @access public
765
	 */
766
	public function load_metadata()
767
	{
768
		// Retrieve the extension name based on the namespace of this file
769
		$this->retrieve_ext_name();
770
771
		// If they've specified an extension, let's load the metadata manager and validate it.
772
		if ($this->ext_name)
773
		{
774
			$md_manager = new \phpbb\extension\metadata_manager($this->ext_name, $this->config, $this->extension_manager, $this->template, $this->user, $this->root_path);
775
776
			try
777
			{
778
				$this->ext_meta = $md_manager->get_metadata('all');
779
			}
780
			catch (\phpbb\extension\exception $e)
781
			{
782
				trigger_error($e, E_USER_WARNING);
783
			}
784
		}
785
786
		return $this->ext_meta;
787
	}
788
789
	/**
790
	 * Retrieve the extension name
791
	 *
792
	 * @return null
793
	 * @access protected
794
	 */
795
	protected function retrieve_ext_name()
796
	{
797
		$namespace_ary = explode('\\', __NAMESPACE__);
798
		$this->ext_name = $namespace_ary[0] . '/' . $namespace_ary[1];
799
	}
800
801
	/**
802
	 * Check if fsockopen is available
803
	 *
804
	 * @return bool
805
	 * @access public
806
	 */
807
	public function check_fsockopen()
808
	{
809
		if (function_exists('fsockopen'))
810
		{
811
			$this->get_ext_meta();
812
813
			$url = parse_url($this->ext_meta['extra']['version-check']['host']);
814
815
			$fp = @fsockopen($url['path'], 80);
816
817
			return ($fp !== false) ? true : false;
818
		}
819
820
		return false;
821
	}
822
}
823