Completed
Pull Request — develop (#22)
by Mario
03:59 queued 01:29
created

main_controller::paypal_hidden_fields()   A

Complexity

Conditions 1
Paths 1

Size

Total Lines 16
Code Lines 13

Duplication

Lines 0
Ratio 0 %

Importance

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