Completed
Branch Gutenberg/test-block (c5ef4c)
by
unknown
62:00 queued 47:06
created
core/domain/services/capabilities/CapCheck.php 3 patches
Doc Comments   +1 added lines, -1 removed lines patch added patch discarded remove patch
@@ -38,7 +38,7 @@
 block discarded – undo
38 38
 
39 39
 
40 40
     /**
41
-     * @param string|array $capability   - the capability to be checked, like: 'ee_edit_registrations',
41
+     * @param string $capability   - the capability to be checked, like: 'ee_edit_registrations',
42 42
      *                                   or an array of capability strings
43 43
      * @param string       $context      - what the user is attempting to do, like: 'Edit Registration'
44 44
      * @param int          $ID           - (optional) ID for item where current_user_can is being called from
Please login to merge, or discard this patch.
Indentation   +52 added lines, -52 removed lines patch added patch discarded remove patch
@@ -15,66 +15,66 @@
 block discarded – undo
15 15
 class CapCheck implements CapCheckInterface
16 16
 {
17 17
 
18
-    /**
19
-     * @var string|array $capability
20
-     */
21
-    private $capability;
18
+	/**
19
+	 * @var string|array $capability
20
+	 */
21
+	private $capability;
22 22
 
23
-    /**
24
-     * @var string $context
25
-     */
26
-    private $context;
23
+	/**
24
+	 * @var string $context
25
+	 */
26
+	private $context;
27 27
 
28
-    /**
29
-     * @var int|string $ID
30
-     */
31
-    private $ID;
28
+	/**
29
+	 * @var int|string $ID
30
+	 */
31
+	private $ID;
32 32
 
33 33
 
34
-    /**
35
-     * @param string|array $capability   - the capability to be checked, like: 'ee_edit_registrations',
36
-     *                                   or an array of capability strings
37
-     * @param string       $context      - what the user is attempting to do, like: 'Edit Registration'
38
-     * @param int          $ID           - (optional) ID for item where current_user_can is being called from
39
-     * @throws InvalidDataTypeException
40
-     */
41
-    public function __construct($capability, $context, $ID = 0)
42
-    {
43
-        if (! (is_string($capability) || is_array($capability))) {
44
-            throw new InvalidDataTypeException('$capability', $capability, 'string or array');
45
-        }
46
-        if (! is_string($context)) {
47
-            throw new InvalidDataTypeException('$context', $context, 'string');
48
-        }
49
-        $this->capability = $capability;
50
-        $this->context = strtolower(str_replace(' ', '_', $context));
51
-        $this->ID = $ID;
52
-    }
34
+	/**
35
+	 * @param string|array $capability   - the capability to be checked, like: 'ee_edit_registrations',
36
+	 *                                   or an array of capability strings
37
+	 * @param string       $context      - what the user is attempting to do, like: 'Edit Registration'
38
+	 * @param int          $ID           - (optional) ID for item where current_user_can is being called from
39
+	 * @throws InvalidDataTypeException
40
+	 */
41
+	public function __construct($capability, $context, $ID = 0)
42
+	{
43
+		if (! (is_string($capability) || is_array($capability))) {
44
+			throw new InvalidDataTypeException('$capability', $capability, 'string or array');
45
+		}
46
+		if (! is_string($context)) {
47
+			throw new InvalidDataTypeException('$context', $context, 'string');
48
+		}
49
+		$this->capability = $capability;
50
+		$this->context = strtolower(str_replace(' ', '_', $context));
51
+		$this->ID = $ID;
52
+	}
53 53
 
54 54
 
55
-    /**
56
-     * @return string|array
57
-     */
58
-    public function capability()
59
-    {
60
-        return $this->capability;
61
-    }
55
+	/**
56
+	 * @return string|array
57
+	 */
58
+	public function capability()
59
+	{
60
+		return $this->capability;
61
+	}
62 62
 
63 63
 
64
-    /**
65
-     * @return string
66
-     */
67
-    public function context()
68
-    {
69
-        return $this->context;
70
-    }
64
+	/**
65
+	 * @return string
66
+	 */
67
+	public function context()
68
+	{
69
+		return $this->context;
70
+	}
71 71
 
72 72
 
73
-    /**
74
-     * @return int|string
75
-     */
76
-    public function ID()
77
-    {
78
-        return $this->ID;
79
-    }
73
+	/**
74
+	 * @return int|string
75
+	 */
76
+	public function ID()
77
+	{
78
+		return $this->ID;
79
+	}
80 80
 }
Please login to merge, or discard this patch.
Spacing   +2 added lines, -2 removed lines patch added patch discarded remove patch
@@ -40,10 +40,10 @@
 block discarded – undo
40 40
      */
41 41
     public function __construct($capability, $context, $ID = 0)
42 42
     {
43
-        if (! (is_string($capability) || is_array($capability))) {
43
+        if ( ! (is_string($capability) || is_array($capability))) {
44 44
             throw new InvalidDataTypeException('$capability', $capability, 'string or array');
45 45
         }
46
-        if (! is_string($context)) {
46
+        if ( ! is_string($context)) {
47 47
             throw new InvalidDataTypeException('$context', $context, 'string');
48 48
         }
49 49
         $this->capability = $capability;
Please login to merge, or discard this patch.
core/db_models/fields/EE_Primary_Key_String_Field.php 2 patches
Doc Comments   +3 added lines patch added patch discarded remove patch
@@ -4,6 +4,9 @@
 block discarded – undo
4 4
 class EE_Primary_Key_String_Field extends EE_Primary_Key_Field_Base
5 5
 {
6 6
 
7
+    /**
8
+     * @param string $table_column
9
+     */
7 10
     public function __construct($table_column, $nicename)
8 11
     {
9 12
         parent::__construct($table_column, $nicename, null);
Please login to merge, or discard this patch.
Indentation   +17 added lines, -17 removed lines patch added patch discarded remove patch
@@ -3,22 +3,22 @@
 block discarded – undo
3 3
 class EE_Primary_Key_String_Field extends EE_Primary_Key_Field_Base
4 4
 {
5 5
 
6
-    public function __construct($table_column, $nicename)
7
-    {
8
-        parent::__construct($table_column, $nicename, null);
9
-    }
6
+	public function __construct($table_column, $nicename)
7
+	{
8
+		parent::__construct($table_column, $nicename, null);
9
+	}
10 10
 
11
-    /**
12
-     * removes all tags when setting
13
-     *
14
-     * @param string $value_inputted_for_field_on_model_object
15
-     * @return string
16
-     */
17
-    public function prepare_for_set($value_inputted_for_field_on_model_object)
18
-    {
19
-        if ($this->is_model_obj_of_type_pointed_to($value_inputted_for_field_on_model_object)) {
20
-            $value_inputted_for_field_on_model_object = $value_inputted_for_field_on_model_object->ID();
21
-        }
22
-        return wp_strip_all_tags($value_inputted_for_field_on_model_object);
23
-    }
11
+	/**
12
+	 * removes all tags when setting
13
+	 *
14
+	 * @param string $value_inputted_for_field_on_model_object
15
+	 * @return string
16
+	 */
17
+	public function prepare_for_set($value_inputted_for_field_on_model_object)
18
+	{
19
+		if ($this->is_model_obj_of_type_pointed_to($value_inputted_for_field_on_model_object)) {
20
+			$value_inputted_for_field_on_model_object = $value_inputted_for_field_on_model_object->ID();
21
+		}
22
+		return wp_strip_all_tags($value_inputted_for_field_on_model_object);
23
+	}
24 24
 }
Please login to merge, or discard this patch.
public/Espresso_Arabica_2014/single-espresso_events.php 1 patch
Spacing   +4 added lines, -4 removed lines patch added patch discarded remove patch
@@ -19,11 +19,11 @@  discard block
 block discarded – undo
19 19
 				<div id="espresso-event-details-dv" class="" >
20 20
 			<?php
21 21
 				// Start the Loop.
22
-				while ( have_posts() ) : the_post();
22
+				while (have_posts()) : the_post();
23 23
 					//  Include the post TYPE-specific template for the content.
24
-					espresso_get_template_part( 'content', 'espresso_events' );
24
+					espresso_get_template_part('content', 'espresso_events');
25 25
 					// If comments are open or we have at least one comment, load up the comment template.
26
-					if ( comments_open() || get_comments_number() ) {
26
+					if (comments_open() || get_comments_number()) {
27 27
 						comments_template();
28 28
 					}
29 29
 				endwhile;
@@ -35,6 +35,6 @@  discard block
 block discarded – undo
35 35
 	</div><!-- #primary -->
36 36
 
37 37
 <?php
38
-get_sidebar( 'content' );
38
+get_sidebar('content');
39 39
 get_sidebar();
40 40
 get_footer();
41 41
\ No newline at end of file
Please login to merge, or discard this patch.
registration_form/help_tabs/registration_form_edit_question.help_tab.php 1 patch
Spacing   +2 added lines, -2 removed lines patch added patch discarded remove patch
@@ -30,8 +30,8 @@
 block discarded – undo
30 30
 <?php _e('This shows the type of question. Available options are Text, Textarea, Checkboxes, Radio Buttons, Dropdown, State/Province Dropdown, Country Dropdown, Date Picker, and HTML Textarea (allowed tags: a, abbr, acronym, b, br, blockquote ,cite, code, del ,em, i, li, ol, p, q, s, strike, strong, ul).', 'event_espresso'); ?>
31 31
 </li>
32 32
 <li>
33
-<strong><?php _e('Answer Options (for applicable question types)', 'event_espresso');?></strong>
34
-<strong><?php _e('Values do not allow any HTML, however, descriptions do allow HTML.', 'event_espresso');?></strong>
33
+<strong><?php _e('Answer Options (for applicable question types)', 'event_espresso'); ?></strong>
34
+<strong><?php _e('Values do not allow any HTML, however, descriptions do allow HTML.', 'event_espresso'); ?></strong>
35 35
 </li>
36 36
 <li>
37 37
 <strong><?php _e('Required Question', 'event_espresso'); ?></strong><br />
Please login to merge, or discard this patch.
admin_pages/payments/Payments_Admin_Page.core.php 3 patches
Doc Comments   +4 added lines, -4 removed lines patch added patch discarded remove patch
@@ -470,7 +470,7 @@  discard block
 block discarded – undo
470 470
      *
471 471
      * @access protected
472 472
      * @param \EE_Payment_Method $payment_method
473
-     * @return \EE_Form_Section_Proper
473
+     * @return EE_Form_Section_HTML
474 474
      */
475 475
     protected function _pci_dss_compliance(EE_Payment_Method $payment_method)
476 476
     {
@@ -506,7 +506,7 @@  discard block
 block discarded – undo
506 506
      *
507 507
      * @access protected
508 508
      * @param \EE_Payment_Method $payment_method
509
-     * @return \EE_Form_Section_Proper
509
+     * @return EE_Form_Section_HTML
510 510
      */
511 511
     protected function _currency_support(EE_Payment_Method $payment_method)
512 512
     {
@@ -541,7 +541,7 @@  discard block
 block discarded – undo
541 541
      *
542 542
      * @access protected
543 543
      * @param \EE_Payment_Method $payment_method
544
-     * @return \EE_Form_Section_HTML
544
+     * @return EE_Payment_Method_Form
545 545
      */
546 546
     protected function _payment_method_settings(EE_Payment_Method $payment_method)
547 547
     {
@@ -615,7 +615,7 @@  discard block
 block discarded – undo
615 615
      *
616 616
      * @access protected
617 617
      * @param \EE_Payment_Method $payment_method
618
-     * @return \EE_Form_Section_Proper
618
+     * @return EE_Form_Section_HTML
619 619
      */
620 620
     protected function _deactivate_payment_method_button(EE_Payment_Method $payment_method)
621 621
     {
Please login to merge, or discard this patch.
Indentation   +1121 added lines, -1121 removed lines patch added patch discarded remove patch
@@ -14,1125 +14,1125 @@
 block discarded – undo
14 14
 class Payments_Admin_Page extends EE_Admin_Page
15 15
 {
16 16
 
17
-    /**
18
-     * Variables used for when we're re-sorting the logs results, in case
19
-     * we needed to do two queries and we need to resort
20
-     *
21
-     * @var string
22
-     */
23
-    private $_sort_logs_again_direction;
24
-
25
-
26
-    /**
27
-     * @Constructor
28
-     * @access public
29
-     * @param bool $routing indicate whether we want to just load the object and handle routing or just load the object.
30
-     * @return \Payments_Admin_Page
31
-     */
32
-    public function __construct($routing = true)
33
-    {
34
-        parent::__construct($routing);
35
-    }
36
-
37
-
38
-    protected function _init_page_props()
39
-    {
40
-        $this->page_slug = EE_PAYMENTS_PG_SLUG;
41
-        $this->page_label = __('Payment Methods', 'event_espresso');
42
-        $this->_admin_base_url = EE_PAYMENTS_ADMIN_URL;
43
-        $this->_admin_base_path = EE_PAYMENTS_ADMIN;
44
-    }
45
-
46
-
47
-    protected function _ajax_hooks()
48
-    {
49
-        // todo: all hooks for ajax goes here.
50
-    }
51
-
52
-
53
-    protected function _define_page_props()
54
-    {
55
-        $this->_admin_page_title = $this->page_label;
56
-        $this->_labels = array(
57
-            'publishbox' => __('Update Settings', 'event_espresso'),
58
-        );
59
-    }
60
-
61
-
62
-    protected function _set_page_routes()
63
-    {
64
-        /**
65
-         * note that with payment method capabilities, although we've implemented
66
-         * capability mapping which will be used for accessing payment methods owned by
67
-         * other users.  This is not fully implemented yet in the payment method ui.
68
-         * Currently only the "plural" caps are in active use.
69
-         * When cap mapping is implemented, some routes will need to use the singular form of
70
-         * capability method and also include the $id of the payment method for the route.
71
-         **/
72
-        $this->_page_routes = array(
73
-            'default'                   => array(
74
-                'func'       => '_payment_methods_list',
75
-                'capability' => 'ee_edit_payment_methods',
76
-            ),
77
-            'payment_settings'          => array(
78
-                'func'       => '_payment_settings',
79
-                'capability' => 'ee_manage_gateways',
80
-            ),
81
-            'activate_payment_method'   => array(
82
-                'func'       => '_activate_payment_method',
83
-                'noheader'   => true,
84
-                'capability' => 'ee_edit_payment_methods',
85
-            ),
86
-            'deactivate_payment_method' => array(
87
-                'func'       => '_deactivate_payment_method',
88
-                'noheader'   => true,
89
-                'capability' => 'ee_delete_payment_methods',
90
-            ),
91
-            'update_payment_method'     => array(
92
-                'func'               => '_update_payment_method',
93
-                'noheader'           => true,
94
-                'headers_sent_route' => 'default',
95
-                'capability'         => 'ee_edit_payment_methods',
96
-            ),
97
-            'update_payment_settings'   => array(
98
-                'func'       => '_update_payment_settings',
99
-                'noheader'   => true,
100
-                'capability' => 'ee_manage_gateways',
101
-            ),
102
-            'payment_log'               => array(
103
-                'func'       => '_payment_log_overview_list_table',
104
-                'capability' => 'ee_read_payment_methods',
105
-            ),
106
-            'payment_log_details'       => array(
107
-                'func'       => '_payment_log_details',
108
-                'capability' => 'ee_read_payment_methods',
109
-            ),
110
-        );
111
-    }
112
-
113
-
114
-    protected function _set_page_config()
115
-    {
116
-        $payment_method_list_config = array(
117
-            'nav'           => array(
118
-                'label' => __('Payment Methods', 'event_espresso'),
119
-                'order' => 10,
120
-            ),
121
-            'metaboxes'     => $this->_default_espresso_metaboxes,
122
-            'help_tabs'     => array_merge(
123
-                array(
124
-                    'payment_methods_overview_help_tab' => array(
125
-                        'title'    => __('Payment Methods Overview', 'event_espresso'),
126
-                        'filename' => 'payment_methods_overview',
127
-                    ),
128
-                ),
129
-                $this->_add_payment_method_help_tabs()
130
-            ),
131
-            'help_tour'     => array('Payment_Methods_Selection_Help_Tour'),
132
-            'require_nonce' => false,
133
-        );
134
-        $this->_page_config = array(
135
-            'default'          => $payment_method_list_config,
136
-            'payment_settings' => array(
137
-                'nav'           => array(
138
-                    'label' => __('Settings', 'event_espresso'),
139
-                    'order' => 20,
140
-                ),
141
-                'help_tabs'     => array(
142
-                    'payment_methods_settings_help_tab' => array(
143
-                        'title'    => __('Payment Method Settings', 'event_espresso'),
144
-                        'filename' => 'payment_methods_settings',
145
-                    ),
146
-                ),
147
-                // 'help_tour' => array( 'Payment_Methods_Settings_Help_Tour' ),
148
-                'metaboxes'     => array_merge($this->_default_espresso_metaboxes, array('_publish_post_box')),
149
-                'require_nonce' => false,
150
-            ),
151
-            'payment_log'      => array(
152
-                'nav'           => array(
153
-                    'label' => __("Logs", 'event_espresso'),
154
-                    'order' => 30,
155
-                ),
156
-                'list_table'    => 'Payment_Log_Admin_List_Table',
157
-                'metaboxes'     => $this->_default_espresso_metaboxes,
158
-                'require_nonce' => false,
159
-            ),
160
-        );
161
-    }
162
-
163
-
164
-    /**
165
-     * @return array
166
-     */
167
-    protected function _add_payment_method_help_tabs()
168
-    {
169
-        EE_Registry::instance()->load_lib('Payment_Method_Manager');
170
-        $payment_method_types = EE_Payment_Method_Manager::instance()->payment_method_types();
171
-        $all_pmt_help_tabs_config = array();
172
-        foreach ($payment_method_types as $payment_method_type) {
173
-            if (! EE_Registry::instance()->CAP->current_user_can(
174
-                $payment_method_type->cap_name(),
175
-                'specific_payment_method_type_access'
176
-            )
177
-            ) {
178
-                continue;
179
-            }
180
-            foreach ($payment_method_type->help_tabs_config() as $help_tab_name => $config) {
181
-                $template_args = isset($config['template_args']) ? $config['template_args'] : array();
182
-                $template_args['admin_page_obj'] = $this;
183
-                $all_pmt_help_tabs_config[ $help_tab_name ] = array(
184
-                    'title'   => $config['title'],
185
-                    'content' => EEH_Template::display_template(
186
-                        $payment_method_type->file_folder() . 'help_tabs' . DS . $config['filename'] . '.help_tab.php',
187
-                        $template_args,
188
-                        true
189
-                    ),
190
-                );
191
-            }
192
-        }
193
-        return $all_pmt_help_tabs_config;
194
-    }
195
-
196
-
197
-    // none of the below group are currently used for Gateway Settings
198
-    protected function _add_screen_options()
199
-    {
200
-    }
201
-
202
-
203
-    protected function _add_feature_pointers()
204
-    {
205
-    }
206
-
207
-
208
-    public function admin_init()
209
-    {
210
-    }
211
-
212
-
213
-    public function admin_notices()
214
-    {
215
-    }
216
-
217
-
218
-    public function admin_footer_scripts()
219
-    {
220
-    }
221
-
222
-
223
-    public function load_scripts_styles()
224
-    {
225
-        wp_enqueue_script('ee_admin_js');
226
-        wp_enqueue_script('ee-text-links');
227
-        wp_enqueue_script(
228
-            'espresso_payments',
229
-            EE_PAYMENTS_ASSETS_URL . 'espresso_payments_admin.js',
230
-            array('espresso-ui-theme', 'ee-datepicker'),
231
-            EVENT_ESPRESSO_VERSION,
232
-            true
233
-        );
234
-    }
235
-
236
-
237
-    public function load_scripts_styles_default()
238
-    {
239
-        // styles
240
-        wp_register_style(
241
-            'espresso_payments',
242
-            EE_PAYMENTS_ASSETS_URL . 'ee-payments.css',
243
-            array(),
244
-            EVENT_ESPRESSO_VERSION
245
-        );
246
-        wp_enqueue_style('espresso_payments');
247
-        wp_enqueue_style('ee-text-links');
248
-        // scripts
249
-    }
250
-
251
-
252
-    protected function _payment_methods_list()
253
-    {
254
-        /**
255
-         * first let's ensure payment methods have been setup. We do this here because when people activate a
256
-         * payment method for the first time (as an addon), it may not setup its capabilities or get registered correctly due
257
-         * to the loading process.  However, people MUST setup the details for the payment method so its safe to do a
258
-         * recheck here.
259
-         */
260
-        EE_Registry::instance()->load_lib('Payment_Method_Manager');
261
-        EEM_Payment_Method::instance()->verify_button_urls();
262
-        // setup tabs, one for each payment method type
263
-        $tabs = array();
264
-        $payment_methods = array();
265
-        foreach (EE_Payment_Method_Manager::instance()->payment_method_types() as $pmt_obj) {
266
-            // we don't want to show admin-only PMTs for now
267
-            if ($pmt_obj instanceof EE_PMT_Admin_Only) {
268
-                continue;
269
-            }
270
-            // check access
271
-            if (! EE_Registry::instance()->CAP->current_user_can(
272
-                $pmt_obj->cap_name(),
273
-                'specific_payment_method_type_access'
274
-            )
275
-            ) {
276
-                continue;
277
-            }
278
-            // check for any active pms of that type
279
-            $payment_method = EEM_Payment_Method::instance()->get_one_of_type($pmt_obj->system_name());
280
-            if (! $payment_method instanceof EE_Payment_Method) {
281
-                $payment_method = EE_Payment_Method::new_instance(
282
-                    array(
283
-                        'PMD_slug'       => sanitize_key($pmt_obj->system_name()),
284
-                        'PMD_type'       => $pmt_obj->system_name(),
285
-                        'PMD_name'       => $pmt_obj->pretty_name(),
286
-                        'PMD_admin_name' => $pmt_obj->pretty_name(),
287
-                    )
288
-                );
289
-            }
290
-            $payment_methods[ $payment_method->slug() ] = $payment_method;
291
-        }
292
-        $payment_methods = apply_filters(
293
-            'FHEE__Payments_Admin_Page___payment_methods_list__payment_methods',
294
-            $payment_methods
295
-        );
296
-        foreach ($payment_methods as $payment_method) {
297
-            if ($payment_method instanceof EE_Payment_Method) {
298
-                add_meta_box(
299
-                    // html id
300
-                    'espresso_' . $payment_method->slug() . '_payment_settings',
301
-                    // title
302
-                    sprintf(__('%s Settings', 'event_espresso'), $payment_method->admin_name()),
303
-                    // callback
304
-                    array($this, 'payment_method_settings_meta_box'),
305
-                    // post type
306
-                    null,
307
-                    // context
308
-                    'normal',
309
-                    // priority
310
-                    'default',
311
-                    // callback args
312
-                    array('payment_method' => $payment_method)
313
-                );
314
-                // setup for tabbed content
315
-                $tabs[ $payment_method->slug() ] = array(
316
-                    'label' => $payment_method->admin_name(),
317
-                    'class' => $payment_method->active() ? 'gateway-active' : '',
318
-                    'href'  => 'espresso_' . $payment_method->slug() . '_payment_settings',
319
-                    'title' => __('Modify this Payment Method', 'event_espresso'),
320
-                    'slug'  => $payment_method->slug(),
321
-                );
322
-            }
323
-        }
324
-        $this->_template_args['admin_page_header'] = EEH_Tabbed_Content::tab_text_links(
325
-            $tabs,
326
-            'payment_method_links',
327
-            '|',
328
-            $this->_get_active_payment_method_slug()
329
-        );
330
-        $this->display_admin_page_with_sidebar();
331
-    }
332
-
333
-
334
-    /**
335
-     *   _get_active_payment_method_slug
336
-     *
337
-     * @return string
338
-     */
339
-    protected function _get_active_payment_method_slug()
340
-    {
341
-        $payment_method_slug = false;
342
-        // decide which payment method tab to open first, as dictated by the request's 'payment_method'
343
-        if (isset($this->_req_data['payment_method'])) {
344
-            // if they provided the current payment method, use it
345
-            $payment_method_slug = sanitize_key($this->_req_data['payment_method']);
346
-        }
347
-        $payment_method = EEM_Payment_Method::instance()->get_one(array(array('PMD_slug' => $payment_method_slug)));
348
-        // if that didn't work or wasn't provided, find another way to select the current pm
349
-        if (! $this->_verify_payment_method($payment_method)) {
350
-            // like, looking for an active one
351
-            $payment_method = EEM_Payment_Method::instance()->get_one_active('CART');
352
-            // test that one as well
353
-            if ($this->_verify_payment_method($payment_method)) {
354
-                $payment_method_slug = $payment_method->slug();
355
-            } else {
356
-                $payment_method_slug = 'paypal_standard';
357
-            }
358
-        }
359
-        return $payment_method_slug;
360
-    }
361
-
362
-
363
-    /**
364
-     *    payment_method_settings_meta_box
365
-     *    returns TRUE if the passed payment method is properly constructed and the logged in user has the correct
366
-     *    capabilities to access it
367
-     *
368
-     * @param \EE_Payment_Method $payment_method
369
-     * @return boolean
370
-     */
371
-    protected function _verify_payment_method($payment_method)
372
-    {
373
-        if ($payment_method instanceof EE_Payment_Method && $payment_method->type_obj() instanceof EE_PMT_Base
374
-            && EE_Registry::instance()->CAP->current_user_can(
375
-                $payment_method->type_obj()->cap_name(),
376
-                'specific_payment_method_type_access'
377
-            )
378
-        ) {
379
-            return true;
380
-        }
381
-        return false;
382
-    }
383
-
384
-
385
-    /**
386
-     *    payment_method_settings_meta_box
387
-     *
388
-     * @param NULL  $post_obj_which_is_null is an object containing the current post (as a $post object)
389
-     * @param array $metabox                is an array with metabox id, title, callback, and args elements. the value
390
-     *                                      at 'args' has key 'payment_method', as set within _payment_methods_list
391
-     * @return string
392
-     * @throws EE_Error
393
-     */
394
-    public function payment_method_settings_meta_box($post_obj_which_is_null, $metabox)
395
-    {
396
-        $payment_method = isset($metabox['args'], $metabox['args']['payment_method'])
397
-            ? $metabox['args']['payment_method'] : null;
398
-        if (! $payment_method instanceof EE_Payment_Method) {
399
-            throw new EE_Error(
400
-                sprintf(
401
-                    __(
402
-                        'Payment method metabox setup incorrectly. No Payment method object was supplied',
403
-                        'event_espresso'
404
-                    )
405
-                )
406
-            );
407
-        }
408
-        $payment_method_scopes = $payment_method->active();
409
-        // if the payment method really exists show its form, otherwise the activation template
410
-        if ($payment_method->ID() && ! empty($payment_method_scopes)) {
411
-            $form = $this->_generate_payment_method_settings_form($payment_method);
412
-            if ($form->form_data_present_in($this->_req_data)) {
413
-                $form->receive_form_submission($this->_req_data);
414
-            }
415
-            echo $form->form_open() . $form->get_html_and_js() . $form->form_close();
416
-        } else {
417
-            echo $this->_activate_payment_method_button($payment_method)->get_html_and_js();
418
-        }
419
-    }
420
-
421
-
422
-    /**
423
-     * Gets the form for all the settings related to this payment method type
424
-     *
425
-     * @access protected
426
-     * @param \EE_Payment_Method $payment_method
427
-     * @return \EE_Form_Section_Proper
428
-     */
429
-    protected function _generate_payment_method_settings_form(EE_Payment_Method $payment_method)
430
-    {
431
-        if (! $payment_method instanceof EE_Payment_Method) {
432
-            return new EE_Form_Section_Proper();
433
-        }
434
-        return new EE_Form_Section_Proper(
435
-            array(
436
-                'name'            => $payment_method->slug() . '_settings_form',
437
-                'html_id'         => $payment_method->slug() . '_settings_form',
438
-                'action'          => EE_Admin_Page::add_query_args_and_nonce(
439
-                    array(
440
-                        'action'         => 'update_payment_method',
441
-                        'payment_method' => $payment_method->slug(),
442
-                    ),
443
-                    EE_PAYMENTS_ADMIN_URL
444
-                ),
445
-                'layout_strategy' => new EE_Admin_Two_Column_Layout(),
446
-                'subsections'     => apply_filters(
447
-                    'FHEE__Payments_Admin_Page___generate_payment_method_settings_form__form_subsections',
448
-                    array(
449
-                        'pci_dss_compliance'      => $this->_pci_dss_compliance($payment_method),
450
-                        'currency_support'        => $this->_currency_support($payment_method),
451
-                        'payment_method_settings' => $this->_payment_method_settings($payment_method),
452
-                        'update'                  => $this->_update_payment_method_button($payment_method),
453
-                        'deactivate'              => $this->_deactivate_payment_method_button($payment_method),
454
-                        'fine_print'              => $this->_fine_print(),
455
-                    ),
456
-                    $payment_method
457
-                ),
458
-            )
459
-        );
460
-    }
461
-
462
-
463
-    /**
464
-     * _pci_dss_compliance
465
-     *
466
-     * @access protected
467
-     * @param \EE_Payment_Method $payment_method
468
-     * @return \EE_Form_Section_Proper
469
-     */
470
-    protected function _pci_dss_compliance(EE_Payment_Method $payment_method)
471
-    {
472
-        if ($payment_method->type_obj()->requires_https()) {
473
-            return new EE_Form_Section_HTML(
474
-                EEH_HTML::tr(
475
-                    EEH_HTML::th(
476
-                        EEH_HTML::label(
477
-                            EEH_HTML::strong(__('IMPORTANT', 'event_espresso'), '', 'important-notice')
478
-                        )
479
-                    ) .
480
-                    EEH_HTML::td(
481
-                        EEH_HTML::strong(
482
-                            __(
483
-                                'You are responsible for your own website security and Payment Card Industry Data Security Standards (PCI DSS) compliance.',
484
-                                'event_espresso'
485
-                            )
486
-                        )
487
-                        .
488
-                        EEH_HTML::br()
489
-                        .
490
-                        __('Learn more about ', 'event_espresso')
491
-                        . EEH_HTML::link(
492
-                            'https://www.pcisecuritystandards.org/merchants/index.php',
493
-                            __('PCI DSS compliance', 'event_espresso')
494
-                        )
495
-                    )
496
-                )
497
-            );
498
-        } else {
499
-            return new EE_Form_Section_HTML('');
500
-        }
501
-    }
502
-
503
-
504
-    /**
505
-     * _currency_support
506
-     *
507
-     * @access protected
508
-     * @param \EE_Payment_Method $payment_method
509
-     * @return \EE_Form_Section_Proper
510
-     */
511
-    protected function _currency_support(EE_Payment_Method $payment_method)
512
-    {
513
-        if (! $payment_method->usable_for_currency(EE_Config::instance()->currency->code)) {
514
-            return new EE_Form_Section_HTML(
515
-                EEH_HTML::tr(
516
-                    EEH_HTML::th(
517
-                        EEH_HTML::label(
518
-                            EEH_HTML::strong(__('IMPORTANT', 'event_espresso'), '', 'important-notice')
519
-                        )
520
-                    ) .
521
-                    EEH_HTML::td(
522
-                        EEH_HTML::strong(
523
-                            sprintf(
524
-                                __(
525
-                                    'This payment method does not support the currency set on your site (%1$s). Please activate a different payment method or change your site\'s country and associated currency.',
526
-                                    'event_espresso'
527
-                                ),
528
-                                EE_Config::instance()->currency->code
529
-                            )
530
-                        )
531
-                    )
532
-                )
533
-            );
534
-        } else {
535
-            return new EE_Form_Section_HTML('');
536
-        }
537
-    }
538
-
539
-
540
-    /**
541
-     * _update_payment_method_button
542
-     *
543
-     * @access protected
544
-     * @param \EE_Payment_Method $payment_method
545
-     * @return \EE_Form_Section_HTML
546
-     */
547
-    protected function _payment_method_settings(EE_Payment_Method $payment_method)
548
-    {
549
-        // modify the form so we only have/show fields that will be implemented for this version
550
-        return $this->_simplify_form($payment_method->type_obj()->settings_form(), $payment_method->name());
551
-    }
552
-
553
-
554
-    /**
555
-     * Simplifies the form to merely reproduce 4.1's gateway settings functionality
556
-     *
557
-     * @param EE_Form_Section_Proper $form_section
558
-     * @param string                 $payment_method_name
559
-     * @return \EE_Payment_Method_Form
560
-     * @throws \EE_Error
561
-     */
562
-    protected function _simplify_form($form_section, $payment_method_name = '')
563
-    {
564
-        if ($form_section instanceof EE_Payment_Method_Form) {
565
-            $form_section->exclude(
566
-                array(
567
-                    'PMD_type', // dont want them changing the type
568
-                    'PMD_slug', // or the slug (probably never)
569
-                    'PMD_wp_user', // or the user's ID
570
-                    'Currency' // or the currency, until the rest of EE supports simultaneous currencies
571
-                )
572
-            );
573
-            return $form_section;
574
-        } else {
575
-            throw new EE_Error(
576
-                sprintf(
577
-                    __(
578
-                        'The EE_Payment_Method_Form for the "%1$s" payment method is missing or invalid.',
579
-                        'event_espresso'
580
-                    ),
581
-                    $payment_method_name
582
-                )
583
-            );
584
-        }
585
-    }
586
-
587
-
588
-    /**
589
-     * _update_payment_method_button
590
-     *
591
-     * @access protected
592
-     * @param \EE_Payment_Method $payment_method
593
-     * @return \EE_Form_Section_HTML
594
-     */
595
-    protected function _update_payment_method_button(EE_Payment_Method $payment_method)
596
-    {
597
-        $update_button = new EE_Submit_Input(
598
-            array(
599
-                'name'       => 'submit',
600
-                'html_id'    => 'save_' . $payment_method->slug() . '_settings',
601
-                'default'    => sprintf(
602
-                    __('Update %s Payment Settings', 'event_espresso'),
603
-                    $payment_method->admin_name()
604
-                ),
605
-                'html_label' => EEH_HTML::nbsp(),
606
-            )
607
-        );
608
-        return new EE_Form_Section_HTML(
609
-            EEH_HTML::no_row(EEH_HTML::br(2)) .
610
-            EEH_HTML::tr(
611
-                EEH_HTML::th(__('Update Settings', 'event_espresso')) .
612
-                EEH_HTML::td(
613
-                    $update_button->get_html_for_input()
614
-                )
615
-            )
616
-        );
617
-    }
618
-
619
-
620
-    /**
621
-     * _deactivate_payment_method_button
622
-     *
623
-     * @access protected
624
-     * @param \EE_Payment_Method $payment_method
625
-     * @return \EE_Form_Section_Proper
626
-     */
627
-    protected function _deactivate_payment_method_button(EE_Payment_Method $payment_method)
628
-    {
629
-        $link_text_and_title = sprintf(
630
-            __('Deactivate %1$s Payments?', 'event_espresso'),
631
-            $payment_method->admin_name()
632
-        );
633
-        return new EE_Form_Section_HTML(
634
-            EEH_HTML::tr(
635
-                EEH_HTML::th(__('Deactivate Payment Method', 'event_espresso')) .
636
-                EEH_HTML::td(
637
-                    EEH_HTML::link(
638
-                        EE_Admin_Page::add_query_args_and_nonce(
639
-                            array(
640
-                                'action'         => 'deactivate_payment_method',
641
-                                'payment_method' => $payment_method->slug(),
642
-                            ),
643
-                            EE_PAYMENTS_ADMIN_URL
644
-                        ),
645
-                        $link_text_and_title,
646
-                        $link_text_and_title,
647
-                        'deactivate_' . $payment_method->slug(),
648
-                        'espresso-button button-secondary'
649
-                    )
650
-                )
651
-            )
652
-        );
653
-    }
654
-
655
-
656
-    /**
657
-     * _activate_payment_method_button
658
-     *
659
-     * @access protected
660
-     * @param \EE_Payment_Method $payment_method
661
-     * @return \EE_Form_Section_Proper
662
-     */
663
-    protected function _activate_payment_method_button(EE_Payment_Method $payment_method)
664
-    {
665
-        $link_text_and_title = sprintf(
666
-            __('Activate %1$s Payment Method?', 'event_espresso'),
667
-            $payment_method->admin_name()
668
-        );
669
-        return new EE_Form_Section_Proper(
670
-            array(
671
-                'name'            => 'activate_' . $payment_method->slug() . '_settings_form',
672
-                'html_id'         => 'activate_' . $payment_method->slug() . '_settings_form',
673
-                'action'          => '#',
674
-                'layout_strategy' => new EE_Admin_Two_Column_Layout(),
675
-                'subsections'     => apply_filters(
676
-                    'FHEE__Payments_Admin_Page___activate_payment_method_button__form_subsections',
677
-                    array(
678
-                        new EE_Form_Section_HTML(
679
-                            EEH_HTML::tr(
680
-                                EEH_HTML::td(
681
-                                    $payment_method->type_obj()->introductory_html(),
682
-                                    '',
683
-                                    '',
684
-                                    '',
685
-                                    'colspan="2"'
686
-                                )
687
-                            ) .
688
-                            EEH_HTML::tr(
689
-                                EEH_HTML::th(
690
-                                    EEH_HTML::label(__('Click to Activate ', 'event_espresso'))
691
-                                ) .
692
-                                EEH_HTML::td(
693
-                                    EEH_HTML::link(
694
-                                        EE_Admin_Page::add_query_args_and_nonce(
695
-                                            array(
696
-                                                'action'              => 'activate_payment_method',
697
-                                                'payment_method_type' => $payment_method->type(),
698
-                                            ),
699
-                                            EE_PAYMENTS_ADMIN_URL
700
-                                        ),
701
-                                        $link_text_and_title,
702
-                                        $link_text_and_title,
703
-                                        'activate_' . $payment_method->slug(),
704
-                                        'espresso-button-green button-primary'
705
-                                    )
706
-                                )
707
-                            )
708
-                        ),
709
-                    ),
710
-                    $payment_method
711
-                ),
712
-            )
713
-        );
714
-    }
715
-
716
-
717
-    /**
718
-     * _fine_print
719
-     *
720
-     * @access protected
721
-     * @return \EE_Form_Section_HTML
722
-     */
723
-    protected function _fine_print()
724
-    {
725
-        return new EE_Form_Section_HTML(
726
-            EEH_HTML::tr(
727
-                EEH_HTML::th() .
728
-                EEH_HTML::td(
729
-                    EEH_HTML::p(__('All fields marked with a * are required fields', 'event_espresso'), '', 'grey-text')
730
-                )
731
-            )
732
-        );
733
-    }
734
-
735
-
736
-    /**
737
-     * Activates a payment method of that type. Mostly assuming there is only 1 of that type (or none so far)
738
-     *
739
-     * @global WP_User $current_user
740
-     */
741
-    protected function _activate_payment_method()
742
-    {
743
-        if (isset($this->_req_data['payment_method_type'])) {
744
-            $payment_method_type = sanitize_text_field($this->_req_data['payment_method_type']);
745
-            // see if one exists
746
-            EE_Registry::instance()->load_lib('Payment_Method_Manager');
747
-            $payment_method = EE_Payment_Method_Manager::instance()
748
-                                                       ->activate_a_payment_method_of_type($payment_method_type);
749
-            $this->_redirect_after_action(
750
-                1,
751
-                'Payment Method',
752
-                'activated',
753
-                array('action' => 'default', 'payment_method' => $payment_method->slug())
754
-            );
755
-        } else {
756
-            $this->_redirect_after_action(false, 'Payment Method', 'activated', array('action' => 'default'));
757
-        }
758
-    }
759
-
760
-
761
-    /**
762
-     * Deactivates the payment method with the specified slug, and redirects.
763
-     */
764
-    protected function _deactivate_payment_method()
765
-    {
766
-        if (isset($this->_req_data['payment_method'])) {
767
-            $payment_method_slug = sanitize_key($this->_req_data['payment_method']);
768
-            // deactivate it
769
-            EE_Registry::instance()->load_lib('Payment_Method_Manager');
770
-            $count_updated = EE_Payment_Method_Manager::instance()->deactivate_payment_method($payment_method_slug);
771
-            $this->_redirect_after_action(
772
-                $count_updated,
773
-                'Payment Method',
774
-                'deactivated',
775
-                array('action' => 'default', 'payment_method' => $payment_method_slug)
776
-            );
777
-        } else {
778
-            $this->_redirect_after_action(false, 'Payment Method', 'deactivated', array('action' => 'default'));
779
-        }
780
-    }
781
-
782
-
783
-    /**
784
-     * Processes the payment method form that was submitted. This is slightly trickier than usual form
785
-     * processing because we first need to identify WHICH form was processed and which payment method
786
-     * it corresponds to. Once we have done that, we see if the form is valid. If it is, the
787
-     * form's data is saved and we redirect to the default payment methods page, setting the updated payment method
788
-     * as the currently-selected one. If it DOESN'T validate, we render the page with the form's errors (in the
789
-     * subsequently called 'headers_sent_func' which is _payment_methods_list)
790
-     *
791
-     * @return void
792
-     */
793
-    protected function _update_payment_method()
794
-    {
795
-        if ($_SERVER['REQUEST_METHOD'] == 'POST') {
796
-            // ok let's find which gateway form to use based on the form input
797
-            EE_Registry::instance()->load_lib('Payment_Method_Manager');
798
-            /** @var $correct_pmt_form_to_use EE_Payment_Method_Form */
799
-            $correct_pmt_form_to_use = null;
800
-            $payment_method = null;
801
-            foreach (EEM_Payment_Method::instance()->get_all() as $payment_method) {
802
-                // get the form and simplify it, like what we do when we display it
803
-                $pmt_form = $this->_generate_payment_method_settings_form($payment_method);
804
-                if ($pmt_form->form_data_present_in($this->_req_data)) {
805
-                    $correct_pmt_form_to_use = $pmt_form;
806
-                    break;
807
-                }
808
-            }
809
-            // if we couldn't find the correct payment method type...
810
-            if (! $correct_pmt_form_to_use) {
811
-                EE_Error::add_error(
812
-                    __(
813
-                        "We could not find which payment method type your form submission related to. Please contact support",
814
-                        'event_espresso'
815
-                    ),
816
-                    __FILE__,
817
-                    __FUNCTION__,
818
-                    __LINE__
819
-                );
820
-                $this->_redirect_after_action(false, 'Payment Method', 'activated', array('action' => 'default'));
821
-            }
822
-            $correct_pmt_form_to_use->receive_form_submission($this->_req_data);
823
-            if ($correct_pmt_form_to_use->is_valid()) {
824
-                $payment_settings_subform = $correct_pmt_form_to_use->get_subsection('payment_method_settings');
825
-                if (! $payment_settings_subform instanceof EE_Payment_Method_Form) {
826
-                    throw new EE_Error(
827
-                        sprintf(
828
-                            __(
829
-                                'The payment method could not be saved because the form sections were misnamed. We expected to find %1$s, but did not.',
830
-                                'event_espresso'
831
-                            ),
832
-                            'payment_method_settings'
833
-                        )
834
-                    );
835
-                }
836
-                $payment_settings_subform->save();
837
-                /** @var $pm EE_Payment_Method */
838
-                $this->_redirect_after_action(
839
-                    true,
840
-                    'Payment Method',
841
-                    'updated',
842
-                    array('action' => 'default', 'payment_method' => $payment_method->slug())
843
-                );
844
-            } else {
845
-                EE_Error::add_error(
846
-                    sprintf(
847
-                        __(
848
-                            'Payment method of type %s was not saved because there were validation errors. They have been marked in the form',
849
-                            'event_espresso'
850
-                        ),
851
-                        $payment_method instanceof EE_Payment_Method ? $payment_method->type_obj()->pretty_name()
852
-                            : __('"(unknown)"', 'event_espresso')
853
-                    ),
854
-                    __FILE__,
855
-                    __FUNCTION__,
856
-                    __LINE__
857
-                );
858
-            }
859
-        }
860
-        return;
861
-    }
862
-
863
-
864
-    /**
865
-     * Displays payment settings (not payment METHOD settings, that's _payment_method_settings)
866
-     * @throws DomainException
867
-     * @throws EE_Error
868
-     * @throws InvalidArgumentException
869
-     * @throws \EventEspresso\core\exceptions\InvalidDataTypeException
870
-     * @throws \EventEspresso\core\exceptions\InvalidInterfaceException
871
-     */
872
-    protected function _payment_settings()
873
-    {
874
-        $form = $this->getPaymentSettingsForm();
875
-        $this->_set_add_edit_form_tags('update_payment_settings');
876
-        $this->_set_publish_post_box_vars(null, false, false, null, false);
877
-        $this->_template_args['admin_page_content'] =  $form->get_html_and_js();
878
-        $this->display_admin_page_with_sidebar();
879
-    }
880
-
881
-
882
-    /**
883
-     *        _update_payment_settings
884
-     *
885
-     * @access protected
886
-     * @return void
887
-     * @throws EE_Error
888
-     * @throws InvalidArgumentException
889
-     * @throws \EventEspresso\core\exceptions\InvalidDataTypeException
890
-     * @throws \EventEspresso\core\exceptions\InvalidInterfaceException
891
-     */
892
-    protected function _update_payment_settings()
893
-    {
894
-        $form = $this->getPaymentSettingsForm();
895
-        if ($form->was_submitted($this->_req_data)) {
896
-            $form->receive_form_submission($this->_req_data);
897
-            if ($form->is_valid()) {
898
-                /**
899
-                 * @var $reg_config EE_Registration_Config
900
-                 */
901
-                $loader = LoaderFactory::getLoader();
902
-                $reg_config = $loader->getShared('EE_Registration_Config');
903
-                $valid_data = $form->valid_data();
904
-                $reg_config->show_pending_payment_options = $valid_data['show_pending_payment_options'];
905
-                $reg_config->gateway_log_lifespan = $valid_data['gateway_log_lifespan'];
906
-            }
907
-        }
908
-        EE_Registry::instance()->CFG = apply_filters(
909
-            'FHEE__Payments_Admin_Page___update_payment_settings__CFG',
910
-            EE_Registry::instance()->CFG
911
-        );
912
-
913
-        $cfg =  EE_Registry::instance()->CFG ;
914
-
915
-        $what = __('Payment Settings', 'event_espresso');
916
-        $success = $this->_update_espresso_configuration(
917
-            $what,
918
-            EE_Registry::instance()->CFG,
919
-            __FILE__,
920
-            __FUNCTION__,
921
-            __LINE__
922
-        );
923
-        $this->_redirect_after_action(
924
-            $success,
925
-            $what,
926
-            __('updated', 'event_espresso'),
927
-            array('action' => 'payment_settings')
928
-        );
929
-    }
930
-
931
-
932
-    /**
933
-     * Gets the form used for updating payment settings
934
-     *
935
-     * @return EE_Form_Section_Proper
936
-     * @throws EE_Error
937
-     * @throws InvalidArgumentException
938
-     * @throws \EventEspresso\core\exceptions\InvalidDataTypeException
939
-     * @throws \EventEspresso\core\exceptions\InvalidInterfaceException
940
-     */
941
-    protected function getPaymentSettingsForm()
942
-    {
943
-        /**
944
-         * @var $reg_config EE_Registration_Config
945
-         */
946
-        $reg_config = LoaderFactory::getLoader()->getShared('EE_Registration_Config');
947
-        return new EE_Form_Section_Proper(
948
-            array(
949
-                'name' => 'payment-settings',
950
-                'layout_strategy' => new EE_Admin_Two_Column_Layout(),
951
-                'subsections' => array(
952
-                    'show_pending_payment_options' => new EE_Yes_No_Input(
953
-                        array(
954
-                            'html_name' => 'show_pending_payment_options',
955
-                            'default' => $reg_config->show_pending_payment_options,
956
-                            'html_help_text' => esc_html__(
957
-                                "If a payment is marked as 'Pending Payment', or if payment is deferred (ie, an offline gateway like Check, Bank, or Invoice is used), then give registrants the option to retry payment. ",
958
-                                'event_espresso'
959
-                            )
960
-                        )
961
-                    ),
962
-                    'gateway_log_lifespan' => new \EE_Select_Input(
963
-                        $reg_config->gatewayLogLifespanOptions(),
964
-                        array(
965
-                            'html_label_text' => esc_html__('Gateway Logs Lifespan', 'event_espresso'),
966
-                            'html_help_text' => esc_html__('If issues arise with payments being made through a payment gateway, it\'s helpful to log non-sensitive communications with the payment gateway. But it\'s a security responsibility, so it\'s a good idea to not keep them for any longer than necessary.', 'event_espresso'),
967
-                            'default' => $reg_config->gateway_log_lifespan,
968
-                        )
969
-                    )
970
-                )
971
-            )
972
-        );
973
-    }
974
-
975
-
976
-    protected function _payment_log_overview_list_table()
977
-    {
978
-        $this->display_admin_list_table_page_with_sidebar();
979
-    }
980
-
981
-
982
-    protected function _set_list_table_views_payment_log()
983
-    {
984
-        $this->_views = array(
985
-            'all' => array(
986
-                'slug'  => 'all',
987
-                'label' => __('View All Logs', 'event_espresso'),
988
-                'count' => 0,
989
-            ),
990
-        );
991
-    }
992
-
993
-
994
-    /**
995
-     * @param int  $per_page
996
-     * @param int  $current_page
997
-     * @param bool $count
998
-     * @return array
999
-     */
1000
-    public function get_payment_logs($per_page = 50, $current_page = 0, $count = false)
1001
-    {
1002
-        EE_Registry::instance()->load_model('Change_Log');
1003
-        // we may need to do multiple queries (joining differently), so we actually wan tan array of query params
1004
-        $query_params = array(array('LOG_type' => EEM_Change_Log::type_gateway));
1005
-        // check if they've selected a specific payment method
1006
-        if (isset($this->_req_data['_payment_method']) && $this->_req_data['_payment_method'] !== 'all') {
1007
-            $query_params[0]['OR*pm_or_pay_pm'] = array(
1008
-                'Payment.Payment_Method.PMD_ID' => $this->_req_data['_payment_method'],
1009
-                'Payment_Method.PMD_ID'         => $this->_req_data['_payment_method'],
1010
-            );
1011
-        }
1012
-        // take into account search
1013
-        if (isset($this->_req_data['s']) && $this->_req_data['s']) {
1014
-            $similarity_string = array('LIKE', '%' . str_replace("", "%", $this->_req_data['s']) . '%');
1015
-            $query_params[0]['OR*s']['Payment.Transaction.Registration.Attendee.ATT_fname'] = $similarity_string;
1016
-            $query_params[0]['OR*s']['Payment.Transaction.Registration.Attendee.ATT_lname'] = $similarity_string;
1017
-            $query_params[0]['OR*s']['Payment.Transaction.Registration.Attendee.ATT_email'] = $similarity_string;
1018
-            $query_params[0]['OR*s']['Payment.Payment_Method.PMD_name'] = $similarity_string;
1019
-            $query_params[0]['OR*s']['Payment.Payment_Method.PMD_admin_name'] = $similarity_string;
1020
-            $query_params[0]['OR*s']['Payment.Payment_Method.PMD_type'] = $similarity_string;
1021
-            $query_params[0]['OR*s']['LOG_message'] = $similarity_string;
1022
-            $query_params[0]['OR*s']['Payment_Method.PMD_name'] = $similarity_string;
1023
-            $query_params[0]['OR*s']['Payment_Method.PMD_admin_name'] = $similarity_string;
1024
-            $query_params[0]['OR*s']['Payment_Method.PMD_type'] = $similarity_string;
1025
-            $query_params[0]['OR*s']['LOG_message'] = $similarity_string;
1026
-        }
1027
-        if (isset($this->_req_data['payment-filter-start-date'])
1028
-            && isset($this->_req_data['payment-filter-end-date'])
1029
-        ) {
1030
-            // add date
1031
-            $start_date = wp_strip_all_tags($this->_req_data['payment-filter-start-date']);
1032
-            $end_date = wp_strip_all_tags($this->_req_data['payment-filter-end-date']);
1033
-            // make sure our timestamps start and end right at the boundaries for each day
1034
-            $start_date = date('Y-m-d', strtotime($start_date)) . ' 00:00:00';
1035
-            $end_date = date('Y-m-d', strtotime($end_date)) . ' 23:59:59';
1036
-            // convert to timestamps
1037
-            $start_date = strtotime($start_date);
1038
-            $end_date = strtotime($end_date);
1039
-            // makes sure start date is the lowest value and vice versa
1040
-            $start_date = min($start_date, $end_date);
1041
-            $end_date = max($start_date, $end_date);
1042
-            // convert for query
1043
-            $start_date = EEM_Change_Log::instance()
1044
-                                        ->convert_datetime_for_query(
1045
-                                            'LOG_time',
1046
-                                            date('Y-m-d H:i:s', $start_date),
1047
-                                            'Y-m-d H:i:s'
1048
-                                        );
1049
-            $end_date = EEM_Change_Log::instance()
1050
-                                      ->convert_datetime_for_query(
1051
-                                          'LOG_time',
1052
-                                          date('Y-m-d H:i:s', $end_date),
1053
-                                          'Y-m-d H:i:s'
1054
-                                      );
1055
-            $query_params[0]['LOG_time'] = array('BETWEEN', array($start_date, $end_date));
1056
-        }
1057
-        if ($count) {
1058
-            return EEM_Change_Log::instance()->count($query_params);
1059
-        }
1060
-        if (isset($this->_req_data['order'])) {
1061
-            $sort = (isset($this->_req_data['order']) && ! empty($this->_req_data['order'])) ? $this->_req_data['order']
1062
-                : 'DESC';
1063
-            $query_params['order_by'] = array('LOG_time' => $sort);
1064
-        } else {
1065
-            $query_params['order_by'] = array('LOG_time' => 'DESC');
1066
-        }
1067
-        $offset = ($current_page - 1) * $per_page;
1068
-        if (! isset($this->_req_data['download_results'])) {
1069
-            $query_params['limit'] = array($offset, $per_page);
1070
-        }
1071
-        // now they've requested to instead just download the file instead of viewing it.
1072
-        if (isset($this->_req_data['download_results'])) {
1073
-            $wpdb_results = EEM_Change_Log::instance()->get_all_efficiently($query_params);
1074
-            header('Content-Disposition: attachment');
1075
-            header("Content-Disposition: attachment; filename=ee_payment_logs_for_" . sanitize_key(site_url()));
1076
-            echo "<h1>Payment Logs for " . site_url() . "</h1>";
1077
-            echo "<h3>Query:</h3>";
1078
-            var_dump($query_params);
1079
-            echo "<h3>Results:</h3>";
1080
-            var_dump($wpdb_results);
1081
-            die;
1082
-        }
1083
-        $results = EEM_Change_Log::instance()->get_all($query_params);
1084
-        return $results;
1085
-    }
1086
-
1087
-
1088
-    /**
1089
-     * Used by usort to RE-sort log query results, because we lose the ordering
1090
-     * because we're possibly combining the results from two queries
1091
-     *
1092
-     * @param EE_Change_Log $logA
1093
-     * @param EE_Change_Log $logB
1094
-     * @return int
1095
-     */
1096
-    protected function _sort_logs_again($logA, $logB)
1097
-    {
1098
-        $timeA = $logA->get_raw('LOG_time');
1099
-        $timeB = $logB->get_raw('LOG_time');
1100
-        if ($timeA == $timeB) {
1101
-            return 0;
1102
-        }
1103
-        $comparison = $timeA < $timeB ? -1 : 1;
1104
-        if (strtoupper($this->_sort_logs_again_direction) == 'DESC') {
1105
-            return $comparison * -1;
1106
-        } else {
1107
-            return $comparison;
1108
-        }
1109
-    }
1110
-
1111
-
1112
-    protected function _payment_log_details()
1113
-    {
1114
-        EE_Registry::instance()->load_model('Change_Log');
1115
-        /** @var $payment_log EE_Change_Log */
1116
-        $payment_log = EEM_Change_Log::instance()->get_one_by_ID($this->_req_data['ID']);
1117
-        $payment_method = null;
1118
-        $transaction = null;
1119
-        if ($payment_log instanceof EE_Change_Log) {
1120
-            if ($payment_log->object() instanceof EE_Payment) {
1121
-                $payment_method = $payment_log->object()->payment_method();
1122
-                $transaction = $payment_log->object()->transaction();
1123
-            } elseif ($payment_log->object() instanceof EE_Payment_Method) {
1124
-                $payment_method = $payment_log->object();
1125
-            }
1126
-        }
1127
-        $this->_template_args['admin_page_content'] = EEH_Template::display_template(
1128
-            EE_PAYMENTS_TEMPLATE_PATH . 'payment_log_details.template.php',
1129
-            array(
1130
-                'payment_log'    => $payment_log,
1131
-                'payment_method' => $payment_method,
1132
-                'transaction'    => $transaction,
1133
-            ),
1134
-            true
1135
-        );
1136
-        $this->display_admin_page_with_sidebar();
1137
-    }
17
+	/**
18
+	 * Variables used for when we're re-sorting the logs results, in case
19
+	 * we needed to do two queries and we need to resort
20
+	 *
21
+	 * @var string
22
+	 */
23
+	private $_sort_logs_again_direction;
24
+
25
+
26
+	/**
27
+	 * @Constructor
28
+	 * @access public
29
+	 * @param bool $routing indicate whether we want to just load the object and handle routing or just load the object.
30
+	 * @return \Payments_Admin_Page
31
+	 */
32
+	public function __construct($routing = true)
33
+	{
34
+		parent::__construct($routing);
35
+	}
36
+
37
+
38
+	protected function _init_page_props()
39
+	{
40
+		$this->page_slug = EE_PAYMENTS_PG_SLUG;
41
+		$this->page_label = __('Payment Methods', 'event_espresso');
42
+		$this->_admin_base_url = EE_PAYMENTS_ADMIN_URL;
43
+		$this->_admin_base_path = EE_PAYMENTS_ADMIN;
44
+	}
45
+
46
+
47
+	protected function _ajax_hooks()
48
+	{
49
+		// todo: all hooks for ajax goes here.
50
+	}
51
+
52
+
53
+	protected function _define_page_props()
54
+	{
55
+		$this->_admin_page_title = $this->page_label;
56
+		$this->_labels = array(
57
+			'publishbox' => __('Update Settings', 'event_espresso'),
58
+		);
59
+	}
60
+
61
+
62
+	protected function _set_page_routes()
63
+	{
64
+		/**
65
+		 * note that with payment method capabilities, although we've implemented
66
+		 * capability mapping which will be used for accessing payment methods owned by
67
+		 * other users.  This is not fully implemented yet in the payment method ui.
68
+		 * Currently only the "plural" caps are in active use.
69
+		 * When cap mapping is implemented, some routes will need to use the singular form of
70
+		 * capability method and also include the $id of the payment method for the route.
71
+		 **/
72
+		$this->_page_routes = array(
73
+			'default'                   => array(
74
+				'func'       => '_payment_methods_list',
75
+				'capability' => 'ee_edit_payment_methods',
76
+			),
77
+			'payment_settings'          => array(
78
+				'func'       => '_payment_settings',
79
+				'capability' => 'ee_manage_gateways',
80
+			),
81
+			'activate_payment_method'   => array(
82
+				'func'       => '_activate_payment_method',
83
+				'noheader'   => true,
84
+				'capability' => 'ee_edit_payment_methods',
85
+			),
86
+			'deactivate_payment_method' => array(
87
+				'func'       => '_deactivate_payment_method',
88
+				'noheader'   => true,
89
+				'capability' => 'ee_delete_payment_methods',
90
+			),
91
+			'update_payment_method'     => array(
92
+				'func'               => '_update_payment_method',
93
+				'noheader'           => true,
94
+				'headers_sent_route' => 'default',
95
+				'capability'         => 'ee_edit_payment_methods',
96
+			),
97
+			'update_payment_settings'   => array(
98
+				'func'       => '_update_payment_settings',
99
+				'noheader'   => true,
100
+				'capability' => 'ee_manage_gateways',
101
+			),
102
+			'payment_log'               => array(
103
+				'func'       => '_payment_log_overview_list_table',
104
+				'capability' => 'ee_read_payment_methods',
105
+			),
106
+			'payment_log_details'       => array(
107
+				'func'       => '_payment_log_details',
108
+				'capability' => 'ee_read_payment_methods',
109
+			),
110
+		);
111
+	}
112
+
113
+
114
+	protected function _set_page_config()
115
+	{
116
+		$payment_method_list_config = array(
117
+			'nav'           => array(
118
+				'label' => __('Payment Methods', 'event_espresso'),
119
+				'order' => 10,
120
+			),
121
+			'metaboxes'     => $this->_default_espresso_metaboxes,
122
+			'help_tabs'     => array_merge(
123
+				array(
124
+					'payment_methods_overview_help_tab' => array(
125
+						'title'    => __('Payment Methods Overview', 'event_espresso'),
126
+						'filename' => 'payment_methods_overview',
127
+					),
128
+				),
129
+				$this->_add_payment_method_help_tabs()
130
+			),
131
+			'help_tour'     => array('Payment_Methods_Selection_Help_Tour'),
132
+			'require_nonce' => false,
133
+		);
134
+		$this->_page_config = array(
135
+			'default'          => $payment_method_list_config,
136
+			'payment_settings' => array(
137
+				'nav'           => array(
138
+					'label' => __('Settings', 'event_espresso'),
139
+					'order' => 20,
140
+				),
141
+				'help_tabs'     => array(
142
+					'payment_methods_settings_help_tab' => array(
143
+						'title'    => __('Payment Method Settings', 'event_espresso'),
144
+						'filename' => 'payment_methods_settings',
145
+					),
146
+				),
147
+				// 'help_tour' => array( 'Payment_Methods_Settings_Help_Tour' ),
148
+				'metaboxes'     => array_merge($this->_default_espresso_metaboxes, array('_publish_post_box')),
149
+				'require_nonce' => false,
150
+			),
151
+			'payment_log'      => array(
152
+				'nav'           => array(
153
+					'label' => __("Logs", 'event_espresso'),
154
+					'order' => 30,
155
+				),
156
+				'list_table'    => 'Payment_Log_Admin_List_Table',
157
+				'metaboxes'     => $this->_default_espresso_metaboxes,
158
+				'require_nonce' => false,
159
+			),
160
+		);
161
+	}
162
+
163
+
164
+	/**
165
+	 * @return array
166
+	 */
167
+	protected function _add_payment_method_help_tabs()
168
+	{
169
+		EE_Registry::instance()->load_lib('Payment_Method_Manager');
170
+		$payment_method_types = EE_Payment_Method_Manager::instance()->payment_method_types();
171
+		$all_pmt_help_tabs_config = array();
172
+		foreach ($payment_method_types as $payment_method_type) {
173
+			if (! EE_Registry::instance()->CAP->current_user_can(
174
+				$payment_method_type->cap_name(),
175
+				'specific_payment_method_type_access'
176
+			)
177
+			) {
178
+				continue;
179
+			}
180
+			foreach ($payment_method_type->help_tabs_config() as $help_tab_name => $config) {
181
+				$template_args = isset($config['template_args']) ? $config['template_args'] : array();
182
+				$template_args['admin_page_obj'] = $this;
183
+				$all_pmt_help_tabs_config[ $help_tab_name ] = array(
184
+					'title'   => $config['title'],
185
+					'content' => EEH_Template::display_template(
186
+						$payment_method_type->file_folder() . 'help_tabs' . DS . $config['filename'] . '.help_tab.php',
187
+						$template_args,
188
+						true
189
+					),
190
+				);
191
+			}
192
+		}
193
+		return $all_pmt_help_tabs_config;
194
+	}
195
+
196
+
197
+	// none of the below group are currently used for Gateway Settings
198
+	protected function _add_screen_options()
199
+	{
200
+	}
201
+
202
+
203
+	protected function _add_feature_pointers()
204
+	{
205
+	}
206
+
207
+
208
+	public function admin_init()
209
+	{
210
+	}
211
+
212
+
213
+	public function admin_notices()
214
+	{
215
+	}
216
+
217
+
218
+	public function admin_footer_scripts()
219
+	{
220
+	}
221
+
222
+
223
+	public function load_scripts_styles()
224
+	{
225
+		wp_enqueue_script('ee_admin_js');
226
+		wp_enqueue_script('ee-text-links');
227
+		wp_enqueue_script(
228
+			'espresso_payments',
229
+			EE_PAYMENTS_ASSETS_URL . 'espresso_payments_admin.js',
230
+			array('espresso-ui-theme', 'ee-datepicker'),
231
+			EVENT_ESPRESSO_VERSION,
232
+			true
233
+		);
234
+	}
235
+
236
+
237
+	public function load_scripts_styles_default()
238
+	{
239
+		// styles
240
+		wp_register_style(
241
+			'espresso_payments',
242
+			EE_PAYMENTS_ASSETS_URL . 'ee-payments.css',
243
+			array(),
244
+			EVENT_ESPRESSO_VERSION
245
+		);
246
+		wp_enqueue_style('espresso_payments');
247
+		wp_enqueue_style('ee-text-links');
248
+		// scripts
249
+	}
250
+
251
+
252
+	protected function _payment_methods_list()
253
+	{
254
+		/**
255
+		 * first let's ensure payment methods have been setup. We do this here because when people activate a
256
+		 * payment method for the first time (as an addon), it may not setup its capabilities or get registered correctly due
257
+		 * to the loading process.  However, people MUST setup the details for the payment method so its safe to do a
258
+		 * recheck here.
259
+		 */
260
+		EE_Registry::instance()->load_lib('Payment_Method_Manager');
261
+		EEM_Payment_Method::instance()->verify_button_urls();
262
+		// setup tabs, one for each payment method type
263
+		$tabs = array();
264
+		$payment_methods = array();
265
+		foreach (EE_Payment_Method_Manager::instance()->payment_method_types() as $pmt_obj) {
266
+			// we don't want to show admin-only PMTs for now
267
+			if ($pmt_obj instanceof EE_PMT_Admin_Only) {
268
+				continue;
269
+			}
270
+			// check access
271
+			if (! EE_Registry::instance()->CAP->current_user_can(
272
+				$pmt_obj->cap_name(),
273
+				'specific_payment_method_type_access'
274
+			)
275
+			) {
276
+				continue;
277
+			}
278
+			// check for any active pms of that type
279
+			$payment_method = EEM_Payment_Method::instance()->get_one_of_type($pmt_obj->system_name());
280
+			if (! $payment_method instanceof EE_Payment_Method) {
281
+				$payment_method = EE_Payment_Method::new_instance(
282
+					array(
283
+						'PMD_slug'       => sanitize_key($pmt_obj->system_name()),
284
+						'PMD_type'       => $pmt_obj->system_name(),
285
+						'PMD_name'       => $pmt_obj->pretty_name(),
286
+						'PMD_admin_name' => $pmt_obj->pretty_name(),
287
+					)
288
+				);
289
+			}
290
+			$payment_methods[ $payment_method->slug() ] = $payment_method;
291
+		}
292
+		$payment_methods = apply_filters(
293
+			'FHEE__Payments_Admin_Page___payment_methods_list__payment_methods',
294
+			$payment_methods
295
+		);
296
+		foreach ($payment_methods as $payment_method) {
297
+			if ($payment_method instanceof EE_Payment_Method) {
298
+				add_meta_box(
299
+					// html id
300
+					'espresso_' . $payment_method->slug() . '_payment_settings',
301
+					// title
302
+					sprintf(__('%s Settings', 'event_espresso'), $payment_method->admin_name()),
303
+					// callback
304
+					array($this, 'payment_method_settings_meta_box'),
305
+					// post type
306
+					null,
307
+					// context
308
+					'normal',
309
+					// priority
310
+					'default',
311
+					// callback args
312
+					array('payment_method' => $payment_method)
313
+				);
314
+				// setup for tabbed content
315
+				$tabs[ $payment_method->slug() ] = array(
316
+					'label' => $payment_method->admin_name(),
317
+					'class' => $payment_method->active() ? 'gateway-active' : '',
318
+					'href'  => 'espresso_' . $payment_method->slug() . '_payment_settings',
319
+					'title' => __('Modify this Payment Method', 'event_espresso'),
320
+					'slug'  => $payment_method->slug(),
321
+				);
322
+			}
323
+		}
324
+		$this->_template_args['admin_page_header'] = EEH_Tabbed_Content::tab_text_links(
325
+			$tabs,
326
+			'payment_method_links',
327
+			'|',
328
+			$this->_get_active_payment_method_slug()
329
+		);
330
+		$this->display_admin_page_with_sidebar();
331
+	}
332
+
333
+
334
+	/**
335
+	 *   _get_active_payment_method_slug
336
+	 *
337
+	 * @return string
338
+	 */
339
+	protected function _get_active_payment_method_slug()
340
+	{
341
+		$payment_method_slug = false;
342
+		// decide which payment method tab to open first, as dictated by the request's 'payment_method'
343
+		if (isset($this->_req_data['payment_method'])) {
344
+			// if they provided the current payment method, use it
345
+			$payment_method_slug = sanitize_key($this->_req_data['payment_method']);
346
+		}
347
+		$payment_method = EEM_Payment_Method::instance()->get_one(array(array('PMD_slug' => $payment_method_slug)));
348
+		// if that didn't work or wasn't provided, find another way to select the current pm
349
+		if (! $this->_verify_payment_method($payment_method)) {
350
+			// like, looking for an active one
351
+			$payment_method = EEM_Payment_Method::instance()->get_one_active('CART');
352
+			// test that one as well
353
+			if ($this->_verify_payment_method($payment_method)) {
354
+				$payment_method_slug = $payment_method->slug();
355
+			} else {
356
+				$payment_method_slug = 'paypal_standard';
357
+			}
358
+		}
359
+		return $payment_method_slug;
360
+	}
361
+
362
+
363
+	/**
364
+	 *    payment_method_settings_meta_box
365
+	 *    returns TRUE if the passed payment method is properly constructed and the logged in user has the correct
366
+	 *    capabilities to access it
367
+	 *
368
+	 * @param \EE_Payment_Method $payment_method
369
+	 * @return boolean
370
+	 */
371
+	protected function _verify_payment_method($payment_method)
372
+	{
373
+		if ($payment_method instanceof EE_Payment_Method && $payment_method->type_obj() instanceof EE_PMT_Base
374
+			&& EE_Registry::instance()->CAP->current_user_can(
375
+				$payment_method->type_obj()->cap_name(),
376
+				'specific_payment_method_type_access'
377
+			)
378
+		) {
379
+			return true;
380
+		}
381
+		return false;
382
+	}
383
+
384
+
385
+	/**
386
+	 *    payment_method_settings_meta_box
387
+	 *
388
+	 * @param NULL  $post_obj_which_is_null is an object containing the current post (as a $post object)
389
+	 * @param array $metabox                is an array with metabox id, title, callback, and args elements. the value
390
+	 *                                      at 'args' has key 'payment_method', as set within _payment_methods_list
391
+	 * @return string
392
+	 * @throws EE_Error
393
+	 */
394
+	public function payment_method_settings_meta_box($post_obj_which_is_null, $metabox)
395
+	{
396
+		$payment_method = isset($metabox['args'], $metabox['args']['payment_method'])
397
+			? $metabox['args']['payment_method'] : null;
398
+		if (! $payment_method instanceof EE_Payment_Method) {
399
+			throw new EE_Error(
400
+				sprintf(
401
+					__(
402
+						'Payment method metabox setup incorrectly. No Payment method object was supplied',
403
+						'event_espresso'
404
+					)
405
+				)
406
+			);
407
+		}
408
+		$payment_method_scopes = $payment_method->active();
409
+		// if the payment method really exists show its form, otherwise the activation template
410
+		if ($payment_method->ID() && ! empty($payment_method_scopes)) {
411
+			$form = $this->_generate_payment_method_settings_form($payment_method);
412
+			if ($form->form_data_present_in($this->_req_data)) {
413
+				$form->receive_form_submission($this->_req_data);
414
+			}
415
+			echo $form->form_open() . $form->get_html_and_js() . $form->form_close();
416
+		} else {
417
+			echo $this->_activate_payment_method_button($payment_method)->get_html_and_js();
418
+		}
419
+	}
420
+
421
+
422
+	/**
423
+	 * Gets the form for all the settings related to this payment method type
424
+	 *
425
+	 * @access protected
426
+	 * @param \EE_Payment_Method $payment_method
427
+	 * @return \EE_Form_Section_Proper
428
+	 */
429
+	protected function _generate_payment_method_settings_form(EE_Payment_Method $payment_method)
430
+	{
431
+		if (! $payment_method instanceof EE_Payment_Method) {
432
+			return new EE_Form_Section_Proper();
433
+		}
434
+		return new EE_Form_Section_Proper(
435
+			array(
436
+				'name'            => $payment_method->slug() . '_settings_form',
437
+				'html_id'         => $payment_method->slug() . '_settings_form',
438
+				'action'          => EE_Admin_Page::add_query_args_and_nonce(
439
+					array(
440
+						'action'         => 'update_payment_method',
441
+						'payment_method' => $payment_method->slug(),
442
+					),
443
+					EE_PAYMENTS_ADMIN_URL
444
+				),
445
+				'layout_strategy' => new EE_Admin_Two_Column_Layout(),
446
+				'subsections'     => apply_filters(
447
+					'FHEE__Payments_Admin_Page___generate_payment_method_settings_form__form_subsections',
448
+					array(
449
+						'pci_dss_compliance'      => $this->_pci_dss_compliance($payment_method),
450
+						'currency_support'        => $this->_currency_support($payment_method),
451
+						'payment_method_settings' => $this->_payment_method_settings($payment_method),
452
+						'update'                  => $this->_update_payment_method_button($payment_method),
453
+						'deactivate'              => $this->_deactivate_payment_method_button($payment_method),
454
+						'fine_print'              => $this->_fine_print(),
455
+					),
456
+					$payment_method
457
+				),
458
+			)
459
+		);
460
+	}
461
+
462
+
463
+	/**
464
+	 * _pci_dss_compliance
465
+	 *
466
+	 * @access protected
467
+	 * @param \EE_Payment_Method $payment_method
468
+	 * @return \EE_Form_Section_Proper
469
+	 */
470
+	protected function _pci_dss_compliance(EE_Payment_Method $payment_method)
471
+	{
472
+		if ($payment_method->type_obj()->requires_https()) {
473
+			return new EE_Form_Section_HTML(
474
+				EEH_HTML::tr(
475
+					EEH_HTML::th(
476
+						EEH_HTML::label(
477
+							EEH_HTML::strong(__('IMPORTANT', 'event_espresso'), '', 'important-notice')
478
+						)
479
+					) .
480
+					EEH_HTML::td(
481
+						EEH_HTML::strong(
482
+							__(
483
+								'You are responsible for your own website security and Payment Card Industry Data Security Standards (PCI DSS) compliance.',
484
+								'event_espresso'
485
+							)
486
+						)
487
+						.
488
+						EEH_HTML::br()
489
+						.
490
+						__('Learn more about ', 'event_espresso')
491
+						. EEH_HTML::link(
492
+							'https://www.pcisecuritystandards.org/merchants/index.php',
493
+							__('PCI DSS compliance', 'event_espresso')
494
+						)
495
+					)
496
+				)
497
+			);
498
+		} else {
499
+			return new EE_Form_Section_HTML('');
500
+		}
501
+	}
502
+
503
+
504
+	/**
505
+	 * _currency_support
506
+	 *
507
+	 * @access protected
508
+	 * @param \EE_Payment_Method $payment_method
509
+	 * @return \EE_Form_Section_Proper
510
+	 */
511
+	protected function _currency_support(EE_Payment_Method $payment_method)
512
+	{
513
+		if (! $payment_method->usable_for_currency(EE_Config::instance()->currency->code)) {
514
+			return new EE_Form_Section_HTML(
515
+				EEH_HTML::tr(
516
+					EEH_HTML::th(
517
+						EEH_HTML::label(
518
+							EEH_HTML::strong(__('IMPORTANT', 'event_espresso'), '', 'important-notice')
519
+						)
520
+					) .
521
+					EEH_HTML::td(
522
+						EEH_HTML::strong(
523
+							sprintf(
524
+								__(
525
+									'This payment method does not support the currency set on your site (%1$s). Please activate a different payment method or change your site\'s country and associated currency.',
526
+									'event_espresso'
527
+								),
528
+								EE_Config::instance()->currency->code
529
+							)
530
+						)
531
+					)
532
+				)
533
+			);
534
+		} else {
535
+			return new EE_Form_Section_HTML('');
536
+		}
537
+	}
538
+
539
+
540
+	/**
541
+	 * _update_payment_method_button
542
+	 *
543
+	 * @access protected
544
+	 * @param \EE_Payment_Method $payment_method
545
+	 * @return \EE_Form_Section_HTML
546
+	 */
547
+	protected function _payment_method_settings(EE_Payment_Method $payment_method)
548
+	{
549
+		// modify the form so we only have/show fields that will be implemented for this version
550
+		return $this->_simplify_form($payment_method->type_obj()->settings_form(), $payment_method->name());
551
+	}
552
+
553
+
554
+	/**
555
+	 * Simplifies the form to merely reproduce 4.1's gateway settings functionality
556
+	 *
557
+	 * @param EE_Form_Section_Proper $form_section
558
+	 * @param string                 $payment_method_name
559
+	 * @return \EE_Payment_Method_Form
560
+	 * @throws \EE_Error
561
+	 */
562
+	protected function _simplify_form($form_section, $payment_method_name = '')
563
+	{
564
+		if ($form_section instanceof EE_Payment_Method_Form) {
565
+			$form_section->exclude(
566
+				array(
567
+					'PMD_type', // dont want them changing the type
568
+					'PMD_slug', // or the slug (probably never)
569
+					'PMD_wp_user', // or the user's ID
570
+					'Currency' // or the currency, until the rest of EE supports simultaneous currencies
571
+				)
572
+			);
573
+			return $form_section;
574
+		} else {
575
+			throw new EE_Error(
576
+				sprintf(
577
+					__(
578
+						'The EE_Payment_Method_Form for the "%1$s" payment method is missing or invalid.',
579
+						'event_espresso'
580
+					),
581
+					$payment_method_name
582
+				)
583
+			);
584
+		}
585
+	}
586
+
587
+
588
+	/**
589
+	 * _update_payment_method_button
590
+	 *
591
+	 * @access protected
592
+	 * @param \EE_Payment_Method $payment_method
593
+	 * @return \EE_Form_Section_HTML
594
+	 */
595
+	protected function _update_payment_method_button(EE_Payment_Method $payment_method)
596
+	{
597
+		$update_button = new EE_Submit_Input(
598
+			array(
599
+				'name'       => 'submit',
600
+				'html_id'    => 'save_' . $payment_method->slug() . '_settings',
601
+				'default'    => sprintf(
602
+					__('Update %s Payment Settings', 'event_espresso'),
603
+					$payment_method->admin_name()
604
+				),
605
+				'html_label' => EEH_HTML::nbsp(),
606
+			)
607
+		);
608
+		return new EE_Form_Section_HTML(
609
+			EEH_HTML::no_row(EEH_HTML::br(2)) .
610
+			EEH_HTML::tr(
611
+				EEH_HTML::th(__('Update Settings', 'event_espresso')) .
612
+				EEH_HTML::td(
613
+					$update_button->get_html_for_input()
614
+				)
615
+			)
616
+		);
617
+	}
618
+
619
+
620
+	/**
621
+	 * _deactivate_payment_method_button
622
+	 *
623
+	 * @access protected
624
+	 * @param \EE_Payment_Method $payment_method
625
+	 * @return \EE_Form_Section_Proper
626
+	 */
627
+	protected function _deactivate_payment_method_button(EE_Payment_Method $payment_method)
628
+	{
629
+		$link_text_and_title = sprintf(
630
+			__('Deactivate %1$s Payments?', 'event_espresso'),
631
+			$payment_method->admin_name()
632
+		);
633
+		return new EE_Form_Section_HTML(
634
+			EEH_HTML::tr(
635
+				EEH_HTML::th(__('Deactivate Payment Method', 'event_espresso')) .
636
+				EEH_HTML::td(
637
+					EEH_HTML::link(
638
+						EE_Admin_Page::add_query_args_and_nonce(
639
+							array(
640
+								'action'         => 'deactivate_payment_method',
641
+								'payment_method' => $payment_method->slug(),
642
+							),
643
+							EE_PAYMENTS_ADMIN_URL
644
+						),
645
+						$link_text_and_title,
646
+						$link_text_and_title,
647
+						'deactivate_' . $payment_method->slug(),
648
+						'espresso-button button-secondary'
649
+					)
650
+				)
651
+			)
652
+		);
653
+	}
654
+
655
+
656
+	/**
657
+	 * _activate_payment_method_button
658
+	 *
659
+	 * @access protected
660
+	 * @param \EE_Payment_Method $payment_method
661
+	 * @return \EE_Form_Section_Proper
662
+	 */
663
+	protected function _activate_payment_method_button(EE_Payment_Method $payment_method)
664
+	{
665
+		$link_text_and_title = sprintf(
666
+			__('Activate %1$s Payment Method?', 'event_espresso'),
667
+			$payment_method->admin_name()
668
+		);
669
+		return new EE_Form_Section_Proper(
670
+			array(
671
+				'name'            => 'activate_' . $payment_method->slug() . '_settings_form',
672
+				'html_id'         => 'activate_' . $payment_method->slug() . '_settings_form',
673
+				'action'          => '#',
674
+				'layout_strategy' => new EE_Admin_Two_Column_Layout(),
675
+				'subsections'     => apply_filters(
676
+					'FHEE__Payments_Admin_Page___activate_payment_method_button__form_subsections',
677
+					array(
678
+						new EE_Form_Section_HTML(
679
+							EEH_HTML::tr(
680
+								EEH_HTML::td(
681
+									$payment_method->type_obj()->introductory_html(),
682
+									'',
683
+									'',
684
+									'',
685
+									'colspan="2"'
686
+								)
687
+							) .
688
+							EEH_HTML::tr(
689
+								EEH_HTML::th(
690
+									EEH_HTML::label(__('Click to Activate ', 'event_espresso'))
691
+								) .
692
+								EEH_HTML::td(
693
+									EEH_HTML::link(
694
+										EE_Admin_Page::add_query_args_and_nonce(
695
+											array(
696
+												'action'              => 'activate_payment_method',
697
+												'payment_method_type' => $payment_method->type(),
698
+											),
699
+											EE_PAYMENTS_ADMIN_URL
700
+										),
701
+										$link_text_and_title,
702
+										$link_text_and_title,
703
+										'activate_' . $payment_method->slug(),
704
+										'espresso-button-green button-primary'
705
+									)
706
+								)
707
+							)
708
+						),
709
+					),
710
+					$payment_method
711
+				),
712
+			)
713
+		);
714
+	}
715
+
716
+
717
+	/**
718
+	 * _fine_print
719
+	 *
720
+	 * @access protected
721
+	 * @return \EE_Form_Section_HTML
722
+	 */
723
+	protected function _fine_print()
724
+	{
725
+		return new EE_Form_Section_HTML(
726
+			EEH_HTML::tr(
727
+				EEH_HTML::th() .
728
+				EEH_HTML::td(
729
+					EEH_HTML::p(__('All fields marked with a * are required fields', 'event_espresso'), '', 'grey-text')
730
+				)
731
+			)
732
+		);
733
+	}
734
+
735
+
736
+	/**
737
+	 * Activates a payment method of that type. Mostly assuming there is only 1 of that type (or none so far)
738
+	 *
739
+	 * @global WP_User $current_user
740
+	 */
741
+	protected function _activate_payment_method()
742
+	{
743
+		if (isset($this->_req_data['payment_method_type'])) {
744
+			$payment_method_type = sanitize_text_field($this->_req_data['payment_method_type']);
745
+			// see if one exists
746
+			EE_Registry::instance()->load_lib('Payment_Method_Manager');
747
+			$payment_method = EE_Payment_Method_Manager::instance()
748
+													   ->activate_a_payment_method_of_type($payment_method_type);
749
+			$this->_redirect_after_action(
750
+				1,
751
+				'Payment Method',
752
+				'activated',
753
+				array('action' => 'default', 'payment_method' => $payment_method->slug())
754
+			);
755
+		} else {
756
+			$this->_redirect_after_action(false, 'Payment Method', 'activated', array('action' => 'default'));
757
+		}
758
+	}
759
+
760
+
761
+	/**
762
+	 * Deactivates the payment method with the specified slug, and redirects.
763
+	 */
764
+	protected function _deactivate_payment_method()
765
+	{
766
+		if (isset($this->_req_data['payment_method'])) {
767
+			$payment_method_slug = sanitize_key($this->_req_data['payment_method']);
768
+			// deactivate it
769
+			EE_Registry::instance()->load_lib('Payment_Method_Manager');
770
+			$count_updated = EE_Payment_Method_Manager::instance()->deactivate_payment_method($payment_method_slug);
771
+			$this->_redirect_after_action(
772
+				$count_updated,
773
+				'Payment Method',
774
+				'deactivated',
775
+				array('action' => 'default', 'payment_method' => $payment_method_slug)
776
+			);
777
+		} else {
778
+			$this->_redirect_after_action(false, 'Payment Method', 'deactivated', array('action' => 'default'));
779
+		}
780
+	}
781
+
782
+
783
+	/**
784
+	 * Processes the payment method form that was submitted. This is slightly trickier than usual form
785
+	 * processing because we first need to identify WHICH form was processed and which payment method
786
+	 * it corresponds to. Once we have done that, we see if the form is valid. If it is, the
787
+	 * form's data is saved and we redirect to the default payment methods page, setting the updated payment method
788
+	 * as the currently-selected one. If it DOESN'T validate, we render the page with the form's errors (in the
789
+	 * subsequently called 'headers_sent_func' which is _payment_methods_list)
790
+	 *
791
+	 * @return void
792
+	 */
793
+	protected function _update_payment_method()
794
+	{
795
+		if ($_SERVER['REQUEST_METHOD'] == 'POST') {
796
+			// ok let's find which gateway form to use based on the form input
797
+			EE_Registry::instance()->load_lib('Payment_Method_Manager');
798
+			/** @var $correct_pmt_form_to_use EE_Payment_Method_Form */
799
+			$correct_pmt_form_to_use = null;
800
+			$payment_method = null;
801
+			foreach (EEM_Payment_Method::instance()->get_all() as $payment_method) {
802
+				// get the form and simplify it, like what we do when we display it
803
+				$pmt_form = $this->_generate_payment_method_settings_form($payment_method);
804
+				if ($pmt_form->form_data_present_in($this->_req_data)) {
805
+					$correct_pmt_form_to_use = $pmt_form;
806
+					break;
807
+				}
808
+			}
809
+			// if we couldn't find the correct payment method type...
810
+			if (! $correct_pmt_form_to_use) {
811
+				EE_Error::add_error(
812
+					__(
813
+						"We could not find which payment method type your form submission related to. Please contact support",
814
+						'event_espresso'
815
+					),
816
+					__FILE__,
817
+					__FUNCTION__,
818
+					__LINE__
819
+				);
820
+				$this->_redirect_after_action(false, 'Payment Method', 'activated', array('action' => 'default'));
821
+			}
822
+			$correct_pmt_form_to_use->receive_form_submission($this->_req_data);
823
+			if ($correct_pmt_form_to_use->is_valid()) {
824
+				$payment_settings_subform = $correct_pmt_form_to_use->get_subsection('payment_method_settings');
825
+				if (! $payment_settings_subform instanceof EE_Payment_Method_Form) {
826
+					throw new EE_Error(
827
+						sprintf(
828
+							__(
829
+								'The payment method could not be saved because the form sections were misnamed. We expected to find %1$s, but did not.',
830
+								'event_espresso'
831
+							),
832
+							'payment_method_settings'
833
+						)
834
+					);
835
+				}
836
+				$payment_settings_subform->save();
837
+				/** @var $pm EE_Payment_Method */
838
+				$this->_redirect_after_action(
839
+					true,
840
+					'Payment Method',
841
+					'updated',
842
+					array('action' => 'default', 'payment_method' => $payment_method->slug())
843
+				);
844
+			} else {
845
+				EE_Error::add_error(
846
+					sprintf(
847
+						__(
848
+							'Payment method of type %s was not saved because there were validation errors. They have been marked in the form',
849
+							'event_espresso'
850
+						),
851
+						$payment_method instanceof EE_Payment_Method ? $payment_method->type_obj()->pretty_name()
852
+							: __('"(unknown)"', 'event_espresso')
853
+					),
854
+					__FILE__,
855
+					__FUNCTION__,
856
+					__LINE__
857
+				);
858
+			}
859
+		}
860
+		return;
861
+	}
862
+
863
+
864
+	/**
865
+	 * Displays payment settings (not payment METHOD settings, that's _payment_method_settings)
866
+	 * @throws DomainException
867
+	 * @throws EE_Error
868
+	 * @throws InvalidArgumentException
869
+	 * @throws \EventEspresso\core\exceptions\InvalidDataTypeException
870
+	 * @throws \EventEspresso\core\exceptions\InvalidInterfaceException
871
+	 */
872
+	protected function _payment_settings()
873
+	{
874
+		$form = $this->getPaymentSettingsForm();
875
+		$this->_set_add_edit_form_tags('update_payment_settings');
876
+		$this->_set_publish_post_box_vars(null, false, false, null, false);
877
+		$this->_template_args['admin_page_content'] =  $form->get_html_and_js();
878
+		$this->display_admin_page_with_sidebar();
879
+	}
880
+
881
+
882
+	/**
883
+	 *        _update_payment_settings
884
+	 *
885
+	 * @access protected
886
+	 * @return void
887
+	 * @throws EE_Error
888
+	 * @throws InvalidArgumentException
889
+	 * @throws \EventEspresso\core\exceptions\InvalidDataTypeException
890
+	 * @throws \EventEspresso\core\exceptions\InvalidInterfaceException
891
+	 */
892
+	protected function _update_payment_settings()
893
+	{
894
+		$form = $this->getPaymentSettingsForm();
895
+		if ($form->was_submitted($this->_req_data)) {
896
+			$form->receive_form_submission($this->_req_data);
897
+			if ($form->is_valid()) {
898
+				/**
899
+				 * @var $reg_config EE_Registration_Config
900
+				 */
901
+				$loader = LoaderFactory::getLoader();
902
+				$reg_config = $loader->getShared('EE_Registration_Config');
903
+				$valid_data = $form->valid_data();
904
+				$reg_config->show_pending_payment_options = $valid_data['show_pending_payment_options'];
905
+				$reg_config->gateway_log_lifespan = $valid_data['gateway_log_lifespan'];
906
+			}
907
+		}
908
+		EE_Registry::instance()->CFG = apply_filters(
909
+			'FHEE__Payments_Admin_Page___update_payment_settings__CFG',
910
+			EE_Registry::instance()->CFG
911
+		);
912
+
913
+		$cfg =  EE_Registry::instance()->CFG ;
914
+
915
+		$what = __('Payment Settings', 'event_espresso');
916
+		$success = $this->_update_espresso_configuration(
917
+			$what,
918
+			EE_Registry::instance()->CFG,
919
+			__FILE__,
920
+			__FUNCTION__,
921
+			__LINE__
922
+		);
923
+		$this->_redirect_after_action(
924
+			$success,
925
+			$what,
926
+			__('updated', 'event_espresso'),
927
+			array('action' => 'payment_settings')
928
+		);
929
+	}
930
+
931
+
932
+	/**
933
+	 * Gets the form used for updating payment settings
934
+	 *
935
+	 * @return EE_Form_Section_Proper
936
+	 * @throws EE_Error
937
+	 * @throws InvalidArgumentException
938
+	 * @throws \EventEspresso\core\exceptions\InvalidDataTypeException
939
+	 * @throws \EventEspresso\core\exceptions\InvalidInterfaceException
940
+	 */
941
+	protected function getPaymentSettingsForm()
942
+	{
943
+		/**
944
+		 * @var $reg_config EE_Registration_Config
945
+		 */
946
+		$reg_config = LoaderFactory::getLoader()->getShared('EE_Registration_Config');
947
+		return new EE_Form_Section_Proper(
948
+			array(
949
+				'name' => 'payment-settings',
950
+				'layout_strategy' => new EE_Admin_Two_Column_Layout(),
951
+				'subsections' => array(
952
+					'show_pending_payment_options' => new EE_Yes_No_Input(
953
+						array(
954
+							'html_name' => 'show_pending_payment_options',
955
+							'default' => $reg_config->show_pending_payment_options,
956
+							'html_help_text' => esc_html__(
957
+								"If a payment is marked as 'Pending Payment', or if payment is deferred (ie, an offline gateway like Check, Bank, or Invoice is used), then give registrants the option to retry payment. ",
958
+								'event_espresso'
959
+							)
960
+						)
961
+					),
962
+					'gateway_log_lifespan' => new \EE_Select_Input(
963
+						$reg_config->gatewayLogLifespanOptions(),
964
+						array(
965
+							'html_label_text' => esc_html__('Gateway Logs Lifespan', 'event_espresso'),
966
+							'html_help_text' => esc_html__('If issues arise with payments being made through a payment gateway, it\'s helpful to log non-sensitive communications with the payment gateway. But it\'s a security responsibility, so it\'s a good idea to not keep them for any longer than necessary.', 'event_espresso'),
967
+							'default' => $reg_config->gateway_log_lifespan,
968
+						)
969
+					)
970
+				)
971
+			)
972
+		);
973
+	}
974
+
975
+
976
+	protected function _payment_log_overview_list_table()
977
+	{
978
+		$this->display_admin_list_table_page_with_sidebar();
979
+	}
980
+
981
+
982
+	protected function _set_list_table_views_payment_log()
983
+	{
984
+		$this->_views = array(
985
+			'all' => array(
986
+				'slug'  => 'all',
987
+				'label' => __('View All Logs', 'event_espresso'),
988
+				'count' => 0,
989
+			),
990
+		);
991
+	}
992
+
993
+
994
+	/**
995
+	 * @param int  $per_page
996
+	 * @param int  $current_page
997
+	 * @param bool $count
998
+	 * @return array
999
+	 */
1000
+	public function get_payment_logs($per_page = 50, $current_page = 0, $count = false)
1001
+	{
1002
+		EE_Registry::instance()->load_model('Change_Log');
1003
+		// we may need to do multiple queries (joining differently), so we actually wan tan array of query params
1004
+		$query_params = array(array('LOG_type' => EEM_Change_Log::type_gateway));
1005
+		// check if they've selected a specific payment method
1006
+		if (isset($this->_req_data['_payment_method']) && $this->_req_data['_payment_method'] !== 'all') {
1007
+			$query_params[0]['OR*pm_or_pay_pm'] = array(
1008
+				'Payment.Payment_Method.PMD_ID' => $this->_req_data['_payment_method'],
1009
+				'Payment_Method.PMD_ID'         => $this->_req_data['_payment_method'],
1010
+			);
1011
+		}
1012
+		// take into account search
1013
+		if (isset($this->_req_data['s']) && $this->_req_data['s']) {
1014
+			$similarity_string = array('LIKE', '%' . str_replace("", "%", $this->_req_data['s']) . '%');
1015
+			$query_params[0]['OR*s']['Payment.Transaction.Registration.Attendee.ATT_fname'] = $similarity_string;
1016
+			$query_params[0]['OR*s']['Payment.Transaction.Registration.Attendee.ATT_lname'] = $similarity_string;
1017
+			$query_params[0]['OR*s']['Payment.Transaction.Registration.Attendee.ATT_email'] = $similarity_string;
1018
+			$query_params[0]['OR*s']['Payment.Payment_Method.PMD_name'] = $similarity_string;
1019
+			$query_params[0]['OR*s']['Payment.Payment_Method.PMD_admin_name'] = $similarity_string;
1020
+			$query_params[0]['OR*s']['Payment.Payment_Method.PMD_type'] = $similarity_string;
1021
+			$query_params[0]['OR*s']['LOG_message'] = $similarity_string;
1022
+			$query_params[0]['OR*s']['Payment_Method.PMD_name'] = $similarity_string;
1023
+			$query_params[0]['OR*s']['Payment_Method.PMD_admin_name'] = $similarity_string;
1024
+			$query_params[0]['OR*s']['Payment_Method.PMD_type'] = $similarity_string;
1025
+			$query_params[0]['OR*s']['LOG_message'] = $similarity_string;
1026
+		}
1027
+		if (isset($this->_req_data['payment-filter-start-date'])
1028
+			&& isset($this->_req_data['payment-filter-end-date'])
1029
+		) {
1030
+			// add date
1031
+			$start_date = wp_strip_all_tags($this->_req_data['payment-filter-start-date']);
1032
+			$end_date = wp_strip_all_tags($this->_req_data['payment-filter-end-date']);
1033
+			// make sure our timestamps start and end right at the boundaries for each day
1034
+			$start_date = date('Y-m-d', strtotime($start_date)) . ' 00:00:00';
1035
+			$end_date = date('Y-m-d', strtotime($end_date)) . ' 23:59:59';
1036
+			// convert to timestamps
1037
+			$start_date = strtotime($start_date);
1038
+			$end_date = strtotime($end_date);
1039
+			// makes sure start date is the lowest value and vice versa
1040
+			$start_date = min($start_date, $end_date);
1041
+			$end_date = max($start_date, $end_date);
1042
+			// convert for query
1043
+			$start_date = EEM_Change_Log::instance()
1044
+										->convert_datetime_for_query(
1045
+											'LOG_time',
1046
+											date('Y-m-d H:i:s', $start_date),
1047
+											'Y-m-d H:i:s'
1048
+										);
1049
+			$end_date = EEM_Change_Log::instance()
1050
+									  ->convert_datetime_for_query(
1051
+										  'LOG_time',
1052
+										  date('Y-m-d H:i:s', $end_date),
1053
+										  'Y-m-d H:i:s'
1054
+									  );
1055
+			$query_params[0]['LOG_time'] = array('BETWEEN', array($start_date, $end_date));
1056
+		}
1057
+		if ($count) {
1058
+			return EEM_Change_Log::instance()->count($query_params);
1059
+		}
1060
+		if (isset($this->_req_data['order'])) {
1061
+			$sort = (isset($this->_req_data['order']) && ! empty($this->_req_data['order'])) ? $this->_req_data['order']
1062
+				: 'DESC';
1063
+			$query_params['order_by'] = array('LOG_time' => $sort);
1064
+		} else {
1065
+			$query_params['order_by'] = array('LOG_time' => 'DESC');
1066
+		}
1067
+		$offset = ($current_page - 1) * $per_page;
1068
+		if (! isset($this->_req_data['download_results'])) {
1069
+			$query_params['limit'] = array($offset, $per_page);
1070
+		}
1071
+		// now they've requested to instead just download the file instead of viewing it.
1072
+		if (isset($this->_req_data['download_results'])) {
1073
+			$wpdb_results = EEM_Change_Log::instance()->get_all_efficiently($query_params);
1074
+			header('Content-Disposition: attachment');
1075
+			header("Content-Disposition: attachment; filename=ee_payment_logs_for_" . sanitize_key(site_url()));
1076
+			echo "<h1>Payment Logs for " . site_url() . "</h1>";
1077
+			echo "<h3>Query:</h3>";
1078
+			var_dump($query_params);
1079
+			echo "<h3>Results:</h3>";
1080
+			var_dump($wpdb_results);
1081
+			die;
1082
+		}
1083
+		$results = EEM_Change_Log::instance()->get_all($query_params);
1084
+		return $results;
1085
+	}
1086
+
1087
+
1088
+	/**
1089
+	 * Used by usort to RE-sort log query results, because we lose the ordering
1090
+	 * because we're possibly combining the results from two queries
1091
+	 *
1092
+	 * @param EE_Change_Log $logA
1093
+	 * @param EE_Change_Log $logB
1094
+	 * @return int
1095
+	 */
1096
+	protected function _sort_logs_again($logA, $logB)
1097
+	{
1098
+		$timeA = $logA->get_raw('LOG_time');
1099
+		$timeB = $logB->get_raw('LOG_time');
1100
+		if ($timeA == $timeB) {
1101
+			return 0;
1102
+		}
1103
+		$comparison = $timeA < $timeB ? -1 : 1;
1104
+		if (strtoupper($this->_sort_logs_again_direction) == 'DESC') {
1105
+			return $comparison * -1;
1106
+		} else {
1107
+			return $comparison;
1108
+		}
1109
+	}
1110
+
1111
+
1112
+	protected function _payment_log_details()
1113
+	{
1114
+		EE_Registry::instance()->load_model('Change_Log');
1115
+		/** @var $payment_log EE_Change_Log */
1116
+		$payment_log = EEM_Change_Log::instance()->get_one_by_ID($this->_req_data['ID']);
1117
+		$payment_method = null;
1118
+		$transaction = null;
1119
+		if ($payment_log instanceof EE_Change_Log) {
1120
+			if ($payment_log->object() instanceof EE_Payment) {
1121
+				$payment_method = $payment_log->object()->payment_method();
1122
+				$transaction = $payment_log->object()->transaction();
1123
+			} elseif ($payment_log->object() instanceof EE_Payment_Method) {
1124
+				$payment_method = $payment_log->object();
1125
+			}
1126
+		}
1127
+		$this->_template_args['admin_page_content'] = EEH_Template::display_template(
1128
+			EE_PAYMENTS_TEMPLATE_PATH . 'payment_log_details.template.php',
1129
+			array(
1130
+				'payment_log'    => $payment_log,
1131
+				'payment_method' => $payment_method,
1132
+				'transaction'    => $transaction,
1133
+			),
1134
+			true
1135
+		);
1136
+		$this->display_admin_page_with_sidebar();
1137
+	}
1138 1138
 }
Please login to merge, or discard this patch.
Spacing   +42 added lines, -42 removed lines patch added patch discarded remove patch
@@ -170,7 +170,7 @@  discard block
 block discarded – undo
170 170
         $payment_method_types = EE_Payment_Method_Manager::instance()->payment_method_types();
171 171
         $all_pmt_help_tabs_config = array();
172 172
         foreach ($payment_method_types as $payment_method_type) {
173
-            if (! EE_Registry::instance()->CAP->current_user_can(
173
+            if ( ! EE_Registry::instance()->CAP->current_user_can(
174 174
                 $payment_method_type->cap_name(),
175 175
                 'specific_payment_method_type_access'
176 176
             )
@@ -180,10 +180,10 @@  discard block
 block discarded – undo
180 180
             foreach ($payment_method_type->help_tabs_config() as $help_tab_name => $config) {
181 181
                 $template_args = isset($config['template_args']) ? $config['template_args'] : array();
182 182
                 $template_args['admin_page_obj'] = $this;
183
-                $all_pmt_help_tabs_config[ $help_tab_name ] = array(
183
+                $all_pmt_help_tabs_config[$help_tab_name] = array(
184 184
                     'title'   => $config['title'],
185 185
                     'content' => EEH_Template::display_template(
186
-                        $payment_method_type->file_folder() . 'help_tabs' . DS . $config['filename'] . '.help_tab.php',
186
+                        $payment_method_type->file_folder().'help_tabs'.DS.$config['filename'].'.help_tab.php',
187 187
                         $template_args,
188 188
                         true
189 189
                     ),
@@ -226,7 +226,7 @@  discard block
 block discarded – undo
226 226
         wp_enqueue_script('ee-text-links');
227 227
         wp_enqueue_script(
228 228
             'espresso_payments',
229
-            EE_PAYMENTS_ASSETS_URL . 'espresso_payments_admin.js',
229
+            EE_PAYMENTS_ASSETS_URL.'espresso_payments_admin.js',
230 230
             array('espresso-ui-theme', 'ee-datepicker'),
231 231
             EVENT_ESPRESSO_VERSION,
232 232
             true
@@ -239,7 +239,7 @@  discard block
 block discarded – undo
239 239
         // styles
240 240
         wp_register_style(
241 241
             'espresso_payments',
242
-            EE_PAYMENTS_ASSETS_URL . 'ee-payments.css',
242
+            EE_PAYMENTS_ASSETS_URL.'ee-payments.css',
243 243
             array(),
244 244
             EVENT_ESPRESSO_VERSION
245 245
         );
@@ -268,7 +268,7 @@  discard block
 block discarded – undo
268 268
                 continue;
269 269
             }
270 270
             // check access
271
-            if (! EE_Registry::instance()->CAP->current_user_can(
271
+            if ( ! EE_Registry::instance()->CAP->current_user_can(
272 272
                 $pmt_obj->cap_name(),
273 273
                 'specific_payment_method_type_access'
274 274
             )
@@ -277,7 +277,7 @@  discard block
 block discarded – undo
277 277
             }
278 278
             // check for any active pms of that type
279 279
             $payment_method = EEM_Payment_Method::instance()->get_one_of_type($pmt_obj->system_name());
280
-            if (! $payment_method instanceof EE_Payment_Method) {
280
+            if ( ! $payment_method instanceof EE_Payment_Method) {
281 281
                 $payment_method = EE_Payment_Method::new_instance(
282 282
                     array(
283 283
                         'PMD_slug'       => sanitize_key($pmt_obj->system_name()),
@@ -287,7 +287,7 @@  discard block
 block discarded – undo
287 287
                     )
288 288
                 );
289 289
             }
290
-            $payment_methods[ $payment_method->slug() ] = $payment_method;
290
+            $payment_methods[$payment_method->slug()] = $payment_method;
291 291
         }
292 292
         $payment_methods = apply_filters(
293 293
             'FHEE__Payments_Admin_Page___payment_methods_list__payment_methods',
@@ -297,7 +297,7 @@  discard block
 block discarded – undo
297 297
             if ($payment_method instanceof EE_Payment_Method) {
298 298
                 add_meta_box(
299 299
                     // html id
300
-                    'espresso_' . $payment_method->slug() . '_payment_settings',
300
+                    'espresso_'.$payment_method->slug().'_payment_settings',
301 301
                     // title
302 302
                     sprintf(__('%s Settings', 'event_espresso'), $payment_method->admin_name()),
303 303
                     // callback
@@ -312,10 +312,10 @@  discard block
 block discarded – undo
312 312
                     array('payment_method' => $payment_method)
313 313
                 );
314 314
                 // setup for tabbed content
315
-                $tabs[ $payment_method->slug() ] = array(
315
+                $tabs[$payment_method->slug()] = array(
316 316
                     'label' => $payment_method->admin_name(),
317 317
                     'class' => $payment_method->active() ? 'gateway-active' : '',
318
-                    'href'  => 'espresso_' . $payment_method->slug() . '_payment_settings',
318
+                    'href'  => 'espresso_'.$payment_method->slug().'_payment_settings',
319 319
                     'title' => __('Modify this Payment Method', 'event_espresso'),
320 320
                     'slug'  => $payment_method->slug(),
321 321
                 );
@@ -346,7 +346,7 @@  discard block
 block discarded – undo
346 346
         }
347 347
         $payment_method = EEM_Payment_Method::instance()->get_one(array(array('PMD_slug' => $payment_method_slug)));
348 348
         // if that didn't work or wasn't provided, find another way to select the current pm
349
-        if (! $this->_verify_payment_method($payment_method)) {
349
+        if ( ! $this->_verify_payment_method($payment_method)) {
350 350
             // like, looking for an active one
351 351
             $payment_method = EEM_Payment_Method::instance()->get_one_active('CART');
352 352
             // test that one as well
@@ -395,7 +395,7 @@  discard block
 block discarded – undo
395 395
     {
396 396
         $payment_method = isset($metabox['args'], $metabox['args']['payment_method'])
397 397
             ? $metabox['args']['payment_method'] : null;
398
-        if (! $payment_method instanceof EE_Payment_Method) {
398
+        if ( ! $payment_method instanceof EE_Payment_Method) {
399 399
             throw new EE_Error(
400 400
                 sprintf(
401 401
                     __(
@@ -412,7 +412,7 @@  discard block
 block discarded – undo
412 412
             if ($form->form_data_present_in($this->_req_data)) {
413 413
                 $form->receive_form_submission($this->_req_data);
414 414
             }
415
-            echo $form->form_open() . $form->get_html_and_js() . $form->form_close();
415
+            echo $form->form_open().$form->get_html_and_js().$form->form_close();
416 416
         } else {
417 417
             echo $this->_activate_payment_method_button($payment_method)->get_html_and_js();
418 418
         }
@@ -428,13 +428,13 @@  discard block
 block discarded – undo
428 428
      */
429 429
     protected function _generate_payment_method_settings_form(EE_Payment_Method $payment_method)
430 430
     {
431
-        if (! $payment_method instanceof EE_Payment_Method) {
431
+        if ( ! $payment_method instanceof EE_Payment_Method) {
432 432
             return new EE_Form_Section_Proper();
433 433
         }
434 434
         return new EE_Form_Section_Proper(
435 435
             array(
436
-                'name'            => $payment_method->slug() . '_settings_form',
437
-                'html_id'         => $payment_method->slug() . '_settings_form',
436
+                'name'            => $payment_method->slug().'_settings_form',
437
+                'html_id'         => $payment_method->slug().'_settings_form',
438 438
                 'action'          => EE_Admin_Page::add_query_args_and_nonce(
439 439
                     array(
440 440
                         'action'         => 'update_payment_method',
@@ -476,7 +476,7 @@  discard block
 block discarded – undo
476 476
                         EEH_HTML::label(
477 477
                             EEH_HTML::strong(__('IMPORTANT', 'event_espresso'), '', 'important-notice')
478 478
                         )
479
-                    ) .
479
+                    ).
480 480
                     EEH_HTML::td(
481 481
                         EEH_HTML::strong(
482 482
                             __(
@@ -510,14 +510,14 @@  discard block
 block discarded – undo
510 510
      */
511 511
     protected function _currency_support(EE_Payment_Method $payment_method)
512 512
     {
513
-        if (! $payment_method->usable_for_currency(EE_Config::instance()->currency->code)) {
513
+        if ( ! $payment_method->usable_for_currency(EE_Config::instance()->currency->code)) {
514 514
             return new EE_Form_Section_HTML(
515 515
                 EEH_HTML::tr(
516 516
                     EEH_HTML::th(
517 517
                         EEH_HTML::label(
518 518
                             EEH_HTML::strong(__('IMPORTANT', 'event_espresso'), '', 'important-notice')
519 519
                         )
520
-                    ) .
520
+                    ).
521 521
                     EEH_HTML::td(
522 522
                         EEH_HTML::strong(
523 523
                             sprintf(
@@ -597,7 +597,7 @@  discard block
 block discarded – undo
597 597
         $update_button = new EE_Submit_Input(
598 598
             array(
599 599
                 'name'       => 'submit',
600
-                'html_id'    => 'save_' . $payment_method->slug() . '_settings',
600
+                'html_id'    => 'save_'.$payment_method->slug().'_settings',
601 601
                 'default'    => sprintf(
602 602
                     __('Update %s Payment Settings', 'event_espresso'),
603 603
                     $payment_method->admin_name()
@@ -606,9 +606,9 @@  discard block
 block discarded – undo
606 606
             )
607 607
         );
608 608
         return new EE_Form_Section_HTML(
609
-            EEH_HTML::no_row(EEH_HTML::br(2)) .
609
+            EEH_HTML::no_row(EEH_HTML::br(2)).
610 610
             EEH_HTML::tr(
611
-                EEH_HTML::th(__('Update Settings', 'event_espresso')) .
611
+                EEH_HTML::th(__('Update Settings', 'event_espresso')).
612 612
                 EEH_HTML::td(
613 613
                     $update_button->get_html_for_input()
614 614
                 )
@@ -632,7 +632,7 @@  discard block
 block discarded – undo
632 632
         );
633 633
         return new EE_Form_Section_HTML(
634 634
             EEH_HTML::tr(
635
-                EEH_HTML::th(__('Deactivate Payment Method', 'event_espresso')) .
635
+                EEH_HTML::th(__('Deactivate Payment Method', 'event_espresso')).
636 636
                 EEH_HTML::td(
637 637
                     EEH_HTML::link(
638 638
                         EE_Admin_Page::add_query_args_and_nonce(
@@ -644,7 +644,7 @@  discard block
 block discarded – undo
644 644
                         ),
645 645
                         $link_text_and_title,
646 646
                         $link_text_and_title,
647
-                        'deactivate_' . $payment_method->slug(),
647
+                        'deactivate_'.$payment_method->slug(),
648 648
                         'espresso-button button-secondary'
649 649
                     )
650 650
                 )
@@ -668,8 +668,8 @@  discard block
 block discarded – undo
668 668
         );
669 669
         return new EE_Form_Section_Proper(
670 670
             array(
671
-                'name'            => 'activate_' . $payment_method->slug() . '_settings_form',
672
-                'html_id'         => 'activate_' . $payment_method->slug() . '_settings_form',
671
+                'name'            => 'activate_'.$payment_method->slug().'_settings_form',
672
+                'html_id'         => 'activate_'.$payment_method->slug().'_settings_form',
673 673
                 'action'          => '#',
674 674
                 'layout_strategy' => new EE_Admin_Two_Column_Layout(),
675 675
                 'subsections'     => apply_filters(
@@ -684,11 +684,11 @@  discard block
 block discarded – undo
684 684
                                     '',
685 685
                                     'colspan="2"'
686 686
                                 )
687
-                            ) .
687
+                            ).
688 688
                             EEH_HTML::tr(
689 689
                                 EEH_HTML::th(
690 690
                                     EEH_HTML::label(__('Click to Activate ', 'event_espresso'))
691
-                                ) .
691
+                                ).
692 692
                                 EEH_HTML::td(
693 693
                                     EEH_HTML::link(
694 694
                                         EE_Admin_Page::add_query_args_and_nonce(
@@ -700,7 +700,7 @@  discard block
 block discarded – undo
700 700
                                         ),
701 701
                                         $link_text_and_title,
702 702
                                         $link_text_and_title,
703
-                                        'activate_' . $payment_method->slug(),
703
+                                        'activate_'.$payment_method->slug(),
704 704
                                         'espresso-button-green button-primary'
705 705
                                     )
706 706
                                 )
@@ -724,7 +724,7 @@  discard block
 block discarded – undo
724 724
     {
725 725
         return new EE_Form_Section_HTML(
726 726
             EEH_HTML::tr(
727
-                EEH_HTML::th() .
727
+                EEH_HTML::th().
728 728
                 EEH_HTML::td(
729 729
                     EEH_HTML::p(__('All fields marked with a * are required fields', 'event_espresso'), '', 'grey-text')
730 730
                 )
@@ -807,7 +807,7 @@  discard block
 block discarded – undo
807 807
                 }
808 808
             }
809 809
             // if we couldn't find the correct payment method type...
810
-            if (! $correct_pmt_form_to_use) {
810
+            if ( ! $correct_pmt_form_to_use) {
811 811
                 EE_Error::add_error(
812 812
                     __(
813 813
                         "We could not find which payment method type your form submission related to. Please contact support",
@@ -822,7 +822,7 @@  discard block
 block discarded – undo
822 822
             $correct_pmt_form_to_use->receive_form_submission($this->_req_data);
823 823
             if ($correct_pmt_form_to_use->is_valid()) {
824 824
                 $payment_settings_subform = $correct_pmt_form_to_use->get_subsection('payment_method_settings');
825
-                if (! $payment_settings_subform instanceof EE_Payment_Method_Form) {
825
+                if ( ! $payment_settings_subform instanceof EE_Payment_Method_Form) {
826 826
                     throw new EE_Error(
827 827
                         sprintf(
828 828
                             __(
@@ -874,7 +874,7 @@  discard block
 block discarded – undo
874 874
         $form = $this->getPaymentSettingsForm();
875 875
         $this->_set_add_edit_form_tags('update_payment_settings');
876 876
         $this->_set_publish_post_box_vars(null, false, false, null, false);
877
-        $this->_template_args['admin_page_content'] =  $form->get_html_and_js();
877
+        $this->_template_args['admin_page_content'] = $form->get_html_and_js();
878 878
         $this->display_admin_page_with_sidebar();
879 879
     }
880 880
 
@@ -910,7 +910,7 @@  discard block
 block discarded – undo
910 910
             EE_Registry::instance()->CFG
911 911
         );
912 912
 
913
-        $cfg =  EE_Registry::instance()->CFG ;
913
+        $cfg = EE_Registry::instance()->CFG;
914 914
 
915 915
         $what = __('Payment Settings', 'event_espresso');
916 916
         $success = $this->_update_espresso_configuration(
@@ -1011,7 +1011,7 @@  discard block
 block discarded – undo
1011 1011
         }
1012 1012
         // take into account search
1013 1013
         if (isset($this->_req_data['s']) && $this->_req_data['s']) {
1014
-            $similarity_string = array('LIKE', '%' . str_replace("", "%", $this->_req_data['s']) . '%');
1014
+            $similarity_string = array('LIKE', '%'.str_replace("", "%", $this->_req_data['s']).'%');
1015 1015
             $query_params[0]['OR*s']['Payment.Transaction.Registration.Attendee.ATT_fname'] = $similarity_string;
1016 1016
             $query_params[0]['OR*s']['Payment.Transaction.Registration.Attendee.ATT_lname'] = $similarity_string;
1017 1017
             $query_params[0]['OR*s']['Payment.Transaction.Registration.Attendee.ATT_email'] = $similarity_string;
@@ -1031,8 +1031,8 @@  discard block
 block discarded – undo
1031 1031
             $start_date = wp_strip_all_tags($this->_req_data['payment-filter-start-date']);
1032 1032
             $end_date = wp_strip_all_tags($this->_req_data['payment-filter-end-date']);
1033 1033
             // make sure our timestamps start and end right at the boundaries for each day
1034
-            $start_date = date('Y-m-d', strtotime($start_date)) . ' 00:00:00';
1035
-            $end_date = date('Y-m-d', strtotime($end_date)) . ' 23:59:59';
1034
+            $start_date = date('Y-m-d', strtotime($start_date)).' 00:00:00';
1035
+            $end_date = date('Y-m-d', strtotime($end_date)).' 23:59:59';
1036 1036
             // convert to timestamps
1037 1037
             $start_date = strtotime($start_date);
1038 1038
             $end_date = strtotime($end_date);
@@ -1065,15 +1065,15 @@  discard block
 block discarded – undo
1065 1065
             $query_params['order_by'] = array('LOG_time' => 'DESC');
1066 1066
         }
1067 1067
         $offset = ($current_page - 1) * $per_page;
1068
-        if (! isset($this->_req_data['download_results'])) {
1068
+        if ( ! isset($this->_req_data['download_results'])) {
1069 1069
             $query_params['limit'] = array($offset, $per_page);
1070 1070
         }
1071 1071
         // now they've requested to instead just download the file instead of viewing it.
1072 1072
         if (isset($this->_req_data['download_results'])) {
1073 1073
             $wpdb_results = EEM_Change_Log::instance()->get_all_efficiently($query_params);
1074 1074
             header('Content-Disposition: attachment');
1075
-            header("Content-Disposition: attachment; filename=ee_payment_logs_for_" . sanitize_key(site_url()));
1076
-            echo "<h1>Payment Logs for " . site_url() . "</h1>";
1075
+            header("Content-Disposition: attachment; filename=ee_payment_logs_for_".sanitize_key(site_url()));
1076
+            echo "<h1>Payment Logs for ".site_url()."</h1>";
1077 1077
             echo "<h3>Query:</h3>";
1078 1078
             var_dump($query_params);
1079 1079
             echo "<h3>Results:</h3>";
@@ -1125,7 +1125,7 @@  discard block
 block discarded – undo
1125 1125
             }
1126 1126
         }
1127 1127
         $this->_template_args['admin_page_content'] = EEH_Template::display_template(
1128
-            EE_PAYMENTS_TEMPLATE_PATH . 'payment_log_details.template.php',
1128
+            EE_PAYMENTS_TEMPLATE_PATH.'payment_log_details.template.php',
1129 1129
             array(
1130 1130
                 'payment_log'    => $payment_log,
1131 1131
                 'payment_method' => $payment_method,
Please login to merge, or discard this patch.
core/libraries/form_sections/base/EE_Model_Form_Section.form.php 3 patches
Doc Comments   +1 added lines patch added patch discarded remove patch
@@ -372,6 +372,7 @@
 block discarded – undo
372 372
      * save the relations indicated
373 373
      *
374 374
      * @type string $relation_name
375
+     * @param integer $relation_name
375 376
      * @return bool
376 377
      * @throws EE_Error
377 378
      */
Please login to merge, or discard this patch.
Indentation   +455 added lines, -455 removed lines patch added patch discarded remove patch
@@ -14,459 +14,459 @@
 block discarded – undo
14 14
 class EE_Model_Form_Section extends EE_Form_Section_Proper
15 15
 {
16 16
 
17
-    /**
18
-     * @var EEM_Base
19
-     */
20
-    protected $_model = null;
21
-
22
-    /**
23
-     * @var EE_Base_Class
24
-     */
25
-    protected $_model_object = null;
26
-
27
-
28
-
29
-    /**
30
-     * @param array        $options_array   keys: {
31
-     * @type EEM_Base      $model
32
-     * @type EE_Base_Class $model_object
33
-     * @type array         $subsection_args array keys should be subsection names (that either do or will exist), and
34
-     *       values are the arrays as you would pass them to that subsection
35
-     *                                      }
36
-     * @throws EE_Error
37
-     */
38
-    public function __construct($options_array = array())
39
-    {
40
-        if (isset($options_array['model']) && $options_array['model'] instanceof EEM_Base) {
41
-            $this->_model = $options_array['model'];
42
-        }
43
-        if (! $this->_model || ! $this->_model instanceof EEM_Base) {
44
-            throw new EE_Error(sprintf(__(
45
-                "Model Form Sections must first specify the _model property to be a subclass of EEM_Base",
46
-                "event_espresso"
47
-            )));
48
-        }
49
-        if (isset($options_array['subsection_args'])) {
50
-            $subsection_args = $options_array['subsection_args'];
51
-        } else {
52
-            $subsection_args = array();
53
-        }
54
-        // gather fields and relations to convert to inputs
55
-        // but if they're just going to exclude a field anyways, don't bother converting it to an input
56
-        $exclude = $this->_subsections;
57
-        if (isset($options_array['exclude'])) {
58
-            $exclude = array_merge($exclude, array_flip($options_array['exclude']));
59
-        }
60
-        $model_fields = array_diff_key($this->_model->field_settings(), $exclude);
61
-        $model_relations = array_diff_key($this->_model->relation_settings(), $exclude);
62
-        // convert fields and relations to inputs
63
-        $this->_subsections = array_merge(
64
-            $this->_convert_model_fields_to_inputs($model_fields),
65
-            $this->_convert_model_relations_to_inputs($model_relations, $subsection_args),
66
-            $this->_subsections
67
-        );
68
-        parent::__construct($options_array);
69
-        if (isset($options_array['model_object']) && $options_array['model_object'] instanceof EE_Base_Class) {
70
-            $this->populate_model_obj($options_array['model_object']);
71
-        }
72
-    }
73
-
74
-
75
-
76
-    /**
77
-     * For now, just makes inputs for only HABTM relations
78
-     *
79
-     * @param EE_Model_Relation_Base[] $relations
80
-     * @param array                    $subsection_args keys should be existing or soon-to-be-existing input names, and
81
-     *                                                  their values are {
82
-     * @type array {
83
-     * @type EE_Base_Class[]           $model_objects   if the subsection is an EE_Select_Multi_Model_Input
84
-     *                                                  }
85
-     *                                                  }
86
-     * @return array
87
-     */
88
-    protected function _convert_model_relations_to_inputs($relations, $subsection_args = array())
89
-    {
90
-        $inputs = array();
91
-        foreach ($relations as $relation_name => $relation_obj) {
92
-            $input_constructor_args = array(
93
-                array_merge(
94
-                    array(
95
-                        'required'        => $relation_obj instanceof EE_Belongs_To_Relation,
96
-                        'html_label_text' => $relation_obj instanceof EE_Belongs_To_Relation
97
-                            ? $relation_obj->get_other_model()->item_name(1)
98
-                            : $relation_obj->get_other_model()
99
-                                           ->item_name(2),
100
-                    ),
101
-                    $subsection_args
102
-                ),
103
-            );
104
-            $input = null;
105
-            switch (get_class($relation_obj)) {
106
-                case 'EE_HABTM_Relation':
107
-                    if (isset($subsection_args[ $relation_name ])
108
-                        && isset($subsection_args[ $relation_name ]['model_objects'])
109
-                    ) {
110
-                        $model_objects = $subsection_args[ $relation_name ]['model_objects'];
111
-                    } else {
112
-                        $model_objects = $relation_obj->get_other_model()->get_all();
113
-                    }
114
-                    $input = new EE_Select_Multi_Model_Input($model_objects, $input_constructor_args);
115
-                    break;
116
-                default:
117
-            }
118
-            if ($input) {
119
-                $inputs[ $relation_name ] = $input;
120
-            }
121
-        }
122
-        return $inputs;
123
-    }
124
-
125
-
126
-
127
-    /**
128
-     * Changes model fields into form section inputs
129
-     *
130
-     * @param EE_Model_Field_Base[] $model_fields keys are the model's name
131
-     * @throws EE_Error
132
-     * @return EE_Form_Input_Base[]
133
-     */
134
-    protected function _convert_model_fields_to_inputs($model_fields = array())
135
-    {
136
-        $inputs = array();
137
-        foreach ($model_fields as $field_name => $model_field) {
138
-            if ($model_field instanceof EE_Model_Field_Base) {
139
-                $input_constructor_args = array(
140
-                    array(
141
-                        'required'        => ! $model_field->is_nullable()
142
-                                             && $model_field->get_default_value()
143
-                                                === null,
144
-                        'html_label_text' => $model_field->get_nicename(),
145
-                        'default'         => $model_field->get_default_value(),
146
-                    ),
147
-                );
148
-                switch (get_class($model_field)) {
149
-                    case 'EE_All_Caps_Text_Field':
150
-                    case 'EE_Any_Foreign_Model_Name_Field':
151
-                        $input_class = 'EE_Text_Input';
152
-                        break;
153
-                    case 'EE_Boolean_Field':
154
-                        $input_class = 'EE_Yes_No_Input';
155
-                        break;
156
-                    case 'EE_Datetime_Field':
157
-                        throw new EE_Error(sprintf(__(
158
-                            "Model field '%s' does not yet have a known conversion to form input",
159
-                            "event_espresso"
160
-                        ), get_class($model_field)));
161
-                        break;
162
-                    case 'EE_Email_Field':
163
-                        $input_class = 'EE_Email_Input';
164
-                        break;
165
-                    case 'EE_Enum_Integer_Field':
166
-                        throw new EE_Error(sprintf(__(
167
-                            "Model field '%s' does not yet have a known conversion to form input",
168
-                            "event_espresso"
169
-                        ), get_class($model_field)));
170
-                        break;
171
-                    case 'EE_Enum_Text_Field':
172
-                        throw new EE_Error(sprintf(__(
173
-                            "Model field '%s' does not yet have a known conversion to form input",
174
-                            "event_espresso"
175
-                        ), get_class($model_field)));
176
-                        break;
177
-                    case 'EE_Float_Field':
178
-                        $input_class = 'EE_Float_Input';
179
-                        break;
180
-                    case 'EE_Foreign_Key_Int_Field':
181
-                    case 'EE_Foreign_Key_String_Field':
182
-                    case 'EE_WP_User_Field':
183
-                        $models_pointed_to = $model_field instanceof EE_Field_With_Model_Name
184
-                            ? $model_field->get_model_class_names_pointed_to() : array();
185
-                        if (true || is_array($models_pointed_to) && count($models_pointed_to) > 1) {
186
-                            $input_class = 'EE_Text_Input';
187
-                        } else {
188
-                            // so its just one model
189
-                            $model_name = is_array($models_pointed_to) ? reset($models_pointed_to) : $models_pointed_to;
190
-                            $model = EE_Registry::instance()->load_model($model_name);
191
-                            $model_names = $model->get_all_names(array('limit' => 10));
192
-                            if ($model_field->is_nullable()) {
193
-                                array_unshift($model_names, __("Please Select", 'event_espresso'));
194
-                            }
195
-                            $input_constructor_args[1] = $input_constructor_args[0];
196
-                            $input_constructor_args[0] = $model_names;
197
-                            $input_class = 'EE_Select_Input';
198
-                        }
199
-                        break;
200
-                    case 'EE_Full_HTML_Field':
201
-                        $input_class = 'EE_Text_Area_Input';
202
-                        $input_constructor_args[0]['validation_strategies'] = array(new EE_Full_HTML_Validation_Strategy());
203
-                        break;
204
-                    case 'EE_Infinite_Integer':
205
-                        throw new EE_Error(sprintf(__(
206
-                            "Model field '%s' does not yet have a known conversion to form input",
207
-                            "event_espresso"
208
-                        ), get_class($model_field)));
209
-                        break;
210
-                    case 'EE_Integer_Field':
211
-                        $input_class = 'EE_Text_Input';
212
-                        break;
213
-                    case 'EE_Maybe_Serialized_Text_Field':
214
-                        $input_class = 'EE_Text_Area_Input';
215
-                        break;
216
-                    case 'EE_Money_Field':
217
-                        throw new EE_Error(sprintf(__(
218
-                            "Model field '%s' does not yet have a known conversion to form input",
219
-                            "event_espresso"
220
-                        ), get_class($model_field)));
221
-                        break;
222
-                    case 'EE_Post_Content_Field':
223
-                        $input_class = 'EE_Text_Area_Input';
224
-                        $input_constructor_args[0]['validation_strategies'] = array(new EE_Full_HTML_Validation_Strategy());
225
-                        break;
226
-                    case 'EE_Plain_Text_Field':
227
-                        $input_class = 'EE_Text_Input';
228
-                        break;
229
-                    case 'EE_Primary_Key_Int_Field':
230
-                        $input_class = 'EE_Hidden_Input';
231
-                        $input_constructor_args['normalization_strategy'] = new EE_Int_Normalization();
232
-                        break;
233
-                    case 'EE_Primary_Key_String_Field':
234
-                        $input_class = 'EE_Hidden_Input';
235
-                        break;
236
-                    case 'EE_Serialized_Text_Field':
237
-                        $input_class = 'EE_Text_Area_Input';
238
-                        break;
239
-                    case 'EE_Simple_HTML_Field':
240
-                        $input_class = 'EE_Text_Area_Input';
241
-                        $input_constructor_args[0]['validation_strategies'] = array(new EE_Simple_HTML_Validation_Strategy());
242
-                        break;
243
-                    case 'EE_Slug_Field':
244
-                        $input_class = 'EE_Text_Input';
245
-                        break;
246
-                    case 'EE_Trashed_Flag_Field':
247
-                        $input_class = 'EE_Yes_No_Input';
248
-                        break;
249
-                    case 'EE_WP_Post_Status_Field':
250
-                        throw new EE_Error(sprintf(__(
251
-                            "Model field '%s' does not yet have a known conversion to form input",
252
-                            "event_espresso"
253
-                        ), get_class($model_field)));
254
-                        break;
255
-                    case 'EE_WP_Post_Type_Field':
256
-                        throw new EE_Error(sprintf(__(
257
-                            "Model field '%s' does not yet have a known conversion to form input",
258
-                            "event_espresso"
259
-                        ), get_class($model_field)));
260
-                        break;
261
-                    default:
262
-                        throw new EE_Error(sprintf(__(
263
-                            "Model field of type '%s' does not convert to any known Form Input. Please add a case to EE_Model_Form_section's _convert_model_fields_to_inputs switch statement",
264
-                            "event_espresso"
265
-                        ), get_class($model_field)));
266
-                }
267
-                $reflection = new ReflectionClass($input_class);
268
-                $input = $reflection->newInstanceArgs($input_constructor_args);
269
-                $inputs[ $field_name ] = $input;
270
-            }
271
-        }
272
-        return $inputs;
273
-    }
274
-
275
-
276
-
277
-    /**
278
-     * Mostly the same as populate_defaults , except takes a model object as input, not an array,
279
-     * and also sets the form's _model_object
280
-     *
281
-     * @param EE_Base_Class $model_obj
282
-     * @return void
283
-     */
284
-    public function populate_model_obj($model_obj)
285
-    {
286
-        $model_obj = $this->_model->ensure_is_obj($model_obj);
287
-        $this->_model_object = $model_obj;
288
-        $defaults = $model_obj->model_field_array();
289
-        foreach ($this->_model->relation_settings() as $relation_name => $relation_obj) {
290
-            $subsection = $this->get_subsection($relation_name, false);
291
-            if ($subsection instanceof EE_Form_Input_Base) {
292
-                if ($relation_obj instanceof EE_Belongs_To_Relation) {
293
-                    // then we only expect there to be one
294
-                    $related_item = $this->_model_object->get_first_related($relation_name);
295
-                    $defaults[ $relation_name ] = $related_item->ID();
296
-                } else {
297
-                    $related_items = $this->_model_object->get_many_related($relation_name);
298
-                    $ids = array();
299
-                    foreach ($related_items as $related_item) {
300
-                        $ids[] = $related_item->ID();
301
-                    }
302
-                    $defaults[ $relation_name ] = $ids;
303
-                }
304
-            }
305
-        }
306
-        $defaults = apply_filters(
307
-            'FHEE__EE_Model_Form_Section__populate_model_obj',
308
-            $defaults,
309
-            $this
310
-        );
311
-        $this->populate_defaults($defaults);
312
-    }
313
-
314
-
315
-
316
-    /**
317
-     * Gets all the input values that correspond to model fields. Keys are the input/field names,
318
-     * values are their normalized values
319
-     *
320
-     * @return array
321
-     */
322
-    public function inputs_values_corresponding_to_model_fields()
323
-    {
324
-        return array_intersect_key($this->input_values(), $this->_model->field_settings());
325
-    }
326
-
327
-
328
-
329
-    /**
330
-     * After we've normalized the data as normal, set the corresponding model object
331
-     * on the form.
332
-     *
333
-     * @param array $req_data should usually be $_REQUEST (the default).
334
-     * @return void
335
-     */
336
-    public function _normalize($req_data)
337
-    {
338
-        parent::_normalize($req_data);
339
-        // create or set the model object, if it isn't already
340
-        if (! $this->_model_object) {
341
-            // check to see if the form indicates a PK, in which case we want to only retrieve it and update it
342
-            $pk_name = $this->_model->primary_key_name();
343
-            $model_obj = $this->_model->get_one_by_ID($this->get_input_value($pk_name));
344
-            if ($model_obj) {
345
-                $this->_model_object = $model_obj;
346
-            } else {
347
-                $this->_model_object = EE_Registry::instance()->load_class($this->_model->get_this_model_name());
348
-            }
349
-        }
350
-    }
351
-
352
-
353
-
354
-    /**
355
-     * After this form has been initialized and is verified to be valid,
356
-     * either creates a model object from its data and saves it, or updates
357
-     * the model object its data represents
358
-     *
359
-     * @throws EE_Error
360
-     * @return int, 1 on a successful update, the ID of
361
-     *                    the new entry on insert; 0 on failure
362
-     */
363
-    public function save()
364
-    {
365
-        if (! $this->_model_object) {
366
-            throw new EE_Error(sprintf(__(
367
-                "Cannot save the model form's model object (model is '%s') because there is no model object set. You must either set it, or call receive_form_submission where it is set automatically",
368
-                "event_espresso"
369
-            ), get_class($this->_model)));
370
-        }
371
-        // ok so the model object is set. Just set it with the submitted form data
372
-        foreach ($this->inputs_values_corresponding_to_model_fields() as $field_name => $field_value) {
373
-            // only set the non-primary key
374
-            if ($field_name != $this->_model->primary_key_name()) {
375
-                $this->_model_object->set($field_name, $field_value);
376
-            }
377
-        }
378
-        $success = $this->_model_object->save();
379
-        foreach ($this->_model->relation_settings() as $relation_name => $relation_obj) {
380
-            if (isset($this->_subsections[ $relation_name ])) {
381
-                $success = $this->_save_related_info($relation_name);
382
-            }
383
-        }
384
-        do_action('AHEE__EE_Model_Form_Section__save__done', $this, $success);
385
-        return $success;
386
-    }
387
-
388
-
389
-
390
-    /**
391
-     * Automatically finds the related model info from the form, if present, and
392
-     * save the relations indicated
393
-     *
394
-     * @type string $relation_name
395
-     * @return bool
396
-     * @throws EE_Error
397
-     */
398
-    protected function _save_related_info($relation_name)
399
-    {
400
-        $relation_obj = $this->_model->related_settings_for($relation_name);
401
-        if ($relation_obj instanceof EE_Belongs_To_Relation) {
402
-            // there is just a foreign key on this model pointing to that one
403
-            $this->_model_object->_add_relation_to($this->get_input_value($relation_name), $relation_name);
404
-        } elseif ($relation_obj instanceof EE_Has_Many_Relation) {
405
-            // then we want to consider all of its currently-related things.
406
-            // if they're in this list, keep them
407
-            // if they're not in this list, remove them
408
-            // and lastly add all the new items
409
-            throw new EE_Error(sprintf(__(
410
-                'Automatic saving of related info across a "has many" relation is not yet supported',
411
-                "event_espresso"
412
-            )));
413
-        } elseif ($relation_obj instanceof EE_HABTM_Relation) {
414
-            // delete everything NOT in this list
415
-            $normalized_input_value = $this->get_input_value($relation_name);
416
-            if ($normalized_input_value && is_array($normalized_input_value)) {
417
-                $where_query_params = array(
418
-                    $relation_obj->get_other_model()->primary_key_name() => array('NOT_IN', $normalized_input_value),
419
-                );
420
-            } else {
421
-                $where_query_params = array();
422
-            }
423
-            $this->_model_object->_remove_relations($relation_name, $where_query_params);
424
-            foreach ($normalized_input_value as $id) {
425
-                $this->_model_object->_add_relation_to($id, $relation_name);
426
-            }
427
-        }
428
-        return true;
429
-    }
430
-
431
-
432
-
433
-    /**
434
-     * Gets the model of this model form
435
-     *
436
-     * @return EEM_Base
437
-     */
438
-    public function get_model()
439
-    {
440
-        return $this->_model;
441
-    }
442
-
443
-
444
-
445
-    /**
446
-     * Gets the model object for this model form, which was either set
447
-     * upon construction (using the $options_array arg 'model_object'), by using
448
-     * set_model_object($model_obj), or implicitly
449
-     * when receive_form_submission($req_data) was called.
450
-     *
451
-     * @return EE_Base_Class
452
-     */
453
-    public function get_model_object()
454
-    {
455
-        return $this->_model_object;
456
-    }
457
-
458
-
459
-
460
-    /**
461
-     * gets teh default name of this form section if none is specified
462
-     *
463
-     * @return string
464
-     */
465
-    protected function _set_default_name_if_empty()
466
-    {
467
-        if (! $this->_name) {
468
-            $default_name = str_replace("EEM_", "", get_class($this->_model)) . "_Model_Form";
469
-            $this->_name = $default_name;
470
-        }
471
-    }
17
+	/**
18
+	 * @var EEM_Base
19
+	 */
20
+	protected $_model = null;
21
+
22
+	/**
23
+	 * @var EE_Base_Class
24
+	 */
25
+	protected $_model_object = null;
26
+
27
+
28
+
29
+	/**
30
+	 * @param array        $options_array   keys: {
31
+	 * @type EEM_Base      $model
32
+	 * @type EE_Base_Class $model_object
33
+	 * @type array         $subsection_args array keys should be subsection names (that either do or will exist), and
34
+	 *       values are the arrays as you would pass them to that subsection
35
+	 *                                      }
36
+	 * @throws EE_Error
37
+	 */
38
+	public function __construct($options_array = array())
39
+	{
40
+		if (isset($options_array['model']) && $options_array['model'] instanceof EEM_Base) {
41
+			$this->_model = $options_array['model'];
42
+		}
43
+		if (! $this->_model || ! $this->_model instanceof EEM_Base) {
44
+			throw new EE_Error(sprintf(__(
45
+				"Model Form Sections must first specify the _model property to be a subclass of EEM_Base",
46
+				"event_espresso"
47
+			)));
48
+		}
49
+		if (isset($options_array['subsection_args'])) {
50
+			$subsection_args = $options_array['subsection_args'];
51
+		} else {
52
+			$subsection_args = array();
53
+		}
54
+		// gather fields and relations to convert to inputs
55
+		// but if they're just going to exclude a field anyways, don't bother converting it to an input
56
+		$exclude = $this->_subsections;
57
+		if (isset($options_array['exclude'])) {
58
+			$exclude = array_merge($exclude, array_flip($options_array['exclude']));
59
+		}
60
+		$model_fields = array_diff_key($this->_model->field_settings(), $exclude);
61
+		$model_relations = array_diff_key($this->_model->relation_settings(), $exclude);
62
+		// convert fields and relations to inputs
63
+		$this->_subsections = array_merge(
64
+			$this->_convert_model_fields_to_inputs($model_fields),
65
+			$this->_convert_model_relations_to_inputs($model_relations, $subsection_args),
66
+			$this->_subsections
67
+		);
68
+		parent::__construct($options_array);
69
+		if (isset($options_array['model_object']) && $options_array['model_object'] instanceof EE_Base_Class) {
70
+			$this->populate_model_obj($options_array['model_object']);
71
+		}
72
+	}
73
+
74
+
75
+
76
+	/**
77
+	 * For now, just makes inputs for only HABTM relations
78
+	 *
79
+	 * @param EE_Model_Relation_Base[] $relations
80
+	 * @param array                    $subsection_args keys should be existing or soon-to-be-existing input names, and
81
+	 *                                                  their values are {
82
+	 * @type array {
83
+	 * @type EE_Base_Class[]           $model_objects   if the subsection is an EE_Select_Multi_Model_Input
84
+	 *                                                  }
85
+	 *                                                  }
86
+	 * @return array
87
+	 */
88
+	protected function _convert_model_relations_to_inputs($relations, $subsection_args = array())
89
+	{
90
+		$inputs = array();
91
+		foreach ($relations as $relation_name => $relation_obj) {
92
+			$input_constructor_args = array(
93
+				array_merge(
94
+					array(
95
+						'required'        => $relation_obj instanceof EE_Belongs_To_Relation,
96
+						'html_label_text' => $relation_obj instanceof EE_Belongs_To_Relation
97
+							? $relation_obj->get_other_model()->item_name(1)
98
+							: $relation_obj->get_other_model()
99
+										   ->item_name(2),
100
+					),
101
+					$subsection_args
102
+				),
103
+			);
104
+			$input = null;
105
+			switch (get_class($relation_obj)) {
106
+				case 'EE_HABTM_Relation':
107
+					if (isset($subsection_args[ $relation_name ])
108
+						&& isset($subsection_args[ $relation_name ]['model_objects'])
109
+					) {
110
+						$model_objects = $subsection_args[ $relation_name ]['model_objects'];
111
+					} else {
112
+						$model_objects = $relation_obj->get_other_model()->get_all();
113
+					}
114
+					$input = new EE_Select_Multi_Model_Input($model_objects, $input_constructor_args);
115
+					break;
116
+				default:
117
+			}
118
+			if ($input) {
119
+				$inputs[ $relation_name ] = $input;
120
+			}
121
+		}
122
+		return $inputs;
123
+	}
124
+
125
+
126
+
127
+	/**
128
+	 * Changes model fields into form section inputs
129
+	 *
130
+	 * @param EE_Model_Field_Base[] $model_fields keys are the model's name
131
+	 * @throws EE_Error
132
+	 * @return EE_Form_Input_Base[]
133
+	 */
134
+	protected function _convert_model_fields_to_inputs($model_fields = array())
135
+	{
136
+		$inputs = array();
137
+		foreach ($model_fields as $field_name => $model_field) {
138
+			if ($model_field instanceof EE_Model_Field_Base) {
139
+				$input_constructor_args = array(
140
+					array(
141
+						'required'        => ! $model_field->is_nullable()
142
+											 && $model_field->get_default_value()
143
+												=== null,
144
+						'html_label_text' => $model_field->get_nicename(),
145
+						'default'         => $model_field->get_default_value(),
146
+					),
147
+				);
148
+				switch (get_class($model_field)) {
149
+					case 'EE_All_Caps_Text_Field':
150
+					case 'EE_Any_Foreign_Model_Name_Field':
151
+						$input_class = 'EE_Text_Input';
152
+						break;
153
+					case 'EE_Boolean_Field':
154
+						$input_class = 'EE_Yes_No_Input';
155
+						break;
156
+					case 'EE_Datetime_Field':
157
+						throw new EE_Error(sprintf(__(
158
+							"Model field '%s' does not yet have a known conversion to form input",
159
+							"event_espresso"
160
+						), get_class($model_field)));
161
+						break;
162
+					case 'EE_Email_Field':
163
+						$input_class = 'EE_Email_Input';
164
+						break;
165
+					case 'EE_Enum_Integer_Field':
166
+						throw new EE_Error(sprintf(__(
167
+							"Model field '%s' does not yet have a known conversion to form input",
168
+							"event_espresso"
169
+						), get_class($model_field)));
170
+						break;
171
+					case 'EE_Enum_Text_Field':
172
+						throw new EE_Error(sprintf(__(
173
+							"Model field '%s' does not yet have a known conversion to form input",
174
+							"event_espresso"
175
+						), get_class($model_field)));
176
+						break;
177
+					case 'EE_Float_Field':
178
+						$input_class = 'EE_Float_Input';
179
+						break;
180
+					case 'EE_Foreign_Key_Int_Field':
181
+					case 'EE_Foreign_Key_String_Field':
182
+					case 'EE_WP_User_Field':
183
+						$models_pointed_to = $model_field instanceof EE_Field_With_Model_Name
184
+							? $model_field->get_model_class_names_pointed_to() : array();
185
+						if (true || is_array($models_pointed_to) && count($models_pointed_to) > 1) {
186
+							$input_class = 'EE_Text_Input';
187
+						} else {
188
+							// so its just one model
189
+							$model_name = is_array($models_pointed_to) ? reset($models_pointed_to) : $models_pointed_to;
190
+							$model = EE_Registry::instance()->load_model($model_name);
191
+							$model_names = $model->get_all_names(array('limit' => 10));
192
+							if ($model_field->is_nullable()) {
193
+								array_unshift($model_names, __("Please Select", 'event_espresso'));
194
+							}
195
+							$input_constructor_args[1] = $input_constructor_args[0];
196
+							$input_constructor_args[0] = $model_names;
197
+							$input_class = 'EE_Select_Input';
198
+						}
199
+						break;
200
+					case 'EE_Full_HTML_Field':
201
+						$input_class = 'EE_Text_Area_Input';
202
+						$input_constructor_args[0]['validation_strategies'] = array(new EE_Full_HTML_Validation_Strategy());
203
+						break;
204
+					case 'EE_Infinite_Integer':
205
+						throw new EE_Error(sprintf(__(
206
+							"Model field '%s' does not yet have a known conversion to form input",
207
+							"event_espresso"
208
+						), get_class($model_field)));
209
+						break;
210
+					case 'EE_Integer_Field':
211
+						$input_class = 'EE_Text_Input';
212
+						break;
213
+					case 'EE_Maybe_Serialized_Text_Field':
214
+						$input_class = 'EE_Text_Area_Input';
215
+						break;
216
+					case 'EE_Money_Field':
217
+						throw new EE_Error(sprintf(__(
218
+							"Model field '%s' does not yet have a known conversion to form input",
219
+							"event_espresso"
220
+						), get_class($model_field)));
221
+						break;
222
+					case 'EE_Post_Content_Field':
223
+						$input_class = 'EE_Text_Area_Input';
224
+						$input_constructor_args[0]['validation_strategies'] = array(new EE_Full_HTML_Validation_Strategy());
225
+						break;
226
+					case 'EE_Plain_Text_Field':
227
+						$input_class = 'EE_Text_Input';
228
+						break;
229
+					case 'EE_Primary_Key_Int_Field':
230
+						$input_class = 'EE_Hidden_Input';
231
+						$input_constructor_args['normalization_strategy'] = new EE_Int_Normalization();
232
+						break;
233
+					case 'EE_Primary_Key_String_Field':
234
+						$input_class = 'EE_Hidden_Input';
235
+						break;
236
+					case 'EE_Serialized_Text_Field':
237
+						$input_class = 'EE_Text_Area_Input';
238
+						break;
239
+					case 'EE_Simple_HTML_Field':
240
+						$input_class = 'EE_Text_Area_Input';
241
+						$input_constructor_args[0]['validation_strategies'] = array(new EE_Simple_HTML_Validation_Strategy());
242
+						break;
243
+					case 'EE_Slug_Field':
244
+						$input_class = 'EE_Text_Input';
245
+						break;
246
+					case 'EE_Trashed_Flag_Field':
247
+						$input_class = 'EE_Yes_No_Input';
248
+						break;
249
+					case 'EE_WP_Post_Status_Field':
250
+						throw new EE_Error(sprintf(__(
251
+							"Model field '%s' does not yet have a known conversion to form input",
252
+							"event_espresso"
253
+						), get_class($model_field)));
254
+						break;
255
+					case 'EE_WP_Post_Type_Field':
256
+						throw new EE_Error(sprintf(__(
257
+							"Model field '%s' does not yet have a known conversion to form input",
258
+							"event_espresso"
259
+						), get_class($model_field)));
260
+						break;
261
+					default:
262
+						throw new EE_Error(sprintf(__(
263
+							"Model field of type '%s' does not convert to any known Form Input. Please add a case to EE_Model_Form_section's _convert_model_fields_to_inputs switch statement",
264
+							"event_espresso"
265
+						), get_class($model_field)));
266
+				}
267
+				$reflection = new ReflectionClass($input_class);
268
+				$input = $reflection->newInstanceArgs($input_constructor_args);
269
+				$inputs[ $field_name ] = $input;
270
+			}
271
+		}
272
+		return $inputs;
273
+	}
274
+
275
+
276
+
277
+	/**
278
+	 * Mostly the same as populate_defaults , except takes a model object as input, not an array,
279
+	 * and also sets the form's _model_object
280
+	 *
281
+	 * @param EE_Base_Class $model_obj
282
+	 * @return void
283
+	 */
284
+	public function populate_model_obj($model_obj)
285
+	{
286
+		$model_obj = $this->_model->ensure_is_obj($model_obj);
287
+		$this->_model_object = $model_obj;
288
+		$defaults = $model_obj->model_field_array();
289
+		foreach ($this->_model->relation_settings() as $relation_name => $relation_obj) {
290
+			$subsection = $this->get_subsection($relation_name, false);
291
+			if ($subsection instanceof EE_Form_Input_Base) {
292
+				if ($relation_obj instanceof EE_Belongs_To_Relation) {
293
+					// then we only expect there to be one
294
+					$related_item = $this->_model_object->get_first_related($relation_name);
295
+					$defaults[ $relation_name ] = $related_item->ID();
296
+				} else {
297
+					$related_items = $this->_model_object->get_many_related($relation_name);
298
+					$ids = array();
299
+					foreach ($related_items as $related_item) {
300
+						$ids[] = $related_item->ID();
301
+					}
302
+					$defaults[ $relation_name ] = $ids;
303
+				}
304
+			}
305
+		}
306
+		$defaults = apply_filters(
307
+			'FHEE__EE_Model_Form_Section__populate_model_obj',
308
+			$defaults,
309
+			$this
310
+		);
311
+		$this->populate_defaults($defaults);
312
+	}
313
+
314
+
315
+
316
+	/**
317
+	 * Gets all the input values that correspond to model fields. Keys are the input/field names,
318
+	 * values are their normalized values
319
+	 *
320
+	 * @return array
321
+	 */
322
+	public function inputs_values_corresponding_to_model_fields()
323
+	{
324
+		return array_intersect_key($this->input_values(), $this->_model->field_settings());
325
+	}
326
+
327
+
328
+
329
+	/**
330
+	 * After we've normalized the data as normal, set the corresponding model object
331
+	 * on the form.
332
+	 *
333
+	 * @param array $req_data should usually be $_REQUEST (the default).
334
+	 * @return void
335
+	 */
336
+	public function _normalize($req_data)
337
+	{
338
+		parent::_normalize($req_data);
339
+		// create or set the model object, if it isn't already
340
+		if (! $this->_model_object) {
341
+			// check to see if the form indicates a PK, in which case we want to only retrieve it and update it
342
+			$pk_name = $this->_model->primary_key_name();
343
+			$model_obj = $this->_model->get_one_by_ID($this->get_input_value($pk_name));
344
+			if ($model_obj) {
345
+				$this->_model_object = $model_obj;
346
+			} else {
347
+				$this->_model_object = EE_Registry::instance()->load_class($this->_model->get_this_model_name());
348
+			}
349
+		}
350
+	}
351
+
352
+
353
+
354
+	/**
355
+	 * After this form has been initialized and is verified to be valid,
356
+	 * either creates a model object from its data and saves it, or updates
357
+	 * the model object its data represents
358
+	 *
359
+	 * @throws EE_Error
360
+	 * @return int, 1 on a successful update, the ID of
361
+	 *                    the new entry on insert; 0 on failure
362
+	 */
363
+	public function save()
364
+	{
365
+		if (! $this->_model_object) {
366
+			throw new EE_Error(sprintf(__(
367
+				"Cannot save the model form's model object (model is '%s') because there is no model object set. You must either set it, or call receive_form_submission where it is set automatically",
368
+				"event_espresso"
369
+			), get_class($this->_model)));
370
+		}
371
+		// ok so the model object is set. Just set it with the submitted form data
372
+		foreach ($this->inputs_values_corresponding_to_model_fields() as $field_name => $field_value) {
373
+			// only set the non-primary key
374
+			if ($field_name != $this->_model->primary_key_name()) {
375
+				$this->_model_object->set($field_name, $field_value);
376
+			}
377
+		}
378
+		$success = $this->_model_object->save();
379
+		foreach ($this->_model->relation_settings() as $relation_name => $relation_obj) {
380
+			if (isset($this->_subsections[ $relation_name ])) {
381
+				$success = $this->_save_related_info($relation_name);
382
+			}
383
+		}
384
+		do_action('AHEE__EE_Model_Form_Section__save__done', $this, $success);
385
+		return $success;
386
+	}
387
+
388
+
389
+
390
+	/**
391
+	 * Automatically finds the related model info from the form, if present, and
392
+	 * save the relations indicated
393
+	 *
394
+	 * @type string $relation_name
395
+	 * @return bool
396
+	 * @throws EE_Error
397
+	 */
398
+	protected function _save_related_info($relation_name)
399
+	{
400
+		$relation_obj = $this->_model->related_settings_for($relation_name);
401
+		if ($relation_obj instanceof EE_Belongs_To_Relation) {
402
+			// there is just a foreign key on this model pointing to that one
403
+			$this->_model_object->_add_relation_to($this->get_input_value($relation_name), $relation_name);
404
+		} elseif ($relation_obj instanceof EE_Has_Many_Relation) {
405
+			// then we want to consider all of its currently-related things.
406
+			// if they're in this list, keep them
407
+			// if they're not in this list, remove them
408
+			// and lastly add all the new items
409
+			throw new EE_Error(sprintf(__(
410
+				'Automatic saving of related info across a "has many" relation is not yet supported',
411
+				"event_espresso"
412
+			)));
413
+		} elseif ($relation_obj instanceof EE_HABTM_Relation) {
414
+			// delete everything NOT in this list
415
+			$normalized_input_value = $this->get_input_value($relation_name);
416
+			if ($normalized_input_value && is_array($normalized_input_value)) {
417
+				$where_query_params = array(
418
+					$relation_obj->get_other_model()->primary_key_name() => array('NOT_IN', $normalized_input_value),
419
+				);
420
+			} else {
421
+				$where_query_params = array();
422
+			}
423
+			$this->_model_object->_remove_relations($relation_name, $where_query_params);
424
+			foreach ($normalized_input_value as $id) {
425
+				$this->_model_object->_add_relation_to($id, $relation_name);
426
+			}
427
+		}
428
+		return true;
429
+	}
430
+
431
+
432
+
433
+	/**
434
+	 * Gets the model of this model form
435
+	 *
436
+	 * @return EEM_Base
437
+	 */
438
+	public function get_model()
439
+	{
440
+		return $this->_model;
441
+	}
442
+
443
+
444
+
445
+	/**
446
+	 * Gets the model object for this model form, which was either set
447
+	 * upon construction (using the $options_array arg 'model_object'), by using
448
+	 * set_model_object($model_obj), or implicitly
449
+	 * when receive_form_submission($req_data) was called.
450
+	 *
451
+	 * @return EE_Base_Class
452
+	 */
453
+	public function get_model_object()
454
+	{
455
+		return $this->_model_object;
456
+	}
457
+
458
+
459
+
460
+	/**
461
+	 * gets teh default name of this form section if none is specified
462
+	 *
463
+	 * @return string
464
+	 */
465
+	protected function _set_default_name_if_empty()
466
+	{
467
+		if (! $this->_name) {
468
+			$default_name = str_replace("EEM_", "", get_class($this->_model)) . "_Model_Form";
469
+			$this->_name = $default_name;
470
+		}
471
+	}
472 472
 }
Please login to merge, or discard this patch.
Spacing   +13 added lines, -13 removed lines patch added patch discarded remove patch
@@ -40,7 +40,7 @@  discard block
 block discarded – undo
40 40
         if (isset($options_array['model']) && $options_array['model'] instanceof EEM_Base) {
41 41
             $this->_model = $options_array['model'];
42 42
         }
43
-        if (! $this->_model || ! $this->_model instanceof EEM_Base) {
43
+        if ( ! $this->_model || ! $this->_model instanceof EEM_Base) {
44 44
             throw new EE_Error(sprintf(__(
45 45
                 "Model Form Sections must first specify the _model property to be a subclass of EEM_Base",
46 46
                 "event_espresso"
@@ -104,10 +104,10 @@  discard block
 block discarded – undo
104 104
             $input = null;
105 105
             switch (get_class($relation_obj)) {
106 106
                 case 'EE_HABTM_Relation':
107
-                    if (isset($subsection_args[ $relation_name ])
108
-                        && isset($subsection_args[ $relation_name ]['model_objects'])
107
+                    if (isset($subsection_args[$relation_name])
108
+                        && isset($subsection_args[$relation_name]['model_objects'])
109 109
                     ) {
110
-                        $model_objects = $subsection_args[ $relation_name ]['model_objects'];
110
+                        $model_objects = $subsection_args[$relation_name]['model_objects'];
111 111
                     } else {
112 112
                         $model_objects = $relation_obj->get_other_model()->get_all();
113 113
                     }
@@ -116,7 +116,7 @@  discard block
 block discarded – undo
116 116
                 default:
117 117
             }
118 118
             if ($input) {
119
-                $inputs[ $relation_name ] = $input;
119
+                $inputs[$relation_name] = $input;
120 120
             }
121 121
         }
122 122
         return $inputs;
@@ -266,7 +266,7 @@  discard block
 block discarded – undo
266 266
                 }
267 267
                 $reflection = new ReflectionClass($input_class);
268 268
                 $input = $reflection->newInstanceArgs($input_constructor_args);
269
-                $inputs[ $field_name ] = $input;
269
+                $inputs[$field_name] = $input;
270 270
             }
271 271
         }
272 272
         return $inputs;
@@ -292,14 +292,14 @@  discard block
 block discarded – undo
292 292
                 if ($relation_obj instanceof EE_Belongs_To_Relation) {
293 293
                     // then we only expect there to be one
294 294
                     $related_item = $this->_model_object->get_first_related($relation_name);
295
-                    $defaults[ $relation_name ] = $related_item->ID();
295
+                    $defaults[$relation_name] = $related_item->ID();
296 296
                 } else {
297 297
                     $related_items = $this->_model_object->get_many_related($relation_name);
298 298
                     $ids = array();
299 299
                     foreach ($related_items as $related_item) {
300 300
                         $ids[] = $related_item->ID();
301 301
                     }
302
-                    $defaults[ $relation_name ] = $ids;
302
+                    $defaults[$relation_name] = $ids;
303 303
                 }
304 304
             }
305 305
         }
@@ -337,7 +337,7 @@  discard block
 block discarded – undo
337 337
     {
338 338
         parent::_normalize($req_data);
339 339
         // create or set the model object, if it isn't already
340
-        if (! $this->_model_object) {
340
+        if ( ! $this->_model_object) {
341 341
             // check to see if the form indicates a PK, in which case we want to only retrieve it and update it
342 342
             $pk_name = $this->_model->primary_key_name();
343 343
             $model_obj = $this->_model->get_one_by_ID($this->get_input_value($pk_name));
@@ -362,7 +362,7 @@  discard block
 block discarded – undo
362 362
      */
363 363
     public function save()
364 364
     {
365
-        if (! $this->_model_object) {
365
+        if ( ! $this->_model_object) {
366 366
             throw new EE_Error(sprintf(__(
367 367
                 "Cannot save the model form's model object (model is '%s') because there is no model object set. You must either set it, or call receive_form_submission where it is set automatically",
368 368
                 "event_espresso"
@@ -377,7 +377,7 @@  discard block
 block discarded – undo
377 377
         }
378 378
         $success = $this->_model_object->save();
379 379
         foreach ($this->_model->relation_settings() as $relation_name => $relation_obj) {
380
-            if (isset($this->_subsections[ $relation_name ])) {
380
+            if (isset($this->_subsections[$relation_name])) {
381 381
                 $success = $this->_save_related_info($relation_name);
382 382
             }
383 383
         }
@@ -464,8 +464,8 @@  discard block
 block discarded – undo
464 464
      */
465 465
     protected function _set_default_name_if_empty()
466 466
     {
467
-        if (! $this->_name) {
468
-            $default_name = str_replace("EEM_", "", get_class($this->_model)) . "_Model_Form";
467
+        if ( ! $this->_name) {
468
+            $default_name = str_replace("EEM_", "", get_class($this->_model))."_Model_Form";
469 469
             $this->_name = $default_name;
470 470
         }
471 471
     }
Please login to merge, or discard this patch.
libraries/form_sections/payment_methods/EE_Payment_Method_Form.form.php 3 patches
Doc Comments   +1 added lines, -1 removed lines patch added patch discarded remove patch
@@ -119,7 +119,7 @@
 block discarded – undo
119 119
 
120 120
 
121 121
     /**
122
-     * @param $payment_method_type
122
+     * @param EE_PMT_Base $payment_method_type
123 123
      * @throws EE_Error
124 124
      */
125 125
     public function set_payment_method_type($payment_method_type)
Please login to merge, or discard this patch.
Indentation   +191 added lines, -191 removed lines patch added patch discarded remove patch
@@ -9,195 +9,195 @@
 block discarded – undo
9 9
 class EE_Payment_Method_Form extends EE_Model_Form_Section
10 10
 {
11 11
 
12
-    /**
13
-     * All the subsection inputs that correspond ot extra meta rows
14
-     * for this payment method
15
-     *
16
-     * @var EE_Form_Input_Base[]
17
-     */
18
-    protected $_extra_meta_inputs = array();
19
-
20
-    /**
21
-     * Because payment method form might DELAY part of construction, we want to remember
22
-     * what options were passed in
23
-     *
24
-     * @var array
25
-     */
26
-    protected $_options_array = array();
27
-
28
-    /**
29
-     * The payment method type for this form
30
-     *
31
-     * @var EE_PMT_Base
32
-     */
33
-    protected $_payment_method_type;
34
-
35
-
36
-
37
-    /**
38
-     * @param array      $options_array       {
39
-     * @type string      $extra_meta_inputs   should be EE_Form_Section_Validatable[] which
40
-     *                                        will be _subsections and will be saved as extra meta on the payment
41
-     *                                        method object;
42
-     * @type EE_PMT_Base $payment_method_type the payment method type this form is for
43
-     * @see EE_Model_Form_Section::__construct() for more
44
-     *                                        }
45
-     */
46
-    public function __construct($options_array = array())
47
-    {
48
-        $this->_model = EEM_Payment_Method::instance();
49
-        $this->_options_array = $options_array;
50
-        if (isset($options_array['payment_method_type'])) {
51
-            $this->_payment_method_type = $options_array['payment_method_type'];
52
-        }
53
-        $options_array = $this->_options_array;
54
-        if (isset($options_array['extra_meta_inputs'])) {
55
-            $this->_extra_meta_inputs = array_merge($this->_extra_meta_inputs, $options_array['extra_meta_inputs']);
56
-        }
57
-        if ($this->_extra_meta_inputs) {
58
-            $this->_subsections = array_merge($this->_subsections, $this->_extra_meta_inputs);
59
-        }
60
-        $this->_subsections['PMD_button_url'] = new EE_Admin_File_Uploader_Input(
61
-            array('html_label_text' => __('Button URL', 'event_espresso'))
62
-        );
63
-        $this->_subsections['PMD_scope'] = new EE_Checkbox_Multi_Input(
64
-            EEM_Payment_Method::instance()->scopes(),
65
-            array(
66
-                'html_label_text' => $this->_model->field_settings_for('PMD_scope')->get_nicename()
67
-                                     . EEH_Template::get_help_tab_link('payment_methods_overview'),
68
-            )
69
-        );
70
-        // setup the currency options
71
-        $this->_subsections['Currency'] = new EE_Select_Multi_Model_Input(
72
-            EEM_Currency::instance()->get_all_currencies_usable_by($this->_payment_method_type),
73
-            array(
74
-                'html_label_text' => __('Currencies Supported', 'event_espresso'),
75
-                'required'        => true,
76
-            )
77
-        );
78
-        $this->_subsections['PMD_order'] = new EE_Text_Input(array(
79
-            'html_label_text'        => __('Order', 'event_espresso'),
80
-            'html_help_text'         => __('Lowest numbers will be shown first', 'event_espresso'),
81
-            'normalization_strategy' => new EE_Int_Normalization(),
82
-            'validation_strategies'  => array(
83
-                new EE_Int_Validation_Strategy(),
84
-            ),
85
-            'default'                => 0,
86
-        ));
87
-        $this->_layout_strategy = new EE_Admin_Two_Column_Layout();
88
-        parent::__construct($options_array);
89
-        $debug_mode = isset($this->_subsections['PMD_debug_mode']) ? $this->_subsections['PMD_debug_mode'] : null;
90
-        if ($debug_mode instanceof EE_Form_Input_Base) {
91
-            $debug_mode->set_html_help_text(__(
92
-                'This payment method has a Sandbox Server (also known as Testing Server, Development Server, Quality Assurance Server, etc). While in debug mode and using this sandbox server, real payments will not be processed.',
93
-                'event_espresso'
94
-            ));
95
-        }
96
-    }
97
-
98
-
99
-
100
-    /**
101
-     * Finishes construction given the parent form section and this form section's name
102
-     *
103
-     * @param EE_Form_Section_Proper $parent_form_section
104
-     * @param string                 $name
105
-     * @throws EE_Error
106
-     */
107
-    public function _construct_finalize($parent_form_section, $name)
108
-    {
109
-        if (! $this->_payment_method_type instanceof EE_PMT_Base) {
110
-            throw new EE_Error(sprintf(__(
111
-                'Payment Method forms must have set their payment method type BEFORE calling _construct_finalize',
112
-                'event_espresso'
113
-            )));
114
-        }
115
-        // set the name of this form based on the payment method type
116
-        if (! $this->_name && ! $name) {
117
-            $name = str_replace(" ", "_", ucwords(str_replace("_", " ", ($this->_payment_method_type->system_name()))))
118
-                    . "_Settings_Form";
119
-        }
120
-        parent::_construct_finalize($parent_form_section, $name);
121
-    }
122
-
123
-
124
-
125
-    /**
126
-     * @param $payment_method_type
127
-     * @throws EE_Error
128
-     */
129
-    public function set_payment_method_type($payment_method_type)
130
-    {
131
-        if (! $payment_method_type instanceof EE_PMT_Base) {
132
-            throw new EE_Error(sprintf(__(
133
-                "Payment Method forms MUST set a payment method type by using _set_payment_method_type",
134
-                "event_espresso"
135
-            )));
136
-        }
137
-        $this->_payment_method_type = $payment_method_type;
138
-    }
139
-
140
-
141
-
142
-    /**
143
-     * extends the model form section's save method to also save the extra meta field values
144
-     *
145
-     * @return int ID of the payment method inserted, or true on update
146
-     */
147
-    public function save()
148
-    {
149
-        $parent_save_val = parent::save();
150
-        if ($this->_model_object && $this->_model_object->ID()) {
151
-            foreach ($this->_extra_meta_inputs as $input_name => $input) {
152
-                $this->_model_object->update_extra_meta($input_name, $input->normalized_value());
153
-            }
154
-        }
155
-        return $parent_save_val;
156
-    }
157
-
158
-
159
-
160
-    /**
161
-     * Overrides parent's populate_model_obj to also populate the extra meta fields
162
-     *
163
-     * @param EE_Base_Class $model_obj
164
-     */
165
-    public function populate_model_obj($model_obj)
166
-    {
167
-        $model_obj = $this->_model->ensure_is_obj($model_obj);
168
-        parent::populate_model_obj($model_obj);
169
-        $extra_meta = $model_obj->all_extra_meta_array();
170
-        foreach ($this->_extra_meta_inputs as $input_name => $extra_meta_input) {
171
-            if (isset($extra_meta[ $input_name ])) {
172
-                $extra_meta_input->set_default($extra_meta[ $input_name ]);
173
-            }
174
-        }
175
-    }
176
-
177
-
178
-
179
-    /**
180
-     * gets the default name of this form section if none is specified
181
-     *
182
-     * @return string
183
-     */
184
-    protected function _set_default_name_if_empty()
185
-    {
186
-        if (! $this->_name) {
187
-            $default_name = str_replace("EEM_", "", get_class($this->_model)) . "_Model_Form";
188
-            $this->_name = $default_name;
189
-        }
190
-    }
191
-
192
-
193
-
194
-    /**
195
-     * Gets all the extra meta inputs in this form
196
-     *
197
-     * @return EE_Form_Input_Base[]
198
-     */
199
-    public function extra_meta_inputs()
200
-    {
201
-        return $this->_extra_meta_inputs;
202
-    }
12
+	/**
13
+	 * All the subsection inputs that correspond ot extra meta rows
14
+	 * for this payment method
15
+	 *
16
+	 * @var EE_Form_Input_Base[]
17
+	 */
18
+	protected $_extra_meta_inputs = array();
19
+
20
+	/**
21
+	 * Because payment method form might DELAY part of construction, we want to remember
22
+	 * what options were passed in
23
+	 *
24
+	 * @var array
25
+	 */
26
+	protected $_options_array = array();
27
+
28
+	/**
29
+	 * The payment method type for this form
30
+	 *
31
+	 * @var EE_PMT_Base
32
+	 */
33
+	protected $_payment_method_type;
34
+
35
+
36
+
37
+	/**
38
+	 * @param array      $options_array       {
39
+	 * @type string      $extra_meta_inputs   should be EE_Form_Section_Validatable[] which
40
+	 *                                        will be _subsections and will be saved as extra meta on the payment
41
+	 *                                        method object;
42
+	 * @type EE_PMT_Base $payment_method_type the payment method type this form is for
43
+	 * @see EE_Model_Form_Section::__construct() for more
44
+	 *                                        }
45
+	 */
46
+	public function __construct($options_array = array())
47
+	{
48
+		$this->_model = EEM_Payment_Method::instance();
49
+		$this->_options_array = $options_array;
50
+		if (isset($options_array['payment_method_type'])) {
51
+			$this->_payment_method_type = $options_array['payment_method_type'];
52
+		}
53
+		$options_array = $this->_options_array;
54
+		if (isset($options_array['extra_meta_inputs'])) {
55
+			$this->_extra_meta_inputs = array_merge($this->_extra_meta_inputs, $options_array['extra_meta_inputs']);
56
+		}
57
+		if ($this->_extra_meta_inputs) {
58
+			$this->_subsections = array_merge($this->_subsections, $this->_extra_meta_inputs);
59
+		}
60
+		$this->_subsections['PMD_button_url'] = new EE_Admin_File_Uploader_Input(
61
+			array('html_label_text' => __('Button URL', 'event_espresso'))
62
+		);
63
+		$this->_subsections['PMD_scope'] = new EE_Checkbox_Multi_Input(
64
+			EEM_Payment_Method::instance()->scopes(),
65
+			array(
66
+				'html_label_text' => $this->_model->field_settings_for('PMD_scope')->get_nicename()
67
+									 . EEH_Template::get_help_tab_link('payment_methods_overview'),
68
+			)
69
+		);
70
+		// setup the currency options
71
+		$this->_subsections['Currency'] = new EE_Select_Multi_Model_Input(
72
+			EEM_Currency::instance()->get_all_currencies_usable_by($this->_payment_method_type),
73
+			array(
74
+				'html_label_text' => __('Currencies Supported', 'event_espresso'),
75
+				'required'        => true,
76
+			)
77
+		);
78
+		$this->_subsections['PMD_order'] = new EE_Text_Input(array(
79
+			'html_label_text'        => __('Order', 'event_espresso'),
80
+			'html_help_text'         => __('Lowest numbers will be shown first', 'event_espresso'),
81
+			'normalization_strategy' => new EE_Int_Normalization(),
82
+			'validation_strategies'  => array(
83
+				new EE_Int_Validation_Strategy(),
84
+			),
85
+			'default'                => 0,
86
+		));
87
+		$this->_layout_strategy = new EE_Admin_Two_Column_Layout();
88
+		parent::__construct($options_array);
89
+		$debug_mode = isset($this->_subsections['PMD_debug_mode']) ? $this->_subsections['PMD_debug_mode'] : null;
90
+		if ($debug_mode instanceof EE_Form_Input_Base) {
91
+			$debug_mode->set_html_help_text(__(
92
+				'This payment method has a Sandbox Server (also known as Testing Server, Development Server, Quality Assurance Server, etc). While in debug mode and using this sandbox server, real payments will not be processed.',
93
+				'event_espresso'
94
+			));
95
+		}
96
+	}
97
+
98
+
99
+
100
+	/**
101
+	 * Finishes construction given the parent form section and this form section's name
102
+	 *
103
+	 * @param EE_Form_Section_Proper $parent_form_section
104
+	 * @param string                 $name
105
+	 * @throws EE_Error
106
+	 */
107
+	public function _construct_finalize($parent_form_section, $name)
108
+	{
109
+		if (! $this->_payment_method_type instanceof EE_PMT_Base) {
110
+			throw new EE_Error(sprintf(__(
111
+				'Payment Method forms must have set their payment method type BEFORE calling _construct_finalize',
112
+				'event_espresso'
113
+			)));
114
+		}
115
+		// set the name of this form based on the payment method type
116
+		if (! $this->_name && ! $name) {
117
+			$name = str_replace(" ", "_", ucwords(str_replace("_", " ", ($this->_payment_method_type->system_name()))))
118
+					. "_Settings_Form";
119
+		}
120
+		parent::_construct_finalize($parent_form_section, $name);
121
+	}
122
+
123
+
124
+
125
+	/**
126
+	 * @param $payment_method_type
127
+	 * @throws EE_Error
128
+	 */
129
+	public function set_payment_method_type($payment_method_type)
130
+	{
131
+		if (! $payment_method_type instanceof EE_PMT_Base) {
132
+			throw new EE_Error(sprintf(__(
133
+				"Payment Method forms MUST set a payment method type by using _set_payment_method_type",
134
+				"event_espresso"
135
+			)));
136
+		}
137
+		$this->_payment_method_type = $payment_method_type;
138
+	}
139
+
140
+
141
+
142
+	/**
143
+	 * extends the model form section's save method to also save the extra meta field values
144
+	 *
145
+	 * @return int ID of the payment method inserted, or true on update
146
+	 */
147
+	public function save()
148
+	{
149
+		$parent_save_val = parent::save();
150
+		if ($this->_model_object && $this->_model_object->ID()) {
151
+			foreach ($this->_extra_meta_inputs as $input_name => $input) {
152
+				$this->_model_object->update_extra_meta($input_name, $input->normalized_value());
153
+			}
154
+		}
155
+		return $parent_save_val;
156
+	}
157
+
158
+
159
+
160
+	/**
161
+	 * Overrides parent's populate_model_obj to also populate the extra meta fields
162
+	 *
163
+	 * @param EE_Base_Class $model_obj
164
+	 */
165
+	public function populate_model_obj($model_obj)
166
+	{
167
+		$model_obj = $this->_model->ensure_is_obj($model_obj);
168
+		parent::populate_model_obj($model_obj);
169
+		$extra_meta = $model_obj->all_extra_meta_array();
170
+		foreach ($this->_extra_meta_inputs as $input_name => $extra_meta_input) {
171
+			if (isset($extra_meta[ $input_name ])) {
172
+				$extra_meta_input->set_default($extra_meta[ $input_name ]);
173
+			}
174
+		}
175
+	}
176
+
177
+
178
+
179
+	/**
180
+	 * gets the default name of this form section if none is specified
181
+	 *
182
+	 * @return string
183
+	 */
184
+	protected function _set_default_name_if_empty()
185
+	{
186
+		if (! $this->_name) {
187
+			$default_name = str_replace("EEM_", "", get_class($this->_model)) . "_Model_Form";
188
+			$this->_name = $default_name;
189
+		}
190
+	}
191
+
192
+
193
+
194
+	/**
195
+	 * Gets all the extra meta inputs in this form
196
+	 *
197
+	 * @return EE_Form_Input_Base[]
198
+	 */
199
+	public function extra_meta_inputs()
200
+	{
201
+		return $this->_extra_meta_inputs;
202
+	}
203 203
 }
Please login to merge, or discard this patch.
Spacing   +7 added lines, -7 removed lines patch added patch discarded remove patch
@@ -106,14 +106,14 @@  discard block
 block discarded – undo
106 106
      */
107 107
     public function _construct_finalize($parent_form_section, $name)
108 108
     {
109
-        if (! $this->_payment_method_type instanceof EE_PMT_Base) {
109
+        if ( ! $this->_payment_method_type instanceof EE_PMT_Base) {
110 110
             throw new EE_Error(sprintf(__(
111 111
                 'Payment Method forms must have set their payment method type BEFORE calling _construct_finalize',
112 112
                 'event_espresso'
113 113
             )));
114 114
         }
115 115
         // set the name of this form based on the payment method type
116
-        if (! $this->_name && ! $name) {
116
+        if ( ! $this->_name && ! $name) {
117 117
             $name = str_replace(" ", "_", ucwords(str_replace("_", " ", ($this->_payment_method_type->system_name()))))
118 118
                     . "_Settings_Form";
119 119
         }
@@ -128,7 +128,7 @@  discard block
 block discarded – undo
128 128
      */
129 129
     public function set_payment_method_type($payment_method_type)
130 130
     {
131
-        if (! $payment_method_type instanceof EE_PMT_Base) {
131
+        if ( ! $payment_method_type instanceof EE_PMT_Base) {
132 132
             throw new EE_Error(sprintf(__(
133 133
                 "Payment Method forms MUST set a payment method type by using _set_payment_method_type",
134 134
                 "event_espresso"
@@ -168,8 +168,8 @@  discard block
 block discarded – undo
168 168
         parent::populate_model_obj($model_obj);
169 169
         $extra_meta = $model_obj->all_extra_meta_array();
170 170
         foreach ($this->_extra_meta_inputs as $input_name => $extra_meta_input) {
171
-            if (isset($extra_meta[ $input_name ])) {
172
-                $extra_meta_input->set_default($extra_meta[ $input_name ]);
171
+            if (isset($extra_meta[$input_name])) {
172
+                $extra_meta_input->set_default($extra_meta[$input_name]);
173 173
             }
174 174
         }
175 175
     }
@@ -183,8 +183,8 @@  discard block
 block discarded – undo
183 183
      */
184 184
     protected function _set_default_name_if_empty()
185 185
     {
186
-        if (! $this->_name) {
187
-            $default_name = str_replace("EEM_", "", get_class($this->_model)) . "_Model_Form";
186
+        if ( ! $this->_name) {
187
+            $default_name = str_replace("EEM_", "", get_class($this->_model))."_Model_Form";
188 188
             $this->_name = $default_name;
189 189
         }
190 190
     }
Please login to merge, or discard this patch.
core/libraries/shortcodes/EE_Shortcodes.lib.php 3 patches
Doc Comments   +1 added lines, -1 removed lines patch added patch discarded remove patch
@@ -352,7 +352,7 @@
 block discarded – undo
352 352
      *
353 353
      * Note: regex comes in part from the WP `get_shortcode_regex` expression in \wp-includes\shortcodes.php
354 354
      *
355
-     * @param $shortcode
355
+     * @param string $shortcode
356 356
      * @since 4.9.32
357 357
      * @return string
358 358
      */
Please login to merge, or discard this patch.
Indentation   +453 added lines, -453 removed lines patch added patch discarded remove patch
@@ -17,457 +17,457 @@
 block discarded – undo
17 17
 abstract class EE_Shortcodes extends EE_Base
18 18
 {
19 19
 
20
-    /**
21
-     * holds label for library
22
-     * This is used for referencing the library label
23
-     *
24
-     * @access public
25
-     * @var string
26
-     */
27
-    public $label;
28
-
29
-
30
-    /**
31
-     * This property is used for referencing a short description of the library
32
-     *
33
-     * @access public
34
-     * @var string
35
-     */
36
-    public $description;
37
-
38
-
39
-    /**
40
-     * This will hold an array of shortcodes with the key as the shortcode ([shortcode]) and the value as a
41
-     * label/description for the shortcode.
42
-     *
43
-     * @access protected
44
-     * @var array
45
-     */
46
-    protected $_shortcodes;
47
-
48
-
49
-    /**
50
-     * This will hold the incoming data item sent to the parser method
51
-     *
52
-     * @access protected
53
-     * @var mixed (array|object)
54
-     */
55
-    protected $_data;
56
-
57
-
58
-    /**
59
-     * some shortcodes may require extra data to parse.  This property is provided for that.
60
-     *
61
-     * @var array
62
-     */
63
-    protected $_extra_data;
64
-
65
-
66
-    /**
67
-     * EE_messenger used to generate the template being parsed.
68
-     *
69
-     * @since 4.5.0
70
-     * @var EE_messenger
71
-     */
72
-    protected $_messenger;
73
-
74
-
75
-    /**
76
-     * message type used to generate the template being parsed.
77
-     *
78
-     * @since 4.5.0
79
-     * @var EE_message_type
80
-     */
81
-    protected $_message_type;
82
-
83
-
84
-    /**
85
-     * context used for the template being parsed
86
-     *
87
-     * @since 4.5.0
88
-     * @var string
89
-     */
90
-    protected $_context;
91
-
92
-
93
-    /**
94
-     * Specific Message Template Group ID
95
-     *
96
-     * @since 4.5.0
97
-     * @var int
98
-     */
99
-    protected $_GRP_ID;
100
-
101
-
102
-    /**
103
-     * @since 4.9.0
104
-     * @type EE_Message
105
-     */
106
-    protected $_message;
107
-
108
-
109
-    /**
110
-     * This will hold an instance of the EEH_Parse_Shortcodes helper that will be used when handling list type
111
-     * shortcodes
112
-     *
113
-     * @var EEH_Parse_Shortcodes
114
-     */
115
-    protected $_shortcode_helper;
116
-
117
-
118
-    public function __construct()
119
-    {
120
-        $this->_set_defaults();
121
-        $this->_init_props();
122
-    }
123
-
124
-
125
-    /**
126
-     * This sets the defaults for the properties.  Child classes will override these properties in their _init_props
127
-     * method
128
-     */
129
-    private function _set_defaults()
130
-    {
131
-        $this->name = $this->description = '';
132
-        $this->_shortcodes = array();
133
-        $this->_set_shortcode_helper();
134
-    }
135
-
136
-
137
-    /**
138
-     * loads an instance of the EE_Shortcode_Parser helper when requested
139
-     */
140
-    protected function _set_shortcode_helper()
141
-    {
142
-        // get shortcode_replace instance- set when _get_messages is called in child...
143
-        $this->_shortcode_helper = new EEH_Parse_Shortcodes();
144
-    }
145
-
146
-
147
-    public function get_shortcode_helper()
148
-    {
149
-        if (! $this->_shortcode_helper instanceof EEH_Parse_Shortcodes) {
150
-            $this->_set_shortcode_helper();
151
-        }
152
-        return $this->_shortcode_helper;
153
-    }
154
-
155
-
156
-    /**
157
-     * This is the public method for kicking of the parser included with each child.  It can be overridden by child
158
-     * classes if necessary (see EE_Questions_Answers for example)
159
-     *
160
-     * @param  string $shortcode incoming shortcode to be parsed
161
-     * @param  mixed (object|array) $data       incoming data to be be used for parsing
162
-     * @param  mixed (object|array) $extra_data extra incoming data (usually EE_Messages_Addressee)
163
-     * @return string            parsed shortcode.
164
-     */
165
-    public function parser($shortcode, $data, $extra_data = array())
166
-    {
167
-
168
-        // filter setup shortcodes
169
-        $this->_shortcodes = $this->get_shortcodes();
170
-
171
-        // we need to setup any dynamic shortcodes so that they work with the array_key_exists
172
-        $sc = preg_match_all('/(\[[A-Za-z0-9\_]+_\*)/', $shortcode, $matches);
173
-        $sc_to_verify = ! empty($matches[0]) ? $matches[0][0] . ']' : $shortcode;
174
-
175
-        // first we want to make sure this is a valid shortcode
176
-        if (! array_key_exists($sc_to_verify, $this->_shortcodes)) {
177
-            return false;
178
-        } //get out, this parser doesn't handle the incoming shortcode.
179
-        $this->_data = $data;
180
-        $this->_extra_data = $extra_data;
181
-        $this->_set_messages_properties();
182
-        $parsed = apply_filters(
183
-            'FHEE__' . get_class($this) . '__parser_after',
184
-            $this->_parser($shortcode),
185
-            $shortcode,
186
-            $data,
187
-            $extra_data,
188
-            $this
189
-        );
190
-
191
-        // note the below filter applies to ALL shortcode parsers... be careful!
192
-        $parsed = apply_filters('FHEE__EE_Shortcodes__parser_after', $parsed, $shortcode, $data, $extra_data, $this);
193
-        return $parsed;
194
-    }
195
-
196
-
197
-    /**
198
-     * This method just returns the shortcodes in the $_shortcodes array property.
199
-     *
200
-     * @access public
201
-     * @return array array of shortcodes => description pairs
202
-     */
203
-    public function get_shortcodes()
204
-    {
205
-        $this->_shortcodes = apply_filters('FHEE__' . get_class($this) . '__shortcodes', $this->_shortcodes, $this);
206
-
207
-        // note the below filter applies to ALL shortcode parsers... be careful!
208
-        $this->_shortcodes = apply_filters('FHEE__EE_Shortcodes__shortcodes', $this->_shortcodes, $this);
209
-
210
-        return $this->_shortcodes;
211
-    }
212
-
213
-
214
-    /**
215
-     * Child classes use this method to set the $name, $description, and $_shortcodes properties.
216
-     *
217
-     * @abstract
218
-     * @access protected
219
-     * @return void
220
-     */
221
-    abstract protected function _init_props();
222
-
223
-
224
-    /**
225
-     * This method will give parsing instructions for each shortcode defined in the _shortcodes array.  Child methods
226
-     * will have to take care of handling.
227
-     *
228
-     * @abstract
229
-     * @access protected
230
-     * @param string $shortcode    the shortcode to be parsed.
231
-     * @param mixed (object|array) $data      incoming data for the parser.  The data could be either an object or
232
-     *                             array because there are some shortcodes that might be replaced by prepared data that
233
-     *                             has multiple items in a list (i.e. list of attendees in an event and we're showing
234
-     *                             fname/lname for each attendee).  In this case data will be in an array.  Otherwise
235
-     *                             the data shoudl be in a properly formatted object.  The
236
-     *                             EEH_Parse_Shortcodes.helper.php describes the data object we're expecting.
237
-     * @return string parsed shortcode
238
-     */
239
-    abstract protected function _parser($shortcode);
240
-
241
-
242
-    /**
243
-     * This just validates incoming data for list type shortcode parsers (and they call this method) to make sure it
244
-     * meets their requirements
245
-     *
246
-     * @return mixed (void|exception) If validation fails we'll throw an exception.
247
-     */
248
-    protected function _validate_list_requirements()
249
-    {
250
-
251
-        // first test to make sure we've got an array!
252
-        if (! is_array($this->_data)) {
253
-            throw new EE_Error(
254
-                sprintf(
255
-                    __(
256
-                        'Expecting an array for the data sent to %s. Instead it was %s',
257
-                        'event_espresso'
258
-                    ),
259
-                    get_class($this),
260
-                    gettype($this->_data)
261
-                )
262
-            );
263
-        }
264
-
265
-        // next test to make sure we've got the required template in the index!
266
-        if (! isset($this->_data['template'])) {
267
-            throw new EE_Error(
268
-                sprintf(
269
-                    __(
270
-                        'The incoming data does not have the required template index in its array',
271
-                        'event_espresso'
272
-                    )
273
-                )
274
-            );
275
-        }
276
-
277
-        // next test to make sure we've got got a data index in the incoming data array
278
-        if (! isset($this->_data['data'])) {
279
-            throw new EE_Error(
280
-                __(
281
-                    'The incoming data does not have the required data index in its array',
282
-                    'event_espresso'
283
-                )
284
-            );
285
-        }
286
-
287
-        // all is well let's make sure _extra_data always has the values needed.
288
-        // let's make sure that extra_data includes all templates (for later parsing if necessary)
289
-        if (empty($this->_extra_data) || (empty($this->_extra_data['data']) && empty($this->_extra_data['template']))) {
290
-            $this->_extra_data['data'] = $this->_data['data'];
291
-            $this->_extra_data['template'] = $this->_data['template'];
292
-        }
293
-    }
294
-
295
-
296
-    /**
297
-     * This returns any attributes that may be existing on an EE_Shortcode
298
-     *
299
-     * @since 4.5.0
300
-     * @param string $shortcode incoming shortcode
301
-     * @return array An array with the attributes
302
-     */
303
-    protected function _get_shortcode_attrs($shortcode)
304
-    {
305
-        // make sure the required wp helper function is present
306
-        // require the shortcode file if necessary
307
-        if (! function_exists('shortcode_parse_atts')) {
308
-            require_once(ABSPATH . WPINC . '/shortcodes.php');
309
-        }
310
-
311
-        // let's get any attributes that may be present and set the defaults.
312
-        $shortcode_to_parse = str_replace('[', '', str_replace(']', '', $shortcode));
313
-        return shortcode_parse_atts($shortcode_to_parse);
314
-    }
315
-
316
-
317
-    /**
318
-     * Conditional blocks are shortcode patterns with an opening conditional tag `[IF_*]` and a corresponding
319
-     * closing tag (eg `[/IF_*]`).  The content within the tags will be displayed/hidden depending on whatever
320
-     * conditions existed in the opening tag.  This method handles parsing the actual template to show/hide this
321
-     * conditional content.
322
-     *
323
-     * @since 4.9.32
324
-     *
325
-     * @param string $shortcode This should be original shortcode as used in the template and passed to the parser.
326
-     * @param bool   $show      true means the opening and closing tags are removed and the content is left showing,
327
-     *                          false means the opening and closing tags and the contained content are removed.
328
-     * @return string     The template for the shortcode is returned.
329
-     */
330
-    protected function _mutate_conditional_block_in_template($shortcode, $show = true)
331
-    {
332
-        // first let's get all the matches in the template for this particular shortcode.
333
-        preg_match_all('~' . $this->_get_conditional_block_regex($shortcode) . '~', $this->_data['template'], $matches);
334
-
335
-        if ($matches && is_array($matches[0]) && ! empty($matches[0])) {
336
-            // we need to hide all instances of the matches
337
-            foreach ($matches[0] as $index => $content_to_show_or_hide) {
338
-                $content_to_show_or_hide = preg_quote($content_to_show_or_hide);
339
-                $replacement = $show ? $matches[4][ $index ] : '';
340
-                $this->_data['template'] = preg_replace(
341
-                    '~' . $content_to_show_or_hide . '~',
342
-                    $replacement,
343
-                    $this->_data['template']
344
-                );
345
-            }
346
-        }
347
-        // return $template
348
-        return $this->_data['template'];
349
-    }
350
-
351
-
352
-    /**
353
-     * This returns the regex pattern to use for conditional shortcodes parsing.
354
-     *
355
-     * Note: regex comes in part from the WP `get_shortcode_regex` expression in \wp-includes\shortcodes.php
356
-     *
357
-     * @param $shortcode
358
-     * @since 4.9.32
359
-     * @return string
360
-     */
361
-    private function _get_conditional_block_regex($shortcode)
362
-    {
363
-        // get just the shortcode tag for the match
364
-        preg_match('@\[([^<>&/\[\]\x00-\x20=]++)@', $shortcode, $shortcode_tag_matches);
365
-        if (empty($shortcode_tag_matches[1])) {
366
-            return $this->_data['template'];
367
-        }
368
-
369
-        $shortcode_tag = $shortcode_tag_matches[1];
370
-        // get attributes_part_of_tag
371
-        $attributes_part = preg_quote(str_replace(array($shortcode_tag, '[', ']'), '', $shortcode));
372
-        // escape
373
-        $shortcode_tag = preg_quote($shortcode_tag);
374
-
375
-        return
376
-            '\['                                  // Opening Bracket
377
-            . "($shortcode_tag)$attributes_part"    // 1: Shortcode Name
378
-            . '(?![\w-])'                           // Not followed by word character or hyphen
379
-            . '('                                   // 2: Unroll the loop: Inside the opening shortcode tag
380
-            . '[^\]\/]*'                          // Not a closing bracket or forward slash
381
-            . '(?:'
382
-            . '\/(?!\])'                      // A forward slash not followed by a closing bracket
383
-            . '[^\]\/]*'                      // Not a closing bracket or forward slash.
384
-            . ')*?'
385
-            . ')'
386
-            . '(?:'
387
-            . '(\/)'                              // 3. Self closing tag ...
388
-            . '\]'                                // ... and closing bracket
389
-            . '|'
390
-            . '\]'                                // Closing bracket
391
-            . '(?:'
392
-            . '('                             // 4: Unroll the loop: Optionally, anything between the opening and closing brackets
393
-            . '[^\[]*+'                   // Not an opening bracket
394
-            . '(?:'
395
-            . '\[(?!\/\1\])'          // An opening bracket not followed by the closing shortcode tag.
396
-            . '[^\[]*+'               // Not an opening bracket
397
-            . ')*+'
398
-            . ')'
399
-            . '\[\/\1\]'                      // Closing shortcode tag
400
-            . ')?'
401
-            . ')';
402
-    }
403
-
404
-
405
-    /**
406
-     * This sets the properties related to the messages system
407
-     *
408
-     * @since 4.5.0
409
-     * @return void
410
-     */
411
-    protected function _set_messages_properties()
412
-    {
413
-        // should be in _extra_data
414
-        if (isset($this->_extra_data['messenger'])) {
415
-            $this->_messenger = $this->_extra_data['messenger'];
416
-            $this->_message_type = $this->_extra_data['message_type'];
417
-            $this->_context = $this->_extra_data['message'] instanceof EE_Message
418
-                ? $this->_extra_data['message']->context() : '';
419
-            $this->_GRP_ID = $this->_extra_data['message'] instanceof EE_Message
420
-                ? $this->_extra_data['message']->GRP_ID() : 0;
421
-            $this->_message = $this->_extra_data['message'] instanceof EE_Message ? $this->_extra_data['message']
422
-                : null;
423
-        }
424
-    }
425
-
426
-
427
-    /**
428
-     * This returns whatever the set message type object is that was set on this shortcode parser.
429
-     *
430
-     * @since 4.5.0
431
-     * @return EE_message_type
432
-     */
433
-    public function get_set_message_type()
434
-    {
435
-        return $this->_message_type;
436
-    }
437
-
438
-
439
-    /**
440
-     * This returns whatever the set messenger object is that was set on this shortcode parser
441
-     *
442
-     * @since 4.5.0
443
-     * @return EE_messenger
444
-     */
445
-    public function get_set_messenger()
446
-    {
447
-        return $this->_messenger;
448
-    }
449
-
450
-
451
-    /**
452
-     * This returns whatever the set context string is on this shortcode parser.
453
-     *
454
-     * @since 4.5.0
455
-     * @return string
456
-     */
457
-    public function get_set_context()
458
-    {
459
-        return $this->_context;
460
-    }
461
-
462
-
463
-    /**
464
-     * This returns whatever the set EE_Message object is on this shortcode.
465
-     *
466
-     * @since 4.9.0
467
-     * @return EE_Message
468
-     */
469
-    public function get_set_message()
470
-    {
471
-        return $this->_message;
472
-    }
20
+	/**
21
+	 * holds label for library
22
+	 * This is used for referencing the library label
23
+	 *
24
+	 * @access public
25
+	 * @var string
26
+	 */
27
+	public $label;
28
+
29
+
30
+	/**
31
+	 * This property is used for referencing a short description of the library
32
+	 *
33
+	 * @access public
34
+	 * @var string
35
+	 */
36
+	public $description;
37
+
38
+
39
+	/**
40
+	 * This will hold an array of shortcodes with the key as the shortcode ([shortcode]) and the value as a
41
+	 * label/description for the shortcode.
42
+	 *
43
+	 * @access protected
44
+	 * @var array
45
+	 */
46
+	protected $_shortcodes;
47
+
48
+
49
+	/**
50
+	 * This will hold the incoming data item sent to the parser method
51
+	 *
52
+	 * @access protected
53
+	 * @var mixed (array|object)
54
+	 */
55
+	protected $_data;
56
+
57
+
58
+	/**
59
+	 * some shortcodes may require extra data to parse.  This property is provided for that.
60
+	 *
61
+	 * @var array
62
+	 */
63
+	protected $_extra_data;
64
+
65
+
66
+	/**
67
+	 * EE_messenger used to generate the template being parsed.
68
+	 *
69
+	 * @since 4.5.0
70
+	 * @var EE_messenger
71
+	 */
72
+	protected $_messenger;
73
+
74
+
75
+	/**
76
+	 * message type used to generate the template being parsed.
77
+	 *
78
+	 * @since 4.5.0
79
+	 * @var EE_message_type
80
+	 */
81
+	protected $_message_type;
82
+
83
+
84
+	/**
85
+	 * context used for the template being parsed
86
+	 *
87
+	 * @since 4.5.0
88
+	 * @var string
89
+	 */
90
+	protected $_context;
91
+
92
+
93
+	/**
94
+	 * Specific Message Template Group ID
95
+	 *
96
+	 * @since 4.5.0
97
+	 * @var int
98
+	 */
99
+	protected $_GRP_ID;
100
+
101
+
102
+	/**
103
+	 * @since 4.9.0
104
+	 * @type EE_Message
105
+	 */
106
+	protected $_message;
107
+
108
+
109
+	/**
110
+	 * This will hold an instance of the EEH_Parse_Shortcodes helper that will be used when handling list type
111
+	 * shortcodes
112
+	 *
113
+	 * @var EEH_Parse_Shortcodes
114
+	 */
115
+	protected $_shortcode_helper;
116
+
117
+
118
+	public function __construct()
119
+	{
120
+		$this->_set_defaults();
121
+		$this->_init_props();
122
+	}
123
+
124
+
125
+	/**
126
+	 * This sets the defaults for the properties.  Child classes will override these properties in their _init_props
127
+	 * method
128
+	 */
129
+	private function _set_defaults()
130
+	{
131
+		$this->name = $this->description = '';
132
+		$this->_shortcodes = array();
133
+		$this->_set_shortcode_helper();
134
+	}
135
+
136
+
137
+	/**
138
+	 * loads an instance of the EE_Shortcode_Parser helper when requested
139
+	 */
140
+	protected function _set_shortcode_helper()
141
+	{
142
+		// get shortcode_replace instance- set when _get_messages is called in child...
143
+		$this->_shortcode_helper = new EEH_Parse_Shortcodes();
144
+	}
145
+
146
+
147
+	public function get_shortcode_helper()
148
+	{
149
+		if (! $this->_shortcode_helper instanceof EEH_Parse_Shortcodes) {
150
+			$this->_set_shortcode_helper();
151
+		}
152
+		return $this->_shortcode_helper;
153
+	}
154
+
155
+
156
+	/**
157
+	 * This is the public method for kicking of the parser included with each child.  It can be overridden by child
158
+	 * classes if necessary (see EE_Questions_Answers for example)
159
+	 *
160
+	 * @param  string $shortcode incoming shortcode to be parsed
161
+	 * @param  mixed (object|array) $data       incoming data to be be used for parsing
162
+	 * @param  mixed (object|array) $extra_data extra incoming data (usually EE_Messages_Addressee)
163
+	 * @return string            parsed shortcode.
164
+	 */
165
+	public function parser($shortcode, $data, $extra_data = array())
166
+	{
167
+
168
+		// filter setup shortcodes
169
+		$this->_shortcodes = $this->get_shortcodes();
170
+
171
+		// we need to setup any dynamic shortcodes so that they work with the array_key_exists
172
+		$sc = preg_match_all('/(\[[A-Za-z0-9\_]+_\*)/', $shortcode, $matches);
173
+		$sc_to_verify = ! empty($matches[0]) ? $matches[0][0] . ']' : $shortcode;
174
+
175
+		// first we want to make sure this is a valid shortcode
176
+		if (! array_key_exists($sc_to_verify, $this->_shortcodes)) {
177
+			return false;
178
+		} //get out, this parser doesn't handle the incoming shortcode.
179
+		$this->_data = $data;
180
+		$this->_extra_data = $extra_data;
181
+		$this->_set_messages_properties();
182
+		$parsed = apply_filters(
183
+			'FHEE__' . get_class($this) . '__parser_after',
184
+			$this->_parser($shortcode),
185
+			$shortcode,
186
+			$data,
187
+			$extra_data,
188
+			$this
189
+		);
190
+
191
+		// note the below filter applies to ALL shortcode parsers... be careful!
192
+		$parsed = apply_filters('FHEE__EE_Shortcodes__parser_after', $parsed, $shortcode, $data, $extra_data, $this);
193
+		return $parsed;
194
+	}
195
+
196
+
197
+	/**
198
+	 * This method just returns the shortcodes in the $_shortcodes array property.
199
+	 *
200
+	 * @access public
201
+	 * @return array array of shortcodes => description pairs
202
+	 */
203
+	public function get_shortcodes()
204
+	{
205
+		$this->_shortcodes = apply_filters('FHEE__' . get_class($this) . '__shortcodes', $this->_shortcodes, $this);
206
+
207
+		// note the below filter applies to ALL shortcode parsers... be careful!
208
+		$this->_shortcodes = apply_filters('FHEE__EE_Shortcodes__shortcodes', $this->_shortcodes, $this);
209
+
210
+		return $this->_shortcodes;
211
+	}
212
+
213
+
214
+	/**
215
+	 * Child classes use this method to set the $name, $description, and $_shortcodes properties.
216
+	 *
217
+	 * @abstract
218
+	 * @access protected
219
+	 * @return void
220
+	 */
221
+	abstract protected function _init_props();
222
+
223
+
224
+	/**
225
+	 * This method will give parsing instructions for each shortcode defined in the _shortcodes array.  Child methods
226
+	 * will have to take care of handling.
227
+	 *
228
+	 * @abstract
229
+	 * @access protected
230
+	 * @param string $shortcode    the shortcode to be parsed.
231
+	 * @param mixed (object|array) $data      incoming data for the parser.  The data could be either an object or
232
+	 *                             array because there are some shortcodes that might be replaced by prepared data that
233
+	 *                             has multiple items in a list (i.e. list of attendees in an event and we're showing
234
+	 *                             fname/lname for each attendee).  In this case data will be in an array.  Otherwise
235
+	 *                             the data shoudl be in a properly formatted object.  The
236
+	 *                             EEH_Parse_Shortcodes.helper.php describes the data object we're expecting.
237
+	 * @return string parsed shortcode
238
+	 */
239
+	abstract protected function _parser($shortcode);
240
+
241
+
242
+	/**
243
+	 * This just validates incoming data for list type shortcode parsers (and they call this method) to make sure it
244
+	 * meets their requirements
245
+	 *
246
+	 * @return mixed (void|exception) If validation fails we'll throw an exception.
247
+	 */
248
+	protected function _validate_list_requirements()
249
+	{
250
+
251
+		// first test to make sure we've got an array!
252
+		if (! is_array($this->_data)) {
253
+			throw new EE_Error(
254
+				sprintf(
255
+					__(
256
+						'Expecting an array for the data sent to %s. Instead it was %s',
257
+						'event_espresso'
258
+					),
259
+					get_class($this),
260
+					gettype($this->_data)
261
+				)
262
+			);
263
+		}
264
+
265
+		// next test to make sure we've got the required template in the index!
266
+		if (! isset($this->_data['template'])) {
267
+			throw new EE_Error(
268
+				sprintf(
269
+					__(
270
+						'The incoming data does not have the required template index in its array',
271
+						'event_espresso'
272
+					)
273
+				)
274
+			);
275
+		}
276
+
277
+		// next test to make sure we've got got a data index in the incoming data array
278
+		if (! isset($this->_data['data'])) {
279
+			throw new EE_Error(
280
+				__(
281
+					'The incoming data does not have the required data index in its array',
282
+					'event_espresso'
283
+				)
284
+			);
285
+		}
286
+
287
+		// all is well let's make sure _extra_data always has the values needed.
288
+		// let's make sure that extra_data includes all templates (for later parsing if necessary)
289
+		if (empty($this->_extra_data) || (empty($this->_extra_data['data']) && empty($this->_extra_data['template']))) {
290
+			$this->_extra_data['data'] = $this->_data['data'];
291
+			$this->_extra_data['template'] = $this->_data['template'];
292
+		}
293
+	}
294
+
295
+
296
+	/**
297
+	 * This returns any attributes that may be existing on an EE_Shortcode
298
+	 *
299
+	 * @since 4.5.0
300
+	 * @param string $shortcode incoming shortcode
301
+	 * @return array An array with the attributes
302
+	 */
303
+	protected function _get_shortcode_attrs($shortcode)
304
+	{
305
+		// make sure the required wp helper function is present
306
+		// require the shortcode file if necessary
307
+		if (! function_exists('shortcode_parse_atts')) {
308
+			require_once(ABSPATH . WPINC . '/shortcodes.php');
309
+		}
310
+
311
+		// let's get any attributes that may be present and set the defaults.
312
+		$shortcode_to_parse = str_replace('[', '', str_replace(']', '', $shortcode));
313
+		return shortcode_parse_atts($shortcode_to_parse);
314
+	}
315
+
316
+
317
+	/**
318
+	 * Conditional blocks are shortcode patterns with an opening conditional tag `[IF_*]` and a corresponding
319
+	 * closing tag (eg `[/IF_*]`).  The content within the tags will be displayed/hidden depending on whatever
320
+	 * conditions existed in the opening tag.  This method handles parsing the actual template to show/hide this
321
+	 * conditional content.
322
+	 *
323
+	 * @since 4.9.32
324
+	 *
325
+	 * @param string $shortcode This should be original shortcode as used in the template and passed to the parser.
326
+	 * @param bool   $show      true means the opening and closing tags are removed and the content is left showing,
327
+	 *                          false means the opening and closing tags and the contained content are removed.
328
+	 * @return string     The template for the shortcode is returned.
329
+	 */
330
+	protected function _mutate_conditional_block_in_template($shortcode, $show = true)
331
+	{
332
+		// first let's get all the matches in the template for this particular shortcode.
333
+		preg_match_all('~' . $this->_get_conditional_block_regex($shortcode) . '~', $this->_data['template'], $matches);
334
+
335
+		if ($matches && is_array($matches[0]) && ! empty($matches[0])) {
336
+			// we need to hide all instances of the matches
337
+			foreach ($matches[0] as $index => $content_to_show_or_hide) {
338
+				$content_to_show_or_hide = preg_quote($content_to_show_or_hide);
339
+				$replacement = $show ? $matches[4][ $index ] : '';
340
+				$this->_data['template'] = preg_replace(
341
+					'~' . $content_to_show_or_hide . '~',
342
+					$replacement,
343
+					$this->_data['template']
344
+				);
345
+			}
346
+		}
347
+		// return $template
348
+		return $this->_data['template'];
349
+	}
350
+
351
+
352
+	/**
353
+	 * This returns the regex pattern to use for conditional shortcodes parsing.
354
+	 *
355
+	 * Note: regex comes in part from the WP `get_shortcode_regex` expression in \wp-includes\shortcodes.php
356
+	 *
357
+	 * @param $shortcode
358
+	 * @since 4.9.32
359
+	 * @return string
360
+	 */
361
+	private function _get_conditional_block_regex($shortcode)
362
+	{
363
+		// get just the shortcode tag for the match
364
+		preg_match('@\[([^<>&/\[\]\x00-\x20=]++)@', $shortcode, $shortcode_tag_matches);
365
+		if (empty($shortcode_tag_matches[1])) {
366
+			return $this->_data['template'];
367
+		}
368
+
369
+		$shortcode_tag = $shortcode_tag_matches[1];
370
+		// get attributes_part_of_tag
371
+		$attributes_part = preg_quote(str_replace(array($shortcode_tag, '[', ']'), '', $shortcode));
372
+		// escape
373
+		$shortcode_tag = preg_quote($shortcode_tag);
374
+
375
+		return
376
+			'\['                                  // Opening Bracket
377
+			. "($shortcode_tag)$attributes_part"    // 1: Shortcode Name
378
+			. '(?![\w-])'                           // Not followed by word character or hyphen
379
+			. '('                                   // 2: Unroll the loop: Inside the opening shortcode tag
380
+			. '[^\]\/]*'                          // Not a closing bracket or forward slash
381
+			. '(?:'
382
+			. '\/(?!\])'                      // A forward slash not followed by a closing bracket
383
+			. '[^\]\/]*'                      // Not a closing bracket or forward slash.
384
+			. ')*?'
385
+			. ')'
386
+			. '(?:'
387
+			. '(\/)'                              // 3. Self closing tag ...
388
+			. '\]'                                // ... and closing bracket
389
+			. '|'
390
+			. '\]'                                // Closing bracket
391
+			. '(?:'
392
+			. '('                             // 4: Unroll the loop: Optionally, anything between the opening and closing brackets
393
+			. '[^\[]*+'                   // Not an opening bracket
394
+			. '(?:'
395
+			. '\[(?!\/\1\])'          // An opening bracket not followed by the closing shortcode tag.
396
+			. '[^\[]*+'               // Not an opening bracket
397
+			. ')*+'
398
+			. ')'
399
+			. '\[\/\1\]'                      // Closing shortcode tag
400
+			. ')?'
401
+			. ')';
402
+	}
403
+
404
+
405
+	/**
406
+	 * This sets the properties related to the messages system
407
+	 *
408
+	 * @since 4.5.0
409
+	 * @return void
410
+	 */
411
+	protected function _set_messages_properties()
412
+	{
413
+		// should be in _extra_data
414
+		if (isset($this->_extra_data['messenger'])) {
415
+			$this->_messenger = $this->_extra_data['messenger'];
416
+			$this->_message_type = $this->_extra_data['message_type'];
417
+			$this->_context = $this->_extra_data['message'] instanceof EE_Message
418
+				? $this->_extra_data['message']->context() : '';
419
+			$this->_GRP_ID = $this->_extra_data['message'] instanceof EE_Message
420
+				? $this->_extra_data['message']->GRP_ID() : 0;
421
+			$this->_message = $this->_extra_data['message'] instanceof EE_Message ? $this->_extra_data['message']
422
+				: null;
423
+		}
424
+	}
425
+
426
+
427
+	/**
428
+	 * This returns whatever the set message type object is that was set on this shortcode parser.
429
+	 *
430
+	 * @since 4.5.0
431
+	 * @return EE_message_type
432
+	 */
433
+	public function get_set_message_type()
434
+	{
435
+		return $this->_message_type;
436
+	}
437
+
438
+
439
+	/**
440
+	 * This returns whatever the set messenger object is that was set on this shortcode parser
441
+	 *
442
+	 * @since 4.5.0
443
+	 * @return EE_messenger
444
+	 */
445
+	public function get_set_messenger()
446
+	{
447
+		return $this->_messenger;
448
+	}
449
+
450
+
451
+	/**
452
+	 * This returns whatever the set context string is on this shortcode parser.
453
+	 *
454
+	 * @since 4.5.0
455
+	 * @return string
456
+	 */
457
+	public function get_set_context()
458
+	{
459
+		return $this->_context;
460
+	}
461
+
462
+
463
+	/**
464
+	 * This returns whatever the set EE_Message object is on this shortcode.
465
+	 *
466
+	 * @since 4.9.0
467
+	 * @return EE_Message
468
+	 */
469
+	public function get_set_message()
470
+	{
471
+		return $this->_message;
472
+	}
473 473
 }
Please login to merge, or discard this patch.
Spacing   +13 added lines, -13 removed lines patch added patch discarded remove patch
@@ -146,7 +146,7 @@  discard block
 block discarded – undo
146 146
 
147 147
     public function get_shortcode_helper()
148 148
     {
149
-        if (! $this->_shortcode_helper instanceof EEH_Parse_Shortcodes) {
149
+        if ( ! $this->_shortcode_helper instanceof EEH_Parse_Shortcodes) {
150 150
             $this->_set_shortcode_helper();
151 151
         }
152 152
         return $this->_shortcode_helper;
@@ -170,17 +170,17 @@  discard block
 block discarded – undo
170 170
 
171 171
         // we need to setup any dynamic shortcodes so that they work with the array_key_exists
172 172
         $sc = preg_match_all('/(\[[A-Za-z0-9\_]+_\*)/', $shortcode, $matches);
173
-        $sc_to_verify = ! empty($matches[0]) ? $matches[0][0] . ']' : $shortcode;
173
+        $sc_to_verify = ! empty($matches[0]) ? $matches[0][0].']' : $shortcode;
174 174
 
175 175
         // first we want to make sure this is a valid shortcode
176
-        if (! array_key_exists($sc_to_verify, $this->_shortcodes)) {
176
+        if ( ! array_key_exists($sc_to_verify, $this->_shortcodes)) {
177 177
             return false;
178 178
         } //get out, this parser doesn't handle the incoming shortcode.
179 179
         $this->_data = $data;
180 180
         $this->_extra_data = $extra_data;
181 181
         $this->_set_messages_properties();
182 182
         $parsed = apply_filters(
183
-            'FHEE__' . get_class($this) . '__parser_after',
183
+            'FHEE__'.get_class($this).'__parser_after',
184 184
             $this->_parser($shortcode),
185 185
             $shortcode,
186 186
             $data,
@@ -202,7 +202,7 @@  discard block
 block discarded – undo
202 202
      */
203 203
     public function get_shortcodes()
204 204
     {
205
-        $this->_shortcodes = apply_filters('FHEE__' . get_class($this) . '__shortcodes', $this->_shortcodes, $this);
205
+        $this->_shortcodes = apply_filters('FHEE__'.get_class($this).'__shortcodes', $this->_shortcodes, $this);
206 206
 
207 207
         // note the below filter applies to ALL shortcode parsers... be careful!
208 208
         $this->_shortcodes = apply_filters('FHEE__EE_Shortcodes__shortcodes', $this->_shortcodes, $this);
@@ -249,7 +249,7 @@  discard block
 block discarded – undo
249 249
     {
250 250
 
251 251
         // first test to make sure we've got an array!
252
-        if (! is_array($this->_data)) {
252
+        if ( ! is_array($this->_data)) {
253 253
             throw new EE_Error(
254 254
                 sprintf(
255 255
                     __(
@@ -263,7 +263,7 @@  discard block
 block discarded – undo
263 263
         }
264 264
 
265 265
         // next test to make sure we've got the required template in the index!
266
-        if (! isset($this->_data['template'])) {
266
+        if ( ! isset($this->_data['template'])) {
267 267
             throw new EE_Error(
268 268
                 sprintf(
269 269
                     __(
@@ -275,7 +275,7 @@  discard block
 block discarded – undo
275 275
         }
276 276
 
277 277
         // next test to make sure we've got got a data index in the incoming data array
278
-        if (! isset($this->_data['data'])) {
278
+        if ( ! isset($this->_data['data'])) {
279 279
             throw new EE_Error(
280 280
                 __(
281 281
                     'The incoming data does not have the required data index in its array',
@@ -304,8 +304,8 @@  discard block
 block discarded – undo
304 304
     {
305 305
         // make sure the required wp helper function is present
306 306
         // require the shortcode file if necessary
307
-        if (! function_exists('shortcode_parse_atts')) {
308
-            require_once(ABSPATH . WPINC . '/shortcodes.php');
307
+        if ( ! function_exists('shortcode_parse_atts')) {
308
+            require_once(ABSPATH.WPINC.'/shortcodes.php');
309 309
         }
310 310
 
311 311
         // let's get any attributes that may be present and set the defaults.
@@ -330,15 +330,15 @@  discard block
 block discarded – undo
330 330
     protected function _mutate_conditional_block_in_template($shortcode, $show = true)
331 331
     {
332 332
         // first let's get all the matches in the template for this particular shortcode.
333
-        preg_match_all('~' . $this->_get_conditional_block_regex($shortcode) . '~', $this->_data['template'], $matches);
333
+        preg_match_all('~'.$this->_get_conditional_block_regex($shortcode).'~', $this->_data['template'], $matches);
334 334
 
335 335
         if ($matches && is_array($matches[0]) && ! empty($matches[0])) {
336 336
             // we need to hide all instances of the matches
337 337
             foreach ($matches[0] as $index => $content_to_show_or_hide) {
338 338
                 $content_to_show_or_hide = preg_quote($content_to_show_or_hide);
339
-                $replacement = $show ? $matches[4][ $index ] : '';
339
+                $replacement = $show ? $matches[4][$index] : '';
340 340
                 $this->_data['template'] = preg_replace(
341
-                    '~' . $content_to_show_or_hide . '~',
341
+                    '~'.$content_to_show_or_hide.'~',
342 342
                     $replacement,
343 343
                     $this->_data['template']
344 344
                 );
Please login to merge, or discard this patch.
core/services/commands/transaction/CreateTransactionCommand.php 2 patches
Spacing   +1 added lines, -1 removed lines patch added patch discarded remove patch
@@ -57,7 +57,7 @@
 block discarded – undo
57 57
     public function getCapCheck()
58 58
     {
59 59
         // need cap for non-AJAX admin requests
60
-        if (! (defined('DOING_AJAX') && DOING_AJAX) && is_admin()) {
60
+        if ( ! (defined('DOING_AJAX') && DOING_AJAX) && is_admin()) {
61 61
             // there's no specific caps for editing/creating transactions,
62 62
             // so that's why we are using ee_edit_registrations
63 63
             return new CapCheck('ee_edit_registrations', 'create_new_transaction');
Please login to merge, or discard this patch.
Indentation   +47 added lines, -47 removed lines patch added patch discarded remove patch
@@ -20,60 +20,60 @@
 block discarded – undo
20 20
 class CreateTransactionCommand extends Command implements CommandRequiresCapCheckInterface
21 21
 {
22 22
 
23
-    /**
24
-     * @var EE_Checkout $checkout
25
-     */
26
-    protected $checkout;
23
+	/**
24
+	 * @var EE_Checkout $checkout
25
+	 */
26
+	protected $checkout;
27 27
 
28
-    /**
29
-     * @var array $transaction_details
30
-     */
31
-    protected $transaction_details;
28
+	/**
29
+	 * @var array $transaction_details
30
+	 */
31
+	protected $transaction_details;
32 32
 
33 33
 
34
-    /**
35
-     * CreateTransactionCommand constructor.
36
-     *
37
-     * @param EE_Checkout $checkout
38
-     * @param array       $transaction_details
39
-     */
40
-    public function __construct(EE_Checkout $checkout = null, array $transaction_details = array())
41
-    {
42
-        $this->checkout = $checkout;
43
-        $this->transaction_details = $transaction_details;
44
-    }
34
+	/**
35
+	 * CreateTransactionCommand constructor.
36
+	 *
37
+	 * @param EE_Checkout $checkout
38
+	 * @param array       $transaction_details
39
+	 */
40
+	public function __construct(EE_Checkout $checkout = null, array $transaction_details = array())
41
+	{
42
+		$this->checkout = $checkout;
43
+		$this->transaction_details = $transaction_details;
44
+	}
45 45
 
46 46
 
47
-    /**
48
-     * @return CapCheckInterface
49
-     * @throws InvalidDataTypeException
50
-     */
51
-    public function getCapCheck()
52
-    {
53
-        // need cap for non-AJAX admin requests
54
-        if (! (defined('DOING_AJAX') && DOING_AJAX) && is_admin()) {
55
-            // there's no specific caps for editing/creating transactions,
56
-            // so that's why we are using ee_edit_registrations
57
-            return new CapCheck('ee_edit_registrations', 'create_new_transaction');
58
-        }
59
-        return new PublicCapabilities('', 'create_new_transaction');
60
-    }
47
+	/**
48
+	 * @return CapCheckInterface
49
+	 * @throws InvalidDataTypeException
50
+	 */
51
+	public function getCapCheck()
52
+	{
53
+		// need cap for non-AJAX admin requests
54
+		if (! (defined('DOING_AJAX') && DOING_AJAX) && is_admin()) {
55
+			// there's no specific caps for editing/creating transactions,
56
+			// so that's why we are using ee_edit_registrations
57
+			return new CapCheck('ee_edit_registrations', 'create_new_transaction');
58
+		}
59
+		return new PublicCapabilities('', 'create_new_transaction');
60
+	}
61 61
 
62 62
 
63
-    /**
64
-     * @return EE_Checkout
65
-     */
66
-    public function checkout()
67
-    {
68
-        return $this->checkout;
69
-    }
63
+	/**
64
+	 * @return EE_Checkout
65
+	 */
66
+	public function checkout()
67
+	{
68
+		return $this->checkout;
69
+	}
70 70
 
71 71
 
72
-    /**
73
-     * @return array
74
-     */
75
-    public function transactionDetails()
76
-    {
77
-        return $this->transaction_details;
78
-    }
72
+	/**
73
+	 * @return array
74
+	 */
75
+	public function transactionDetails()
76
+	{
77
+		return $this->transaction_details;
78
+	}
79 79
 }
Please login to merge, or discard this patch.