Completed
Pull Request — develop (#22)
by Mario
02:37 queued 10s
created

main_controller::use_ipn()   A

Complexity

Conditions 4
Paths 5

Size

Total Lines 4
Code Lines 2

Duplication

Lines 0
Ratio 0 %

Importance

Changes 1
Bugs 0 Features 0
Metric Value
c 1
b 0
f 0
dl 0
loc 4
rs 9.2
cc 4
eloc 2
nc 5
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()
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