Completed
Branch Gutenberg/master (c6dd94)
by
unknown
30:30 queued 15:26
created
core/domain/services/assets/CoreAssetManager.php 1 patch
Indentation   +371 added lines, -371 removed lines patch added patch discarded remove patch
@@ -29,384 +29,384 @@
 block discarded – undo
29 29
 class CoreAssetManager extends AssetManager
30 30
 {
31 31
 
32
-    // WordPress core / Third party JS asset handles
33
-    const JS_HANDLE_JQUERY = 'jquery';
32
+	// WordPress core / Third party JS asset handles
33
+	const JS_HANDLE_JQUERY = 'jquery';
34 34
 
35
-    const JS_HANDLE_JQUERY_VALIDATE = 'jquery-validate';
35
+	const JS_HANDLE_JQUERY_VALIDATE = 'jquery-validate';
36 36
 
37
-    const JS_HANDLE_JQUERY_VALIDATE_EXTRA = 'jquery-validate-extra-methods';
37
+	const JS_HANDLE_JQUERY_VALIDATE_EXTRA = 'jquery-validate-extra-methods';
38 38
 
39
-    const JS_HANDLE_UNDERSCORE = 'underscore';
39
+	const JS_HANDLE_UNDERSCORE = 'underscore';
40 40
 
41
-    const JS_HANDLE_ACCOUNTING_CORE = 'ee-accounting-core';
41
+	const JS_HANDLE_ACCOUNTING_CORE = 'ee-accounting-core';
42 42
 
43
-    // EE JS assets handles
44
-    const JS_HANDLE_EE_MANIFEST = 'ee-manifest';
43
+	// EE JS assets handles
44
+	const JS_HANDLE_EE_MANIFEST = 'ee-manifest';
45 45
 
46
-    const JS_HANDLE_EE_JS_CORE = 'eejs-core';
47
-
48
-    const JS_HANDLE_EE_VENDOR = 'eventespresso-vendor';
49
-
50
-    const JS_HANDLE_EE_DATA_STORES = 'eventespresso-data-stores';
46
+	const JS_HANDLE_EE_JS_CORE = 'eejs-core';
47
+
48
+	const JS_HANDLE_EE_VENDOR = 'eventespresso-vendor';
49
+
50
+	const JS_HANDLE_EE_DATA_STORES = 'eventespresso-data-stores';
51 51
 
52
-    const JS_HANDLE_EE_HELPERS = 'eventespresso-helpers';
52
+	const JS_HANDLE_EE_HELPERS = 'eventespresso-helpers';
53 53
 
54
-    const JS_HANDLE_EE_HOC_COMPONENTS = 'eventespresso-hoc-components';
55
-
56
-    const JS_HANDLE_EE_COMPONENTS = 'eventespresso-components';
57
-
58
-    const JS_HANDLE_EE_JS_API = 'eejs-api';
59
-
60
-    const JS_HANDLE_EE_CORE = 'espresso_core';
61
-
62
-    const JS_HANDLE_EE_I18N = 'eei18n';
63
-
64
-    const JS_HANDLE_EE_ACCOUNTING = 'ee-accounting';
65
-
66
-    const JS_HANDLE_EE_WP_PLUGINS_PAGE = 'ee-wp-plugins-page';
67
-
68
-    // EE CSS assets handles
69
-    const CSS_HANDLE_EE_DEFAULT = 'espresso_default';
70
-
71
-    const CSS_HANDLE_EE_CUSTOM = 'espresso_custom_css';
72
-
73
-    /**
74
-     * @var EE_Currency_Config $currency_config
75
-     */
76
-    protected $currency_config;
77
-
78
-    /**
79
-     * @var EE_Template_Config $template_config
80
-     */
81
-    protected $template_config;
82
-
83
-
84
-    /**
85
-     * CoreAssetRegister constructor.
86
-     *
87
-     * @param AssetCollection    $assets
88
-     * @param EE_Currency_Config $currency_config
89
-     * @param EE_Template_Config $template_config
90
-     * @param DomainInterface    $domain
91
-     * @param Registry           $registry
92
-     */
93
-    public function __construct(
94
-        AssetCollection $assets,
95
-        EE_Currency_Config $currency_config,
96
-        EE_Template_Config $template_config,
97
-        DomainInterface $domain,
98
-        Registry $registry
99
-    ) {
100
-        $this->currency_config = $currency_config;
101
-        $this->template_config = $template_config;
102
-        parent::__construct($domain, $assets, $registry);
103
-    }
104
-
105
-
106
-    /**
107
-     * @since 4.9.62.p
108
-     * @throws DuplicateCollectionIdentifierException
109
-     * @throws InvalidArgumentException
110
-     * @throws InvalidDataTypeException
111
-     * @throws InvalidEntityException
112
-     */
113
-    public function addAssets()
114
-    {
115
-        $this->addJavascriptFiles();
116
-        $this->addStylesheetFiles();
117
-    }
118
-
119
-
120
-    /**
121
-     * @since 4.9.62.p
122
-     * @throws DuplicateCollectionIdentifierException
123
-     * @throws InvalidArgumentException
124
-     * @throws InvalidDataTypeException
125
-     * @throws InvalidEntityException
126
-     */
127
-    public function addJavascriptFiles()
128
-    {
129
-        $this->loadCoreJs();
130
-        $this->loadJqueryValidate();
131
-        $this->loadAccountingJs();
132
-        add_action(
133
-            'AHEE__EventEspresso_core_services_assets_Registry__registerScripts__before_script',
134
-            array($this, 'loadQtipJs')
135
-        );
136
-        $this->registerAdminAssets();
137
-    }
138
-
139
-
140
-    /**
141
-     * @since 4.9.62.p
142
-     * @throws DuplicateCollectionIdentifierException
143
-     * @throws InvalidDataTypeException
144
-     * @throws InvalidEntityException
145
-     */
146
-    public function addStylesheetFiles()
147
-    {
148
-        $this->loadCoreCss();
149
-    }
150
-
151
-
152
-    /**
153
-     * core default javascript
154
-     *
155
-     * @since 4.9.62.p
156
-     * @throws DuplicateCollectionIdentifierException
157
-     * @throws InvalidArgumentException
158
-     * @throws InvalidDataTypeException
159
-     * @throws InvalidEntityException
160
-     */
161
-    private function loadCoreJs()
162
-    {
163
-        $this->addJavascript(
164
-            CoreAssetManager::JS_HANDLE_EE_MANIFEST,
165
-            $this->registry->getJsUrl($this->domain->assetNamespace(), 'manifest')
166
-        );
167
-
168
-        $this->addJavascript(
169
-            CoreAssetManager::JS_HANDLE_EE_JS_CORE,
170
-            $this->registry->getJsUrl($this->domain->assetNamespace(), 'eejs'),
171
-            array(CoreAssetManager::JS_HANDLE_EE_MANIFEST)
172
-        )
173
-        ->setHasInlineData();
174
-
175
-        $this->addJavascript(
176
-            CoreAssetManager::JS_HANDLE_EE_VENDOR,
177
-            $this->registry->getJsUrl($this->domain->assetNamespace(), 'vendor'),
178
-            array(CoreAssetManager::JS_HANDLE_EE_JS_CORE)
179
-        );
180
-
181
-        $this->addJavascript(
182
-            CoreAssetManager::JS_HANDLE_EE_DATA_STORES,
183
-            $this->registry->getJsUrl($this->domain->assetNamespace(), 'data-stores'),
184
-            array(CoreAssetManager::JS_HANDLE_EE_VENDOR, 'wp-data', 'wp-api-request')
185
-        )
186
-        ->setRequiresTranslation();
187
-
188
-        $this->addJavascript(
189
-            CoreAssetManager::JS_HANDLE_EE_HELPERS,
190
-            $this->registry->getJsUrl($this->domain->assetNamespace(), 'helpers')
191
-        )->setRequiresTranslation();
192
-
193
-        $this->addJavascript(
194
-            CoreAssetManager::JS_HANDLE_EE_HOC_COMPONENTS,
195
-            $this->registry->getJsUrl($this->domain->assetNamespace(), 'hocComponents'),
196
-            array(
197
-                CoreAssetManager::JS_HANDLE_EE_DATA_STORES,
198
-                CoreAssetManager::JS_HANDLE_EE_HELPERS
199
-            )
200
-        )->setRequiresTranslation();
201
-
202
-        $this->addJavascript(
203
-            CoreAssetManager::JS_HANDLE_EE_COMPONENTS,
204
-            $this->registry->getJsUrl($this->domain->assetNamespace(), 'components'),
205
-            array(
206
-                CoreAssetManager::JS_HANDLE_EE_DATA_STORES,
207
-                CoreAssetManager::JS_HANDLE_EE_HELPERS
208
-            )
209
-        )
210
-        ->setRequiresTranslation();
211
-
212
-        global $wp_version;
213
-        if (version_compare($wp_version, '4.4.0', '>')) {
214
-            //js.api
215
-            $this->addJavascript(
216
-                CoreAssetManager::JS_HANDLE_EE_JS_API,
217
-                EE_LIBRARIES_URL . 'rest_api/assets/js/eejs-api.min.js',
218
-                array(
219
-                    CoreAssetManager::JS_HANDLE_UNDERSCORE,
220
-                    CoreAssetManager::JS_HANDLE_EE_JS_CORE
221
-                )
222
-            );
223
-            $this->registry->addData('eejs_api_nonce', wp_create_nonce('wp_rest'));
224
-            $this->registry->addData(
225
-                'paths',
226
-                array(
227
-                    'rest_route' => rest_url('ee/v4.8.36/'),
228
-                    'collection_endpoints' => EED_Core_Rest_Api::getCollectionRoutesIndexedByModelName(),
229
-                    'primary_keys' => EED_Core_Rest_Api::getPrimaryKeyNamesIndexedByModelName(),
54
+	const JS_HANDLE_EE_HOC_COMPONENTS = 'eventespresso-hoc-components';
55
+
56
+	const JS_HANDLE_EE_COMPONENTS = 'eventespresso-components';
57
+
58
+	const JS_HANDLE_EE_JS_API = 'eejs-api';
59
+
60
+	const JS_HANDLE_EE_CORE = 'espresso_core';
61
+
62
+	const JS_HANDLE_EE_I18N = 'eei18n';
63
+
64
+	const JS_HANDLE_EE_ACCOUNTING = 'ee-accounting';
65
+
66
+	const JS_HANDLE_EE_WP_PLUGINS_PAGE = 'ee-wp-plugins-page';
67
+
68
+	// EE CSS assets handles
69
+	const CSS_HANDLE_EE_DEFAULT = 'espresso_default';
70
+
71
+	const CSS_HANDLE_EE_CUSTOM = 'espresso_custom_css';
72
+
73
+	/**
74
+	 * @var EE_Currency_Config $currency_config
75
+	 */
76
+	protected $currency_config;
77
+
78
+	/**
79
+	 * @var EE_Template_Config $template_config
80
+	 */
81
+	protected $template_config;
82
+
83
+
84
+	/**
85
+	 * CoreAssetRegister constructor.
86
+	 *
87
+	 * @param AssetCollection    $assets
88
+	 * @param EE_Currency_Config $currency_config
89
+	 * @param EE_Template_Config $template_config
90
+	 * @param DomainInterface    $domain
91
+	 * @param Registry           $registry
92
+	 */
93
+	public function __construct(
94
+		AssetCollection $assets,
95
+		EE_Currency_Config $currency_config,
96
+		EE_Template_Config $template_config,
97
+		DomainInterface $domain,
98
+		Registry $registry
99
+	) {
100
+		$this->currency_config = $currency_config;
101
+		$this->template_config = $template_config;
102
+		parent::__construct($domain, $assets, $registry);
103
+	}
104
+
105
+
106
+	/**
107
+	 * @since 4.9.62.p
108
+	 * @throws DuplicateCollectionIdentifierException
109
+	 * @throws InvalidArgumentException
110
+	 * @throws InvalidDataTypeException
111
+	 * @throws InvalidEntityException
112
+	 */
113
+	public function addAssets()
114
+	{
115
+		$this->addJavascriptFiles();
116
+		$this->addStylesheetFiles();
117
+	}
118
+
119
+
120
+	/**
121
+	 * @since 4.9.62.p
122
+	 * @throws DuplicateCollectionIdentifierException
123
+	 * @throws InvalidArgumentException
124
+	 * @throws InvalidDataTypeException
125
+	 * @throws InvalidEntityException
126
+	 */
127
+	public function addJavascriptFiles()
128
+	{
129
+		$this->loadCoreJs();
130
+		$this->loadJqueryValidate();
131
+		$this->loadAccountingJs();
132
+		add_action(
133
+			'AHEE__EventEspresso_core_services_assets_Registry__registerScripts__before_script',
134
+			array($this, 'loadQtipJs')
135
+		);
136
+		$this->registerAdminAssets();
137
+	}
138
+
139
+
140
+	/**
141
+	 * @since 4.9.62.p
142
+	 * @throws DuplicateCollectionIdentifierException
143
+	 * @throws InvalidDataTypeException
144
+	 * @throws InvalidEntityException
145
+	 */
146
+	public function addStylesheetFiles()
147
+	{
148
+		$this->loadCoreCss();
149
+	}
150
+
151
+
152
+	/**
153
+	 * core default javascript
154
+	 *
155
+	 * @since 4.9.62.p
156
+	 * @throws DuplicateCollectionIdentifierException
157
+	 * @throws InvalidArgumentException
158
+	 * @throws InvalidDataTypeException
159
+	 * @throws InvalidEntityException
160
+	 */
161
+	private function loadCoreJs()
162
+	{
163
+		$this->addJavascript(
164
+			CoreAssetManager::JS_HANDLE_EE_MANIFEST,
165
+			$this->registry->getJsUrl($this->domain->assetNamespace(), 'manifest')
166
+		);
167
+
168
+		$this->addJavascript(
169
+			CoreAssetManager::JS_HANDLE_EE_JS_CORE,
170
+			$this->registry->getJsUrl($this->domain->assetNamespace(), 'eejs'),
171
+			array(CoreAssetManager::JS_HANDLE_EE_MANIFEST)
172
+		)
173
+		->setHasInlineData();
174
+
175
+		$this->addJavascript(
176
+			CoreAssetManager::JS_HANDLE_EE_VENDOR,
177
+			$this->registry->getJsUrl($this->domain->assetNamespace(), 'vendor'),
178
+			array(CoreAssetManager::JS_HANDLE_EE_JS_CORE)
179
+		);
180
+
181
+		$this->addJavascript(
182
+			CoreAssetManager::JS_HANDLE_EE_DATA_STORES,
183
+			$this->registry->getJsUrl($this->domain->assetNamespace(), 'data-stores'),
184
+			array(CoreAssetManager::JS_HANDLE_EE_VENDOR, 'wp-data', 'wp-api-request')
185
+		)
186
+		->setRequiresTranslation();
187
+
188
+		$this->addJavascript(
189
+			CoreAssetManager::JS_HANDLE_EE_HELPERS,
190
+			$this->registry->getJsUrl($this->domain->assetNamespace(), 'helpers')
191
+		)->setRequiresTranslation();
192
+
193
+		$this->addJavascript(
194
+			CoreAssetManager::JS_HANDLE_EE_HOC_COMPONENTS,
195
+			$this->registry->getJsUrl($this->domain->assetNamespace(), 'hocComponents'),
196
+			array(
197
+				CoreAssetManager::JS_HANDLE_EE_DATA_STORES,
198
+				CoreAssetManager::JS_HANDLE_EE_HELPERS
199
+			)
200
+		)->setRequiresTranslation();
201
+
202
+		$this->addJavascript(
203
+			CoreAssetManager::JS_HANDLE_EE_COMPONENTS,
204
+			$this->registry->getJsUrl($this->domain->assetNamespace(), 'components'),
205
+			array(
206
+				CoreAssetManager::JS_HANDLE_EE_DATA_STORES,
207
+				CoreAssetManager::JS_HANDLE_EE_HELPERS
208
+			)
209
+		)
210
+		->setRequiresTranslation();
211
+
212
+		global $wp_version;
213
+		if (version_compare($wp_version, '4.4.0', '>')) {
214
+			//js.api
215
+			$this->addJavascript(
216
+				CoreAssetManager::JS_HANDLE_EE_JS_API,
217
+				EE_LIBRARIES_URL . 'rest_api/assets/js/eejs-api.min.js',
218
+				array(
219
+					CoreAssetManager::JS_HANDLE_UNDERSCORE,
220
+					CoreAssetManager::JS_HANDLE_EE_JS_CORE
221
+				)
222
+			);
223
+			$this->registry->addData('eejs_api_nonce', wp_create_nonce('wp_rest'));
224
+			$this->registry->addData(
225
+				'paths',
226
+				array(
227
+					'rest_route' => rest_url('ee/v4.8.36/'),
228
+					'collection_endpoints' => EED_Core_Rest_Api::getCollectionRoutesIndexedByModelName(),
229
+					'primary_keys' => EED_Core_Rest_Api::getPrimaryKeyNamesIndexedByModelName(),
230 230
 					'site_url' => site_url('/'),
231
-                    'admin_url' => admin_url('/'),
232
-                )
233
-            );
234
-            /** site formatting values **/
235
-            $this->registry->addData(
236
-                'site_formats',
237
-                array(
238
-                    'date_formats' => EEH_DTT_Helper::convert_php_to_js_and_moment_date_formats()
239
-                )
240
-            );
241
-        }
242
-
243
-        $this->addJavascript(
244
-            CoreAssetManager::JS_HANDLE_EE_CORE,
245
-            EE_GLOBAL_ASSETS_URL . 'scripts/espresso_core.js',
246
-            array(CoreAssetManager::JS_HANDLE_JQUERY)
247
-        )
248
-        ->setInlineDataCallback(
249
-            function () {
250
-                wp_localize_script(
251
-                    CoreAssetManager::JS_HANDLE_EE_CORE,
252
-                    CoreAssetManager::JS_HANDLE_EE_I18N,
253
-                    EE_Registry::$i18n_js_strings
254
-                );
255
-            }
256
-        );
257
-    }
258
-
259
-
260
-    /**
261
-     * @since 4.9.62.p
262
-     * @throws DuplicateCollectionIdentifierException
263
-     * @throws InvalidDataTypeException
264
-     * @throws InvalidEntityException
265
-     */
266
-    private function loadCoreCss()
267
-    {
268
-        if ($this->template_config->enable_default_style && ! is_admin()) {
269
-            $this->addStylesheet(
270
-                CoreAssetManager::CSS_HANDLE_EE_DEFAULT,
271
-                is_readable(EVENT_ESPRESSO_UPLOAD_DIR . 'css/style.css')
272
-                    ? EVENT_ESPRESSO_UPLOAD_DIR . 'css/espresso_default.css'
273
-                    : EE_GLOBAL_ASSETS_URL . 'css/espresso_default.css',
274
-                array('dashicons')
275
-            );
276
-            //Load custom style sheet if available
277
-            if ($this->template_config->custom_style_sheet !== null) {
278
-                $this->addStylesheet(
279
-                    CoreAssetManager::CSS_HANDLE_EE_CUSTOM,
280
-                    EVENT_ESPRESSO_UPLOAD_URL . 'css/' . $this->template_config->custom_style_sheet,
281
-                    array(CoreAssetManager::CSS_HANDLE_EE_DEFAULT)
282
-                );
283
-            }
284
-        }
285
-    }
286
-
287
-
288
-    /**
289
-     * jQuery Validate for form validation
290
-     *
291
-     * @since 4.9.62.p
292
-     * @throws DuplicateCollectionIdentifierException
293
-     * @throws InvalidDataTypeException
294
-     * @throws InvalidEntityException
295
-     */
296
-    private function loadJqueryValidate()
297
-    {
298
-        $this->addJavascript(
299
-            CoreAssetManager::JS_HANDLE_JQUERY_VALIDATE,
300
-            EE_GLOBAL_ASSETS_URL . 'scripts/jquery.validate.min.js',
301
-            array(CoreAssetManager::JS_HANDLE_JQUERY)
302
-        )
303
-        ->setVersion('1.15.0');
304
-
305
-        $this->addJavascript(
306
-            CoreAssetManager::JS_HANDLE_JQUERY_VALIDATE_EXTRA,
307
-            EE_GLOBAL_ASSETS_URL . 'scripts/jquery.validate.additional-methods.min.js',
308
-            array(CoreAssetManager::JS_HANDLE_JQUERY_VALIDATE)
309
-        )
310
-        ->setVersion('1.15.0');
311
-    }
312
-
313
-
314
-    /**
315
-     * accounting.js for performing client-side calculations
316
-     *
317
-     * @since 4.9.62.p
318
-     * @throws DuplicateCollectionIdentifierException
319
-     * @throws InvalidDataTypeException
320
-     * @throws InvalidEntityException
321
-     */
322
-    private function loadAccountingJs()
323
-    {
324
-        //accounting.js library
325
-        // @link http://josscrowcroft.github.io/accounting.js/
326
-        $this->addJavascript(
327
-            CoreAssetManager::JS_HANDLE_ACCOUNTING_CORE,
328
-            EE_THIRD_PARTY_URL . 'accounting/accounting.js',
329
-            array(CoreAssetManager::JS_HANDLE_UNDERSCORE)
330
-        )
331
-        ->setVersion('0.3.2');
332
-
333
-        $currency_config = $this->currency_config;
334
-        $this->addJavascript(
335
-            CoreAssetManager::JS_HANDLE_EE_ACCOUNTING,
336
-            EE_GLOBAL_ASSETS_URL . 'scripts/ee-accounting-config.js',
337
-            array(CoreAssetManager::JS_HANDLE_ACCOUNTING_CORE)
338
-        )
339
-        ->setInlineDataCallback(
340
-            function () use ($currency_config) {
341
-                 wp_localize_script(
342
-                     CoreAssetManager::JS_HANDLE_EE_ACCOUNTING,
343
-                     'EE_ACCOUNTING_CFG',
344
-                     array(
345
-                         'currency' => array(
346
-                             'symbol'    => $currency_config->sign,
347
-                             'format'    => array(
348
-                                 'pos'  => $currency_config->sign_b4 ? '%s%v' : '%v%s',
349
-                                 'neg'  => $currency_config->sign_b4 ? '- %s%v' : '- %v%s',
350
-                                 'zero' => $currency_config->sign_b4 ? '%s--' : '--%s',
351
-                             ),
352
-                             'decimal'   => $currency_config->dec_mrk,
353
-                             'thousand'  => $currency_config->thsnds,
354
-                             'precision' => $currency_config->dec_plc,
355
-                         ),
356
-                         'number'   => array(
357
-                             'precision' => $currency_config->dec_plc,
358
-                             'thousand'  => $currency_config->thsnds,
359
-                             'decimal'   => $currency_config->dec_mrk,
360
-                         ),
361
-                     )
362
-                 );
363
-            }
364
-        )
365
-        ->setVersion();
366
-    }
367
-
368
-
369
-    /**
370
-     * registers assets for cleaning your ears
371
-     *
372
-     * @param JavascriptAsset $script
373
-     */
374
-    public function loadQtipJs(JavascriptAsset $script)
375
-    {
376
-        // qtip is turned OFF by default, but prior to the wp_enqueue_scripts hook,
377
-        // can be turned back on again via: add_filter('FHEE_load_qtip', '__return_true' );
378
-        if (
379
-            $script->handle() === CoreAssetManager::JS_HANDLE_EE_WP_PLUGINS_PAGE
380
-            && apply_filters('FHEE_load_qtip', false)
381
-        ) {
382
-            EEH_Qtip_Loader::instance()->register_and_enqueue();
383
-        }
384
-    }
385
-
386
-
387
-    /**
388
-     * assets that are used in the WordPress admin
389
-     *
390
-     * @since 4.9.62.p
391
-     * @throws DuplicateCollectionIdentifierException
392
-     * @throws InvalidDataTypeException
393
-     * @throws InvalidEntityException
394
-     */
395
-    private function registerAdminAssets()
396
-    {
397
-        $this->addJavascript(
398
-            CoreAssetManager::JS_HANDLE_EE_WP_PLUGINS_PAGE,
399
-            $this->registry->getJsUrl($this->domain->assetNamespace(), 'wp-plugins-page'),
400
-            array(
401
-                CoreAssetManager::JS_HANDLE_JQUERY,
402
-                CoreAssetManager::JS_HANDLE_EE_VENDOR,
403
-            )
404
-        )
405
-        ->setRequiresTranslation();
406
-
407
-        $this->addStylesheet(
408
-            CoreAssetManager::JS_HANDLE_EE_WP_PLUGINS_PAGE,
409
-            $this->registry->getCssUrl($this->domain->assetNamespace(), 'wp-plugins-page')
410
-        );
411
-    }
231
+					'admin_url' => admin_url('/'),
232
+				)
233
+			);
234
+			/** site formatting values **/
235
+			$this->registry->addData(
236
+				'site_formats',
237
+				array(
238
+					'date_formats' => EEH_DTT_Helper::convert_php_to_js_and_moment_date_formats()
239
+				)
240
+			);
241
+		}
242
+
243
+		$this->addJavascript(
244
+			CoreAssetManager::JS_HANDLE_EE_CORE,
245
+			EE_GLOBAL_ASSETS_URL . 'scripts/espresso_core.js',
246
+			array(CoreAssetManager::JS_HANDLE_JQUERY)
247
+		)
248
+		->setInlineDataCallback(
249
+			function () {
250
+				wp_localize_script(
251
+					CoreAssetManager::JS_HANDLE_EE_CORE,
252
+					CoreAssetManager::JS_HANDLE_EE_I18N,
253
+					EE_Registry::$i18n_js_strings
254
+				);
255
+			}
256
+		);
257
+	}
258
+
259
+
260
+	/**
261
+	 * @since 4.9.62.p
262
+	 * @throws DuplicateCollectionIdentifierException
263
+	 * @throws InvalidDataTypeException
264
+	 * @throws InvalidEntityException
265
+	 */
266
+	private function loadCoreCss()
267
+	{
268
+		if ($this->template_config->enable_default_style && ! is_admin()) {
269
+			$this->addStylesheet(
270
+				CoreAssetManager::CSS_HANDLE_EE_DEFAULT,
271
+				is_readable(EVENT_ESPRESSO_UPLOAD_DIR . 'css/style.css')
272
+					? EVENT_ESPRESSO_UPLOAD_DIR . 'css/espresso_default.css'
273
+					: EE_GLOBAL_ASSETS_URL . 'css/espresso_default.css',
274
+				array('dashicons')
275
+			);
276
+			//Load custom style sheet if available
277
+			if ($this->template_config->custom_style_sheet !== null) {
278
+				$this->addStylesheet(
279
+					CoreAssetManager::CSS_HANDLE_EE_CUSTOM,
280
+					EVENT_ESPRESSO_UPLOAD_URL . 'css/' . $this->template_config->custom_style_sheet,
281
+					array(CoreAssetManager::CSS_HANDLE_EE_DEFAULT)
282
+				);
283
+			}
284
+		}
285
+	}
286
+
287
+
288
+	/**
289
+	 * jQuery Validate for form validation
290
+	 *
291
+	 * @since 4.9.62.p
292
+	 * @throws DuplicateCollectionIdentifierException
293
+	 * @throws InvalidDataTypeException
294
+	 * @throws InvalidEntityException
295
+	 */
296
+	private function loadJqueryValidate()
297
+	{
298
+		$this->addJavascript(
299
+			CoreAssetManager::JS_HANDLE_JQUERY_VALIDATE,
300
+			EE_GLOBAL_ASSETS_URL . 'scripts/jquery.validate.min.js',
301
+			array(CoreAssetManager::JS_HANDLE_JQUERY)
302
+		)
303
+		->setVersion('1.15.0');
304
+
305
+		$this->addJavascript(
306
+			CoreAssetManager::JS_HANDLE_JQUERY_VALIDATE_EXTRA,
307
+			EE_GLOBAL_ASSETS_URL . 'scripts/jquery.validate.additional-methods.min.js',
308
+			array(CoreAssetManager::JS_HANDLE_JQUERY_VALIDATE)
309
+		)
310
+		->setVersion('1.15.0');
311
+	}
312
+
313
+
314
+	/**
315
+	 * accounting.js for performing client-side calculations
316
+	 *
317
+	 * @since 4.9.62.p
318
+	 * @throws DuplicateCollectionIdentifierException
319
+	 * @throws InvalidDataTypeException
320
+	 * @throws InvalidEntityException
321
+	 */
322
+	private function loadAccountingJs()
323
+	{
324
+		//accounting.js library
325
+		// @link http://josscrowcroft.github.io/accounting.js/
326
+		$this->addJavascript(
327
+			CoreAssetManager::JS_HANDLE_ACCOUNTING_CORE,
328
+			EE_THIRD_PARTY_URL . 'accounting/accounting.js',
329
+			array(CoreAssetManager::JS_HANDLE_UNDERSCORE)
330
+		)
331
+		->setVersion('0.3.2');
332
+
333
+		$currency_config = $this->currency_config;
334
+		$this->addJavascript(
335
+			CoreAssetManager::JS_HANDLE_EE_ACCOUNTING,
336
+			EE_GLOBAL_ASSETS_URL . 'scripts/ee-accounting-config.js',
337
+			array(CoreAssetManager::JS_HANDLE_ACCOUNTING_CORE)
338
+		)
339
+		->setInlineDataCallback(
340
+			function () use ($currency_config) {
341
+				 wp_localize_script(
342
+					 CoreAssetManager::JS_HANDLE_EE_ACCOUNTING,
343
+					 'EE_ACCOUNTING_CFG',
344
+					 array(
345
+						 'currency' => array(
346
+							 'symbol'    => $currency_config->sign,
347
+							 'format'    => array(
348
+								 'pos'  => $currency_config->sign_b4 ? '%s%v' : '%v%s',
349
+								 'neg'  => $currency_config->sign_b4 ? '- %s%v' : '- %v%s',
350
+								 'zero' => $currency_config->sign_b4 ? '%s--' : '--%s',
351
+							 ),
352
+							 'decimal'   => $currency_config->dec_mrk,
353
+							 'thousand'  => $currency_config->thsnds,
354
+							 'precision' => $currency_config->dec_plc,
355
+						 ),
356
+						 'number'   => array(
357
+							 'precision' => $currency_config->dec_plc,
358
+							 'thousand'  => $currency_config->thsnds,
359
+							 'decimal'   => $currency_config->dec_mrk,
360
+						 ),
361
+					 )
362
+				 );
363
+			}
364
+		)
365
+		->setVersion();
366
+	}
367
+
368
+
369
+	/**
370
+	 * registers assets for cleaning your ears
371
+	 *
372
+	 * @param JavascriptAsset $script
373
+	 */
374
+	public function loadQtipJs(JavascriptAsset $script)
375
+	{
376
+		// qtip is turned OFF by default, but prior to the wp_enqueue_scripts hook,
377
+		// can be turned back on again via: add_filter('FHEE_load_qtip', '__return_true' );
378
+		if (
379
+			$script->handle() === CoreAssetManager::JS_HANDLE_EE_WP_PLUGINS_PAGE
380
+			&& apply_filters('FHEE_load_qtip', false)
381
+		) {
382
+			EEH_Qtip_Loader::instance()->register_and_enqueue();
383
+		}
384
+	}
385
+
386
+
387
+	/**
388
+	 * assets that are used in the WordPress admin
389
+	 *
390
+	 * @since 4.9.62.p
391
+	 * @throws DuplicateCollectionIdentifierException
392
+	 * @throws InvalidDataTypeException
393
+	 * @throws InvalidEntityException
394
+	 */
395
+	private function registerAdminAssets()
396
+	{
397
+		$this->addJavascript(
398
+			CoreAssetManager::JS_HANDLE_EE_WP_PLUGINS_PAGE,
399
+			$this->registry->getJsUrl($this->domain->assetNamespace(), 'wp-plugins-page'),
400
+			array(
401
+				CoreAssetManager::JS_HANDLE_JQUERY,
402
+				CoreAssetManager::JS_HANDLE_EE_VENDOR,
403
+			)
404
+		)
405
+		->setRequiresTranslation();
406
+
407
+		$this->addStylesheet(
408
+			CoreAssetManager::JS_HANDLE_EE_WP_PLUGINS_PAGE,
409
+			$this->registry->getCssUrl($this->domain->assetNamespace(), 'wp-plugins-page')
410
+		);
411
+	}
412 412
 }
Please login to merge, or discard this patch.
core/libraries/payment_methods/EE_PMT_Base.lib.php 1 patch
Indentation   +808 added lines, -808 removed lines patch added patch discarded remove patch
@@ -21,812 +21,812 @@
 block discarded – undo
21 21
 abstract class EE_PMT_Base
22 22
 {
23 23
 
24
-    const onsite = 'on-site';
25
-    const offsite = 'off-site';
26
-    const offline = 'off-line';
27
-
28
-    /**
29
-     * @var EE_Payment_Method
30
-     */
31
-    protected $_pm_instance = null;
32
-
33
-    /**
34
-     * @var boolean
35
-     */
36
-    protected $_requires_https = false;
37
-
38
-    /**
39
-     * @var boolean
40
-     */
41
-    protected $_has_billing_form;
42
-
43
-    /**
44
-     * @var EE_Gateway
45
-     */
46
-    protected $_gateway = null;
47
-
48
-    /**
49
-     * @var EE_Payment_Method_Form
50
-     */
51
-    protected $_settings_form = null;
52
-
53
-    /**
54
-     * @var EE_Form_Section_Proper
55
-     */
56
-    protected $_billing_form = null;
57
-
58
-    /**
59
-     * @var boolean
60
-     */
61
-    protected $_cache_billing_form = true;
62
-
63
-    /**
64
-     * String of the absolute path to the folder containing this file, with a trailing slash.
65
-     * eg '/public_html/wp-site/wp-content/plugins/event-espresso/payment_methods/Invoice/'
66
-     *
67
-     * @var string
68
-     */
69
-    protected $_file_folder = null;
70
-
71
-    /**
72
-     * String to the absolute URL to this file (useful for getting its web-accessible resources
73
-     * like images, js, or css)
74
-     *
75
-     * @var string
76
-     */
77
-    protected $_file_url = null;
78
-
79
-    /**
80
-     * Pretty name for the payment method
81
-     *
82
-     * @var string
83
-     */
84
-    protected $_pretty_name = null;
85
-
86
-    /**
87
-     *
88
-     * @var string
89
-     */
90
-    protected $_default_button_url = null;
91
-
92
-    /**
93
-     *
94
-     * @var string
95
-     */
96
-    protected $_default_description = null;
97
-
98
-
99
-    /**
100
-     *
101
-     * @param EE_Payment_Method $pm_instance
102
-     * @throws EE_Error
103
-     * @return EE_PMT_Base
104
-     */
105
-    public function __construct($pm_instance = null)
106
-    {
107
-        if ($pm_instance instanceof EE_Payment_Method) {
108
-            $this->set_instance($pm_instance);
109
-        }
110
-        if ($this->_gateway) {
111
-            $this->_gateway->set_payment_model(EEM_Payment::instance());
112
-            $this->_gateway->set_payment_log(EEM_Change_Log::instance());
113
-            $this->_gateway->set_template_helper(new EEH_Template());
114
-            $this->_gateway->set_line_item_helper(new EEH_Line_Item());
115
-            $this->_gateway->set_money_helper(new EEH_Money());
116
-            $this->_gateway->set_gateway_data_formatter(new GatewayDataFormatter());
117
-            $this->_gateway->set_unsupported_character_remover(new AsciiOnly());
118
-            do_action('AHEE__EE_PMT_Base___construct__done_initializing_gateway_class', $this, $this->_gateway);
119
-        }
120
-        if (! isset($this->_has_billing_form)) {
121
-            // by default, On Site gateways have a billing form
122
-            if ($this->payment_occurs() == EE_PMT_Base::onsite) {
123
-                $this->set_has_billing_form(true);
124
-            } else {
125
-                $this->set_has_billing_form(false);
126
-            }
127
-        }
128
-
129
-        if (! $this->_pretty_name) {
130
-            throw new EE_Error(
131
-                sprintf(
132
-                    __(
133
-                        "You must set the pretty name for the Payment Method Type in the constructor (_pretty_name), and please make it internationalized",
134
-                        "event_espresso"
135
-                    )
136
-                )
137
-            );
138
-        }
139
-        // if the child didn't specify a default button, use the credit card one
140
-        if ($this->_default_button_url === null) {
141
-            $this->_default_button_url = EE_PLUGIN_DIR_URL . 'payment_methods' . DS . 'pay-by-credit-card.png';
142
-        }
143
-    }
144
-
145
-
146
-    /**
147
-     * @param boolean $has_billing_form
148
-     */
149
-    public function set_has_billing_form($has_billing_form)
150
-    {
151
-        $this->_has_billing_form = filter_var($has_billing_form, FILTER_VALIDATE_BOOLEAN);
152
-    }
153
-
154
-
155
-    /**
156
-     * sets the file_folder property
157
-     */
158
-    protected function _set_file_folder()
159
-    {
160
-        $reflector = new ReflectionClass(get_class($this));
161
-        $fn = $reflector->getFileName();
162
-        $this->_file_folder = dirname($fn) . DS;
163
-    }
164
-
165
-
166
-    /**
167
-     * sets the file URL with a trailing slash for this PMT
168
-     */
169
-    protected function _set_file_url()
170
-    {
171
-        $plugins_dir_fixed = str_replace('\\', DS, WP_PLUGIN_DIR);
172
-        $file_folder_fixed = str_replace('\\', DS, $this->file_folder());
173
-        $file_path = str_replace($plugins_dir_fixed, WP_PLUGIN_URL, $file_folder_fixed);
174
-        $this->_file_url = $file_path;
175
-    }
176
-
177
-    /**
178
-     * Gets the default description on all payment methods of this type
179
-     *
180
-     * @return string
181
-     */
182
-    public function default_description()
183
-    {
184
-        return $this->_default_description;
185
-    }
186
-
187
-
188
-    /**
189
-     * Returns the folder containing the PMT child class, with a trailing slash
190
-     *
191
-     * @return string
192
-     */
193
-    public function file_folder()
194
-    {
195
-        if (! $this->_file_folder) {
196
-            $this->_set_file_folder();
197
-        }
198
-        return $this->_file_folder;
199
-    }
200
-
201
-
202
-    /**
203
-     * @return string
204
-     */
205
-    public function file_url()
206
-    {
207
-        if (! $this->_file_url) {
208
-            $this->_set_file_url();
209
-        }
210
-        return $this->_file_url;
211
-    }
212
-
213
-
214
-    /**
215
-     * Sets the payment method instance this payment method type is for.
216
-     * Its important teh payment method instance is set before
217
-     *
218
-     * @param EE_Payment_Method $payment_method_instance
219
-     */
220
-    public function set_instance($payment_method_instance)
221
-    {
222
-        $this->_pm_instance = $payment_method_instance;
223
-        // if they have already requested the settings form, make sure its
224
-        // data matches this model object
225
-        if ($this->_settings_form) {
226
-            $this->settings_form()->populate_model_obj($payment_method_instance);
227
-        }
228
-        if ($this->_gateway && $this->_gateway instanceof EE_Gateway) {
229
-            $this->_gateway->set_settings($payment_method_instance->settings_array());
230
-        }
231
-    }
232
-
233
-
234
-    /**
235
-     * Gets teh form for displaying to admins where they setup the payment method
236
-     *
237
-     * @return EE_Payment_Method_Form
238
-     */
239
-    public function settings_form()
240
-    {
241
-        if (! $this->_settings_form) {
242
-            $this->_settings_form = $this->generate_new_settings_form();
243
-            $this->_settings_form->set_payment_method_type($this);
244
-            // if we have already assigned a model object to this pmt, make
245
-            // sure its reflected in teh form we just generated
246
-            if ($this->_pm_instance) {
247
-                $this->_settings_form->populate_model_obj($this->_pm_instance);
248
-            }
249
-        }
250
-        return $this->_settings_form;
251
-    }
252
-
253
-
254
-    /**
255
-     * Gets the form for all the settings related to this payment method type
256
-     *
257
-     * @return EE_Payment_Method_Form
258
-     */
259
-    abstract public function generate_new_settings_form();
260
-
261
-
262
-    /**
263
-     * Sets the form for settings. This may be useful if we have already received
264
-     * a form submission and have form data it in, and want to use it anytime we're showing
265
-     * this payment method type's settings form later in the request
266
-     *
267
-     * @param EE_Payment_Method_Form $form
268
-     */
269
-    public function set_settings_form($form)
270
-    {
271
-        $this->_settings_form = $form;
272
-    }
273
-
274
-
275
-    /**
276
-     * @return boolean
277
-     */
278
-    public function has_billing_form()
279
-    {
280
-        return $this->_has_billing_form;
281
-    }
282
-
283
-
284
-    /**
285
-     * Gets the form for displaying to attendees where they can enter their billing info
286
-     * which will be sent to teh gateway (can be null)
287
-     *
288
-     * @param \EE_Transaction $transaction
289
-     * @param array           $extra_args
290
-     * @return \EE_Billing_Attendee_Info_Form|\EE_Billing_Info_Form|null
291
-     */
292
-    public function billing_form(EE_Transaction $transaction = null, $extra_args = array())
293
-    {
294
-        // has billing form already been regenerated ? or overwrite cache?
295
-        if (! $this->_billing_form instanceof EE_Billing_Info_Form || ! $this->_cache_billing_form) {
296
-            $this->_billing_form = $this->generate_new_billing_form($transaction, $extra_args);
297
-        }
298
-        // if we know who the attendee is, and this is a billing form
299
-        // that uses attendee info, populate it
300
-        if (apply_filters(
301
-            'FHEE__populate_billing_form_fields_from_attendee',
302
-            ($this->_billing_form instanceof EE_Billing_Attendee_Info_Form
303
-                && $transaction instanceof EE_Transaction
304
-                && $transaction->primary_registration() instanceof EE_Registration
305
-                && $transaction->primary_registration()->attendee() instanceof EE_Attendee
306
-            ),
307
-            $this->_billing_form,
308
-            $transaction
309
-        )) {
310
-            $this->_billing_form->populate_from_attendee($transaction->primary_registration()->attendee());
311
-        }
312
-        return $this->_billing_form;
313
-    }
314
-
315
-
316
-    /**
317
-     * Creates the billing form for this payment method type
318
-     *
319
-     * @param \EE_Transaction $transaction
320
-     * @return \EE_Billing_Info_Form
321
-     */
322
-    abstract public function generate_new_billing_form(EE_Transaction $transaction = null);
323
-
324
-
325
-    /**
326
-     * apply_billing_form_debug_settings
327
-     * applies debug data to the form
328
-     *
329
-     * @param \EE_Billing_Info_Form $billing_form
330
-     * @return \EE_Billing_Info_Form
331
-     */
332
-    public function apply_billing_form_debug_settings(EE_Billing_Info_Form $billing_form)
333
-    {
334
-        return $billing_form;
335
-    }
336
-
337
-
338
-    /**
339
-     * Sets the billing form for this payment method type. You may want to use this
340
-     * if you have form
341
-     *
342
-     * @param EE_Payment_Method $form
343
-     */
344
-    public function set_billing_form($form)
345
-    {
346
-        $this->_billing_form = $form;
347
-    }
348
-
349
-
350
-    /**
351
-     * Returns whether or not this payment method requires HTTPS to be used
352
-     *
353
-     * @return boolean
354
-     */
355
-    public function requires_https()
356
-    {
357
-        return $this->_requires_https;
358
-    }
359
-
360
-
361
-    /**
362
-     *
363
-     * @param EE_Transaction       $transaction
364
-     * @param float                $amount
365
-     * @param EE_Billing_Info_Form $billing_info
366
-     * @param string               $return_url
367
-     * @param string               $fail_url
368
-     * @param string               $method
369
-     * @param bool                 $by_admin
370
-     * @return EE_Payment
371
-     * @throws EE_Error
372
-     */
373
-    public function process_payment(
374
-        EE_Transaction $transaction,
375
-        $amount = null,
376
-        $billing_info = null,
377
-        $return_url = null,
378
-        $fail_url = '',
379
-        $method = 'CART',
380
-        $by_admin = false
381
-    ) {
382
-        // @todo: add surcharge for the payment method, if any
383
-        if ($this->_gateway) {
384
-            // there is a gateway, so we're going to make a payment object
385
-            // but wait! do they already have a payment in progress that we thought was failed?
386
-            $duplicate_properties = array(
387
-                'STS_ID'               => EEM_Payment::status_id_failed,
388
-                'TXN_ID'               => $transaction->ID(),
389
-                'PMD_ID'               => $this->_pm_instance->ID(),
390
-                'PAY_source'           => $method,
391
-                'PAY_amount'           => $amount !== null ? $amount : $transaction->remaining(),
392
-                'PAY_gateway_response' => null,
393
-            );
394
-            $payment = EEM_Payment::instance()->get_one(array($duplicate_properties));
395
-            // if we didn't already have a payment in progress for the same thing,
396
-            // then we actually want to make a new payment
397
-            if (! $payment instanceof EE_Payment) {
398
-                $payment = EE_Payment::new_instance(
399
-                    array_merge(
400
-                        $duplicate_properties,
401
-                        array(
402
-                            'PAY_timestamp'       => time(),
403
-                            'PAY_txn_id_chq_nmbr' => null,
404
-                            'PAY_po_number'       => null,
405
-                            'PAY_extra_accntng'   => null,
406
-                            'PAY_details'         => null,
407
-                        )
408
-                    )
409
-                );
410
-            }
411
-            // make sure the payment has been saved to show we started it, and so it has an ID should the gateway try to log it
412
-            $payment->save();
413
-            $billing_values = $this->_get_billing_values_from_form($billing_info);
414
-
415
-            //  Offsite Gateway
416
-            if ($this->_gateway instanceof EE_Offsite_Gateway) {
417
-                $payment = $this->_gateway->set_redirection_info(
418
-                    $payment,
419
-                    $billing_values,
420
-                    $return_url,
421
-                    EE_Config::instance()->core->txn_page_url(
422
-                        array(
423
-                            'e_reg_url_link'    => $transaction->primary_registration()->reg_url_link(),
424
-                            'ee_payment_method' => $this->_pm_instance->slug(),
425
-                        )
426
-                    ),
427
-                    $fail_url
428
-                );
429
-                $payment->save();
430
-                //  Onsite Gateway
431
-            } elseif ($this->_gateway instanceof EE_Onsite_Gateway) {
432
-                $payment = $this->_gateway->do_direct_payment($payment, $billing_values);
433
-                $payment->save();
434
-            } else {
435
-                throw new EE_Error(
436
-                    sprintf(
437
-                        __(
438
-                            'Gateway for payment method type "%s" is "%s", not a subclass of either EE_Offsite_Gateway or EE_Onsite_Gateway, or null (to indicate NO gateway)',
439
-                            'event_espresso'
440
-                        ),
441
-                        get_class($this),
442
-                        gettype($this->_gateway)
443
-                    )
444
-                );
445
-            }
446
-        } else {
447
-            // no gateway provided
448
-            // there is no payment. Must be an offline gateway
449
-            // create a payment object anyways, but dont save it
450
-            $payment = EE_Payment::new_instance(
451
-                array(
452
-                    'STS_ID'        => EEM_Payment::status_id_pending,
453
-                    'TXN_ID'        => $transaction->ID(),
454
-                    'PMD_ID'        => $transaction->payment_method_ID(),
455
-                    'PAY_amount'    => 0.00,
456
-                    'PAY_timestamp' => time(),
457
-                )
458
-            );
459
-        }
460
-
461
-        // if there is billing info, clean it and save it now
462
-        if ($billing_info instanceof EE_Billing_Attendee_Info_Form) {
463
-            $this->_save_billing_info_to_attendee($billing_info, $transaction);
464
-        }
465
-
466
-        return $payment;
467
-    }
468
-
469
-    /**
470
-     * Gets the values we want to pass onto the gateway. Normally these
471
-     * are just the 'pretty' values, but there may be times the data may need
472
-     * a  little massaging. Proper subsections will become arrays of inputs
473
-     *
474
-     * @param EE_Billing_Info_Form $billing_form
475
-     * @return array
476
-     */
477
-    protected function _get_billing_values_from_form($billing_form)
478
-    {
479
-        if ($billing_form instanceof EE_Form_Section_Proper) {
480
-            return $billing_form->input_pretty_values(true);
481
-        } else {
482
-            return null;
483
-        }
484
-    }
485
-
486
-
487
-    /**
488
-     * Handles an instant payment notification when the transaction is known (by default).
489
-     *
490
-     * @param array          $req_data
491
-     * @param EE_Transaction $transaction
492
-     * @return EE_Payment
493
-     * @throws EE_Error
494
-     */
495
-    public function handle_ipn($req_data, $transaction)
496
-    {
497
-        $transaction = EEM_Transaction::instance()->ensure_is_obj($transaction);
498
-        if (! $this->_gateway instanceof EE_Offsite_Gateway) {
499
-            throw new EE_Error(
500
-                sprintf(
501
-                    __("Could not handle IPN because '%s' is not an offsite gateway", "event_espresso"),
502
-                    print_r($this->_gateway, true)
503
-                )
504
-            );
505
-        }
506
-        $payment = $this->_gateway->handle_payment_update($req_data, $transaction);
507
-        return $payment;
508
-    }
509
-
510
-
511
-    /**
512
-     * Saves the billing info onto the attendee of the primary registrant on this transaction, and
513
-     * cleans it first.
514
-     *
515
-     * @param EE_Billing_Attendee_Info_Form $billing_form
516
-     * @param EE_Transaction                $transaction
517
-     * @return boolean success
518
-     */
519
-    protected function _save_billing_info_to_attendee($billing_form, $transaction)
520
-    {
521
-        if (! $transaction || ! $transaction instanceof EE_Transaction) {
522
-            EE_Error::add_error(
523
-                __("Cannot save billing info because no transaction was specified", "event_espresso"),
524
-                __FILE__,
525
-                __FUNCTION__,
526
-                __LINE__
527
-            );
528
-            return false;
529
-        }
530
-        $primary_reg = $transaction->primary_registration();
531
-        if (! $primary_reg) {
532
-            EE_Error::add_error(
533
-                __("Cannot save billing info because the transaction has no primary registration", "event_espresso"),
534
-                __FILE__,
535
-                __FUNCTION__,
536
-                __LINE__
537
-            );
538
-            return false;
539
-        }
540
-        $attendee = $primary_reg->attendee();
541
-        if (! $attendee) {
542
-            EE_Error::add_error(
543
-                __(
544
-                    "Cannot save billing info because the transaction's primary registration has no attendee!",
545
-                    "event_espresso"
546
-                ),
547
-                __FILE__,
548
-                __FUNCTION__,
549
-                __LINE__
550
-            );
551
-            return false;
552
-        }
553
-        return $attendee->save_and_clean_billing_info_for_payment_method($billing_form, $transaction->payment_method());
554
-    }
555
-
556
-
557
-    /**
558
-     * Gets the payment this IPN is for. Children may often want to
559
-     * override this to inspect the request
560
-     *
561
-     * @param EE_Transaction $transaction
562
-     * @param array          $req_data
563
-     * @return EE_Payment
564
-     */
565
-    protected function find_payment_for_ipn(EE_Transaction $transaction, $req_data = array())
566
-    {
567
-        return $transaction->last_payment();
568
-    }
569
-
570
-
571
-    /**
572
-     * In case generic code cannot provide the payment processor with a specific payment method
573
-     * and transaction, it will try calling this method on each activate payment method.
574
-     * If the payment method is able to identify the request as being for it, it should fetch
575
-     * the payment its for and return it. If not, it should throw an EE_Error to indicate it cannot
576
-     * handle the IPN
577
-     *
578
-     * @param array $req_data
579
-     * @return EE_Payment only if this payment method can find the info its needs from $req_data
580
-     * and identifies the IPN as being for this payment method (not just fo ra payment method of this type)
581
-     * @throws EE_Error
582
-     */
583
-    public function handle_unclaimed_ipn($req_data = array())
584
-    {
585
-        throw new EE_Error(
586
-            sprintf(__("Payment Method '%s' cannot handle unclaimed IPNs", "event_espresso"), get_class($this))
587
-        );
588
-    }
589
-
590
-
591
-    /**
592
-     * Logic to be accomplished when the payment attempt is complete.
593
-     * Most payment methods don't need to do anything at this point; but some, like Mijireh, do.
594
-     * (Mijireh is an offsite gateway which doesn't send an IPN. So when the user returns to EE from
595
-     * mijireh, this method needs to be called so the Mijireh PM can ping Mijireh to know the status
596
-     * of the payment). Fed a transaction because it's always assumed to be the last payment that
597
-     * we're dealing with. Returns that last payment (if there is one)
598
-     *
599
-     * @param EE_Transaction $transaction
600
-     * @return EE_Payment
601
-     */
602
-    public function finalize_payment_for($transaction)
603
-    {
604
-        return $transaction->last_payment();
605
-    }
606
-
607
-
608
-    /**
609
-     * Whether or not this payment method's gateway supports sending refund requests
610
-     *
611
-     * @return boolean
612
-     */
613
-    public function supports_sending_refunds()
614
-    {
615
-        if ($this->_gateway && $this->_gateway instanceof EE_Gateway) {
616
-            return $this->_gateway->supports_sending_refunds();
617
-        } else {
618
-            return false;
619
-        }
620
-    }
621
-
622
-
623
-    /**
624
-     *
625
-     * @param EE_Payment $payment
626
-     * @param array      $refund_info
627
-     * @throws EE_Error
628
-     * @return EE_Payment
629
-     */
630
-    public function process_refund(EE_Payment $payment, $refund_info = array())
631
-    {
632
-        if ($this->_gateway && $this->_gateway instanceof EE_Gateway) {
633
-            return $this->_gateway->do_direct_refund($payment, $refund_info);
634
-        } else {
635
-            throw new EE_Error(
636
-                sprintf(
637
-                    __('Payment Method Type "%s" does not support sending refund requests', 'event_espresso'),
638
-                    get_class($this)
639
-                )
640
-            );
641
-        }
642
-    }
643
-
644
-
645
-    /**
646
-     * Returns one the class's constants onsite,offsite, or offline, depending on this
647
-     * payment method's gateway.
648
-     *
649
-     * @return string
650
-     * @throws EE_Error
651
-     */
652
-    public function payment_occurs()
653
-    {
654
-        if (! $this->_gateway) {
655
-            return EE_PMT_Base::offline;
656
-        } elseif ($this->_gateway instanceof EE_Onsite_Gateway) {
657
-            return EE_PMT_Base::onsite;
658
-        } elseif ($this->_gateway instanceof EE_Offsite_Gateway) {
659
-            return EE_PMT_Base::offsite;
660
-        } else {
661
-            throw new EE_Error(
662
-                sprintf(
663
-                    __(
664
-                        "Payment method type '%s's gateway isn't an instance of EE_Onsite_Gateway, EE_Offsite_Gateway, or null. It must be one of those",
665
-                        "event_espresso"
666
-                    ),
667
-                    get_class($this)
668
-                )
669
-            );
670
-        }
671
-    }
672
-
673
-
674
-    /**
675
-     * For adding any html output ab ove the payment overview.
676
-     * Many gateways won't want ot display anything, so this function just returns an empty string.
677
-     * Other gateways may want to override this, such as offline gateways.
678
-     *
679
-     * @param EE_Payment $payment
680
-     * @return string
681
-     */
682
-    public function payment_overview_content(EE_Payment $payment)
683
-    {
684
-        return EEH_Template::display_template(
685
-            EE_LIBRARIES . 'payment_methods' . DS . 'templates' . DS . 'payment_details_content.template.php',
686
-            array('payment_method' => $this->_pm_instance, 'payment' => $payment),
687
-            true
688
-        );
689
-    }
690
-
691
-
692
-    /**
693
-     * @return array where keys are the help tab name,
694
-     * values are: array {
695
-     * @type string $title         i18n name for the help tab
696
-     * @type string $filename      name of the file located in ./help_tabs/ (ie, in a folder next to this file)
697
-     * @type array  $template_args any arguments you want passed to the template file while rendering.
698
-     *                Keys will be variable names and values with be their values.
699
-     */
700
-    public function help_tabs_config()
701
-    {
702
-        return array();
703
-    }
704
-
705
-
706
-    /**
707
-     * The system name for this PMT (eg AIM, Paypal_Pro, Invoice... what gets put into
708
-     * the payment method's table's PMT_type column)
709
-     *
710
-     * @return string
711
-     */
712
-    public function system_name()
713
-    {
714
-        $classname = get_class($this);
715
-        return str_replace("EE_PMT_", '', $classname);
716
-    }
717
-
718
-
719
-    /**
720
-     * A pretty i18n version of the PMT name. Often the same as the "pretty_name", but you can change it by overriding
721
-     * this method.
722
-     * @return string
723
-     */
724
-    public function defaultFrontendName()
725
-    {
726
-        return $this->pretty_name();
727
-    }
728
-
729
-
730
-    /**
731
-     * A pretty i18n version of the PMT name
732
-     *
733
-     * @return string
734
-     */
735
-    public function pretty_name()
736
-    {
737
-        return $this->_pretty_name;
738
-    }
739
-
740
-
741
-    /**
742
-     * Gets the default absolute URL to the payment method type's button
743
-     *
744
-     * @return string
745
-     */
746
-    public function default_button_url()
747
-    {
748
-        return $this->_default_button_url;
749
-    }
750
-
751
-
752
-    /**
753
-     * Gets the gateway used by this payment method (if any)
754
-     *
755
-     * @return EE_Gateway
756
-     */
757
-    public function get_gateway()
758
-    {
759
-        return $this->_gateway;
760
-    }
761
-
762
-
763
-    /**
764
-     * @return string html for the link to a help tab
765
-     */
766
-    public function get_help_tab_link()
767
-    {
768
-        return EEH_Template::get_help_tab_link(
769
-            $this->get_help_tab_name(),
770
-            'espresso_payment_settings',
771
-            'default'
772
-        );
773
-    }
774
-
775
-
776
-    /**
777
-     * Returns the name of the help tab for this PMT
778
-     *
779
-     * @return string
780
-     */
781
-    public function get_help_tab_name()
782
-    {
783
-        return 'ee_' . strtolower($this->system_name()) . '_help_tab';
784
-    }
785
-
786
-    /**
787
-     * The name of the wp capability that should be associated with the usage of
788
-     * this PMT by an admin
789
-     *
790
-     * @return string
791
-     */
792
-    public function cap_name()
793
-    {
794
-        return 'ee_payment_method_' . strtolower($this->system_name());
795
-    }
796
-
797
-    /**
798
-     * Called by client code to tell the gateway that if it wants to change
799
-     * the transaction or line items or registrations related to teh payment it already
800
-     * processed (we think, but possibly not) that now's the time to do it.
801
-     * It is expected that gateways will store any info they need for this on the PAY_details,
802
-     * or maybe an extra meta value
803
-     *
804
-     * @param EE_Payment $payment
805
-     * @return void
806
-     */
807
-    public function update_txn_based_on_payment($payment)
808
-    {
809
-        if ($this->_gateway instanceof EE_Gateway) {
810
-            $this->_gateway->update_txn_based_on_payment($payment);
811
-        }
812
-    }
813
-
814
-    /**
815
-     * Returns a string of HTML describing this payment method type for an admin,
816
-     * primarily intended for them to read before activating it.
817
-     * The easiest way to set this is to create a folder 'templates' alongside
818
-     * your EE_PMT_{System_Name} file, and in it create a file named "{system_name}_intro.template.php".
819
-     * Eg, if your payment method file is named "EE_PMT_Foo_Bar.pm.php",
820
-     * then you'd create a file named "templates" in the same folder as it, and name the file
821
-     * "foo_bar_intro.template.php", and its content will be returned by this method
822
-     *
823
-     * @return string
824
-     */
825
-    public function introductory_html()
826
-    {
827
-        return EEH_Template::locate_template(
828
-            $this->file_folder() . 'templates' . DS . strtolower($this->system_name()) . '_intro.template.php',
829
-            array('pmt_obj' => $this, 'pm_instance' => $this->_pm_instance)
830
-        );
831
-    }
24
+	const onsite = 'on-site';
25
+	const offsite = 'off-site';
26
+	const offline = 'off-line';
27
+
28
+	/**
29
+	 * @var EE_Payment_Method
30
+	 */
31
+	protected $_pm_instance = null;
32
+
33
+	/**
34
+	 * @var boolean
35
+	 */
36
+	protected $_requires_https = false;
37
+
38
+	/**
39
+	 * @var boolean
40
+	 */
41
+	protected $_has_billing_form;
42
+
43
+	/**
44
+	 * @var EE_Gateway
45
+	 */
46
+	protected $_gateway = null;
47
+
48
+	/**
49
+	 * @var EE_Payment_Method_Form
50
+	 */
51
+	protected $_settings_form = null;
52
+
53
+	/**
54
+	 * @var EE_Form_Section_Proper
55
+	 */
56
+	protected $_billing_form = null;
57
+
58
+	/**
59
+	 * @var boolean
60
+	 */
61
+	protected $_cache_billing_form = true;
62
+
63
+	/**
64
+	 * String of the absolute path to the folder containing this file, with a trailing slash.
65
+	 * eg '/public_html/wp-site/wp-content/plugins/event-espresso/payment_methods/Invoice/'
66
+	 *
67
+	 * @var string
68
+	 */
69
+	protected $_file_folder = null;
70
+
71
+	/**
72
+	 * String to the absolute URL to this file (useful for getting its web-accessible resources
73
+	 * like images, js, or css)
74
+	 *
75
+	 * @var string
76
+	 */
77
+	protected $_file_url = null;
78
+
79
+	/**
80
+	 * Pretty name for the payment method
81
+	 *
82
+	 * @var string
83
+	 */
84
+	protected $_pretty_name = null;
85
+
86
+	/**
87
+	 *
88
+	 * @var string
89
+	 */
90
+	protected $_default_button_url = null;
91
+
92
+	/**
93
+	 *
94
+	 * @var string
95
+	 */
96
+	protected $_default_description = null;
97
+
98
+
99
+	/**
100
+	 *
101
+	 * @param EE_Payment_Method $pm_instance
102
+	 * @throws EE_Error
103
+	 * @return EE_PMT_Base
104
+	 */
105
+	public function __construct($pm_instance = null)
106
+	{
107
+		if ($pm_instance instanceof EE_Payment_Method) {
108
+			$this->set_instance($pm_instance);
109
+		}
110
+		if ($this->_gateway) {
111
+			$this->_gateway->set_payment_model(EEM_Payment::instance());
112
+			$this->_gateway->set_payment_log(EEM_Change_Log::instance());
113
+			$this->_gateway->set_template_helper(new EEH_Template());
114
+			$this->_gateway->set_line_item_helper(new EEH_Line_Item());
115
+			$this->_gateway->set_money_helper(new EEH_Money());
116
+			$this->_gateway->set_gateway_data_formatter(new GatewayDataFormatter());
117
+			$this->_gateway->set_unsupported_character_remover(new AsciiOnly());
118
+			do_action('AHEE__EE_PMT_Base___construct__done_initializing_gateway_class', $this, $this->_gateway);
119
+		}
120
+		if (! isset($this->_has_billing_form)) {
121
+			// by default, On Site gateways have a billing form
122
+			if ($this->payment_occurs() == EE_PMT_Base::onsite) {
123
+				$this->set_has_billing_form(true);
124
+			} else {
125
+				$this->set_has_billing_form(false);
126
+			}
127
+		}
128
+
129
+		if (! $this->_pretty_name) {
130
+			throw new EE_Error(
131
+				sprintf(
132
+					__(
133
+						"You must set the pretty name for the Payment Method Type in the constructor (_pretty_name), and please make it internationalized",
134
+						"event_espresso"
135
+					)
136
+				)
137
+			);
138
+		}
139
+		// if the child didn't specify a default button, use the credit card one
140
+		if ($this->_default_button_url === null) {
141
+			$this->_default_button_url = EE_PLUGIN_DIR_URL . 'payment_methods' . DS . 'pay-by-credit-card.png';
142
+		}
143
+	}
144
+
145
+
146
+	/**
147
+	 * @param boolean $has_billing_form
148
+	 */
149
+	public function set_has_billing_form($has_billing_form)
150
+	{
151
+		$this->_has_billing_form = filter_var($has_billing_form, FILTER_VALIDATE_BOOLEAN);
152
+	}
153
+
154
+
155
+	/**
156
+	 * sets the file_folder property
157
+	 */
158
+	protected function _set_file_folder()
159
+	{
160
+		$reflector = new ReflectionClass(get_class($this));
161
+		$fn = $reflector->getFileName();
162
+		$this->_file_folder = dirname($fn) . DS;
163
+	}
164
+
165
+
166
+	/**
167
+	 * sets the file URL with a trailing slash for this PMT
168
+	 */
169
+	protected function _set_file_url()
170
+	{
171
+		$plugins_dir_fixed = str_replace('\\', DS, WP_PLUGIN_DIR);
172
+		$file_folder_fixed = str_replace('\\', DS, $this->file_folder());
173
+		$file_path = str_replace($plugins_dir_fixed, WP_PLUGIN_URL, $file_folder_fixed);
174
+		$this->_file_url = $file_path;
175
+	}
176
+
177
+	/**
178
+	 * Gets the default description on all payment methods of this type
179
+	 *
180
+	 * @return string
181
+	 */
182
+	public function default_description()
183
+	{
184
+		return $this->_default_description;
185
+	}
186
+
187
+
188
+	/**
189
+	 * Returns the folder containing the PMT child class, with a trailing slash
190
+	 *
191
+	 * @return string
192
+	 */
193
+	public function file_folder()
194
+	{
195
+		if (! $this->_file_folder) {
196
+			$this->_set_file_folder();
197
+		}
198
+		return $this->_file_folder;
199
+	}
200
+
201
+
202
+	/**
203
+	 * @return string
204
+	 */
205
+	public function file_url()
206
+	{
207
+		if (! $this->_file_url) {
208
+			$this->_set_file_url();
209
+		}
210
+		return $this->_file_url;
211
+	}
212
+
213
+
214
+	/**
215
+	 * Sets the payment method instance this payment method type is for.
216
+	 * Its important teh payment method instance is set before
217
+	 *
218
+	 * @param EE_Payment_Method $payment_method_instance
219
+	 */
220
+	public function set_instance($payment_method_instance)
221
+	{
222
+		$this->_pm_instance = $payment_method_instance;
223
+		// if they have already requested the settings form, make sure its
224
+		// data matches this model object
225
+		if ($this->_settings_form) {
226
+			$this->settings_form()->populate_model_obj($payment_method_instance);
227
+		}
228
+		if ($this->_gateway && $this->_gateway instanceof EE_Gateway) {
229
+			$this->_gateway->set_settings($payment_method_instance->settings_array());
230
+		}
231
+	}
232
+
233
+
234
+	/**
235
+	 * Gets teh form for displaying to admins where they setup the payment method
236
+	 *
237
+	 * @return EE_Payment_Method_Form
238
+	 */
239
+	public function settings_form()
240
+	{
241
+		if (! $this->_settings_form) {
242
+			$this->_settings_form = $this->generate_new_settings_form();
243
+			$this->_settings_form->set_payment_method_type($this);
244
+			// if we have already assigned a model object to this pmt, make
245
+			// sure its reflected in teh form we just generated
246
+			if ($this->_pm_instance) {
247
+				$this->_settings_form->populate_model_obj($this->_pm_instance);
248
+			}
249
+		}
250
+		return $this->_settings_form;
251
+	}
252
+
253
+
254
+	/**
255
+	 * Gets the form for all the settings related to this payment method type
256
+	 *
257
+	 * @return EE_Payment_Method_Form
258
+	 */
259
+	abstract public function generate_new_settings_form();
260
+
261
+
262
+	/**
263
+	 * Sets the form for settings. This may be useful if we have already received
264
+	 * a form submission and have form data it in, and want to use it anytime we're showing
265
+	 * this payment method type's settings form later in the request
266
+	 *
267
+	 * @param EE_Payment_Method_Form $form
268
+	 */
269
+	public function set_settings_form($form)
270
+	{
271
+		$this->_settings_form = $form;
272
+	}
273
+
274
+
275
+	/**
276
+	 * @return boolean
277
+	 */
278
+	public function has_billing_form()
279
+	{
280
+		return $this->_has_billing_form;
281
+	}
282
+
283
+
284
+	/**
285
+	 * Gets the form for displaying to attendees where they can enter their billing info
286
+	 * which will be sent to teh gateway (can be null)
287
+	 *
288
+	 * @param \EE_Transaction $transaction
289
+	 * @param array           $extra_args
290
+	 * @return \EE_Billing_Attendee_Info_Form|\EE_Billing_Info_Form|null
291
+	 */
292
+	public function billing_form(EE_Transaction $transaction = null, $extra_args = array())
293
+	{
294
+		// has billing form already been regenerated ? or overwrite cache?
295
+		if (! $this->_billing_form instanceof EE_Billing_Info_Form || ! $this->_cache_billing_form) {
296
+			$this->_billing_form = $this->generate_new_billing_form($transaction, $extra_args);
297
+		}
298
+		// if we know who the attendee is, and this is a billing form
299
+		// that uses attendee info, populate it
300
+		if (apply_filters(
301
+			'FHEE__populate_billing_form_fields_from_attendee',
302
+			($this->_billing_form instanceof EE_Billing_Attendee_Info_Form
303
+				&& $transaction instanceof EE_Transaction
304
+				&& $transaction->primary_registration() instanceof EE_Registration
305
+				&& $transaction->primary_registration()->attendee() instanceof EE_Attendee
306
+			),
307
+			$this->_billing_form,
308
+			$transaction
309
+		)) {
310
+			$this->_billing_form->populate_from_attendee($transaction->primary_registration()->attendee());
311
+		}
312
+		return $this->_billing_form;
313
+	}
314
+
315
+
316
+	/**
317
+	 * Creates the billing form for this payment method type
318
+	 *
319
+	 * @param \EE_Transaction $transaction
320
+	 * @return \EE_Billing_Info_Form
321
+	 */
322
+	abstract public function generate_new_billing_form(EE_Transaction $transaction = null);
323
+
324
+
325
+	/**
326
+	 * apply_billing_form_debug_settings
327
+	 * applies debug data to the form
328
+	 *
329
+	 * @param \EE_Billing_Info_Form $billing_form
330
+	 * @return \EE_Billing_Info_Form
331
+	 */
332
+	public function apply_billing_form_debug_settings(EE_Billing_Info_Form $billing_form)
333
+	{
334
+		return $billing_form;
335
+	}
336
+
337
+
338
+	/**
339
+	 * Sets the billing form for this payment method type. You may want to use this
340
+	 * if you have form
341
+	 *
342
+	 * @param EE_Payment_Method $form
343
+	 */
344
+	public function set_billing_form($form)
345
+	{
346
+		$this->_billing_form = $form;
347
+	}
348
+
349
+
350
+	/**
351
+	 * Returns whether or not this payment method requires HTTPS to be used
352
+	 *
353
+	 * @return boolean
354
+	 */
355
+	public function requires_https()
356
+	{
357
+		return $this->_requires_https;
358
+	}
359
+
360
+
361
+	/**
362
+	 *
363
+	 * @param EE_Transaction       $transaction
364
+	 * @param float                $amount
365
+	 * @param EE_Billing_Info_Form $billing_info
366
+	 * @param string               $return_url
367
+	 * @param string               $fail_url
368
+	 * @param string               $method
369
+	 * @param bool                 $by_admin
370
+	 * @return EE_Payment
371
+	 * @throws EE_Error
372
+	 */
373
+	public function process_payment(
374
+		EE_Transaction $transaction,
375
+		$amount = null,
376
+		$billing_info = null,
377
+		$return_url = null,
378
+		$fail_url = '',
379
+		$method = 'CART',
380
+		$by_admin = false
381
+	) {
382
+		// @todo: add surcharge for the payment method, if any
383
+		if ($this->_gateway) {
384
+			// there is a gateway, so we're going to make a payment object
385
+			// but wait! do they already have a payment in progress that we thought was failed?
386
+			$duplicate_properties = array(
387
+				'STS_ID'               => EEM_Payment::status_id_failed,
388
+				'TXN_ID'               => $transaction->ID(),
389
+				'PMD_ID'               => $this->_pm_instance->ID(),
390
+				'PAY_source'           => $method,
391
+				'PAY_amount'           => $amount !== null ? $amount : $transaction->remaining(),
392
+				'PAY_gateway_response' => null,
393
+			);
394
+			$payment = EEM_Payment::instance()->get_one(array($duplicate_properties));
395
+			// if we didn't already have a payment in progress for the same thing,
396
+			// then we actually want to make a new payment
397
+			if (! $payment instanceof EE_Payment) {
398
+				$payment = EE_Payment::new_instance(
399
+					array_merge(
400
+						$duplicate_properties,
401
+						array(
402
+							'PAY_timestamp'       => time(),
403
+							'PAY_txn_id_chq_nmbr' => null,
404
+							'PAY_po_number'       => null,
405
+							'PAY_extra_accntng'   => null,
406
+							'PAY_details'         => null,
407
+						)
408
+					)
409
+				);
410
+			}
411
+			// make sure the payment has been saved to show we started it, and so it has an ID should the gateway try to log it
412
+			$payment->save();
413
+			$billing_values = $this->_get_billing_values_from_form($billing_info);
414
+
415
+			//  Offsite Gateway
416
+			if ($this->_gateway instanceof EE_Offsite_Gateway) {
417
+				$payment = $this->_gateway->set_redirection_info(
418
+					$payment,
419
+					$billing_values,
420
+					$return_url,
421
+					EE_Config::instance()->core->txn_page_url(
422
+						array(
423
+							'e_reg_url_link'    => $transaction->primary_registration()->reg_url_link(),
424
+							'ee_payment_method' => $this->_pm_instance->slug(),
425
+						)
426
+					),
427
+					$fail_url
428
+				);
429
+				$payment->save();
430
+				//  Onsite Gateway
431
+			} elseif ($this->_gateway instanceof EE_Onsite_Gateway) {
432
+				$payment = $this->_gateway->do_direct_payment($payment, $billing_values);
433
+				$payment->save();
434
+			} else {
435
+				throw new EE_Error(
436
+					sprintf(
437
+						__(
438
+							'Gateway for payment method type "%s" is "%s", not a subclass of either EE_Offsite_Gateway or EE_Onsite_Gateway, or null (to indicate NO gateway)',
439
+							'event_espresso'
440
+						),
441
+						get_class($this),
442
+						gettype($this->_gateway)
443
+					)
444
+				);
445
+			}
446
+		} else {
447
+			// no gateway provided
448
+			// there is no payment. Must be an offline gateway
449
+			// create a payment object anyways, but dont save it
450
+			$payment = EE_Payment::new_instance(
451
+				array(
452
+					'STS_ID'        => EEM_Payment::status_id_pending,
453
+					'TXN_ID'        => $transaction->ID(),
454
+					'PMD_ID'        => $transaction->payment_method_ID(),
455
+					'PAY_amount'    => 0.00,
456
+					'PAY_timestamp' => time(),
457
+				)
458
+			);
459
+		}
460
+
461
+		// if there is billing info, clean it and save it now
462
+		if ($billing_info instanceof EE_Billing_Attendee_Info_Form) {
463
+			$this->_save_billing_info_to_attendee($billing_info, $transaction);
464
+		}
465
+
466
+		return $payment;
467
+	}
468
+
469
+	/**
470
+	 * Gets the values we want to pass onto the gateway. Normally these
471
+	 * are just the 'pretty' values, but there may be times the data may need
472
+	 * a  little massaging. Proper subsections will become arrays of inputs
473
+	 *
474
+	 * @param EE_Billing_Info_Form $billing_form
475
+	 * @return array
476
+	 */
477
+	protected function _get_billing_values_from_form($billing_form)
478
+	{
479
+		if ($billing_form instanceof EE_Form_Section_Proper) {
480
+			return $billing_form->input_pretty_values(true);
481
+		} else {
482
+			return null;
483
+		}
484
+	}
485
+
486
+
487
+	/**
488
+	 * Handles an instant payment notification when the transaction is known (by default).
489
+	 *
490
+	 * @param array          $req_data
491
+	 * @param EE_Transaction $transaction
492
+	 * @return EE_Payment
493
+	 * @throws EE_Error
494
+	 */
495
+	public function handle_ipn($req_data, $transaction)
496
+	{
497
+		$transaction = EEM_Transaction::instance()->ensure_is_obj($transaction);
498
+		if (! $this->_gateway instanceof EE_Offsite_Gateway) {
499
+			throw new EE_Error(
500
+				sprintf(
501
+					__("Could not handle IPN because '%s' is not an offsite gateway", "event_espresso"),
502
+					print_r($this->_gateway, true)
503
+				)
504
+			);
505
+		}
506
+		$payment = $this->_gateway->handle_payment_update($req_data, $transaction);
507
+		return $payment;
508
+	}
509
+
510
+
511
+	/**
512
+	 * Saves the billing info onto the attendee of the primary registrant on this transaction, and
513
+	 * cleans it first.
514
+	 *
515
+	 * @param EE_Billing_Attendee_Info_Form $billing_form
516
+	 * @param EE_Transaction                $transaction
517
+	 * @return boolean success
518
+	 */
519
+	protected function _save_billing_info_to_attendee($billing_form, $transaction)
520
+	{
521
+		if (! $transaction || ! $transaction instanceof EE_Transaction) {
522
+			EE_Error::add_error(
523
+				__("Cannot save billing info because no transaction was specified", "event_espresso"),
524
+				__FILE__,
525
+				__FUNCTION__,
526
+				__LINE__
527
+			);
528
+			return false;
529
+		}
530
+		$primary_reg = $transaction->primary_registration();
531
+		if (! $primary_reg) {
532
+			EE_Error::add_error(
533
+				__("Cannot save billing info because the transaction has no primary registration", "event_espresso"),
534
+				__FILE__,
535
+				__FUNCTION__,
536
+				__LINE__
537
+			);
538
+			return false;
539
+		}
540
+		$attendee = $primary_reg->attendee();
541
+		if (! $attendee) {
542
+			EE_Error::add_error(
543
+				__(
544
+					"Cannot save billing info because the transaction's primary registration has no attendee!",
545
+					"event_espresso"
546
+				),
547
+				__FILE__,
548
+				__FUNCTION__,
549
+				__LINE__
550
+			);
551
+			return false;
552
+		}
553
+		return $attendee->save_and_clean_billing_info_for_payment_method($billing_form, $transaction->payment_method());
554
+	}
555
+
556
+
557
+	/**
558
+	 * Gets the payment this IPN is for. Children may often want to
559
+	 * override this to inspect the request
560
+	 *
561
+	 * @param EE_Transaction $transaction
562
+	 * @param array          $req_data
563
+	 * @return EE_Payment
564
+	 */
565
+	protected function find_payment_for_ipn(EE_Transaction $transaction, $req_data = array())
566
+	{
567
+		return $transaction->last_payment();
568
+	}
569
+
570
+
571
+	/**
572
+	 * In case generic code cannot provide the payment processor with a specific payment method
573
+	 * and transaction, it will try calling this method on each activate payment method.
574
+	 * If the payment method is able to identify the request as being for it, it should fetch
575
+	 * the payment its for and return it. If not, it should throw an EE_Error to indicate it cannot
576
+	 * handle the IPN
577
+	 *
578
+	 * @param array $req_data
579
+	 * @return EE_Payment only if this payment method can find the info its needs from $req_data
580
+	 * and identifies the IPN as being for this payment method (not just fo ra payment method of this type)
581
+	 * @throws EE_Error
582
+	 */
583
+	public function handle_unclaimed_ipn($req_data = array())
584
+	{
585
+		throw new EE_Error(
586
+			sprintf(__("Payment Method '%s' cannot handle unclaimed IPNs", "event_espresso"), get_class($this))
587
+		);
588
+	}
589
+
590
+
591
+	/**
592
+	 * Logic to be accomplished when the payment attempt is complete.
593
+	 * Most payment methods don't need to do anything at this point; but some, like Mijireh, do.
594
+	 * (Mijireh is an offsite gateway which doesn't send an IPN. So when the user returns to EE from
595
+	 * mijireh, this method needs to be called so the Mijireh PM can ping Mijireh to know the status
596
+	 * of the payment). Fed a transaction because it's always assumed to be the last payment that
597
+	 * we're dealing with. Returns that last payment (if there is one)
598
+	 *
599
+	 * @param EE_Transaction $transaction
600
+	 * @return EE_Payment
601
+	 */
602
+	public function finalize_payment_for($transaction)
603
+	{
604
+		return $transaction->last_payment();
605
+	}
606
+
607
+
608
+	/**
609
+	 * Whether or not this payment method's gateway supports sending refund requests
610
+	 *
611
+	 * @return boolean
612
+	 */
613
+	public function supports_sending_refunds()
614
+	{
615
+		if ($this->_gateway && $this->_gateway instanceof EE_Gateway) {
616
+			return $this->_gateway->supports_sending_refunds();
617
+		} else {
618
+			return false;
619
+		}
620
+	}
621
+
622
+
623
+	/**
624
+	 *
625
+	 * @param EE_Payment $payment
626
+	 * @param array      $refund_info
627
+	 * @throws EE_Error
628
+	 * @return EE_Payment
629
+	 */
630
+	public function process_refund(EE_Payment $payment, $refund_info = array())
631
+	{
632
+		if ($this->_gateway && $this->_gateway instanceof EE_Gateway) {
633
+			return $this->_gateway->do_direct_refund($payment, $refund_info);
634
+		} else {
635
+			throw new EE_Error(
636
+				sprintf(
637
+					__('Payment Method Type "%s" does not support sending refund requests', 'event_espresso'),
638
+					get_class($this)
639
+				)
640
+			);
641
+		}
642
+	}
643
+
644
+
645
+	/**
646
+	 * Returns one the class's constants onsite,offsite, or offline, depending on this
647
+	 * payment method's gateway.
648
+	 *
649
+	 * @return string
650
+	 * @throws EE_Error
651
+	 */
652
+	public function payment_occurs()
653
+	{
654
+		if (! $this->_gateway) {
655
+			return EE_PMT_Base::offline;
656
+		} elseif ($this->_gateway instanceof EE_Onsite_Gateway) {
657
+			return EE_PMT_Base::onsite;
658
+		} elseif ($this->_gateway instanceof EE_Offsite_Gateway) {
659
+			return EE_PMT_Base::offsite;
660
+		} else {
661
+			throw new EE_Error(
662
+				sprintf(
663
+					__(
664
+						"Payment method type '%s's gateway isn't an instance of EE_Onsite_Gateway, EE_Offsite_Gateway, or null. It must be one of those",
665
+						"event_espresso"
666
+					),
667
+					get_class($this)
668
+				)
669
+			);
670
+		}
671
+	}
672
+
673
+
674
+	/**
675
+	 * For adding any html output ab ove the payment overview.
676
+	 * Many gateways won't want ot display anything, so this function just returns an empty string.
677
+	 * Other gateways may want to override this, such as offline gateways.
678
+	 *
679
+	 * @param EE_Payment $payment
680
+	 * @return string
681
+	 */
682
+	public function payment_overview_content(EE_Payment $payment)
683
+	{
684
+		return EEH_Template::display_template(
685
+			EE_LIBRARIES . 'payment_methods' . DS . 'templates' . DS . 'payment_details_content.template.php',
686
+			array('payment_method' => $this->_pm_instance, 'payment' => $payment),
687
+			true
688
+		);
689
+	}
690
+
691
+
692
+	/**
693
+	 * @return array where keys are the help tab name,
694
+	 * values are: array {
695
+	 * @type string $title         i18n name for the help tab
696
+	 * @type string $filename      name of the file located in ./help_tabs/ (ie, in a folder next to this file)
697
+	 * @type array  $template_args any arguments you want passed to the template file while rendering.
698
+	 *                Keys will be variable names and values with be their values.
699
+	 */
700
+	public function help_tabs_config()
701
+	{
702
+		return array();
703
+	}
704
+
705
+
706
+	/**
707
+	 * The system name for this PMT (eg AIM, Paypal_Pro, Invoice... what gets put into
708
+	 * the payment method's table's PMT_type column)
709
+	 *
710
+	 * @return string
711
+	 */
712
+	public function system_name()
713
+	{
714
+		$classname = get_class($this);
715
+		return str_replace("EE_PMT_", '', $classname);
716
+	}
717
+
718
+
719
+	/**
720
+	 * A pretty i18n version of the PMT name. Often the same as the "pretty_name", but you can change it by overriding
721
+	 * this method.
722
+	 * @return string
723
+	 */
724
+	public function defaultFrontendName()
725
+	{
726
+		return $this->pretty_name();
727
+	}
728
+
729
+
730
+	/**
731
+	 * A pretty i18n version of the PMT name
732
+	 *
733
+	 * @return string
734
+	 */
735
+	public function pretty_name()
736
+	{
737
+		return $this->_pretty_name;
738
+	}
739
+
740
+
741
+	/**
742
+	 * Gets the default absolute URL to the payment method type's button
743
+	 *
744
+	 * @return string
745
+	 */
746
+	public function default_button_url()
747
+	{
748
+		return $this->_default_button_url;
749
+	}
750
+
751
+
752
+	/**
753
+	 * Gets the gateway used by this payment method (if any)
754
+	 *
755
+	 * @return EE_Gateway
756
+	 */
757
+	public function get_gateway()
758
+	{
759
+		return $this->_gateway;
760
+	}
761
+
762
+
763
+	/**
764
+	 * @return string html for the link to a help tab
765
+	 */
766
+	public function get_help_tab_link()
767
+	{
768
+		return EEH_Template::get_help_tab_link(
769
+			$this->get_help_tab_name(),
770
+			'espresso_payment_settings',
771
+			'default'
772
+		);
773
+	}
774
+
775
+
776
+	/**
777
+	 * Returns the name of the help tab for this PMT
778
+	 *
779
+	 * @return string
780
+	 */
781
+	public function get_help_tab_name()
782
+	{
783
+		return 'ee_' . strtolower($this->system_name()) . '_help_tab';
784
+	}
785
+
786
+	/**
787
+	 * The name of the wp capability that should be associated with the usage of
788
+	 * this PMT by an admin
789
+	 *
790
+	 * @return string
791
+	 */
792
+	public function cap_name()
793
+	{
794
+		return 'ee_payment_method_' . strtolower($this->system_name());
795
+	}
796
+
797
+	/**
798
+	 * Called by client code to tell the gateway that if it wants to change
799
+	 * the transaction or line items or registrations related to teh payment it already
800
+	 * processed (we think, but possibly not) that now's the time to do it.
801
+	 * It is expected that gateways will store any info they need for this on the PAY_details,
802
+	 * or maybe an extra meta value
803
+	 *
804
+	 * @param EE_Payment $payment
805
+	 * @return void
806
+	 */
807
+	public function update_txn_based_on_payment($payment)
808
+	{
809
+		if ($this->_gateway instanceof EE_Gateway) {
810
+			$this->_gateway->update_txn_based_on_payment($payment);
811
+		}
812
+	}
813
+
814
+	/**
815
+	 * Returns a string of HTML describing this payment method type for an admin,
816
+	 * primarily intended for them to read before activating it.
817
+	 * The easiest way to set this is to create a folder 'templates' alongside
818
+	 * your EE_PMT_{System_Name} file, and in it create a file named "{system_name}_intro.template.php".
819
+	 * Eg, if your payment method file is named "EE_PMT_Foo_Bar.pm.php",
820
+	 * then you'd create a file named "templates" in the same folder as it, and name the file
821
+	 * "foo_bar_intro.template.php", and its content will be returned by this method
822
+	 *
823
+	 * @return string
824
+	 */
825
+	public function introductory_html()
826
+	{
827
+		return EEH_Template::locate_template(
828
+			$this->file_folder() . 'templates' . DS . strtolower($this->system_name()) . '_intro.template.php',
829
+			array('pmt_obj' => $this, 'pm_instance' => $this->_pm_instance)
830
+		);
831
+	}
832 832
 }
Please login to merge, or discard this patch.
core/libraries/payment_methods/EE_Payment_Method_Manager.lib.php 2 patches
Indentation   +555 added lines, -555 removed lines patch added patch discarded remove patch
@@ -17,559 +17,559 @@
 block discarded – undo
17 17
 class EE_Payment_Method_Manager implements ResettableInterface
18 18
 {
19 19
 
20
-    /**
21
-     * prefix added to all payment method capabilities names
22
-     */
23
-    const   CAPABILITIES_PREFIX = 'ee_payment_method_';
24
-
25
-    /**
26
-     * @var EE_Payment_Method_Manager $_instance
27
-     */
28
-    private static $_instance;
29
-
30
-    /**
31
-     * @var boolean
32
-     */
33
-    protected $payment_method_caps_initialized = false;
34
-
35
-    /**
36
-     * @var array keys are class names without 'EE_PMT_', values are their filepaths
37
-     */
38
-    protected $_payment_method_types = array();
39
-
40
-    /**
41
-     * @var EE_PMT_Base[]
42
-     */
43
-    protected $payment_method_objects = array();
44
-
45
-
46
-    /**
47
-     * EE_Payment_Method_Manager constructor.
48
-     *
49
-     * @throws EE_Error
50
-     * @throws DomainException
51
-     */
52
-    public function __construct()
53
-    {
54
-        // if in admin lets ensure caps are set.
55
-        if (is_admin()) {
56
-            $this->_register_payment_methods();
57
-            // set them immediately
58
-            $this->initializePaymentMethodCaps();
59
-            // plus any time they get reset
60
-            add_filter(
61
-                'FHEE__EE_Capabilities__addCaps__capabilities_to_add',
62
-                array($this, 'addPaymentMethodCapsDuringReset')
63
-            );
64
-        }
65
-    }
66
-
67
-
68
-    /**
69
-     * @singleton method used to instantiate class object
70
-     * @return EE_Payment_Method_Manager instance
71
-     * @throws DomainException
72
-     * @throws EE_Error
73
-     */
74
-    public static function instance()
75
-    {
76
-        // check if class object is instantiated, and instantiated properly
77
-        if (! self::$_instance instanceof EE_Payment_Method_Manager) {
78
-            EE_Registry::instance()->load_lib('PMT_Base');
79
-            self::$_instance = new self();
80
-        }
81
-        return self::$_instance;
82
-    }
83
-
84
-
85
-    /**
86
-     * Resets the instance and returns a new one
87
-     *
88
-     * @return EE_Payment_Method_Manager
89
-     * @throws DomainException
90
-     * @throws EE_Error
91
-     */
92
-    public static function reset()
93
-    {
94
-        self::$_instance = null;
95
-        return self::instance();
96
-    }
97
-
98
-
99
-    /**
100
-     * If necessary, re-register payment methods
101
-     *
102
-     * @param boolean $force_recheck whether to recheck for payment method types,
103
-     *                               or just re-use the PMTs we found last time we checked during this request (if
104
-     *                               we have not yet checked during this request, then we need to check anyways)
105
-     */
106
-    public function maybe_register_payment_methods($force_recheck = false)
107
-    {
108
-        if (! $this->_payment_method_types || $force_recheck) {
109
-            $this->_register_payment_methods();
110
-        }
111
-    }
112
-
113
-
114
-    /**
115
-     * register_payment_methods
116
-     *
117
-     * @return array
118
-     */
119
-    protected function _register_payment_methods()
120
-    {
121
-        // grab list of installed modules
122
-        $pm_to_register = glob(EE_PAYMENT_METHODS . '*', GLOB_ONLYDIR);
123
-        // filter list of modules to register
124
-        $pm_to_register = apply_filters(
125
-            'FHEE__EE_Payment_Method_Manager__register_payment_methods__payment_methods_to_register',
126
-            $pm_to_register
127
-        );
128
-        // remove any duplicates if that should happen for some reason
129
-        $pm_to_register = array_unique($pm_to_register);
130
-        // loop through folders
131
-        foreach ($pm_to_register as $pm_path) {
132
-            $this->register_payment_method($pm_path);
133
-        }
134
-        do_action('FHEE__EE_Payment_Method_Manager__register_payment_methods__registered_payment_methods');
135
-        // filter list of installed modules
136
-        // keep them organized alphabetically by the payment method type's name
137
-        ksort($this->_payment_method_types);
138
-        return apply_filters(
139
-            'FHEE__EE_Payment_Method_Manager__register_payment_methods__installed_payment_methods',
140
-            $this->_payment_method_types
141
-        );
142
-    }
143
-
144
-
145
-    /**
146
-     * register_payment_method- makes core aware of this payment method
147
-     *
148
-     * @param string $payment_method_path - full path up to and including payment method folder
149
-     * @return boolean
150
-     */
151
-    public function register_payment_method($payment_method_path = '')
152
-    {
153
-        do_action('AHEE__EE_Payment_Method_Manager__register_payment_method__begin', $payment_method_path);
154
-        $module_ext = '.pm.php';
155
-        // make all separators match
156
-        $payment_method_path = rtrim(str_replace('/\\', DS, $payment_method_path), DS);
157
-        // grab and sanitize module name
158
-        $module_dir = basename($payment_method_path);
159
-        // create class name from module directory name
160
-        $module = str_replace(array('_', ' '), array(' ', '_'), $module_dir);
161
-        // add class prefix
162
-        $module_class = 'EE_PMT_' . $module;
163
-        // does the module exist ?
164
-        if (! is_readable($payment_method_path . DS . $module_class . $module_ext)) {
165
-            $msg = sprintf(
166
-                esc_html__(
167
-                    'The requested %s payment method file could not be found or is not readable due to file permissions.',
168
-                    'event_espresso'
169
-                ),
170
-                $module
171
-            );
172
-            EE_Error::add_error($msg . '||' . $msg, __FILE__, __FUNCTION__, __LINE__);
173
-            return false;
174
-        }
175
-        // load the module class file
176
-        require_once($payment_method_path . DS . $module_class . $module_ext);
177
-        // verify that class exists
178
-        if (! class_exists($module_class)) {
179
-            $msg = sprintf(
180
-                esc_html__('The requested %s module class does not exist.', 'event_espresso'),
181
-                $module_class
182
-            );
183
-            EE_Error::add_error($msg . '||' . $msg, __FILE__, __FUNCTION__, __LINE__);
184
-            return false;
185
-        }
186
-        // add to array of registered modules
187
-        $this->_payment_method_types[ $module ] = $payment_method_path . DS . $module_class . $module_ext;
188
-        ksort($this->_payment_method_types);
189
-        return true;
190
-    }
191
-
192
-
193
-    /**
194
-     * Checks if a payment method has been registered, and if so includes it
195
-     *
196
-     * @param string  $payment_method_name like 'PayPal_Pro', (ie class name without the prefix 'EEPM_')
197
-     * @param boolean $force_recheck       whether to force re-checking for new payment method types
198
-     * @return boolean
199
-     */
200
-    public function payment_method_type_exists($payment_method_name, $force_recheck = false)
201
-    {
202
-        if ($force_recheck
203
-            || ! is_array($this->_payment_method_types)
204
-            || ! isset($this->_payment_method_types[ $payment_method_name ])
205
-        ) {
206
-            $this->maybe_register_payment_methods($force_recheck);
207
-        }
208
-        if (isset($this->_payment_method_types[ $payment_method_name ])) {
209
-            require_once($this->_payment_method_types[ $payment_method_name ]);
210
-            return true;
211
-        }
212
-        return false;
213
-    }
214
-
215
-
216
-    /**
217
-     * Returns all the class names of the various payment method types
218
-     *
219
-     * @param boolean $with_prefixes TRUE: get payment method type class names; false just their 'names'
220
-     *                               (what you'd find in wp_esp_payment_method.PMD_type)
221
-     * @param boolean $force_recheck whether to force re-checking for new payment method types
222
-     * @return array
223
-     */
224
-    public function payment_method_type_names($with_prefixes = false, $force_recheck = false)
225
-    {
226
-        $this->maybe_register_payment_methods($force_recheck);
227
-        if ($with_prefixes) {
228
-            $classnames = array_keys($this->_payment_method_types);
229
-            $payment_methods = array();
230
-            foreach ($classnames as $classname) {
231
-                $payment_methods[] = $this->payment_method_class_from_type($classname);
232
-            }
233
-            return $payment_methods;
234
-        }
235
-        return array_keys($this->_payment_method_types);
236
-    }
237
-
238
-
239
-    /**
240
-     * Gets an object of each payment method type, none of which are bound to a
241
-     * payment method instance
242
-     *
243
-     * @param boolean $force_recheck whether to force re-checking for new payment method types
244
-     * @return EE_PMT_Base[]
245
-     */
246
-    public function payment_method_types($force_recheck = false)
247
-    {
248
-        if ($force_recheck || empty($this->payment_method_objects)) {
249
-            $this->maybe_register_payment_methods($force_recheck);
250
-            foreach ($this->payment_method_type_names(true) as $classname) {
251
-                if (! isset($this->payment_method_objects[ $classname ])) {
252
-                    $this->payment_method_objects[ $classname ] = new $classname;
253
-                }
254
-            }
255
-        }
256
-        return $this->payment_method_objects;
257
-    }
258
-
259
-
260
-    /**
261
-     * Changes the payment method's class name into the payment method type's name
262
-     * (as used on the payment method's table's PMD_type field)
263
-     *
264
-     * @param string $classname
265
-     * @return string
266
-     */
267
-    public function payment_method_type_sans_class_prefix($classname)
268
-    {
269
-        return str_replace('EE_PMT_', '', $classname);
270
-    }
271
-
272
-
273
-    /**
274
-     * Does the opposite of payment-method_type_sans_prefix
275
-     *
276
-     * @param string $type
277
-     * @return string
278
-     */
279
-    public function payment_method_class_from_type($type)
280
-    {
281
-        return 'EE_PMT_' . $type;
282
-    }
283
-
284
-
285
-    /**
286
-     * Activates a payment method of the given type.
287
-     *
288
-     * @param string $payment_method_type the PMT_type; for EE_PMT_Invoice this would be 'Invoice'
289
-     * @return EE_Payment_Method
290
-     * @throws InvalidDataTypeException
291
-     * @throws EE_Error
292
-     */
293
-    public function activate_a_payment_method_of_type($payment_method_type)
294
-    {
295
-        $this->maybe_register_payment_methods();
296
-        $payment_method = EEM_Payment_Method::instance()->get_one_of_type($payment_method_type);
297
-        if (! $payment_method instanceof EE_Payment_Method) {
298
-            $pm_type_class = $this->payment_method_class_from_type($payment_method_type);
299
-            if (class_exists($pm_type_class)) {
300
-                /** @var $pm_type_obj EE_PMT_Base */
301
-                $pm_type_obj = new $pm_type_class;
302
-                $payment_method = EEM_Payment_Method::instance()->get_one_by_slug($pm_type_obj->system_name());
303
-                if (! $payment_method) {
304
-                    $payment_method = $this->create_payment_method_of_type($pm_type_obj);
305
-                }
306
-                $payment_method->set_type($payment_method_type);
307
-                $this->initialize_payment_method($payment_method);
308
-            } else {
309
-                throw new EE_Error(
310
-                    sprintf(
311
-                        esc_html__(
312
-                            'There is no payment method of type %1$s, so it could not be activated',
313
-                            'event_espresso'
314
-                        ),
315
-                        $pm_type_class
316
-                    )
317
-                );
318
-            }
319
-        }
320
-        $payment_method->set_active();
321
-        $payment_method->save();
322
-        /** @type EE_Message_Resource_Manager $message_resource_manager */
323
-        // if this was the invoice message type, make sure users can view their invoices
324
-        if ($payment_method->type() === 'Invoice'
325
-            && (
326
-            ! EEH_MSG_Template::is_mt_active('invoice')
327
-            )
328
-        ) {
329
-            $message_resource_manager = EE_Registry::instance()->load_lib('Message_Resource_Manager');
330
-            /** @type EE_Message_Resource_Manager $message_resource_manager */
331
-            $message_resource_manager->ensure_message_type_is_active('invoice', 'html');
332
-            new PersistentAdminNotice(
333
-                'invoice_pm_requirements_notice',
334
-                sprintf(
335
-                    esc_html__(
336
-                        'The Invoice payment method has been activated. It requires the %1$sinvoice message%2$s type to be active, so it was automatically activated for you.',
337
-                        'event_espresso'
338
-                    ),
339
-                    '<a href="' . admin_url('admin.php?page=espresso_messages&action=settings') . '">',
340
-                    '</a>'
341
-                ),
342
-                true
343
-            );
344
-        }
345
-        return $payment_method;
346
-    }
347
-
348
-
349
-    /**
350
-     * Creates a payment method of the specified type. Does not save it.
351
-     *
352
-     * @global WP_User    $current_user
353
-     * @param EE_PMT_Base $pm_type_obj
354
-     * @return EE_Payment_Method
355
-     * @throws EE_Error
356
-     */
357
-    public function create_payment_method_of_type($pm_type_obj)
358
-    {
359
-        global $current_user;
360
-        $payment_method = EE_Payment_Method::new_instance(
361
-            array(
362
-                'PMD_type'       => $pm_type_obj->system_name(),
363
-                'PMD_name'       => $pm_type_obj->defaultFrontendName(),
364
-                'PMD_admin_name' => $pm_type_obj->pretty_name(),
365
-                'PMD_slug'       => $pm_type_obj->system_name(),// automatically converted to slug
366
-                'PMD_wp_user'    => $current_user->ID,
367
-                'PMD_order'      => EEM_Payment_Method::instance()->count(
368
-                    array(array('PMD_type' => array('!=', 'Admin_Only')))
369
-                ) * 10,
370
-            )
371
-        );
372
-        return $payment_method;
373
-    }
374
-
375
-
376
-    /**
377
-     * Sets the initial payment method properties (including extra meta)
378
-     *
379
-     * @param EE_Payment_Method $payment_method
380
-     * @return EE_Payment_Method
381
-     * @throws EE_Error
382
-     */
383
-    public function initialize_payment_method($payment_method)
384
-    {
385
-        $pm_type_obj = $payment_method->type_obj();
386
-        $payment_method->set_description($pm_type_obj->default_description());
387
-        if (! $payment_method->button_url()) {
388
-            $payment_method->set_button_url($pm_type_obj->default_button_url());
389
-        }
390
-        // now add setup its default extra meta properties
391
-        $extra_metas = $pm_type_obj->settings_form()->extra_meta_inputs();
392
-        if (! empty($extra_metas)) {
393
-            // verify the payment method has an ID before adding extra meta
394
-            if (! $payment_method->ID()) {
395
-                $payment_method->save();
396
-            }
397
-            foreach ($extra_metas as $meta_name => $input) {
398
-                $payment_method->update_extra_meta($meta_name, $input->raw_value());
399
-            }
400
-        }
401
-        return $payment_method;
402
-    }
403
-
404
-
405
-    /**
406
-     * Makes sure the payment method is related to the specified payment method
407
-     *
408
-     * @deprecated in 4.9.40 because the currency payment method table is being deprecated
409
-     * @param EE_Payment_Method $payment_method
410
-     * @return EE_Payment_Method
411
-     * @throws EE_Error
412
-     */
413
-    public function set_usable_currencies_on_payment_method($payment_method)
414
-    {
415
-        EE_Error::doing_it_wrong(
416
-            'EE_Payment_Method_Manager::set_usable_currencies_on_payment_method',
417
-            esc_html__(
418
-                'We no longer define what currencies are usable by payment methods. Its not used nor efficient.',
419
-                'event_espresso'
420
-            ),
421
-            '4.9.40'
422
-        );
423
-        return $payment_method;
424
-    }
425
-
426
-
427
-    /**
428
-     * Deactivates a payment method of the given payment method slug.
429
-     *
430
-     * @param string $payment_method_slug The slug for the payment method to deactivate.
431
-     * @return int count of rows updated.
432
-     * @throws EE_Error
433
-     */
434
-    public function deactivate_payment_method($payment_method_slug)
435
-    {
436
-        EE_Log::instance()->log(
437
-            __FILE__,
438
-            __FUNCTION__,
439
-            sprintf(
440
-                esc_html__(
441
-                    'Payment method with slug %1$s is being deactivated by site admin',
442
-                    'event_espresso'
443
-                ),
444
-                $payment_method_slug
445
-            ),
446
-            'payment_method_change'
447
-        );
448
-        $count_updated = EEM_Payment_Method::instance()->update(
449
-            array('PMD_scope' => array()),
450
-            array(array('PMD_slug' => $payment_method_slug))
451
-        );
452
-        do_action(
453
-            'AHEE__EE_Payment_Method_Manager__deactivate_payment_method__after_deactivating_payment_method',
454
-            $payment_method_slug,
455
-            $count_updated
456
-        );
457
-        return $count_updated;
458
-    }
459
-
460
-
461
-    /**
462
-     * initializes payment method access caps via EE_Capabilities::init_role_caps()
463
-     * upon EE_Payment_Method_Manager construction
464
-     *
465
-     * @throws EE_Error
466
-     * @throws DomainException
467
-     */
468
-    protected function initializePaymentMethodCaps()
469
-    {
470
-        // don't do this twice
471
-        if ($this->payment_method_caps_initialized) {
472
-            return;
473
-        }
474
-        EE_Capabilities::instance()->addCaps(
475
-            $this->getPaymentMethodCaps()
476
-        );
477
-        $this->payment_method_caps_initialized = true;
478
-    }
479
-
480
-
481
-    /**
482
-     * array  of dynamic payment method access caps.
483
-     * at the time of writing, october 20 2014, these are the caps added:
484
-     *  ee_payment_method_admin_only
485
-     *  ee_payment_method_aim
486
-     *  ee_payment_method_bank
487
-     *  ee_payment_method_check
488
-     *  ee_payment_method_invoice
489
-     *  ee_payment_method_mijireh
490
-     *  ee_payment_method_paypal_pro
491
-     *  ee_payment_method_paypal_standard
492
-     * Any other payment methods added to core or via addons will also get
493
-     * their related capability automatically added too, so long as they are
494
-     * registered properly using EE_Register_Payment_Method::register()
495
-     *
496
-     * @return array
497
-     * @throws DomainException
498
-     */
499
-    protected function getPaymentMethodCaps()
500
-    {
501
-        $caps = array();
502
-        foreach ($this->payment_method_type_names() as $payment_method_name) {
503
-            $caps = $this->addPaymentMethodCap($payment_method_name, $caps);
504
-        }
505
-        return $caps;
506
-    }
507
-
508
-
509
-    /**
510
-     * @param string $payment_method_name
511
-     * @param array  $payment_method_caps
512
-     * @param string $role
513
-     * @return array
514
-     * @throws DomainException
515
-     */
516
-    public function addPaymentMethodCap($payment_method_name, array $payment_method_caps, $role = 'administrator')
517
-    {
518
-        if (empty($payment_method_name)) {
519
-            throw new DomainException(
520
-                esc_html__(
521
-                    'The name of a payment method must be specified to add capabilities.',
522
-                    'event_espresso'
523
-                )
524
-            );
525
-        }
526
-        if (empty($role)) {
527
-            throw new DomainException(
528
-                sprintf(
529
-                    esc_html__(
530
-                        'No role was supplied while trying to add capabilities for the %1$s payment method.',
531
-                        'event_espresso'
532
-                    ),
533
-                    $payment_method_name
534
-                )
535
-            );
536
-        }
537
-        if (! isset($payment_method_caps[ $role ])) {
538
-            $payment_method_caps[ $role ] = array();
539
-        }
540
-        $payment_method_caps[ $role ][] = EE_Payment_Method_Manager::CAPABILITIES_PREFIX
541
-                                          . strtolower($payment_method_name);
542
-        return $payment_method_caps;
543
-    }
544
-
545
-
546
-    /**
547
-     * callback for FHEE__EE_Capabilities__init_role_caps__caps_map filter
548
-     * to add dynamic payment method access caps when capabilities are reset
549
-     * (or if that filter is called and PM caps are not already set)
550
-     *
551
-     * @param array $caps capabilities being filtered
552
-     * @param bool  $reset
553
-     * @return array
554
-     * @throws DomainException
555
-     */
556
-    public function addPaymentMethodCapsDuringReset(array $caps, $reset = false)
557
-    {
558
-        if ($reset || ! $this->payment_method_caps_initialized) {
559
-            $this->payment_method_caps_initialized = true;
560
-            $caps = array_merge_recursive($caps, $this->getPaymentMethodCaps());
561
-        }
562
-        return $caps;
563
-    }
564
-
565
-
566
-    /**
567
-     * @deprecated 4.9.42
568
-     * @param $caps
569
-     * @return mixed
570
-     */
571
-    public function add_payment_method_caps($caps)
572
-    {
573
-        return $caps;
574
-    }
20
+	/**
21
+	 * prefix added to all payment method capabilities names
22
+	 */
23
+	const   CAPABILITIES_PREFIX = 'ee_payment_method_';
24
+
25
+	/**
26
+	 * @var EE_Payment_Method_Manager $_instance
27
+	 */
28
+	private static $_instance;
29
+
30
+	/**
31
+	 * @var boolean
32
+	 */
33
+	protected $payment_method_caps_initialized = false;
34
+
35
+	/**
36
+	 * @var array keys are class names without 'EE_PMT_', values are their filepaths
37
+	 */
38
+	protected $_payment_method_types = array();
39
+
40
+	/**
41
+	 * @var EE_PMT_Base[]
42
+	 */
43
+	protected $payment_method_objects = array();
44
+
45
+
46
+	/**
47
+	 * EE_Payment_Method_Manager constructor.
48
+	 *
49
+	 * @throws EE_Error
50
+	 * @throws DomainException
51
+	 */
52
+	public function __construct()
53
+	{
54
+		// if in admin lets ensure caps are set.
55
+		if (is_admin()) {
56
+			$this->_register_payment_methods();
57
+			// set them immediately
58
+			$this->initializePaymentMethodCaps();
59
+			// plus any time they get reset
60
+			add_filter(
61
+				'FHEE__EE_Capabilities__addCaps__capabilities_to_add',
62
+				array($this, 'addPaymentMethodCapsDuringReset')
63
+			);
64
+		}
65
+	}
66
+
67
+
68
+	/**
69
+	 * @singleton method used to instantiate class object
70
+	 * @return EE_Payment_Method_Manager instance
71
+	 * @throws DomainException
72
+	 * @throws EE_Error
73
+	 */
74
+	public static function instance()
75
+	{
76
+		// check if class object is instantiated, and instantiated properly
77
+		if (! self::$_instance instanceof EE_Payment_Method_Manager) {
78
+			EE_Registry::instance()->load_lib('PMT_Base');
79
+			self::$_instance = new self();
80
+		}
81
+		return self::$_instance;
82
+	}
83
+
84
+
85
+	/**
86
+	 * Resets the instance and returns a new one
87
+	 *
88
+	 * @return EE_Payment_Method_Manager
89
+	 * @throws DomainException
90
+	 * @throws EE_Error
91
+	 */
92
+	public static function reset()
93
+	{
94
+		self::$_instance = null;
95
+		return self::instance();
96
+	}
97
+
98
+
99
+	/**
100
+	 * If necessary, re-register payment methods
101
+	 *
102
+	 * @param boolean $force_recheck whether to recheck for payment method types,
103
+	 *                               or just re-use the PMTs we found last time we checked during this request (if
104
+	 *                               we have not yet checked during this request, then we need to check anyways)
105
+	 */
106
+	public function maybe_register_payment_methods($force_recheck = false)
107
+	{
108
+		if (! $this->_payment_method_types || $force_recheck) {
109
+			$this->_register_payment_methods();
110
+		}
111
+	}
112
+
113
+
114
+	/**
115
+	 * register_payment_methods
116
+	 *
117
+	 * @return array
118
+	 */
119
+	protected function _register_payment_methods()
120
+	{
121
+		// grab list of installed modules
122
+		$pm_to_register = glob(EE_PAYMENT_METHODS . '*', GLOB_ONLYDIR);
123
+		// filter list of modules to register
124
+		$pm_to_register = apply_filters(
125
+			'FHEE__EE_Payment_Method_Manager__register_payment_methods__payment_methods_to_register',
126
+			$pm_to_register
127
+		);
128
+		// remove any duplicates if that should happen for some reason
129
+		$pm_to_register = array_unique($pm_to_register);
130
+		// loop through folders
131
+		foreach ($pm_to_register as $pm_path) {
132
+			$this->register_payment_method($pm_path);
133
+		}
134
+		do_action('FHEE__EE_Payment_Method_Manager__register_payment_methods__registered_payment_methods');
135
+		// filter list of installed modules
136
+		// keep them organized alphabetically by the payment method type's name
137
+		ksort($this->_payment_method_types);
138
+		return apply_filters(
139
+			'FHEE__EE_Payment_Method_Manager__register_payment_methods__installed_payment_methods',
140
+			$this->_payment_method_types
141
+		);
142
+	}
143
+
144
+
145
+	/**
146
+	 * register_payment_method- makes core aware of this payment method
147
+	 *
148
+	 * @param string $payment_method_path - full path up to and including payment method folder
149
+	 * @return boolean
150
+	 */
151
+	public function register_payment_method($payment_method_path = '')
152
+	{
153
+		do_action('AHEE__EE_Payment_Method_Manager__register_payment_method__begin', $payment_method_path);
154
+		$module_ext = '.pm.php';
155
+		// make all separators match
156
+		$payment_method_path = rtrim(str_replace('/\\', DS, $payment_method_path), DS);
157
+		// grab and sanitize module name
158
+		$module_dir = basename($payment_method_path);
159
+		// create class name from module directory name
160
+		$module = str_replace(array('_', ' '), array(' ', '_'), $module_dir);
161
+		// add class prefix
162
+		$module_class = 'EE_PMT_' . $module;
163
+		// does the module exist ?
164
+		if (! is_readable($payment_method_path . DS . $module_class . $module_ext)) {
165
+			$msg = sprintf(
166
+				esc_html__(
167
+					'The requested %s payment method file could not be found or is not readable due to file permissions.',
168
+					'event_espresso'
169
+				),
170
+				$module
171
+			);
172
+			EE_Error::add_error($msg . '||' . $msg, __FILE__, __FUNCTION__, __LINE__);
173
+			return false;
174
+		}
175
+		// load the module class file
176
+		require_once($payment_method_path . DS . $module_class . $module_ext);
177
+		// verify that class exists
178
+		if (! class_exists($module_class)) {
179
+			$msg = sprintf(
180
+				esc_html__('The requested %s module class does not exist.', 'event_espresso'),
181
+				$module_class
182
+			);
183
+			EE_Error::add_error($msg . '||' . $msg, __FILE__, __FUNCTION__, __LINE__);
184
+			return false;
185
+		}
186
+		// add to array of registered modules
187
+		$this->_payment_method_types[ $module ] = $payment_method_path . DS . $module_class . $module_ext;
188
+		ksort($this->_payment_method_types);
189
+		return true;
190
+	}
191
+
192
+
193
+	/**
194
+	 * Checks if a payment method has been registered, and if so includes it
195
+	 *
196
+	 * @param string  $payment_method_name like 'PayPal_Pro', (ie class name without the prefix 'EEPM_')
197
+	 * @param boolean $force_recheck       whether to force re-checking for new payment method types
198
+	 * @return boolean
199
+	 */
200
+	public function payment_method_type_exists($payment_method_name, $force_recheck = false)
201
+	{
202
+		if ($force_recheck
203
+			|| ! is_array($this->_payment_method_types)
204
+			|| ! isset($this->_payment_method_types[ $payment_method_name ])
205
+		) {
206
+			$this->maybe_register_payment_methods($force_recheck);
207
+		}
208
+		if (isset($this->_payment_method_types[ $payment_method_name ])) {
209
+			require_once($this->_payment_method_types[ $payment_method_name ]);
210
+			return true;
211
+		}
212
+		return false;
213
+	}
214
+
215
+
216
+	/**
217
+	 * Returns all the class names of the various payment method types
218
+	 *
219
+	 * @param boolean $with_prefixes TRUE: get payment method type class names; false just their 'names'
220
+	 *                               (what you'd find in wp_esp_payment_method.PMD_type)
221
+	 * @param boolean $force_recheck whether to force re-checking for new payment method types
222
+	 * @return array
223
+	 */
224
+	public function payment_method_type_names($with_prefixes = false, $force_recheck = false)
225
+	{
226
+		$this->maybe_register_payment_methods($force_recheck);
227
+		if ($with_prefixes) {
228
+			$classnames = array_keys($this->_payment_method_types);
229
+			$payment_methods = array();
230
+			foreach ($classnames as $classname) {
231
+				$payment_methods[] = $this->payment_method_class_from_type($classname);
232
+			}
233
+			return $payment_methods;
234
+		}
235
+		return array_keys($this->_payment_method_types);
236
+	}
237
+
238
+
239
+	/**
240
+	 * Gets an object of each payment method type, none of which are bound to a
241
+	 * payment method instance
242
+	 *
243
+	 * @param boolean $force_recheck whether to force re-checking for new payment method types
244
+	 * @return EE_PMT_Base[]
245
+	 */
246
+	public function payment_method_types($force_recheck = false)
247
+	{
248
+		if ($force_recheck || empty($this->payment_method_objects)) {
249
+			$this->maybe_register_payment_methods($force_recheck);
250
+			foreach ($this->payment_method_type_names(true) as $classname) {
251
+				if (! isset($this->payment_method_objects[ $classname ])) {
252
+					$this->payment_method_objects[ $classname ] = new $classname;
253
+				}
254
+			}
255
+		}
256
+		return $this->payment_method_objects;
257
+	}
258
+
259
+
260
+	/**
261
+	 * Changes the payment method's class name into the payment method type's name
262
+	 * (as used on the payment method's table's PMD_type field)
263
+	 *
264
+	 * @param string $classname
265
+	 * @return string
266
+	 */
267
+	public function payment_method_type_sans_class_prefix($classname)
268
+	{
269
+		return str_replace('EE_PMT_', '', $classname);
270
+	}
271
+
272
+
273
+	/**
274
+	 * Does the opposite of payment-method_type_sans_prefix
275
+	 *
276
+	 * @param string $type
277
+	 * @return string
278
+	 */
279
+	public function payment_method_class_from_type($type)
280
+	{
281
+		return 'EE_PMT_' . $type;
282
+	}
283
+
284
+
285
+	/**
286
+	 * Activates a payment method of the given type.
287
+	 *
288
+	 * @param string $payment_method_type the PMT_type; for EE_PMT_Invoice this would be 'Invoice'
289
+	 * @return EE_Payment_Method
290
+	 * @throws InvalidDataTypeException
291
+	 * @throws EE_Error
292
+	 */
293
+	public function activate_a_payment_method_of_type($payment_method_type)
294
+	{
295
+		$this->maybe_register_payment_methods();
296
+		$payment_method = EEM_Payment_Method::instance()->get_one_of_type($payment_method_type);
297
+		if (! $payment_method instanceof EE_Payment_Method) {
298
+			$pm_type_class = $this->payment_method_class_from_type($payment_method_type);
299
+			if (class_exists($pm_type_class)) {
300
+				/** @var $pm_type_obj EE_PMT_Base */
301
+				$pm_type_obj = new $pm_type_class;
302
+				$payment_method = EEM_Payment_Method::instance()->get_one_by_slug($pm_type_obj->system_name());
303
+				if (! $payment_method) {
304
+					$payment_method = $this->create_payment_method_of_type($pm_type_obj);
305
+				}
306
+				$payment_method->set_type($payment_method_type);
307
+				$this->initialize_payment_method($payment_method);
308
+			} else {
309
+				throw new EE_Error(
310
+					sprintf(
311
+						esc_html__(
312
+							'There is no payment method of type %1$s, so it could not be activated',
313
+							'event_espresso'
314
+						),
315
+						$pm_type_class
316
+					)
317
+				);
318
+			}
319
+		}
320
+		$payment_method->set_active();
321
+		$payment_method->save();
322
+		/** @type EE_Message_Resource_Manager $message_resource_manager */
323
+		// if this was the invoice message type, make sure users can view their invoices
324
+		if ($payment_method->type() === 'Invoice'
325
+			&& (
326
+			! EEH_MSG_Template::is_mt_active('invoice')
327
+			)
328
+		) {
329
+			$message_resource_manager = EE_Registry::instance()->load_lib('Message_Resource_Manager');
330
+			/** @type EE_Message_Resource_Manager $message_resource_manager */
331
+			$message_resource_manager->ensure_message_type_is_active('invoice', 'html');
332
+			new PersistentAdminNotice(
333
+				'invoice_pm_requirements_notice',
334
+				sprintf(
335
+					esc_html__(
336
+						'The Invoice payment method has been activated. It requires the %1$sinvoice message%2$s type to be active, so it was automatically activated for you.',
337
+						'event_espresso'
338
+					),
339
+					'<a href="' . admin_url('admin.php?page=espresso_messages&action=settings') . '">',
340
+					'</a>'
341
+				),
342
+				true
343
+			);
344
+		}
345
+		return $payment_method;
346
+	}
347
+
348
+
349
+	/**
350
+	 * Creates a payment method of the specified type. Does not save it.
351
+	 *
352
+	 * @global WP_User    $current_user
353
+	 * @param EE_PMT_Base $pm_type_obj
354
+	 * @return EE_Payment_Method
355
+	 * @throws EE_Error
356
+	 */
357
+	public function create_payment_method_of_type($pm_type_obj)
358
+	{
359
+		global $current_user;
360
+		$payment_method = EE_Payment_Method::new_instance(
361
+			array(
362
+				'PMD_type'       => $pm_type_obj->system_name(),
363
+				'PMD_name'       => $pm_type_obj->defaultFrontendName(),
364
+				'PMD_admin_name' => $pm_type_obj->pretty_name(),
365
+				'PMD_slug'       => $pm_type_obj->system_name(),// automatically converted to slug
366
+				'PMD_wp_user'    => $current_user->ID,
367
+				'PMD_order'      => EEM_Payment_Method::instance()->count(
368
+					array(array('PMD_type' => array('!=', 'Admin_Only')))
369
+				) * 10,
370
+			)
371
+		);
372
+		return $payment_method;
373
+	}
374
+
375
+
376
+	/**
377
+	 * Sets the initial payment method properties (including extra meta)
378
+	 *
379
+	 * @param EE_Payment_Method $payment_method
380
+	 * @return EE_Payment_Method
381
+	 * @throws EE_Error
382
+	 */
383
+	public function initialize_payment_method($payment_method)
384
+	{
385
+		$pm_type_obj = $payment_method->type_obj();
386
+		$payment_method->set_description($pm_type_obj->default_description());
387
+		if (! $payment_method->button_url()) {
388
+			$payment_method->set_button_url($pm_type_obj->default_button_url());
389
+		}
390
+		// now add setup its default extra meta properties
391
+		$extra_metas = $pm_type_obj->settings_form()->extra_meta_inputs();
392
+		if (! empty($extra_metas)) {
393
+			// verify the payment method has an ID before adding extra meta
394
+			if (! $payment_method->ID()) {
395
+				$payment_method->save();
396
+			}
397
+			foreach ($extra_metas as $meta_name => $input) {
398
+				$payment_method->update_extra_meta($meta_name, $input->raw_value());
399
+			}
400
+		}
401
+		return $payment_method;
402
+	}
403
+
404
+
405
+	/**
406
+	 * Makes sure the payment method is related to the specified payment method
407
+	 *
408
+	 * @deprecated in 4.9.40 because the currency payment method table is being deprecated
409
+	 * @param EE_Payment_Method $payment_method
410
+	 * @return EE_Payment_Method
411
+	 * @throws EE_Error
412
+	 */
413
+	public function set_usable_currencies_on_payment_method($payment_method)
414
+	{
415
+		EE_Error::doing_it_wrong(
416
+			'EE_Payment_Method_Manager::set_usable_currencies_on_payment_method',
417
+			esc_html__(
418
+				'We no longer define what currencies are usable by payment methods. Its not used nor efficient.',
419
+				'event_espresso'
420
+			),
421
+			'4.9.40'
422
+		);
423
+		return $payment_method;
424
+	}
425
+
426
+
427
+	/**
428
+	 * Deactivates a payment method of the given payment method slug.
429
+	 *
430
+	 * @param string $payment_method_slug The slug for the payment method to deactivate.
431
+	 * @return int count of rows updated.
432
+	 * @throws EE_Error
433
+	 */
434
+	public function deactivate_payment_method($payment_method_slug)
435
+	{
436
+		EE_Log::instance()->log(
437
+			__FILE__,
438
+			__FUNCTION__,
439
+			sprintf(
440
+				esc_html__(
441
+					'Payment method with slug %1$s is being deactivated by site admin',
442
+					'event_espresso'
443
+				),
444
+				$payment_method_slug
445
+			),
446
+			'payment_method_change'
447
+		);
448
+		$count_updated = EEM_Payment_Method::instance()->update(
449
+			array('PMD_scope' => array()),
450
+			array(array('PMD_slug' => $payment_method_slug))
451
+		);
452
+		do_action(
453
+			'AHEE__EE_Payment_Method_Manager__deactivate_payment_method__after_deactivating_payment_method',
454
+			$payment_method_slug,
455
+			$count_updated
456
+		);
457
+		return $count_updated;
458
+	}
459
+
460
+
461
+	/**
462
+	 * initializes payment method access caps via EE_Capabilities::init_role_caps()
463
+	 * upon EE_Payment_Method_Manager construction
464
+	 *
465
+	 * @throws EE_Error
466
+	 * @throws DomainException
467
+	 */
468
+	protected function initializePaymentMethodCaps()
469
+	{
470
+		// don't do this twice
471
+		if ($this->payment_method_caps_initialized) {
472
+			return;
473
+		}
474
+		EE_Capabilities::instance()->addCaps(
475
+			$this->getPaymentMethodCaps()
476
+		);
477
+		$this->payment_method_caps_initialized = true;
478
+	}
479
+
480
+
481
+	/**
482
+	 * array  of dynamic payment method access caps.
483
+	 * at the time of writing, october 20 2014, these are the caps added:
484
+	 *  ee_payment_method_admin_only
485
+	 *  ee_payment_method_aim
486
+	 *  ee_payment_method_bank
487
+	 *  ee_payment_method_check
488
+	 *  ee_payment_method_invoice
489
+	 *  ee_payment_method_mijireh
490
+	 *  ee_payment_method_paypal_pro
491
+	 *  ee_payment_method_paypal_standard
492
+	 * Any other payment methods added to core or via addons will also get
493
+	 * their related capability automatically added too, so long as they are
494
+	 * registered properly using EE_Register_Payment_Method::register()
495
+	 *
496
+	 * @return array
497
+	 * @throws DomainException
498
+	 */
499
+	protected function getPaymentMethodCaps()
500
+	{
501
+		$caps = array();
502
+		foreach ($this->payment_method_type_names() as $payment_method_name) {
503
+			$caps = $this->addPaymentMethodCap($payment_method_name, $caps);
504
+		}
505
+		return $caps;
506
+	}
507
+
508
+
509
+	/**
510
+	 * @param string $payment_method_name
511
+	 * @param array  $payment_method_caps
512
+	 * @param string $role
513
+	 * @return array
514
+	 * @throws DomainException
515
+	 */
516
+	public function addPaymentMethodCap($payment_method_name, array $payment_method_caps, $role = 'administrator')
517
+	{
518
+		if (empty($payment_method_name)) {
519
+			throw new DomainException(
520
+				esc_html__(
521
+					'The name of a payment method must be specified to add capabilities.',
522
+					'event_espresso'
523
+				)
524
+			);
525
+		}
526
+		if (empty($role)) {
527
+			throw new DomainException(
528
+				sprintf(
529
+					esc_html__(
530
+						'No role was supplied while trying to add capabilities for the %1$s payment method.',
531
+						'event_espresso'
532
+					),
533
+					$payment_method_name
534
+				)
535
+			);
536
+		}
537
+		if (! isset($payment_method_caps[ $role ])) {
538
+			$payment_method_caps[ $role ] = array();
539
+		}
540
+		$payment_method_caps[ $role ][] = EE_Payment_Method_Manager::CAPABILITIES_PREFIX
541
+										  . strtolower($payment_method_name);
542
+		return $payment_method_caps;
543
+	}
544
+
545
+
546
+	/**
547
+	 * callback for FHEE__EE_Capabilities__init_role_caps__caps_map filter
548
+	 * to add dynamic payment method access caps when capabilities are reset
549
+	 * (or if that filter is called and PM caps are not already set)
550
+	 *
551
+	 * @param array $caps capabilities being filtered
552
+	 * @param bool  $reset
553
+	 * @return array
554
+	 * @throws DomainException
555
+	 */
556
+	public function addPaymentMethodCapsDuringReset(array $caps, $reset = false)
557
+	{
558
+		if ($reset || ! $this->payment_method_caps_initialized) {
559
+			$this->payment_method_caps_initialized = true;
560
+			$caps = array_merge_recursive($caps, $this->getPaymentMethodCaps());
561
+		}
562
+		return $caps;
563
+	}
564
+
565
+
566
+	/**
567
+	 * @deprecated 4.9.42
568
+	 * @param $caps
569
+	 * @return mixed
570
+	 */
571
+	public function add_payment_method_caps($caps)
572
+	{
573
+		return $caps;
574
+	}
575 575
 }
Please login to merge, or discard this patch.
Spacing   +26 added lines, -26 removed lines patch added patch discarded remove patch
@@ -74,7 +74,7 @@  discard block
 block discarded – undo
74 74
     public static function instance()
75 75
     {
76 76
         // check if class object is instantiated, and instantiated properly
77
-        if (! self::$_instance instanceof EE_Payment_Method_Manager) {
77
+        if ( ! self::$_instance instanceof EE_Payment_Method_Manager) {
78 78
             EE_Registry::instance()->load_lib('PMT_Base');
79 79
             self::$_instance = new self();
80 80
         }
@@ -105,7 +105,7 @@  discard block
 block discarded – undo
105 105
      */
106 106
     public function maybe_register_payment_methods($force_recheck = false)
107 107
     {
108
-        if (! $this->_payment_method_types || $force_recheck) {
108
+        if ( ! $this->_payment_method_types || $force_recheck) {
109 109
             $this->_register_payment_methods();
110 110
         }
111 111
     }
@@ -119,7 +119,7 @@  discard block
 block discarded – undo
119 119
     protected function _register_payment_methods()
120 120
     {
121 121
         // grab list of installed modules
122
-        $pm_to_register = glob(EE_PAYMENT_METHODS . '*', GLOB_ONLYDIR);
122
+        $pm_to_register = glob(EE_PAYMENT_METHODS.'*', GLOB_ONLYDIR);
123 123
         // filter list of modules to register
124 124
         $pm_to_register = apply_filters(
125 125
             'FHEE__EE_Payment_Method_Manager__register_payment_methods__payment_methods_to_register',
@@ -159,9 +159,9 @@  discard block
 block discarded – undo
159 159
         // create class name from module directory name
160 160
         $module = str_replace(array('_', ' '), array(' ', '_'), $module_dir);
161 161
         // add class prefix
162
-        $module_class = 'EE_PMT_' . $module;
162
+        $module_class = 'EE_PMT_'.$module;
163 163
         // does the module exist ?
164
-        if (! is_readable($payment_method_path . DS . $module_class . $module_ext)) {
164
+        if ( ! is_readable($payment_method_path.DS.$module_class.$module_ext)) {
165 165
             $msg = sprintf(
166 166
                 esc_html__(
167 167
                     'The requested %s payment method file could not be found or is not readable due to file permissions.',
@@ -169,22 +169,22 @@  discard block
 block discarded – undo
169 169
                 ),
170 170
                 $module
171 171
             );
172
-            EE_Error::add_error($msg . '||' . $msg, __FILE__, __FUNCTION__, __LINE__);
172
+            EE_Error::add_error($msg.'||'.$msg, __FILE__, __FUNCTION__, __LINE__);
173 173
             return false;
174 174
         }
175 175
         // load the module class file
176
-        require_once($payment_method_path . DS . $module_class . $module_ext);
176
+        require_once($payment_method_path.DS.$module_class.$module_ext);
177 177
         // verify that class exists
178
-        if (! class_exists($module_class)) {
178
+        if ( ! class_exists($module_class)) {
179 179
             $msg = sprintf(
180 180
                 esc_html__('The requested %s module class does not exist.', 'event_espresso'),
181 181
                 $module_class
182 182
             );
183
-            EE_Error::add_error($msg . '||' . $msg, __FILE__, __FUNCTION__, __LINE__);
183
+            EE_Error::add_error($msg.'||'.$msg, __FILE__, __FUNCTION__, __LINE__);
184 184
             return false;
185 185
         }
186 186
         // add to array of registered modules
187
-        $this->_payment_method_types[ $module ] = $payment_method_path . DS . $module_class . $module_ext;
187
+        $this->_payment_method_types[$module] = $payment_method_path.DS.$module_class.$module_ext;
188 188
         ksort($this->_payment_method_types);
189 189
         return true;
190 190
     }
@@ -201,12 +201,12 @@  discard block
 block discarded – undo
201 201
     {
202 202
         if ($force_recheck
203 203
             || ! is_array($this->_payment_method_types)
204
-            || ! isset($this->_payment_method_types[ $payment_method_name ])
204
+            || ! isset($this->_payment_method_types[$payment_method_name])
205 205
         ) {
206 206
             $this->maybe_register_payment_methods($force_recheck);
207 207
         }
208
-        if (isset($this->_payment_method_types[ $payment_method_name ])) {
209
-            require_once($this->_payment_method_types[ $payment_method_name ]);
208
+        if (isset($this->_payment_method_types[$payment_method_name])) {
209
+            require_once($this->_payment_method_types[$payment_method_name]);
210 210
             return true;
211 211
         }
212 212
         return false;
@@ -248,8 +248,8 @@  discard block
 block discarded – undo
248 248
         if ($force_recheck || empty($this->payment_method_objects)) {
249 249
             $this->maybe_register_payment_methods($force_recheck);
250 250
             foreach ($this->payment_method_type_names(true) as $classname) {
251
-                if (! isset($this->payment_method_objects[ $classname ])) {
252
-                    $this->payment_method_objects[ $classname ] = new $classname;
251
+                if ( ! isset($this->payment_method_objects[$classname])) {
252
+                    $this->payment_method_objects[$classname] = new $classname;
253 253
                 }
254 254
             }
255 255
         }
@@ -278,7 +278,7 @@  discard block
 block discarded – undo
278 278
      */
279 279
     public function payment_method_class_from_type($type)
280 280
     {
281
-        return 'EE_PMT_' . $type;
281
+        return 'EE_PMT_'.$type;
282 282
     }
283 283
 
284 284
 
@@ -294,13 +294,13 @@  discard block
 block discarded – undo
294 294
     {
295 295
         $this->maybe_register_payment_methods();
296 296
         $payment_method = EEM_Payment_Method::instance()->get_one_of_type($payment_method_type);
297
-        if (! $payment_method instanceof EE_Payment_Method) {
297
+        if ( ! $payment_method instanceof EE_Payment_Method) {
298 298
             $pm_type_class = $this->payment_method_class_from_type($payment_method_type);
299 299
             if (class_exists($pm_type_class)) {
300 300
                 /** @var $pm_type_obj EE_PMT_Base */
301 301
                 $pm_type_obj = new $pm_type_class;
302 302
                 $payment_method = EEM_Payment_Method::instance()->get_one_by_slug($pm_type_obj->system_name());
303
-                if (! $payment_method) {
303
+                if ( ! $payment_method) {
304 304
                     $payment_method = $this->create_payment_method_of_type($pm_type_obj);
305 305
                 }
306 306
                 $payment_method->set_type($payment_method_type);
@@ -336,7 +336,7 @@  discard block
 block discarded – undo
336 336
                         'The Invoice payment method has been activated. It requires the %1$sinvoice message%2$s type to be active, so it was automatically activated for you.',
337 337
                         'event_espresso'
338 338
                     ),
339
-                    '<a href="' . admin_url('admin.php?page=espresso_messages&action=settings') . '">',
339
+                    '<a href="'.admin_url('admin.php?page=espresso_messages&action=settings').'">',
340 340
                     '</a>'
341 341
                 ),
342 342
                 true
@@ -362,7 +362,7 @@  discard block
 block discarded – undo
362 362
                 'PMD_type'       => $pm_type_obj->system_name(),
363 363
                 'PMD_name'       => $pm_type_obj->defaultFrontendName(),
364 364
                 'PMD_admin_name' => $pm_type_obj->pretty_name(),
365
-                'PMD_slug'       => $pm_type_obj->system_name(),// automatically converted to slug
365
+                'PMD_slug'       => $pm_type_obj->system_name(), // automatically converted to slug
366 366
                 'PMD_wp_user'    => $current_user->ID,
367 367
                 'PMD_order'      => EEM_Payment_Method::instance()->count(
368 368
                     array(array('PMD_type' => array('!=', 'Admin_Only')))
@@ -384,14 +384,14 @@  discard block
 block discarded – undo
384 384
     {
385 385
         $pm_type_obj = $payment_method->type_obj();
386 386
         $payment_method->set_description($pm_type_obj->default_description());
387
-        if (! $payment_method->button_url()) {
387
+        if ( ! $payment_method->button_url()) {
388 388
             $payment_method->set_button_url($pm_type_obj->default_button_url());
389 389
         }
390 390
         // now add setup its default extra meta properties
391 391
         $extra_metas = $pm_type_obj->settings_form()->extra_meta_inputs();
392
-        if (! empty($extra_metas)) {
392
+        if ( ! empty($extra_metas)) {
393 393
             // verify the payment method has an ID before adding extra meta
394
-            if (! $payment_method->ID()) {
394
+            if ( ! $payment_method->ID()) {
395 395
                 $payment_method->save();
396 396
             }
397 397
             foreach ($extra_metas as $meta_name => $input) {
@@ -534,10 +534,10 @@  discard block
 block discarded – undo
534 534
                 )
535 535
             );
536 536
         }
537
-        if (! isset($payment_method_caps[ $role ])) {
538
-            $payment_method_caps[ $role ] = array();
537
+        if ( ! isset($payment_method_caps[$role])) {
538
+            $payment_method_caps[$role] = array();
539 539
         }
540
-        $payment_method_caps[ $role ][] = EE_Payment_Method_Manager::CAPABILITIES_PREFIX
540
+        $payment_method_caps[$role][] = EE_Payment_Method_Manager::CAPABILITIES_PREFIX
541 541
                                           . strtolower($payment_method_name);
542 542
         return $payment_method_caps;
543 543
     }
Please login to merge, or discard this patch.
espresso.php 1 patch
Indentation   +80 added lines, -80 removed lines patch added patch discarded remove patch
@@ -38,103 +38,103 @@
 block discarded – undo
38 38
  * @since           4.0
39 39
  */
40 40
 if (function_exists('espresso_version')) {
41
-    if (! function_exists('espresso_duplicate_plugin_error')) {
42
-        /**
43
-         *    espresso_duplicate_plugin_error
44
-         *    displays if more than one version of EE is activated at the same time
45
-         */
46
-        function espresso_duplicate_plugin_error()
47
-        {
48
-            ?>
41
+	if (! function_exists('espresso_duplicate_plugin_error')) {
42
+		/**
43
+		 *    espresso_duplicate_plugin_error
44
+		 *    displays if more than one version of EE is activated at the same time
45
+		 */
46
+		function espresso_duplicate_plugin_error()
47
+		{
48
+			?>
49 49
             <div class="error">
50 50
                 <p>
51 51
                     <?php
52
-                    echo esc_html__(
53
-                        'Can not run multiple versions of Event Espresso! One version has been automatically deactivated. Please verify that you have the correct version you want still active.',
54
-                        'event_espresso'
55
-                    ); ?>
52
+					echo esc_html__(
53
+						'Can not run multiple versions of Event Espresso! One version has been automatically deactivated. Please verify that you have the correct version you want still active.',
54
+						'event_espresso'
55
+					); ?>
56 56
                 </p>
57 57
             </div>
58 58
             <?php
59
-            espresso_deactivate_plugin(plugin_basename(__FILE__));
60
-        }
61
-    }
62
-    add_action('admin_notices', 'espresso_duplicate_plugin_error', 1);
59
+			espresso_deactivate_plugin(plugin_basename(__FILE__));
60
+		}
61
+	}
62
+	add_action('admin_notices', 'espresso_duplicate_plugin_error', 1);
63 63
 } else {
64
-    define('EE_MIN_PHP_VER_REQUIRED', '5.4.0');
65
-    if (! version_compare(PHP_VERSION, EE_MIN_PHP_VER_REQUIRED, '>=')) {
66
-        /**
67
-         * espresso_minimum_php_version_error
68
-         *
69
-         * @return void
70
-         */
71
-        function espresso_minimum_php_version_error()
72
-        {
73
-            ?>
64
+	define('EE_MIN_PHP_VER_REQUIRED', '5.4.0');
65
+	if (! version_compare(PHP_VERSION, EE_MIN_PHP_VER_REQUIRED, '>=')) {
66
+		/**
67
+		 * espresso_minimum_php_version_error
68
+		 *
69
+		 * @return void
70
+		 */
71
+		function espresso_minimum_php_version_error()
72
+		{
73
+			?>
74 74
             <div class="error">
75 75
                 <p>
76 76
                     <?php
77
-                    printf(
78
-                        esc_html__(
79
-                            'We\'re sorry, but Event Espresso requires PHP version %1$s or greater in order to operate. You are currently running version %2$s.%3$sIn order to update your version of PHP, you will need to contact your current hosting provider.%3$sFor information on stable PHP versions, please go to %4$s.',
80
-                            'event_espresso'
81
-                        ),
82
-                        EE_MIN_PHP_VER_REQUIRED,
83
-                        PHP_VERSION,
84
-                        '<br/>',
85
-                        '<a href="http://php.net/downloads.php">http://php.net/downloads.php</a>'
86
-                    );
87
-                    ?>
77
+					printf(
78
+						esc_html__(
79
+							'We\'re sorry, but Event Espresso requires PHP version %1$s or greater in order to operate. You are currently running version %2$s.%3$sIn order to update your version of PHP, you will need to contact your current hosting provider.%3$sFor information on stable PHP versions, please go to %4$s.',
80
+							'event_espresso'
81
+						),
82
+						EE_MIN_PHP_VER_REQUIRED,
83
+						PHP_VERSION,
84
+						'<br/>',
85
+						'<a href="http://php.net/downloads.php">http://php.net/downloads.php</a>'
86
+					);
87
+					?>
88 88
                 </p>
89 89
             </div>
90 90
             <?php
91
-            espresso_deactivate_plugin(plugin_basename(__FILE__));
92
-        }
91
+			espresso_deactivate_plugin(plugin_basename(__FILE__));
92
+		}
93 93
 
94
-        add_action('admin_notices', 'espresso_minimum_php_version_error', 1);
95
-    } else {
96
-        define('EVENT_ESPRESSO_MAIN_FILE', __FILE__);
97
-        /**
98
-         * espresso_version
99
-         * Returns the plugin version
100
-         *
101
-         * @return string
102
-         */
103
-        function espresso_version()
104
-        {
105
-            return apply_filters('FHEE__espresso__espresso_version', '4.9.65.rc.009');
106
-        }
94
+		add_action('admin_notices', 'espresso_minimum_php_version_error', 1);
95
+	} else {
96
+		define('EVENT_ESPRESSO_MAIN_FILE', __FILE__);
97
+		/**
98
+		 * espresso_version
99
+		 * Returns the plugin version
100
+		 *
101
+		 * @return string
102
+		 */
103
+		function espresso_version()
104
+		{
105
+			return apply_filters('FHEE__espresso__espresso_version', '4.9.65.rc.009');
106
+		}
107 107
 
108
-        /**
109
-         * espresso_plugin_activation
110
-         * adds a wp-option to indicate that EE has been activated via the WP admin plugins page
111
-         */
112
-        function espresso_plugin_activation()
113
-        {
114
-            update_option('ee_espresso_activation', true);
115
-        }
108
+		/**
109
+		 * espresso_plugin_activation
110
+		 * adds a wp-option to indicate that EE has been activated via the WP admin plugins page
111
+		 */
112
+		function espresso_plugin_activation()
113
+		{
114
+			update_option('ee_espresso_activation', true);
115
+		}
116 116
 
117
-        register_activation_hook(EVENT_ESPRESSO_MAIN_FILE, 'espresso_plugin_activation');
117
+		register_activation_hook(EVENT_ESPRESSO_MAIN_FILE, 'espresso_plugin_activation');
118 118
 
119
-        require_once __DIR__ . '/core/bootstrap_espresso.php';
120
-        bootstrap_espresso();
121
-    }
119
+		require_once __DIR__ . '/core/bootstrap_espresso.php';
120
+		bootstrap_espresso();
121
+	}
122 122
 }
123 123
 if (! function_exists('espresso_deactivate_plugin')) {
124
-    /**
125
-     *    deactivate_plugin
126
-     * usage:  espresso_deactivate_plugin( plugin_basename( __FILE__ ));
127
-     *
128
-     * @access public
129
-     * @param string $plugin_basename - the results of plugin_basename( __FILE__ ) for the plugin's main file
130
-     * @return    void
131
-     */
132
-    function espresso_deactivate_plugin($plugin_basename = '')
133
-    {
134
-        if (! function_exists('deactivate_plugins')) {
135
-            require_once ABSPATH . 'wp-admin/includes/plugin.php';
136
-        }
137
-        unset($_GET['activate'], $_REQUEST['activate']);
138
-        deactivate_plugins($plugin_basename);
139
-    }
124
+	/**
125
+	 *    deactivate_plugin
126
+	 * usage:  espresso_deactivate_plugin( plugin_basename( __FILE__ ));
127
+	 *
128
+	 * @access public
129
+	 * @param string $plugin_basename - the results of plugin_basename( __FILE__ ) for the plugin's main file
130
+	 * @return    void
131
+	 */
132
+	function espresso_deactivate_plugin($plugin_basename = '')
133
+	{
134
+		if (! function_exists('deactivate_plugins')) {
135
+			require_once ABSPATH . 'wp-admin/includes/plugin.php';
136
+		}
137
+		unset($_GET['activate'], $_REQUEST['activate']);
138
+		deactivate_plugins($plugin_basename);
139
+	}
140 140
 }
Please login to merge, or discard this patch.