Completed
Branch BUG/fix-ee-rest-debug-headers (1355bc)
by
unknown
03:29 queued 18s
created
core/libraries/plugin_api/EE_Register_Data_Migration_Scripts.lib.php 2 patches
Spacing   +4 added lines, -4 removed lines patch added patch discarded remove patch
@@ -47,7 +47,7 @@  discard block
 block discarded – undo
47 47
             );
48 48
         }
49 49
         // make sure we don't register twice
50
-        if (isset(self::$_settings[ $identifier ])) {
50
+        if (isset(self::$_settings[$identifier])) {
51 51
             return;
52 52
         }
53 53
         // make sure this was called in the right place!
@@ -65,7 +65,7 @@  discard block
 block discarded – undo
65 65
             );
66 66
         }
67 67
         // setup $_settings array from incoming values.
68
-        self::$_settings[ $identifier ] = array(
68
+        self::$_settings[$identifier] = array(
69 69
             'dms_paths' => (array) $setup_args['dms_paths'],
70 70
         );
71 71
         // setup DMS
@@ -90,7 +90,7 @@  discard block
 block discarded – undo
90 90
                 // so if for some reason an addon has multiple dms paths,
91 91
                 // we append one or more * to the classname
92 92
                 // which will get stripped out later on
93
-                $dms_paths[ $identifier . str_repeat('*', $wildcards) ] = $dms_path;
93
+                $dms_paths[$identifier.str_repeat('*', $wildcards)] = $dms_path;
94 94
                 $wildcards++;
95 95
             }
96 96
         }
@@ -107,6 +107,6 @@  discard block
 block discarded – undo
107 107
      */
108 108
     public static function deregister($identifier = '')
109 109
     {
110
-        unset(self::$_settings[ $identifier ]);
110
+        unset(self::$_settings[$identifier]);
111 111
     }
112 112
 }
Please login to merge, or discard this patch.
Indentation   +88 added lines, -88 removed lines patch added patch discarded remove patch
@@ -14,98 +14,98 @@
 block discarded – undo
14 14
  */
15 15
 class EE_Register_Data_Migration_Scripts implements EEI_Plugin_API
16 16
 {
17
-    /**
18
-     * Holds values for registered DMSs
19
-     *
20
-     * @var array[][]
21
-     */
22
-    protected static $_settings = array();
17
+	/**
18
+	 * Holds values for registered DMSs
19
+	 *
20
+	 * @var array[][]
21
+	 */
22
+	protected static $_settings = array();
23 23
 
24 24
 
25
-    /**
26
-     * Method for registering new Data Migration Scripts
27
-     *
28
-     * @since 4.3.0
29
-     * @param string $identifier EE_Addon class name that this set of data migration scripts belongs to
30
-     *                           If EE_Addon class is namespaced, then this needs to be the Fully Qualified Class Name
31
-     * @param array  $setup_args {
32
-     * @type string  $dms_paths  an array of full server paths to folders that contain data migration scripts
33
-     *                           }
34
-     * @throws EE_Error
35
-     * @return void
36
-     */
37
-    public static function register($identifier = '', array $setup_args = [])
38
-    {
39
-        // required fields MUST be present, so let's make sure they are.
40
-        if (empty($identifier) || ! is_array($setup_args) || empty($setup_args['dms_paths'])) {
41
-            throw new EE_Error(
42
-                esc_html__(
43
-                    'In order to register Data Migration Scripts with EE_Register_Data_Migration_Scripts::register(), you must include the EE_Addon class name (used as a unique identifier for this set of data migration scripts), and an array containing the following keys: "dms_paths" (an array of full server paths to folders that contain data migration scripts)',
44
-                    'event_espresso'
45
-                )
46
-            );
47
-        }
48
-        // make sure we don't register twice
49
-        if (isset(self::$_settings[ $identifier ])) {
50
-            return;
51
-        }
52
-        // make sure this was called in the right place!
53
-        if (
54
-            ! did_action('AHEE__EE_System__load_espresso_addons')
55
-            || did_action('AHEE__EE_System___detect_if_activation_or_upgrade__begin')
56
-        ) {
57
-            EE_Error::doing_it_wrong(
58
-                __METHOD__,
59
-                esc_html__(
60
-                    'An attempt to register Data Migration Scripts has failed because it was not registered at the correct time.  Please use the "AHEE__EE_System__load_espresso_addons" hook to register Data Migration Scripts.',
61
-                    'event_espresso'
62
-                ),
63
-                '4.3.0'
64
-            );
65
-        }
66
-        // setup $_settings array from incoming values.
67
-        self::$_settings[ $identifier ] = array(
68
-            'dms_paths' => (array) $setup_args['dms_paths'],
69
-        );
70
-        // setup DMS
71
-        add_filter(
72
-            'FHEE__EE_Data_Migration_Manager__get_data_migration_script_folders',
73
-            array('EE_Register_Data_Migration_Scripts', 'add_data_migration_script_folders')
74
-        );
75
-    }
25
+	/**
26
+	 * Method for registering new Data Migration Scripts
27
+	 *
28
+	 * @since 4.3.0
29
+	 * @param string $identifier EE_Addon class name that this set of data migration scripts belongs to
30
+	 *                           If EE_Addon class is namespaced, then this needs to be the Fully Qualified Class Name
31
+	 * @param array  $setup_args {
32
+	 * @type string  $dms_paths  an array of full server paths to folders that contain data migration scripts
33
+	 *                           }
34
+	 * @throws EE_Error
35
+	 * @return void
36
+	 */
37
+	public static function register($identifier = '', array $setup_args = [])
38
+	{
39
+		// required fields MUST be present, so let's make sure they are.
40
+		if (empty($identifier) || ! is_array($setup_args) || empty($setup_args['dms_paths'])) {
41
+			throw new EE_Error(
42
+				esc_html__(
43
+					'In order to register Data Migration Scripts with EE_Register_Data_Migration_Scripts::register(), you must include the EE_Addon class name (used as a unique identifier for this set of data migration scripts), and an array containing the following keys: "dms_paths" (an array of full server paths to folders that contain data migration scripts)',
44
+					'event_espresso'
45
+				)
46
+			);
47
+		}
48
+		// make sure we don't register twice
49
+		if (isset(self::$_settings[ $identifier ])) {
50
+			return;
51
+		}
52
+		// make sure this was called in the right place!
53
+		if (
54
+			! did_action('AHEE__EE_System__load_espresso_addons')
55
+			|| did_action('AHEE__EE_System___detect_if_activation_or_upgrade__begin')
56
+		) {
57
+			EE_Error::doing_it_wrong(
58
+				__METHOD__,
59
+				esc_html__(
60
+					'An attempt to register Data Migration Scripts has failed because it was not registered at the correct time.  Please use the "AHEE__EE_System__load_espresso_addons" hook to register Data Migration Scripts.',
61
+					'event_espresso'
62
+				),
63
+				'4.3.0'
64
+			);
65
+		}
66
+		// setup $_settings array from incoming values.
67
+		self::$_settings[ $identifier ] = array(
68
+			'dms_paths' => (array) $setup_args['dms_paths'],
69
+		);
70
+		// setup DMS
71
+		add_filter(
72
+			'FHEE__EE_Data_Migration_Manager__get_data_migration_script_folders',
73
+			array('EE_Register_Data_Migration_Scripts', 'add_data_migration_script_folders')
74
+		);
75
+	}
76 76
 
77 77
 
78
-    /**
79
-     * @param array $dms_paths
80
-     * @return array
81
-     */
82
-    public static function add_data_migration_script_folders(array $dms_paths = array())
83
-    {
84
-        foreach (self::$_settings as $identifier => $settings) {
85
-            $wildcards = 0;
86
-            foreach ($settings['dms_paths'] as $dms_path) {
87
-                // since we are using the addon name for the array key
88
-                // we need to ensure that the key is unique,
89
-                // so if for some reason an addon has multiple dms paths,
90
-                // we append one or more * to the classname
91
-                // which will get stripped out later on
92
-                $dms_paths[ $identifier . str_repeat('*', $wildcards) ] = $dms_path;
93
-                $wildcards++;
94
-            }
95
-        }
96
-        return $dms_paths;
97
-    }
78
+	/**
79
+	 * @param array $dms_paths
80
+	 * @return array
81
+	 */
82
+	public static function add_data_migration_script_folders(array $dms_paths = array())
83
+	{
84
+		foreach (self::$_settings as $identifier => $settings) {
85
+			$wildcards = 0;
86
+			foreach ($settings['dms_paths'] as $dms_path) {
87
+				// since we are using the addon name for the array key
88
+				// we need to ensure that the key is unique,
89
+				// so if for some reason an addon has multiple dms paths,
90
+				// we append one or more * to the classname
91
+				// which will get stripped out later on
92
+				$dms_paths[ $identifier . str_repeat('*', $wildcards) ] = $dms_path;
93
+				$wildcards++;
94
+			}
95
+		}
96
+		return $dms_paths;
97
+	}
98 98
 
99 99
 
100
-    /**
101
-     * This deregisters a set of Data Migration Scripts that were previously registered with a specific dms_id
102
-     *
103
-     * @since 4.3.0
104
-     * @param string $identifier EE_Addon class name that this set of data migration scripts belongs to
105
-     * @return void
106
-     */
107
-    public static function deregister($identifier = '')
108
-    {
109
-        unset(self::$_settings[ $identifier ]);
110
-    }
100
+	/**
101
+	 * This deregisters a set of Data Migration Scripts that were previously registered with a specific dms_id
102
+	 *
103
+	 * @since 4.3.0
104
+	 * @param string $identifier EE_Addon class name that this set of data migration scripts belongs to
105
+	 * @return void
106
+	 */
107
+	public static function deregister($identifier = '')
108
+	{
109
+		unset(self::$_settings[ $identifier ]);
110
+	}
111 111
 }
Please login to merge, or discard this patch.
core/libraries/plugin_api/EE_Register_Messages_Shortcode_Library.lib.php 2 patches
Spacing   +9 added lines, -9 removed lines patch added patch discarded remove patch
@@ -73,7 +73,7 @@  discard block
 block discarded – undo
73 73
         }
74 74
 
75 75
         // make sure we don't register twice
76
-        if (isset(self::$_ee_messages_shortcode_registry[ $identifier ])) {
76
+        if (isset(self::$_ee_messages_shortcode_registry[$identifier])) {
77 77
             return;
78 78
         }
79 79
 
@@ -95,7 +95,7 @@  discard block
 block discarded – undo
95 95
             );
96 96
         }
97 97
 
98
-        self::$_ee_messages_shortcode_registry[ $identifier ] = [
98
+        self::$_ee_messages_shortcode_registry[$identifier] = [
99 99
             'autoloadpaths'        => (array) $setup_args['autoloadpaths'],
100 100
             'list_type_shortcodes' => ! empty($setup_args['list_type_shortcodes'])
101 101
                 ? (array) $setup_args['list_type_shortcodes'] : [],
@@ -109,19 +109,19 @@  discard block
 block discarded – undo
109 109
         );
110 110
 
111 111
         // add below filters if the required callback is provided.
112
-        if (! empty($setup_args['msgr_validator_callback'])) {
112
+        if ( ! empty($setup_args['msgr_validator_callback'])) {
113 113
             add_filter('FHEE__EE_messenger__get_validator_config', $setup_args['msgr_validator_callback'], 10, 2);
114 114
         }
115 115
 
116
-        if (! empty($setup_args['msgr_template_fields_callback'])) {
116
+        if ( ! empty($setup_args['msgr_template_fields_callback'])) {
117 117
             add_filter('FHEE__EE_messenger__get_template_fields', $setup_args['msgr_template_fields_callback'], 10, 2);
118 118
         }
119 119
 
120
-        if (! empty($setup_args['valid_shortcodes_callback'])) {
120
+        if ( ! empty($setup_args['valid_shortcodes_callback'])) {
121 121
             add_filter('FHEE__EE_Messages_Base__get_valid_shortcodes', $setup_args['valid_shortcodes_callback'], 10, 2);
122 122
         }
123 123
 
124
-        if (! empty($setup_args['list_type_shortcodes'])) {
124
+        if ( ! empty($setup_args['list_type_shortcodes'])) {
125 125
             add_filter(
126 126
                 'FHEE__EEH_Parse_Shortcodes___parse_message_template__list_type_shortcodes',
127 127
                 ['EE_Register_Messages_Shortcode_Library', 'register_list_type_shortcodes'],
@@ -140,7 +140,7 @@  discard block
 block discarded – undo
140 140
      */
141 141
     public static function deregister($identifier = '')
142 142
     {
143
-        unset(self::$_ee_messages_shortcode_registry[ $identifier ]);
143
+        unset(self::$_ee_messages_shortcode_registry[$identifier]);
144 144
     }
145 145
 
146 146
 
@@ -155,7 +155,7 @@  discard block
 block discarded – undo
155 155
     public static function register_msgs_autoload_paths(array $paths)
156 156
     {
157 157
 
158
-        if (! empty(self::$_ee_messages_shortcode_registry)) {
158
+        if ( ! empty(self::$_ee_messages_shortcode_registry)) {
159 159
             foreach (self::$_ee_messages_shortcode_registry as $st_reg) {
160 160
                 if (empty($st_reg['autoloadpaths'])) {
161 161
                     continue;
@@ -184,7 +184,7 @@  discard block
 block discarded – undo
184 184
         }
185 185
 
186 186
         foreach (self::$_ee_messages_shortcode_registry as $sc_reg) {
187
-            if (! empty($sc_reg['list_type_shortcodes'])) {
187
+            if ( ! empty($sc_reg['list_type_shortcodes'])) {
188 188
                 $original_shortcodes = array_merge($original_shortcodes, $sc_reg['list_type_shortcodes']);
189 189
             }
190 190
         }
Please login to merge, or discard this patch.
Indentation   +179 added lines, -179 removed lines patch added patch discarded remove patch
@@ -10,183 +10,183 @@
 block discarded – undo
10 10
  */
11 11
 class EE_Register_Messages_Shortcode_Library implements EEI_Plugin_API
12 12
 {
13
-    /**
14
-     * holds values for registered messages shortcode libraries
15
-     *
16
-     * @var array
17
-     */
18
-    protected static $_ee_messages_shortcode_registry = [];
19
-
20
-
21
-    /**
22
-     * Helper method for registering a new shortcodes library class for the messages system.
23
-     *
24
-     * Note this is not used for adding shortcodes to existing libraries.  It's for registering anything
25
-     * related to registering a new EE_{shortcode_library_name}_Shortcodes.lib.php class.
26
-     *
27
-     * @param string $identifier                                                    What is the name of this shortcode
28
-     *                                                                              library
29
-     *                                                                              (e.g. 'question_list');
30
-     * @param array  $setup_args                                                    {
31
-     *                                                                              An array of arguments provided for
32
-     *                                                                              registering the new messages
33
-     *                                                                              shortcode library.
34
-     *
35
-     * @type array   $autoloadpaths                                                 An array of paths to add to the
36
-     *       messages autoloader for the new shortcode library class file.
37
-     * @type string  $msgr_validator_callback                                       Callback for a method that will
38
-     *       register the library with the messenger
39
-     *                                                                              _validator_config. Optional.
40
-     * @type string  $msgr_template_fields_callback                                 Callback for changing adding the
41
-     *                                                                              _template_fields property for
42
-     *                                                                              messenger. For example, the
43
-     *                                                                              shortcode library may add a new
44
-     *                                                                              field to the message templates.
45
-     *                                                                              Optional.
46
-     * @type string  $valid_shortcodes_callback                                     Callback for message types
47
-     *                                                                              _valid_shortcodes array setup.
48
-     *                                                                              Optional.
49
-     * @type array   $list_type_shortcodes                                          If there are any specific
50
-     *       shortcodes with this message shortcode library that should be considered "list type" then include them in
51
-     *       an array.  List Type shortcodes are shortcodes that have a corresponding field that indicates how they are
52
-     *       parsed. Optional.
53
-     * }
54
-     * @return void
55
-     * @throws EE_Error
56
-     * @throws EE_Error
57
-     * @since    4.3.0
58
-     *
59
-     */
60
-    public static function register($identifier = '', array $setup_args = [])
61
-    {
62
-
63
-        // required fields MUST be present, so let's make sure they are.
64
-        if (empty($identifier) || ! is_array($setup_args) || empty($setup_args['autoloadpaths'])) {
65
-            throw new EE_Error(
66
-                esc_html__(
67
-                    'In order to register a messages shortcode library with EE_Register_Messages_Shortcode_Library::register, you must include a "name" (a unique identifier for this set of message shortcodes), and an array containing the following keys: : "autoload_paths"',
68
-                    'event_espresso'
69
-                )
70
-            );
71
-        }
72
-
73
-        // make sure we don't register twice
74
-        if (isset(self::$_ee_messages_shortcode_registry[ $identifier ])) {
75
-            return;
76
-        }
77
-
78
-        // make sure this was called in the right place!
79
-        if (
80
-            ! did_action('EE_Brewing_Regular___messages_caf')
81
-            || did_action('AHEE__EE_System__perform_activations_upgrades_and_migrations')
82
-        ) {
83
-            EE_Error::doing_it_wrong(
84
-                __METHOD__,
85
-                sprintf(
86
-                    esc_html__(
87
-                        'Should be only called on the "EE_Brewing_Regular___messages_caf" hook (Trying to register a library named %s).',
88
-                        'event_espresso'
89
-                    ),
90
-                    $identifier
91
-                ),
92
-                '4.3.0'
93
-            );
94
-        }
95
-
96
-        self::$_ee_messages_shortcode_registry[ $identifier ] = [
97
-            'autoloadpaths'        => (array) $setup_args['autoloadpaths'],
98
-            'list_type_shortcodes' => ! empty($setup_args['list_type_shortcodes'])
99
-                ? (array) $setup_args['list_type_shortcodes'] : [],
100
-        ];
101
-
102
-        // add filters
103
-        add_filter(
104
-            'FHEE__EED_Messages___set_messages_paths___MSG_PATHS',
105
-            ['EE_Register_Messages_Shortcode_Library', 'register_msgs_autoload_paths'],
106
-            10
107
-        );
108
-
109
-        // add below filters if the required callback is provided.
110
-        if (! empty($setup_args['msgr_validator_callback'])) {
111
-            add_filter('FHEE__EE_messenger__get_validator_config', $setup_args['msgr_validator_callback'], 10, 2);
112
-        }
113
-
114
-        if (! empty($setup_args['msgr_template_fields_callback'])) {
115
-            add_filter('FHEE__EE_messenger__get_template_fields', $setup_args['msgr_template_fields_callback'], 10, 2);
116
-        }
117
-
118
-        if (! empty($setup_args['valid_shortcodes_callback'])) {
119
-            add_filter('FHEE__EE_Messages_Base__get_valid_shortcodes', $setup_args['valid_shortcodes_callback'], 10, 2);
120
-        }
121
-
122
-        if (! empty($setup_args['list_type_shortcodes'])) {
123
-            add_filter(
124
-                'FHEE__EEH_Parse_Shortcodes___parse_message_template__list_type_shortcodes',
125
-                ['EE_Register_Messages_Shortcode_Library', 'register_list_type_shortcodes'],
126
-                10
127
-            );
128
-        }
129
-    }
130
-
131
-
132
-    /**
133
-     * This deregisters any messages shortcode library previously registered with the given name.
134
-     *
135
-     * @param string $identifier name used to register the shortcode library.
136
-     * @return  void
137
-     * @since    4.3.0
138
-     */
139
-    public static function deregister($identifier = '')
140
-    {
141
-        unset(self::$_ee_messages_shortcode_registry[ $identifier ]);
142
-    }
143
-
144
-
145
-    /**
146
-     * callback for FHEE__EED_Messages___set_messages_paths___MSG_PATHS filter.
147
-     *
148
-     * @param array $paths array of paths to be checked by EE_messages autoloader.
149
-     * @return array
150
-     * @since    4.3.0
151
-     *
152
-     */
153
-    public static function register_msgs_autoload_paths(array $paths)
154
-    {
155
-
156
-        if (! empty(self::$_ee_messages_shortcode_registry)) {
157
-            foreach (self::$_ee_messages_shortcode_registry as $st_reg) {
158
-                if (empty($st_reg['autoloadpaths'])) {
159
-                    continue;
160
-                }
161
-                $paths = array_merge($paths, $st_reg['autoloadpaths']);
162
-            }
163
-        }
164
-
165
-        return $paths;
166
-    }
167
-
168
-
169
-    /**
170
-     * This is the callback for the FHEE__EEH_Parse_Shortcodes___parse_message_template__list_type_shortcodes
171
-     * filter which is used to add additional list type shortcodes.
172
-     *
173
-     * @param array $original_shortcodes
174
-     * @return  array                                   Modifications to original shortcodes.
175
-     * @since 4.3.0
176
-     *
177
-     */
178
-    public static function register_list_type_shortcodes(array $original_shortcodes)
179
-    {
180
-        if (empty(self::$_ee_messages_shortcode_registry)) {
181
-            return $original_shortcodes;
182
-        }
183
-
184
-        foreach (self::$_ee_messages_shortcode_registry as $sc_reg) {
185
-            if (! empty($sc_reg['list_type_shortcodes'])) {
186
-                $original_shortcodes = array_merge($original_shortcodes, $sc_reg['list_type_shortcodes']);
187
-            }
188
-        }
189
-
190
-        return $original_shortcodes;
191
-    }
13
+	/**
14
+	 * holds values for registered messages shortcode libraries
15
+	 *
16
+	 * @var array
17
+	 */
18
+	protected static $_ee_messages_shortcode_registry = [];
19
+
20
+
21
+	/**
22
+	 * Helper method for registering a new shortcodes library class for the messages system.
23
+	 *
24
+	 * Note this is not used for adding shortcodes to existing libraries.  It's for registering anything
25
+	 * related to registering a new EE_{shortcode_library_name}_Shortcodes.lib.php class.
26
+	 *
27
+	 * @param string $identifier                                                    What is the name of this shortcode
28
+	 *                                                                              library
29
+	 *                                                                              (e.g. 'question_list');
30
+	 * @param array  $setup_args                                                    {
31
+	 *                                                                              An array of arguments provided for
32
+	 *                                                                              registering the new messages
33
+	 *                                                                              shortcode library.
34
+	 *
35
+	 * @type array   $autoloadpaths                                                 An array of paths to add to the
36
+	 *       messages autoloader for the new shortcode library class file.
37
+	 * @type string  $msgr_validator_callback                                       Callback for a method that will
38
+	 *       register the library with the messenger
39
+	 *                                                                              _validator_config. Optional.
40
+	 * @type string  $msgr_template_fields_callback                                 Callback for changing adding the
41
+	 *                                                                              _template_fields property for
42
+	 *                                                                              messenger. For example, the
43
+	 *                                                                              shortcode library may add a new
44
+	 *                                                                              field to the message templates.
45
+	 *                                                                              Optional.
46
+	 * @type string  $valid_shortcodes_callback                                     Callback for message types
47
+	 *                                                                              _valid_shortcodes array setup.
48
+	 *                                                                              Optional.
49
+	 * @type array   $list_type_shortcodes                                          If there are any specific
50
+	 *       shortcodes with this message shortcode library that should be considered "list type" then include them in
51
+	 *       an array.  List Type shortcodes are shortcodes that have a corresponding field that indicates how they are
52
+	 *       parsed. Optional.
53
+	 * }
54
+	 * @return void
55
+	 * @throws EE_Error
56
+	 * @throws EE_Error
57
+	 * @since    4.3.0
58
+	 *
59
+	 */
60
+	public static function register($identifier = '', array $setup_args = [])
61
+	{
62
+
63
+		// required fields MUST be present, so let's make sure they are.
64
+		if (empty($identifier) || ! is_array($setup_args) || empty($setup_args['autoloadpaths'])) {
65
+			throw new EE_Error(
66
+				esc_html__(
67
+					'In order to register a messages shortcode library with EE_Register_Messages_Shortcode_Library::register, you must include a "name" (a unique identifier for this set of message shortcodes), and an array containing the following keys: : "autoload_paths"',
68
+					'event_espresso'
69
+				)
70
+			);
71
+		}
72
+
73
+		// make sure we don't register twice
74
+		if (isset(self::$_ee_messages_shortcode_registry[ $identifier ])) {
75
+			return;
76
+		}
77
+
78
+		// make sure this was called in the right place!
79
+		if (
80
+			! did_action('EE_Brewing_Regular___messages_caf')
81
+			|| did_action('AHEE__EE_System__perform_activations_upgrades_and_migrations')
82
+		) {
83
+			EE_Error::doing_it_wrong(
84
+				__METHOD__,
85
+				sprintf(
86
+					esc_html__(
87
+						'Should be only called on the "EE_Brewing_Regular___messages_caf" hook (Trying to register a library named %s).',
88
+						'event_espresso'
89
+					),
90
+					$identifier
91
+				),
92
+				'4.3.0'
93
+			);
94
+		}
95
+
96
+		self::$_ee_messages_shortcode_registry[ $identifier ] = [
97
+			'autoloadpaths'        => (array) $setup_args['autoloadpaths'],
98
+			'list_type_shortcodes' => ! empty($setup_args['list_type_shortcodes'])
99
+				? (array) $setup_args['list_type_shortcodes'] : [],
100
+		];
101
+
102
+		// add filters
103
+		add_filter(
104
+			'FHEE__EED_Messages___set_messages_paths___MSG_PATHS',
105
+			['EE_Register_Messages_Shortcode_Library', 'register_msgs_autoload_paths'],
106
+			10
107
+		);
108
+
109
+		// add below filters if the required callback is provided.
110
+		if (! empty($setup_args['msgr_validator_callback'])) {
111
+			add_filter('FHEE__EE_messenger__get_validator_config', $setup_args['msgr_validator_callback'], 10, 2);
112
+		}
113
+
114
+		if (! empty($setup_args['msgr_template_fields_callback'])) {
115
+			add_filter('FHEE__EE_messenger__get_template_fields', $setup_args['msgr_template_fields_callback'], 10, 2);
116
+		}
117
+
118
+		if (! empty($setup_args['valid_shortcodes_callback'])) {
119
+			add_filter('FHEE__EE_Messages_Base__get_valid_shortcodes', $setup_args['valid_shortcodes_callback'], 10, 2);
120
+		}
121
+
122
+		if (! empty($setup_args['list_type_shortcodes'])) {
123
+			add_filter(
124
+				'FHEE__EEH_Parse_Shortcodes___parse_message_template__list_type_shortcodes',
125
+				['EE_Register_Messages_Shortcode_Library', 'register_list_type_shortcodes'],
126
+				10
127
+			);
128
+		}
129
+	}
130
+
131
+
132
+	/**
133
+	 * This deregisters any messages shortcode library previously registered with the given name.
134
+	 *
135
+	 * @param string $identifier name used to register the shortcode library.
136
+	 * @return  void
137
+	 * @since    4.3.0
138
+	 */
139
+	public static function deregister($identifier = '')
140
+	{
141
+		unset(self::$_ee_messages_shortcode_registry[ $identifier ]);
142
+	}
143
+
144
+
145
+	/**
146
+	 * callback for FHEE__EED_Messages___set_messages_paths___MSG_PATHS filter.
147
+	 *
148
+	 * @param array $paths array of paths to be checked by EE_messages autoloader.
149
+	 * @return array
150
+	 * @since    4.3.0
151
+	 *
152
+	 */
153
+	public static function register_msgs_autoload_paths(array $paths)
154
+	{
155
+
156
+		if (! empty(self::$_ee_messages_shortcode_registry)) {
157
+			foreach (self::$_ee_messages_shortcode_registry as $st_reg) {
158
+				if (empty($st_reg['autoloadpaths'])) {
159
+					continue;
160
+				}
161
+				$paths = array_merge($paths, $st_reg['autoloadpaths']);
162
+			}
163
+		}
164
+
165
+		return $paths;
166
+	}
167
+
168
+
169
+	/**
170
+	 * This is the callback for the FHEE__EEH_Parse_Shortcodes___parse_message_template__list_type_shortcodes
171
+	 * filter which is used to add additional list type shortcodes.
172
+	 *
173
+	 * @param array $original_shortcodes
174
+	 * @return  array                                   Modifications to original shortcodes.
175
+	 * @since 4.3.0
176
+	 *
177
+	 */
178
+	public static function register_list_type_shortcodes(array $original_shortcodes)
179
+	{
180
+		if (empty(self::$_ee_messages_shortcode_registry)) {
181
+			return $original_shortcodes;
182
+		}
183
+
184
+		foreach (self::$_ee_messages_shortcode_registry as $sc_reg) {
185
+			if (! empty($sc_reg['list_type_shortcodes'])) {
186
+				$original_shortcodes = array_merge($original_shortcodes, $sc_reg['list_type_shortcodes']);
187
+			}
188
+		}
189
+
190
+		return $original_shortcodes;
191
+	}
192 192
 }
Please login to merge, or discard this patch.
core/libraries/plugin_api/EE_Register_Shortcode.lib.php 2 patches
Spacing   +6 added lines, -6 removed lines patch added patch discarded remove patch
@@ -61,7 +61,7 @@  discard block
 block discarded – undo
61 61
         }
62 62
 
63 63
         // make sure we don't register twice
64
-        if (isset(self::$_settings[ $identifier ])) {
64
+        if (isset(self::$_settings[$identifier])) {
65 65
             return;
66 66
         }
67 67
 
@@ -80,7 +80,7 @@  discard block
 block discarded – undo
80 80
             );
81 81
         }
82 82
         // setup $_settings array from incoming values.
83
-        self::$_settings[ $identifier ] = [
83
+        self::$_settings[$identifier] = [
84 84
             // array of full server paths to any EES_Shortcodes used by the shortcode
85 85
             'shortcode_paths' => isset($setup_args['shortcode_paths'])
86 86
                 ? (array) $setup_args['shortcode_paths']
@@ -134,9 +134,9 @@  discard block
 block discarded – undo
134 134
     public static function instantiateAndAddToShortcodeCollection(CollectionInterface $shortcodes_collection)
135 135
     {
136 136
         foreach (self::$_settings as $settings) {
137
-            if (! empty($settings['shortcode_fqcns'])) {
137
+            if ( ! empty($settings['shortcode_fqcns'])) {
138 138
                 foreach ($settings['shortcode_fqcns'] as $shortcode_fqcn) {
139
-                    if (! class_exists($shortcode_fqcn)) {
139
+                    if ( ! class_exists($shortcode_fqcn)) {
140 140
                         throw new InvalidClassException(
141 141
                             sprintf(
142 142
                                 esc_html__(
@@ -147,7 +147,7 @@  discard block
 block discarded – undo
147 147
                             )
148 148
                         );
149 149
                     }
150
-                    if (! EE_Dependency_Map::instance()->has_dependency_for_class($shortcode_fqcn)) {
150
+                    if ( ! EE_Dependency_Map::instance()->has_dependency_for_class($shortcode_fqcn)) {
151 151
                         // register dependencies
152 152
                         EE_Dependency_Map::register_dependencies(
153 153
                             $shortcode_fqcn,
@@ -173,6 +173,6 @@  discard block
 block discarded – undo
173 173
      */
174 174
     public static function deregister($identifier = '')
175 175
     {
176
-        unset(self::$_settings[ $identifier ]);
176
+        unset(self::$_settings[$identifier]);
177 177
     }
178 178
 }
Please login to merge, or discard this patch.
Indentation   +144 added lines, -144 removed lines patch added patch discarded remove patch
@@ -19,159 +19,159 @@
 block discarded – undo
19 19
  */
20 20
 class EE_Register_Shortcode implements EEI_Plugin_API
21 21
 {
22
-    /**
23
-     * Holds values for registered shortcodes
24
-     *
25
-     * @var array
26
-     */
27
-    protected static $_settings = [];
22
+	/**
23
+	 * Holds values for registered shortcodes
24
+	 *
25
+	 * @var array
26
+	 */
27
+	protected static $_settings = [];
28 28
 
29 29
 
30
-    /**
31
-     *    Method for registering new EE_Shortcodes
32
-     *
33
-     * @param string $identifier    a unique identifier for this set of modules Required.
34
-     * @param array  $setup_args    an array of arguments provided for registering shortcodes Required.
35
-     * @type array shortcode_paths  an array of full server paths to folders containing any EES_Shortcodes
36
-     * @type array shortcode_fqcns  an array of fully qualified class names for any new shortcode classes to register.
37
-     *                              Shortcode classes should extend EspressoShortcode
38
-     *                              and be properly namespaced so they are autoloaded.
39
-     * @return void
40
-     * @throws EE_Error
41
-     * @since    4.3.0
42
-     * @since    4.9.46.rc.025  for the new `shortcode_fqcns` array argument.
43
-     */
44
-    public static function register($identifier = '', array $setup_args = [])
45
-    {
46
-        // required fields MUST be present, so let's make sure they are.
47
-        if (
48
-            empty($identifier)
49
-            || ! is_array($setup_args)
50
-            || (
51
-               empty($setup_args['shortcode_paths']))
52
-               && empty($setup_args['shortcode_fqcns'])
53
-        ) {
54
-            throw new EE_Error(
55
-                esc_html__(
56
-                    'In order to register Modules with EE_Register_Shortcode::register(), you must include a "shortcode_id" (a unique identifier for this set of shortcodes), and an array containing the following keys: "shortcode_paths" (an array of full server paths to folders that contain shortcodes, or to the shortcode files themselves)',
57
-                    'event_espresso'
58
-                )
59
-            );
60
-        }
30
+	/**
31
+	 *    Method for registering new EE_Shortcodes
32
+	 *
33
+	 * @param string $identifier    a unique identifier for this set of modules Required.
34
+	 * @param array  $setup_args    an array of arguments provided for registering shortcodes Required.
35
+	 * @type array shortcode_paths  an array of full server paths to folders containing any EES_Shortcodes
36
+	 * @type array shortcode_fqcns  an array of fully qualified class names for any new shortcode classes to register.
37
+	 *                              Shortcode classes should extend EspressoShortcode
38
+	 *                              and be properly namespaced so they are autoloaded.
39
+	 * @return void
40
+	 * @throws EE_Error
41
+	 * @since    4.3.0
42
+	 * @since    4.9.46.rc.025  for the new `shortcode_fqcns` array argument.
43
+	 */
44
+	public static function register($identifier = '', array $setup_args = [])
45
+	{
46
+		// required fields MUST be present, so let's make sure they are.
47
+		if (
48
+			empty($identifier)
49
+			|| ! is_array($setup_args)
50
+			|| (
51
+			   empty($setup_args['shortcode_paths']))
52
+			   && empty($setup_args['shortcode_fqcns'])
53
+		) {
54
+			throw new EE_Error(
55
+				esc_html__(
56
+					'In order to register Modules with EE_Register_Shortcode::register(), you must include a "shortcode_id" (a unique identifier for this set of shortcodes), and an array containing the following keys: "shortcode_paths" (an array of full server paths to folders that contain shortcodes, or to the shortcode files themselves)',
57
+					'event_espresso'
58
+				)
59
+			);
60
+		}
61 61
 
62
-        // make sure we don't register twice
63
-        if (isset(self::$_settings[ $identifier ])) {
64
-            return;
65
-        }
62
+		// make sure we don't register twice
63
+		if (isset(self::$_settings[ $identifier ])) {
64
+			return;
65
+		}
66 66
 
67
-        // make sure this was called in the right place!
68
-        if (
69
-            ! did_action('AHEE__EE_System__load_espresso_addons')
70
-            || did_action('AHEE__EE_System__register_shortcodes_modules_and_widgets')
71
-        ) {
72
-            EE_Error::doing_it_wrong(
73
-                __METHOD__,
74
-                esc_html__(
75
-                    'An attempt to register shortcodes has failed because it was not registered at the correct time.  Please use the "AHEE__EE_System__register_shortcodes_modules_and_widgets" hook to register shortcodes.',
76
-                    'event_espresso'
77
-                ),
78
-                '4.3.0'
79
-            );
80
-        }
81
-        // setup $_settings array from incoming values.
82
-        self::$_settings[ $identifier ] = [
83
-            // array of full server paths to any EES_Shortcodes used by the shortcode
84
-            'shortcode_paths' => isset($setup_args['shortcode_paths'])
85
-                ? (array) $setup_args['shortcode_paths']
86
-                : [],
87
-            'shortcode_fqcns' => isset($setup_args['shortcode_fqcns'])
88
-                ? (array) $setup_args['shortcode_fqcns']
89
-                : [],
90
-        ];
91
-        // add to list of shortcodes to be registered
92
-        add_filter(
93
-            'FHEE__EE_Config__register_shortcodes__shortcodes_to_register',
94
-            ['EE_Register_Shortcode', 'add_shortcodes']
95
-        );
67
+		// make sure this was called in the right place!
68
+		if (
69
+			! did_action('AHEE__EE_System__load_espresso_addons')
70
+			|| did_action('AHEE__EE_System__register_shortcodes_modules_and_widgets')
71
+		) {
72
+			EE_Error::doing_it_wrong(
73
+				__METHOD__,
74
+				esc_html__(
75
+					'An attempt to register shortcodes has failed because it was not registered at the correct time.  Please use the "AHEE__EE_System__register_shortcodes_modules_and_widgets" hook to register shortcodes.',
76
+					'event_espresso'
77
+				),
78
+				'4.3.0'
79
+			);
80
+		}
81
+		// setup $_settings array from incoming values.
82
+		self::$_settings[ $identifier ] = [
83
+			// array of full server paths to any EES_Shortcodes used by the shortcode
84
+			'shortcode_paths' => isset($setup_args['shortcode_paths'])
85
+				? (array) $setup_args['shortcode_paths']
86
+				: [],
87
+			'shortcode_fqcns' => isset($setup_args['shortcode_fqcns'])
88
+				? (array) $setup_args['shortcode_fqcns']
89
+				: [],
90
+		];
91
+		// add to list of shortcodes to be registered
92
+		add_filter(
93
+			'FHEE__EE_Config__register_shortcodes__shortcodes_to_register',
94
+			['EE_Register_Shortcode', 'add_shortcodes']
95
+		);
96 96
 
97
-        add_filter(
98
-            'FHEE__EventEspresso_core_services_shortcodes_ShortcodesManager__registerShortcodes__shortcode_collection',
99
-            ['EE_Register_Shortcode', 'instantiateAndAddToShortcodeCollection']
100
-        );
101
-    }
97
+		add_filter(
98
+			'FHEE__EventEspresso_core_services_shortcodes_ShortcodesManager__registerShortcodes__shortcode_collection',
99
+			['EE_Register_Shortcode', 'instantiateAndAddToShortcodeCollection']
100
+		);
101
+	}
102 102
 
103 103
 
104
-    /**
105
-     * Filters the list of shortcodes to add ours.
106
-     * and they're just full filepaths to FOLDERS containing a shortcode class file. Eg.
107
-     * array('espresso_monkey'=>'/public_html/wonder-site/wp-content/plugins/ee4/shortcodes/espresso_monkey'...)
108
-     *
109
-     * @param array $shortcodes_to_register array of paths to all shortcodes that require registering
110
-     * @return array
111
-     */
112
-    public static function add_shortcodes(array $shortcodes_to_register)
113
-    {
114
-        foreach (self::$_settings as $settings) {
115
-            $shortcodes_to_register = array_merge($shortcodes_to_register, $settings['shortcode_paths']);
116
-        }
117
-        return $shortcodes_to_register;
118
-    }
104
+	/**
105
+	 * Filters the list of shortcodes to add ours.
106
+	 * and they're just full filepaths to FOLDERS containing a shortcode class file. Eg.
107
+	 * array('espresso_monkey'=>'/public_html/wonder-site/wp-content/plugins/ee4/shortcodes/espresso_monkey'...)
108
+	 *
109
+	 * @param array $shortcodes_to_register array of paths to all shortcodes that require registering
110
+	 * @return array
111
+	 */
112
+	public static function add_shortcodes(array $shortcodes_to_register)
113
+	{
114
+		foreach (self::$_settings as $settings) {
115
+			$shortcodes_to_register = array_merge($shortcodes_to_register, $settings['shortcode_paths']);
116
+		}
117
+		return $shortcodes_to_register;
118
+	}
119 119
 
120 120
 
121
-    /**
122
-     * Hooks into
123
-     * FHEE__EventEspresso_core_services_shortcodes_ShortcodesManager__registerShortcodes__shortcode_collection and
124
-     * registers any provided shortcode fully qualified class names.
125
-     *
126
-     * @param CollectionInterface $shortcodes_collection
127
-     * @return CollectionInterface
128
-     * @throws InvalidArgumentException
129
-     * @throws InvalidClassException
130
-     * @throws InvalidDataTypeException
131
-     * @throws InvalidInterfaceException
132
-     */
133
-    public static function instantiateAndAddToShortcodeCollection(CollectionInterface $shortcodes_collection)
134
-    {
135
-        foreach (self::$_settings as $settings) {
136
-            if (! empty($settings['shortcode_fqcns'])) {
137
-                foreach ($settings['shortcode_fqcns'] as $shortcode_fqcn) {
138
-                    if (! class_exists($shortcode_fqcn)) {
139
-                        throw new InvalidClassException(
140
-                            sprintf(
141
-                                esc_html__(
142
-                                    'Are you sure %s is the right fully qualified class name for the shortcode class?',
143
-                                    'event_espresso'
144
-                                ),
145
-                                $shortcode_fqcn
146
-                            )
147
-                        );
148
-                    }
149
-                    if (! EE_Dependency_Map::instance()->has_dependency_for_class($shortcode_fqcn)) {
150
-                        // register dependencies
151
-                        EE_Dependency_Map::register_dependencies(
152
-                            $shortcode_fqcn,
153
-                            [
154
-                                'EventEspresso\core\services\cache\PostRelatedCacheManager' => EE_Dependency_Map::load_from_cache,
155
-                            ]
156
-                        );
157
-                    }
158
-                    $shortcodes_collection->add(LoaderFactory::getLoader()->getShared($shortcode_fqcn));
159
-                }
160
-            }
161
-        }
162
-        return $shortcodes_collection;
163
-    }
121
+	/**
122
+	 * Hooks into
123
+	 * FHEE__EventEspresso_core_services_shortcodes_ShortcodesManager__registerShortcodes__shortcode_collection and
124
+	 * registers any provided shortcode fully qualified class names.
125
+	 *
126
+	 * @param CollectionInterface $shortcodes_collection
127
+	 * @return CollectionInterface
128
+	 * @throws InvalidArgumentException
129
+	 * @throws InvalidClassException
130
+	 * @throws InvalidDataTypeException
131
+	 * @throws InvalidInterfaceException
132
+	 */
133
+	public static function instantiateAndAddToShortcodeCollection(CollectionInterface $shortcodes_collection)
134
+	{
135
+		foreach (self::$_settings as $settings) {
136
+			if (! empty($settings['shortcode_fqcns'])) {
137
+				foreach ($settings['shortcode_fqcns'] as $shortcode_fqcn) {
138
+					if (! class_exists($shortcode_fqcn)) {
139
+						throw new InvalidClassException(
140
+							sprintf(
141
+								esc_html__(
142
+									'Are you sure %s is the right fully qualified class name for the shortcode class?',
143
+									'event_espresso'
144
+								),
145
+								$shortcode_fqcn
146
+							)
147
+						);
148
+					}
149
+					if (! EE_Dependency_Map::instance()->has_dependency_for_class($shortcode_fqcn)) {
150
+						// register dependencies
151
+						EE_Dependency_Map::register_dependencies(
152
+							$shortcode_fqcn,
153
+							[
154
+								'EventEspresso\core\services\cache\PostRelatedCacheManager' => EE_Dependency_Map::load_from_cache,
155
+							]
156
+						);
157
+					}
158
+					$shortcodes_collection->add(LoaderFactory::getLoader()->getShared($shortcode_fqcn));
159
+				}
160
+			}
161
+		}
162
+		return $shortcodes_collection;
163
+	}
164 164
 
165 165
 
166
-    /**
167
-     * This deregisters a shortcode that was previously registered with a specific $identifier.
168
-     *
169
-     * @param string $identifier the name for the shortcode that was previously registered
170
-     * @return void
171
-     * @since    4.3.0
172
-     */
173
-    public static function deregister($identifier = '')
174
-    {
175
-        unset(self::$_settings[ $identifier ]);
176
-    }
166
+	/**
167
+	 * This deregisters a shortcode that was previously registered with a specific $identifier.
168
+	 *
169
+	 * @param string $identifier the name for the shortcode that was previously registered
170
+	 * @return void
171
+	 * @since    4.3.0
172
+	 */
173
+	public static function deregister($identifier = '')
174
+	{
175
+		unset(self::$_settings[ $identifier ]);
176
+	}
177 177
 }
Please login to merge, or discard this patch.
core/EED_Module.module.php 2 patches
Spacing   +2 added lines, -2 removed lines patch added patch discarded remove patch
@@ -133,7 +133,7 @@  discard block
 block discarded – undo
133 133
     protected static function getRequest()
134 134
     {
135 135
         static $request;
136
-        if (! $request instanceof RequestInterface) {
136
+        if ( ! $request instanceof RequestInterface) {
137 137
             $request = LoaderFactory::getLoader()->getShared(RequestInterface::class);
138 138
         }
139 139
         return $request;
@@ -147,7 +147,7 @@  discard block
 block discarded – undo
147 147
     protected static function getResponse()
148 148
     {
149 149
         static $response;
150
-        if (! $response instanceof RequestInterface) {
150
+        if ( ! $response instanceof RequestInterface) {
151 151
             $response = LoaderFactory::getLoader()->getShared(ResponseInterface::class);
152 152
         }
153 153
         return $response;
Please login to merge, or discard this patch.
Indentation   +137 added lines, -137 removed lines patch added patch discarded remove patch
@@ -14,141 +14,141 @@
 block discarded – undo
14 14
  */
15 15
 abstract class EED_Module extends EE_Configurable implements ResettableInterface
16 16
 {
17
-    /**
18
-     * rendered output to be returned to WP
19
-     *
20
-     * @var    string $output
21
-     */
22
-    protected $output = '';
23
-
24
-    /**
25
-     * the current active espresso template theme
26
-     *
27
-     * @var    string $theme
28
-     */
29
-    protected $theme = '';
30
-
31
-
32
-    /**
33
-     * @return void
34
-     */
35
-    public static function reset()
36
-    {
37
-        $module_name = get_called_class();
38
-        new $module_name();
39
-    }
40
-
41
-
42
-    /**
43
-     *    set_hooks - for hooking into EE Core, other modules, etc
44
-     *
45
-     * @access    public
46
-     * @return    void
47
-     */
48
-    public static function set_hooks()
49
-    {
50
-    }
51
-
52
-
53
-    /**
54
-     *    set_hooks_admin - for hooking into EE Admin Core, other modules, etc
55
-     *
56
-     * @access    public
57
-     * @return    void
58
-     */
59
-    public static function set_hooks_admin()
60
-    {
61
-    }
62
-
63
-
64
-    /**
65
-     *    run - initial module setup
66
-     *    this method is primarily used for activating resources in the EE_Front_Controller thru the use of filters
67
-     *
68
-     * @access    public
69
-     * @var            WP $WP
70
-     * @return    void
71
-     */
72
-    abstract public function run($WP);
73
-
74
-
75
-    /**
76
-     * EED_Module constructor.
77
-     */
78
-    final public function __construct()
79
-    {
80
-        $this->theme = EE_Config::get_current_theme();
81
-        $module_name = $this->module_name();
82
-        EE_Registry::instance()->modules->{$module_name} = $this;
83
-    }
84
-
85
-
86
-    /**
87
-     * @param string $module_name
88
-     * @return EED_Module|mixed
89
-     * @throws EE_Error
90
-     * @throws ReflectionException
91
-     */
92
-    protected static function get_instance($module_name = '')
93
-    {
94
-        $module_name = ! empty($module_name)
95
-            ? $module_name
96
-            : get_called_class();
97
-        if (
98
-            ! isset(EE_Registry::instance()->modules->{$module_name})
99
-            || ! EE_Registry::instance()->modules->{$module_name} instanceof EED_Module
100
-        ) {
101
-            EE_Registry::instance()->add_module($module_name);
102
-        }
103
-        return EE_Registry::instance()->get_module($module_name);
104
-    }
105
-
106
-
107
-    /**
108
-     *    module_name
109
-     *
110
-     * @access    public
111
-     * @return    string
112
-     */
113
-    public function module_name()
114
-    {
115
-        return get_class($this);
116
-    }
117
-
118
-
119
-    /**
120
-     * @return string
121
-     */
122
-    public function theme()
123
-    {
124
-        return $this->theme;
125
-    }
126
-
127
-
128
-    /**
129
-     * @return RequestInterface
130
-     * @since   4.10.14.p
131
-     */
132
-    protected static function getRequest()
133
-    {
134
-        static $request;
135
-        if (! $request instanceof RequestInterface) {
136
-            $request = LoaderFactory::getLoader()->getShared(RequestInterface::class);
137
-        }
138
-        return $request;
139
-    }
140
-
141
-
142
-    /**
143
-     * @return ResponseInterface
144
-     * @since   4.10.14.p
145
-     */
146
-    protected static function getResponse()
147
-    {
148
-        static $response;
149
-        if (! $response instanceof RequestInterface) {
150
-            $response = LoaderFactory::getLoader()->getShared(ResponseInterface::class);
151
-        }
152
-        return $response;
153
-    }
17
+	/**
18
+	 * rendered output to be returned to WP
19
+	 *
20
+	 * @var    string $output
21
+	 */
22
+	protected $output = '';
23
+
24
+	/**
25
+	 * the current active espresso template theme
26
+	 *
27
+	 * @var    string $theme
28
+	 */
29
+	protected $theme = '';
30
+
31
+
32
+	/**
33
+	 * @return void
34
+	 */
35
+	public static function reset()
36
+	{
37
+		$module_name = get_called_class();
38
+		new $module_name();
39
+	}
40
+
41
+
42
+	/**
43
+	 *    set_hooks - for hooking into EE Core, other modules, etc
44
+	 *
45
+	 * @access    public
46
+	 * @return    void
47
+	 */
48
+	public static function set_hooks()
49
+	{
50
+	}
51
+
52
+
53
+	/**
54
+	 *    set_hooks_admin - for hooking into EE Admin Core, other modules, etc
55
+	 *
56
+	 * @access    public
57
+	 * @return    void
58
+	 */
59
+	public static function set_hooks_admin()
60
+	{
61
+	}
62
+
63
+
64
+	/**
65
+	 *    run - initial module setup
66
+	 *    this method is primarily used for activating resources in the EE_Front_Controller thru the use of filters
67
+	 *
68
+	 * @access    public
69
+	 * @var            WP $WP
70
+	 * @return    void
71
+	 */
72
+	abstract public function run($WP);
73
+
74
+
75
+	/**
76
+	 * EED_Module constructor.
77
+	 */
78
+	final public function __construct()
79
+	{
80
+		$this->theme = EE_Config::get_current_theme();
81
+		$module_name = $this->module_name();
82
+		EE_Registry::instance()->modules->{$module_name} = $this;
83
+	}
84
+
85
+
86
+	/**
87
+	 * @param string $module_name
88
+	 * @return EED_Module|mixed
89
+	 * @throws EE_Error
90
+	 * @throws ReflectionException
91
+	 */
92
+	protected static function get_instance($module_name = '')
93
+	{
94
+		$module_name = ! empty($module_name)
95
+			? $module_name
96
+			: get_called_class();
97
+		if (
98
+			! isset(EE_Registry::instance()->modules->{$module_name})
99
+			|| ! EE_Registry::instance()->modules->{$module_name} instanceof EED_Module
100
+		) {
101
+			EE_Registry::instance()->add_module($module_name);
102
+		}
103
+		return EE_Registry::instance()->get_module($module_name);
104
+	}
105
+
106
+
107
+	/**
108
+	 *    module_name
109
+	 *
110
+	 * @access    public
111
+	 * @return    string
112
+	 */
113
+	public function module_name()
114
+	{
115
+		return get_class($this);
116
+	}
117
+
118
+
119
+	/**
120
+	 * @return string
121
+	 */
122
+	public function theme()
123
+	{
124
+		return $this->theme;
125
+	}
126
+
127
+
128
+	/**
129
+	 * @return RequestInterface
130
+	 * @since   4.10.14.p
131
+	 */
132
+	protected static function getRequest()
133
+	{
134
+		static $request;
135
+		if (! $request instanceof RequestInterface) {
136
+			$request = LoaderFactory::getLoader()->getShared(RequestInterface::class);
137
+		}
138
+		return $request;
139
+	}
140
+
141
+
142
+	/**
143
+	 * @return ResponseInterface
144
+	 * @since   4.10.14.p
145
+	 */
146
+	protected static function getResponse()
147
+	{
148
+		static $response;
149
+		if (! $response instanceof RequestInterface) {
150
+			$response = LoaderFactory::getLoader()->getShared(ResponseInterface::class);
151
+		}
152
+		return $response;
153
+	}
154 154
 }
Please login to merge, or discard this patch.
modules/core_rest_api/EED_Core_Rest_Api.module.php 2 patches
Spacing   +51 added lines, -51 removed lines patch added patch discarded remove patch
@@ -123,7 +123,7 @@  discard block
 block discarded – undo
123 123
      */
124 124
     protected static function _set_hooks_for_changes()
125 125
     {
126
-        $folder_contents = EEH_File::get_contents_of_folders(array(EE_LIBRARIES . 'rest_api/changes'), false);
126
+        $folder_contents = EEH_File::get_contents_of_folders(array(EE_LIBRARIES.'rest_api/changes'), false);
127 127
         foreach ($folder_contents as $classname_in_namespace => $filepath) {
128 128
             // ignore the base parent class
129 129
             // and legacy named classes
@@ -133,7 +133,7 @@  discard block
 block discarded – undo
133 133
             ) {
134 134
                 continue;
135 135
             }
136
-            $full_classname = 'EventEspresso\core\libraries\rest_api\changes\\' . $classname_in_namespace;
136
+            $full_classname = 'EventEspresso\core\libraries\rest_api\changes\\'.$classname_in_namespace;
137 137
             if (class_exists($full_classname)) {
138 138
                 $instance_of_class = new $full_classname();
139 139
                 if ($instance_of_class instanceof ChangesInBase) {
@@ -178,10 +178,10 @@  discard block
 block discarded – undo
178 178
                      * }
179 179
                      */
180 180
                     // skip route options
181
-                    if (! is_numeric($endpoint_key)) {
181
+                    if ( ! is_numeric($endpoint_key)) {
182 182
                         continue;
183 183
                     }
184
-                    if (! isset($data_for_single_endpoint['callback'], $data_for_single_endpoint['methods'])) {
184
+                    if ( ! isset($data_for_single_endpoint['callback'], $data_for_single_endpoint['methods'])) {
185 185
                         throw new EE_Error(
186 186
                             esc_html__(
187 187
                             // @codingStandardsIgnoreStart
@@ -202,7 +202,7 @@  discard block
 block discarded – undo
202 202
                     }
203 203
                     if (isset($data_for_single_endpoint['callback_args'])) {
204 204
                         $callback_args = $data_for_single_endpoint['callback_args'];
205
-                        $single_endpoint_args['callback'] = function (\WP_REST_Request $request) use (
205
+                        $single_endpoint_args['callback'] = function(\WP_REST_Request $request) use (
206 206
                             $callback,
207 207
                             $callback_args
208 208
                         ) {
@@ -219,7 +219,7 @@  discard block
 block discarded – undo
219 219
                     // the REST API will issue a _doing_it_wrong notice.
220 220
                     // Since the EE REST API defers capabilities to the db model system,
221 221
                     // we will just use the generic WP callback for public endpoints
222
-                    if (! isset($single_endpoint_args['permission_callback'])) {
222
+                    if ( ! isset($single_endpoint_args['permission_callback'])) {
223 223
                         $single_endpoint_args['permission_callback'] = '__return_true';
224 224
                     }
225 225
                     $multiple_endpoint_args[] = $single_endpoint_args;
@@ -228,7 +228,7 @@  discard block
 block discarded – undo
228 228
                     $schema_route_data = $data_for_multiple_endpoints['schema'];
229 229
                     $schema_callback = $schema_route_data['schema_callback'];
230 230
                     $callback_args = $schema_route_data['callback_args'];
231
-                    $multiple_endpoint_args['schema'] = function () use ($schema_callback, $callback_args) {
231
+                    $multiple_endpoint_args['schema'] = function() use ($schema_callback, $callback_args) {
232 232
                         return call_user_func_array(
233 233
                             $schema_callback,
234 234
                             $callback_args
@@ -270,7 +270,7 @@  discard block
 block discarded – undo
270 270
     {
271 271
         // delete the saved EE REST API routes
272 272
         foreach (EED_Core_Rest_Api::versions_served() as $version => $hidden) {
273
-            delete_option(EED_Core_Rest_Api::saved_routes_option_names . $version);
273
+            delete_option(EED_Core_Rest_Api::saved_routes_option_names.$version);
274 274
         }
275 275
     }
276 276
 
@@ -289,7 +289,7 @@  discard block
 block discarded – undo
289 289
     {
290 290
         $ee_routes = array();
291 291
         foreach (self::versions_served() as $version => $hidden_endpoints) {
292
-            $ee_routes[ self::ee_api_namespace . $version ] = self::_get_ee_route_data_for_version(
292
+            $ee_routes[self::ee_api_namespace.$version] = self::_get_ee_route_data_for_version(
293 293
                 $version,
294 294
                 $hidden_endpoints
295 295
             );
@@ -309,8 +309,8 @@  discard block
 block discarded – undo
309 309
      */
310 310
     protected static function _get_ee_route_data_for_version($version, $hidden_endpoints = false)
311 311
     {
312
-        $ee_routes = get_option(self::saved_routes_option_names . $version, null);
313
-        if (! $ee_routes || EED_Core_Rest_Api::debugMode()) {
312
+        $ee_routes = get_option(self::saved_routes_option_names.$version, null);
313
+        if ( ! $ee_routes || EED_Core_Rest_Api::debugMode()) {
314 314
             $ee_routes = self::_save_ee_route_data_for_version($version, $hidden_endpoints);
315 315
         }
316 316
         return $ee_routes;
@@ -337,7 +337,7 @@  discard block
 block discarded – undo
337 337
                 $instance->_get_rpc_route_data_for_version($version, $hidden_endpoints)
338 338
             )
339 339
         );
340
-        $option_name = self::saved_routes_option_names . $version;
340
+        $option_name = self::saved_routes_option_names.$version;
341 341
         if (get_option($option_name)) {
342 342
             update_option($option_name, $routes, true);
343 343
         } else {
@@ -382,8 +382,8 @@  discard block
 block discarded – undo
382 382
     {
383 383
         $model_routes = array();
384 384
         foreach (self::versions_served() as $version => $hidden_endpoint) {
385
-            $model_routes[ EED_Core_Rest_Api::ee_api_namespace
386
-                           . $version ] = $this->_get_config_route_data_for_version($version, $hidden_endpoint);
385
+            $model_routes[EED_Core_Rest_Api::ee_api_namespace
386
+                           . $version] = $this->_get_config_route_data_for_version($version, $hidden_endpoint);
387 387
         }
388 388
         return $model_routes;
389 389
     }
@@ -452,13 +452,13 @@  discard block
 block discarded – undo
452 452
         foreach (EED_Core_Rest_Api::model_names_with_plural_routes($version) as $model_name => $model_classname) {
453 453
             $model = \EE_Registry::instance()->load_model($model_name);
454 454
             // if this isn't a valid model then let's skip iterate to the next item in the loop.
455
-            if (! $model instanceof EEM_Base) {
455
+            if ( ! $model instanceof EEM_Base) {
456 456
                 continue;
457 457
             }
458 458
             // yes we could just register one route for ALL models, but then they wouldn't show up in the index
459 459
             $plural_model_route = EED_Core_Rest_Api::get_collection_route($model);
460 460
             $singular_model_route = EED_Core_Rest_Api::get_entity_route($model, '(?P<id>[^\/]+)');
461
-            $model_routes[ $plural_model_route ] = array(
461
+            $model_routes[$plural_model_route] = array(
462 462
                 array(
463 463
                     'callback'        => array(
464 464
                         'EventEspresso\core\libraries\rest_api\controllers\model\Read',
@@ -469,7 +469,7 @@  discard block
 block discarded – undo
469 469
                     'hidden_endpoint' => $hidden_endpoint,
470 470
                     'args'            => $this->_get_read_query_params($model, $version),
471 471
                     '_links'          => array(
472
-                        'self' => rest_url(EED_Core_Rest_Api::ee_api_namespace . $version . $singular_model_route),
472
+                        'self' => rest_url(EED_Core_Rest_Api::ee_api_namespace.$version.$singular_model_route),
473 473
                     ),
474 474
                 ),
475 475
                 'schema' => array(
@@ -480,7 +480,7 @@  discard block
 block discarded – undo
480 480
                     'callback_args'   => array($version, $model_name),
481 481
                 ),
482 482
             );
483
-            $model_routes[ $singular_model_route ] = array(
483
+            $model_routes[$singular_model_route] = array(
484 484
                 array(
485 485
                     'callback'        => array(
486 486
                         'EventEspresso\core\libraries\rest_api\controllers\model\Read',
@@ -499,7 +499,7 @@  discard block
 block discarded – undo
499 499
                     $model
500 500
                 )
501 501
             ) {
502
-                $model_routes[ $plural_model_route ][] = array(
502
+                $model_routes[$plural_model_route][] = array(
503 503
                     'callback'        => array(
504 504
                         'EventEspresso\core\libraries\rest_api\controllers\model\Write',
505 505
                         'handleRequestInsert',
@@ -509,8 +509,8 @@  discard block
 block discarded – undo
509 509
                     'hidden_endpoint' => $hidden_endpoint,
510 510
                     'args'            => $this->_get_write_params($model_name, $model_version_info, true),
511 511
                 );
512
-                $model_routes[ $singular_model_route ] = array_merge(
513
-                    $model_routes[ $singular_model_route ],
512
+                $model_routes[$singular_model_route] = array_merge(
513
+                    $model_routes[$singular_model_route],
514 514
                     array(
515 515
                         array(
516 516
                             'callback'        => array(
@@ -541,7 +541,7 @@  discard block
 block discarded – undo
541 541
                     '(?P<id>[^\/]+)',
542 542
                     $relation_obj
543 543
                 );
544
-                $model_routes[ $related_route ] = array(
544
+                $model_routes[$related_route] = array(
545 545
                     array(
546 546
                         'callback'        => array(
547 547
                             'EventEspresso\core\libraries\rest_api\controllers\model\Read',
@@ -554,8 +554,8 @@  discard block
 block discarded – undo
554 554
                     ),
555 555
                 );
556 556
 
557
-                $related_write_route = $related_route . '/' . '(?P<related_id>[^\/]+)';
558
-                $model_routes[ $related_write_route ] = array(
557
+                $related_write_route = $related_route.'/'.'(?P<related_id>[^\/]+)';
558
+                $model_routes[$related_write_route] = array(
559 559
                     array(
560 560
                         'callback'        => array(
561 561
                             'EventEspresso\core\libraries\rest_api\controllers\model\Write',
@@ -608,7 +608,7 @@  discard block
 block discarded – undo
608 608
      */
609 609
     public static function get_entity_route($model, $id)
610 610
     {
611
-        return EED_Core_Rest_Api::get_collection_route($model) . '/' . $id;
611
+        return EED_Core_Rest_Api::get_collection_route($model).'/'.$id;
612 612
     }
613 613
 
614 614
 
@@ -628,7 +628,7 @@  discard block
 block discarded – undo
628 628
             $relation_obj->get_other_model()->get_this_model_name(),
629 629
             $relation_obj
630 630
         );
631
-        return EED_Core_Rest_Api::get_entity_route($model, $id) . '/' . $related_model_name_endpoint_part;
631
+        return EED_Core_Rest_Api::get_entity_route($model, $id).'/'.$related_model_name_endpoint_part;
632 632
     }
633 633
 
634 634
 
@@ -642,7 +642,7 @@  discard block
 block discarded – undo
642 642
      */
643 643
     public static function get_versioned_route_to($relative_route, $version = '4.8.36')
644 644
     {
645
-        return '/' . EED_Core_Rest_Api::ee_api_namespace . $version . '/' . $relative_route;
645
+        return '/'.EED_Core_Rest_Api::ee_api_namespace.$version.'/'.$relative_route;
646 646
     }
647 647
 
648 648
 
@@ -656,7 +656,7 @@  discard block
 block discarded – undo
656 656
     {
657 657
         $routes = array();
658 658
         foreach (self::versions_served() as $version => $hidden_endpoint) {
659
-            $routes[ self::ee_api_namespace . $version ] = $this->_get_rpc_route_data_for_version(
659
+            $routes[self::ee_api_namespace.$version] = $this->_get_rpc_route_data_for_version(
660 660
                 $version,
661 661
                 $hidden_endpoint
662 662
             );
@@ -779,12 +779,12 @@  discard block
 block discarded – undo
779 779
     {
780 780
         // if they're related through a HABTM relation, check for any non-FKs
781 781
         $all_relation_settings = $source_model->relation_settings();
782
-        $relation_settings = $all_relation_settings[ $related_model->get_this_model_name() ];
782
+        $relation_settings = $all_relation_settings[$related_model->get_this_model_name()];
783 783
         $params = array();
784 784
         if ($relation_settings instanceof EE_HABTM_Relation && $relation_settings->hasNonKeyFields()) {
785 785
             foreach ($relation_settings->getNonKeyFields() as $field) {
786 786
                 /* @var $field EE_Model_Field_Base */
787
-                $params[ $field->get_name() ] = array(
787
+                $params[$field->get_name()] = array(
788 788
                     'required' => ! $field->is_nullable(),
789 789
                     'default' => ModelDataTranslator::prepareFieldValueForJson($field, $field->get_default_value(), $version),
790 790
                     'type' => $field->getSchemaType(),
@@ -809,7 +809,7 @@  discard block
 block discarded – undo
809 809
     {
810 810
         $default_orderby = array();
811 811
         foreach ($model->get_combined_primary_key_fields() as $key_field) {
812
-            $default_orderby[ $key_field->get_name() ] = 'ASC';
812
+            $default_orderby[$key_field->get_name()] = 'ASC';
813 813
         }
814 814
         return array_merge(
815 815
             $this->_get_response_selection_query_params($model, $version),
@@ -843,7 +843,7 @@  discard block
 block discarded – undo
843 843
                     'type'              => array(
844 844
                         'object',
845 845
                         'string',
846
-                    ),// because we accept a variety of types, WP core validation and sanitization
846
+                    ), // because we accept a variety of types, WP core validation and sanitization
847 847
                     // freaks out. We'll just validate this argument while handling the request
848 848
                     'validate_callback' => null,
849 849
                     'sanitize_callback' => null,
@@ -942,7 +942,7 @@  discard block
 block discarded – undo
942 942
                 $sanitize_callback = null;
943 943
             }
944 944
             $arg_info['sanitize_callback'] = $sanitize_callback;
945
-            $args_info[ $field_name ] = $arg_info;
945
+            $args_info[$field_name] = $arg_info;
946 946
             if ($field_obj instanceof EE_Datetime_Field) {
947 947
                 $gmt_arg_info = $arg_info;
948 948
                 $gmt_arg_info['description'] = sprintf(
@@ -953,7 +953,7 @@  discard block
 block discarded – undo
953 953
                     $field_obj->get_nicename(),
954 954
                     $field_name
955 955
                 );
956
-                $args_info[ $field_name . '_gmt' ] = $gmt_arg_info;
956
+                $args_info[$field_name.'_gmt'] = $gmt_arg_info;
957 957
             }
958 958
         }
959 959
         return $args_info;
@@ -977,18 +977,18 @@  discard block
 block discarded – undo
977 977
     {
978 978
         $attributes = $request->get_attributes();
979 979
         if (
980
-            ! isset($attributes['args'][ $param ])
981
-            || ! is_array($attributes['args'][ $param ])
980
+            ! isset($attributes['args'][$param])
981
+            || ! is_array($attributes['args'][$param])
982 982
         ) {
983 983
             $validation_result = true;
984 984
         } else {
985
-            $args = $attributes['args'][ $param ];
985
+            $args = $attributes['args'][$param];
986 986
             if (
987 987
                 (
988 988
                     $value === ''
989 989
                     || $value === null
990 990
                 )
991
-                && (! isset($args['required'])
991
+                && ( ! isset($args['required'])
992 992
                     || $args['required'] === false
993 993
                 )
994 994
             ) {
@@ -999,7 +999,7 @@  discard block
 block discarded – undo
999 999
                       && $args['format'] === 'email'
1000 1000
             ) {
1001 1001
                 $validation_result = true;
1002
-                if (! self::_validate_email($value)) {
1002
+                if ( ! self::_validate_email($value)) {
1003 1003
                     $validation_result = new WP_Error(
1004 1004
                         'rest_invalid_param',
1005 1005
                         esc_html__(
@@ -1049,7 +1049,7 @@  discard block
 block discarded – undo
1049 1049
     {
1050 1050
         $config_routes = array();
1051 1051
         foreach (self::versions_served() as $version => $hidden_endpoint) {
1052
-            $config_routes[ self::ee_api_namespace . $version ] = $this->_get_config_route_data_for_version(
1052
+            $config_routes[self::ee_api_namespace.$version] = $this->_get_config_route_data_for_version(
1053 1053
                 $version,
1054 1054
                 $hidden_endpoint
1055 1055
             );
@@ -1104,7 +1104,7 @@  discard block
 block discarded – undo
1104 1104
     {
1105 1105
         $meta_routes = array();
1106 1106
         foreach (self::versions_served() as $version => $hidden_endpoint) {
1107
-            $meta_routes[ self::ee_api_namespace . $version ] = $this->_get_meta_route_data_for_version(
1107
+            $meta_routes[self::ee_api_namespace.$version] = $this->_get_meta_route_data_for_version(
1108 1108
                 $version,
1109 1109
                 $hidden_endpoint
1110 1110
             );
@@ -1156,7 +1156,7 @@  discard block
 block discarded – undo
1156 1156
             foreach ($relative_urls as $resource_name => $endpoints) {
1157 1157
                 foreach ($endpoints as $key => $endpoint) {
1158 1158
                     // skip schema and other route options
1159
-                    if (! is_numeric($key)) {
1159
+                    if ( ! is_numeric($key)) {
1160 1160
                         continue;
1161 1161
                     }
1162 1162
                     // by default, hide "hidden_endpoint"s, unless the request indicates
@@ -1166,9 +1166,9 @@  discard block
 block discarded – undo
1166 1166
                         ($force_show_ee_namespace !== '' && $force_show_ee_namespace !== $namespace)
1167 1167
                         || ($endpoint['hidden_endpoint'] && $force_show_ee_namespace === '')
1168 1168
                     ) {
1169
-                        $full_route = '/' . ltrim($namespace, '/');
1170
-                        $full_route .= '/' . ltrim($resource_name, '/');
1171
-                        unset($route_data[ $full_route ]);
1169
+                        $full_route = '/'.ltrim($namespace, '/');
1170
+                        $full_route .= '/'.ltrim($resource_name, '/');
1171
+                        unset($route_data[$full_route]);
1172 1172
                     }
1173 1173
                 }
1174 1174
             }
@@ -1242,13 +1242,13 @@  discard block
 block discarded – undo
1242 1242
 
1243 1243
             if ($key_versioned_endpoint === $latest_version) {
1244 1244
                 // don't hide the latest version in the index
1245
-                $versions_served[ $key_versioned_endpoint ] = false;
1245
+                $versions_served[$key_versioned_endpoint] = false;
1246 1246
             } elseif (
1247 1247
                 version_compare($key_versioned_endpoint, $lowest_compatible_version, '>=')
1248 1248
                 && version_compare($key_versioned_endpoint, EED_Core_Rest_Api::core_version(), '<')
1249 1249
             ) {
1250 1250
                 // include, but hide, previous versions which are still supported
1251
-                $versions_served[ $key_versioned_endpoint ] = true;
1251
+                $versions_served[$key_versioned_endpoint] = true;
1252 1252
             } elseif (
1253 1253
                 apply_filters(
1254 1254
                     'FHEE__EED_Core_Rest_Api__versions_served__include_incompatible_versions',
@@ -1257,7 +1257,7 @@  discard block
 block discarded – undo
1257 1257
                 )
1258 1258
             ) {
1259 1259
                 // if a version is no longer supported, don't include it in index or list of versions served
1260
-                $versions_served[ $key_versioned_endpoint ] = true;
1260
+                $versions_served[$key_versioned_endpoint] = true;
1261 1261
             }
1262 1262
         }
1263 1263
         return $versions_served;
@@ -1315,7 +1315,7 @@  discard block
 block discarded – undo
1315 1315
         $model_names = self::model_names_with_plural_routes($version);
1316 1316
         $collection_routes = array();
1317 1317
         foreach ($model_names as $model_name => $model_class_name) {
1318
-            $collection_routes[ strtolower($model_name) ] = '/' . self::ee_api_namespace . $version . '/'
1318
+            $collection_routes[strtolower($model_name)] = '/'.self::ee_api_namespace.$version.'/'
1319 1319
                                                             . EEH_Inflector::pluralize_and_lower($model_name);
1320 1320
         }
1321 1321
         return $collection_routes;
@@ -1336,9 +1336,9 @@  discard block
 block discarded – undo
1336 1336
             $primary_keys = $model_class_name::instance()->get_combined_primary_key_fields();
1337 1337
             foreach ($primary_keys as $primary_key_name => $primary_key_field) {
1338 1338
                 if (count($primary_keys) > 1) {
1339
-                    $primary_key_items[ strtolower($model_name) ][] = $primary_key_name;
1339
+                    $primary_key_items[strtolower($model_name)][] = $primary_key_name;
1340 1340
                 } else {
1341
-                    $primary_key_items[ strtolower($model_name) ] = $primary_key_name;
1341
+                    $primary_key_items[strtolower($model_name)] = $primary_key_name;
1342 1342
                 }
1343 1343
             }
1344 1344
         }
Please login to merge, or discard this patch.
Indentation   +1348 added lines, -1348 removed lines patch added patch discarded remove patch
@@ -22,1352 +22,1352 @@
 block discarded – undo
22 22
  */
23 23
 class EED_Core_Rest_Api extends \EED_Module
24 24
 {
25
-    const ee_api_namespace = Domain::API_NAMESPACE;
26
-
27
-    const ee_api_namespace_for_regex = 'ee\/v([^/]*)\/';
28
-
29
-    const saved_routes_option_names = 'ee_core_routes';
30
-
31
-    /**
32
-     * string used in _links response bodies to make them globally unique.
33
-     *
34
-     * @see http://v2.wp-api.org/extending/linking/
35
-     */
36
-    const ee_api_link_namespace = 'https://api.eventespresso.com/';
37
-
38
-    /**
39
-     * @var CalculatedModelFields
40
-     */
41
-    protected static $_field_calculator;
42
-
43
-
44
-    /**
45
-     * @return EED_Core_Rest_Api|EED_Module
46
-     */
47
-    public static function instance()
48
-    {
49
-        self::$_field_calculator = LoaderFactory::getLoader()->load('EventEspresso\core\libraries\rest_api\CalculatedModelFields');
50
-        return parent::get_instance(__CLASS__);
51
-    }
52
-
53
-
54
-    /**
55
-     *    set_hooks - for hooking into EE Core, other modules, etc
56
-     *
57
-     * @access    public
58
-     * @return    void
59
-     */
60
-    public static function set_hooks()
61
-    {
62
-        self::set_hooks_both();
63
-    }
64
-
65
-
66
-    /**
67
-     *    set_hooks_admin - for hooking into EE Admin Core, other modules, etc
68
-     *
69
-     * @access    public
70
-     * @return    void
71
-     */
72
-    public static function set_hooks_admin()
73
-    {
74
-        self::set_hooks_both();
75
-    }
76
-
77
-
78
-    public static function set_hooks_both()
79
-    {
80
-        add_action('rest_api_init', array('EED_Core_Rest_Api', 'set_hooks_rest_api'), 5);
81
-        add_action('rest_api_init', array('EED_Core_Rest_Api', 'register_routes'), 10);
82
-        add_filter('rest_route_data', array('EED_Core_Rest_Api', 'hide_old_endpoints'), 10, 2);
83
-        add_filter(
84
-            'rest_index',
85
-            array('EventEspresso\core\libraries\rest_api\controllers\model\Meta', 'filterEeMetadataIntoIndex')
86
-        );
87
-        EED_Core_Rest_Api::invalidate_cached_route_data_on_version_change();
88
-    }
89
-
90
-
91
-    /**
92
-     * sets up hooks which only need to be included as part of REST API requests;
93
-     * other requests like to the frontend or admin etc don't need them
94
-     *
95
-     * @throws \EE_Error
96
-     */
97
-    public static function set_hooks_rest_api()
98
-    {
99
-        // set hooks which account for changes made to the API
100
-        EED_Core_Rest_Api::_set_hooks_for_changes();
101
-    }
102
-
103
-
104
-    /**
105
-     * public wrapper of _set_hooks_for_changes.
106
-     * Loads all the hooks which make requests to old versions of the API
107
-     * appear the same as they always did
108
-     *
109
-     * @throws EE_Error
110
-     */
111
-    public static function set_hooks_for_changes()
112
-    {
113
-        self::_set_hooks_for_changes();
114
-    }
115
-
116
-
117
-    /**
118
-     * Loads all the hooks which make requests to old versions of the API
119
-     * appear the same as they always did
120
-     *
121
-     * @throws EE_Error
122
-     */
123
-    protected static function _set_hooks_for_changes()
124
-    {
125
-        $folder_contents = EEH_File::get_contents_of_folders(array(EE_LIBRARIES . 'rest_api/changes'), false);
126
-        foreach ($folder_contents as $classname_in_namespace => $filepath) {
127
-            // ignore the base parent class
128
-            // and legacy named classes
129
-            if (
130
-                $classname_in_namespace === 'ChangesInBase'
131
-                || strpos($classname_in_namespace, 'Changes_In_') === 0
132
-            ) {
133
-                continue;
134
-            }
135
-            $full_classname = 'EventEspresso\core\libraries\rest_api\changes\\' . $classname_in_namespace;
136
-            if (class_exists($full_classname)) {
137
-                $instance_of_class = new $full_classname();
138
-                if ($instance_of_class instanceof ChangesInBase) {
139
-                    $instance_of_class->setHooks();
140
-                }
141
-            }
142
-        }
143
-    }
144
-
145
-
146
-    /**
147
-     * Filters the WP routes to add our EE-related ones. This takes a bit of time
148
-     * so we actually prefer to only do it when an EE plugin is activated or upgraded
149
-     *
150
-     * @throws \EE_Error
151
-     */
152
-    public static function register_routes()
153
-    {
154
-        foreach (EED_Core_Rest_Api::get_ee_route_data() as $namespace => $relative_routes) {
155
-            foreach ($relative_routes as $relative_route => $data_for_multiple_endpoints) {
156
-                /**
157
-                 * @var array     $data_for_multiple_endpoints numerically indexed array
158
-                 *                                         but can also contain route options like {
159
-                 * @type array    $schema                      {
160
-                 * @type callable $schema_callback
161
-                 * @type array    $callback_args               arguments that will be passed to the callback, after the
162
-                 * WP_REST_Request of course
163
-                 * }
164
-                 * }
165
-                 */
166
-                // when registering routes, register all the endpoints' data at the same time
167
-                $multiple_endpoint_args = array();
168
-                foreach ($data_for_multiple_endpoints as $endpoint_key => $data_for_single_endpoint) {
169
-                    /**
170
-                     * @var array     $data_for_single_endpoint {
171
-                     * @type callable $callback
172
-                     * @type string methods
173
-                     * @type array args
174
-                     * @type array _links
175
-                     * @type array    $callback_args            arguments that will be passed to the callback, after the
176
-                     * WP_REST_Request of course
177
-                     * }
178
-                     */
179
-                    // skip route options
180
-                    if (! is_numeric($endpoint_key)) {
181
-                        continue;
182
-                    }
183
-                    if (! isset($data_for_single_endpoint['callback'], $data_for_single_endpoint['methods'])) {
184
-                        throw new EE_Error(
185
-                            esc_html__(
186
-                            // @codingStandardsIgnoreStart
187
-                                'Endpoint configuration data needs to have entries "callback" (callable) and "methods" (comma-separated list of accepts HTTP methods).',
188
-                                // @codingStandardsIgnoreEnd
189
-                                'event_espresso'
190
-                            )
191
-                        );
192
-                    }
193
-                    $callback = $data_for_single_endpoint['callback'];
194
-                    $single_endpoint_args = array(
195
-                        'methods' => $data_for_single_endpoint['methods'],
196
-                        'args'    => isset($data_for_single_endpoint['args']) ? $data_for_single_endpoint['args']
197
-                            : array(),
198
-                    );
199
-                    if (isset($data_for_single_endpoint['_links'])) {
200
-                        $single_endpoint_args['_links'] = $data_for_single_endpoint['_links'];
201
-                    }
202
-                    if (isset($data_for_single_endpoint['callback_args'])) {
203
-                        $callback_args = $data_for_single_endpoint['callback_args'];
204
-                        $single_endpoint_args['callback'] = function (\WP_REST_Request $request) use (
205
-                            $callback,
206
-                            $callback_args
207
-                        ) {
208
-                            array_unshift($callback_args, $request);
209
-                            return call_user_func_array(
210
-                                $callback,
211
-                                $callback_args
212
-                            );
213
-                        };
214
-                    } else {
215
-                        $single_endpoint_args['callback'] = $data_for_single_endpoint['callback'];
216
-                    }
217
-                    // As of WordPress 5.5, if a permission_callback is not provided,
218
-                    // the REST API will issue a _doing_it_wrong notice.
219
-                    // Since the EE REST API defers capabilities to the db model system,
220
-                    // we will just use the generic WP callback for public endpoints
221
-                    if (! isset($single_endpoint_args['permission_callback'])) {
222
-                        $single_endpoint_args['permission_callback'] = '__return_true';
223
-                    }
224
-                    $multiple_endpoint_args[] = $single_endpoint_args;
225
-                }
226
-                if (isset($data_for_multiple_endpoints['schema'])) {
227
-                    $schema_route_data = $data_for_multiple_endpoints['schema'];
228
-                    $schema_callback = $schema_route_data['schema_callback'];
229
-                    $callback_args = $schema_route_data['callback_args'];
230
-                    $multiple_endpoint_args['schema'] = function () use ($schema_callback, $callback_args) {
231
-                        return call_user_func_array(
232
-                            $schema_callback,
233
-                            $callback_args
234
-                        );
235
-                    };
236
-                }
237
-                register_rest_route(
238
-                    $namespace,
239
-                    $relative_route,
240
-                    $multiple_endpoint_args
241
-                );
242
-            }
243
-        }
244
-    }
245
-
246
-
247
-    /**
248
-     * Checks if there was a version change or something that merits invalidating the cached
249
-     * route data. If so, invalidates the cached route data so that it gets refreshed
250
-     * next time the WP API is used
251
-     */
252
-    public static function invalidate_cached_route_data_on_version_change()
253
-    {
254
-        if (EE_System::instance()->detect_req_type() !== EE_System::req_type_normal) {
255
-            EED_Core_Rest_Api::invalidate_cached_route_data();
256
-        }
257
-        foreach (EE_Registry::instance()->addons as $addon) {
258
-            if ($addon instanceof EE_Addon && $addon->detect_req_type() !== EE_System::req_type_normal) {
259
-                EED_Core_Rest_Api::invalidate_cached_route_data();
260
-            }
261
-        }
262
-    }
263
-
264
-
265
-    /**
266
-     * Removes the cached route data so it will get refreshed next time the WP API is used
267
-     */
268
-    public static function invalidate_cached_route_data()
269
-    {
270
-        // delete the saved EE REST API routes
271
-        foreach (EED_Core_Rest_Api::versions_served() as $version => $hidden) {
272
-            delete_option(EED_Core_Rest_Api::saved_routes_option_names . $version);
273
-        }
274
-    }
275
-
276
-
277
-    /**
278
-     * Gets the EE route data
279
-     *
280
-     * @return array top-level key is the namespace, next-level key is the route and its value is array{
281
-     * @throws \EE_Error
282
-     * @type string|array $callback
283
-     * @type string       $methods
284
-     * @type boolean      $hidden_endpoint
285
-     * }
286
-     */
287
-    public static function get_ee_route_data()
288
-    {
289
-        $ee_routes = array();
290
-        foreach (self::versions_served() as $version => $hidden_endpoints) {
291
-            $ee_routes[ self::ee_api_namespace . $version ] = self::_get_ee_route_data_for_version(
292
-                $version,
293
-                $hidden_endpoints
294
-            );
295
-        }
296
-        return $ee_routes;
297
-    }
298
-
299
-
300
-    /**
301
-     * Gets the EE route data from the wp options if it exists already,
302
-     * otherwise re-generates it and saves it to the option
303
-     *
304
-     * @param string  $version
305
-     * @param boolean $hidden_endpoints
306
-     * @return array
307
-     * @throws \EE_Error
308
-     */
309
-    protected static function _get_ee_route_data_for_version($version, $hidden_endpoints = false)
310
-    {
311
-        $ee_routes = get_option(self::saved_routes_option_names . $version, null);
312
-        if (! $ee_routes || EED_Core_Rest_Api::debugMode()) {
313
-            $ee_routes = self::_save_ee_route_data_for_version($version, $hidden_endpoints);
314
-        }
315
-        return $ee_routes;
316
-    }
317
-
318
-
319
-    /**
320
-     * Saves the EE REST API route data to a wp option and returns it
321
-     *
322
-     * @param string  $version
323
-     * @param boolean $hidden_endpoints
324
-     * @return mixed|null
325
-     * @throws \EE_Error
326
-     */
327
-    protected static function _save_ee_route_data_for_version($version, $hidden_endpoints = false)
328
-    {
329
-        $instance = self::instance();
330
-        $routes = apply_filters(
331
-            'EED_Core_Rest_Api__save_ee_route_data_for_version__routes',
332
-            array_replace_recursive(
333
-                $instance->_get_config_route_data_for_version($version, $hidden_endpoints),
334
-                $instance->_get_meta_route_data_for_version($version, $hidden_endpoints),
335
-                $instance->_get_model_route_data_for_version($version, $hidden_endpoints),
336
-                $instance->_get_rpc_route_data_for_version($version, $hidden_endpoints)
337
-            )
338
-        );
339
-        $option_name = self::saved_routes_option_names . $version;
340
-        if (get_option($option_name)) {
341
-            update_option($option_name, $routes, true);
342
-        } else {
343
-            add_option($option_name, $routes, null, 'no');
344
-        }
345
-        return $routes;
346
-    }
347
-
348
-
349
-    /**
350
-     * Calculates all the EE routes and saves it to a WordPress option so we don't
351
-     * need to calculate it on every request
352
-     *
353
-     * @deprecated since version 4.9.1
354
-     * @return void
355
-     */
356
-    public static function save_ee_routes()
357
-    {
358
-        if (EE_Maintenance_Mode::instance()->models_can_query()) {
359
-            $instance = self::instance();
360
-            $routes = apply_filters(
361
-                'EED_Core_Rest_Api__save_ee_routes__routes',
362
-                array_replace_recursive(
363
-                    $instance->_register_config_routes(),
364
-                    $instance->_register_meta_routes(),
365
-                    $instance->_register_model_routes(),
366
-                    $instance->_register_rpc_routes()
367
-                )
368
-            );
369
-            update_option(self::saved_routes_option_names, $routes, true);
370
-        }
371
-    }
372
-
373
-
374
-    /**
375
-     * Gets all the route information relating to EE models
376
-     *
377
-     * @return array @see get_ee_route_data
378
-     * @deprecated since version 4.9.1
379
-     */
380
-    protected function _register_model_routes()
381
-    {
382
-        $model_routes = array();
383
-        foreach (self::versions_served() as $version => $hidden_endpoint) {
384
-            $model_routes[ EED_Core_Rest_Api::ee_api_namespace
385
-                           . $version ] = $this->_get_config_route_data_for_version($version, $hidden_endpoint);
386
-        }
387
-        return $model_routes;
388
-    }
389
-
390
-
391
-    /**
392
-     * Decides whether or not to add write endpoints for this model.
393
-     *
394
-     * Currently, this defaults to exclude all global tables and models
395
-     * which would allow inserting WP core data (we don't want to duplicate
396
-     * what WP API does, as it's unnecessary, extra work, and potentially extra bugs)
397
-     *
398
-     * @param EEM_Base $model
399
-     * @return bool
400
-     */
401
-    public static function should_have_write_endpoints(EEM_Base $model)
402
-    {
403
-        if ($model->is_wp_core_model()) {
404
-            return false;
405
-        }
406
-        foreach ($model->get_tables() as $table) {
407
-            if ($table->is_global()) {
408
-                return false;
409
-            }
410
-        }
411
-        return true;
412
-    }
413
-
414
-
415
-    /**
416
-     * Gets the names of all models which should have plural routes (eg `ee/v4.8.36/events`)
417
-     * in this versioned namespace of EE4
418
-     *
419
-     * @param $version
420
-     * @return array keys are model names (eg 'Event') and values ar either classnames (eg 'EEM_Event')
421
-     */
422
-    public static function model_names_with_plural_routes($version)
423
-    {
424
-        $model_version_info = new ModelVersionInfo($version);
425
-        $models_to_register = $model_version_info->modelsForRequestedVersion();
426
-        // let's not bother having endpoints for extra metas
427
-        unset(
428
-            $models_to_register['Extra_Meta'],
429
-            $models_to_register['Extra_Join'],
430
-            $models_to_register['Post_Meta']
431
-        );
432
-        return apply_filters(
433
-            'FHEE__EED_Core_REST_API___register_model_routes',
434
-            $models_to_register
435
-        );
436
-    }
437
-
438
-
439
-    /**
440
-     * Gets the route data for EE models in the specified version
441
-     *
442
-     * @param string  $version
443
-     * @param boolean $hidden_endpoint
444
-     * @return array
445
-     * @throws EE_Error
446
-     */
447
-    protected function _get_model_route_data_for_version($version, $hidden_endpoint = false)
448
-    {
449
-        $model_routes = array();
450
-        $model_version_info = new ModelVersionInfo($version);
451
-        foreach (EED_Core_Rest_Api::model_names_with_plural_routes($version) as $model_name => $model_classname) {
452
-            $model = \EE_Registry::instance()->load_model($model_name);
453
-            // if this isn't a valid model then let's skip iterate to the next item in the loop.
454
-            if (! $model instanceof EEM_Base) {
455
-                continue;
456
-            }
457
-            // yes we could just register one route for ALL models, but then they wouldn't show up in the index
458
-            $plural_model_route = EED_Core_Rest_Api::get_collection_route($model);
459
-            $singular_model_route = EED_Core_Rest_Api::get_entity_route($model, '(?P<id>[^\/]+)');
460
-            $model_routes[ $plural_model_route ] = array(
461
-                array(
462
-                    'callback'        => array(
463
-                        'EventEspresso\core\libraries\rest_api\controllers\model\Read',
464
-                        'handleRequestGetAll',
465
-                    ),
466
-                    'callback_args'   => array($version, $model_name),
467
-                    'methods'         => WP_REST_Server::READABLE,
468
-                    'hidden_endpoint' => $hidden_endpoint,
469
-                    'args'            => $this->_get_read_query_params($model, $version),
470
-                    '_links'          => array(
471
-                        'self' => rest_url(EED_Core_Rest_Api::ee_api_namespace . $version . $singular_model_route),
472
-                    ),
473
-                ),
474
-                'schema' => array(
475
-                    'schema_callback' => array(
476
-                        'EventEspresso\core\libraries\rest_api\controllers\model\Read',
477
-                        'handleSchemaRequest',
478
-                    ),
479
-                    'callback_args'   => array($version, $model_name),
480
-                ),
481
-            );
482
-            $model_routes[ $singular_model_route ] = array(
483
-                array(
484
-                    'callback'        => array(
485
-                        'EventEspresso\core\libraries\rest_api\controllers\model\Read',
486
-                        'handleRequestGetOne',
487
-                    ),
488
-                    'callback_args'   => array($version, $model_name),
489
-                    'methods'         => WP_REST_Server::READABLE,
490
-                    'hidden_endpoint' => $hidden_endpoint,
491
-                    'args'            => $this->_get_response_selection_query_params($model, $version, true),
492
-                ),
493
-            );
494
-            if (
495
-                apply_filters(
496
-                    'FHEE__EED_Core_Rest_Api___get_model_route_data_for_version__add_write_endpoints',
497
-                    EED_Core_Rest_Api::should_have_write_endpoints($model),
498
-                    $model
499
-                )
500
-            ) {
501
-                $model_routes[ $plural_model_route ][] = array(
502
-                    'callback'        => array(
503
-                        'EventEspresso\core\libraries\rest_api\controllers\model\Write',
504
-                        'handleRequestInsert',
505
-                    ),
506
-                    'callback_args'   => array($version, $model_name),
507
-                    'methods'         => WP_REST_Server::CREATABLE,
508
-                    'hidden_endpoint' => $hidden_endpoint,
509
-                    'args'            => $this->_get_write_params($model_name, $model_version_info, true),
510
-                );
511
-                $model_routes[ $singular_model_route ] = array_merge(
512
-                    $model_routes[ $singular_model_route ],
513
-                    array(
514
-                        array(
515
-                            'callback'        => array(
516
-                                'EventEspresso\core\libraries\rest_api\controllers\model\Write',
517
-                                'handleRequestUpdate',
518
-                            ),
519
-                            'callback_args'   => array($version, $model_name),
520
-                            'methods'         => WP_REST_Server::EDITABLE,
521
-                            'hidden_endpoint' => $hidden_endpoint,
522
-                            'args'            => $this->_get_write_params($model_name, $model_version_info),
523
-                        ),
524
-                        array(
525
-                            'callback'        => array(
526
-                                'EventEspresso\core\libraries\rest_api\controllers\model\Write',
527
-                                'handleRequestDelete',
528
-                            ),
529
-                            'callback_args'   => array($version, $model_name),
530
-                            'methods'         => WP_REST_Server::DELETABLE,
531
-                            'hidden_endpoint' => $hidden_endpoint,
532
-                            'args'            => $this->_get_delete_query_params($model, $version),
533
-                        ),
534
-                    )
535
-                );
536
-            }
537
-            foreach ($model->relation_settings() as $relation_name => $relation_obj) {
538
-                $related_route = EED_Core_Rest_Api::get_relation_route_via(
539
-                    $model,
540
-                    '(?P<id>[^\/]+)',
541
-                    $relation_obj
542
-                );
543
-                $model_routes[ $related_route ] = array(
544
-                    array(
545
-                        'callback'        => array(
546
-                            'EventEspresso\core\libraries\rest_api\controllers\model\Read',
547
-                            'handleRequestGetRelated',
548
-                        ),
549
-                        'callback_args'   => array($version, $model_name, $relation_name),
550
-                        'methods'         => WP_REST_Server::READABLE,
551
-                        'hidden_endpoint' => $hidden_endpoint,
552
-                        'args'            => $this->_get_read_query_params($relation_obj->get_other_model(), $version),
553
-                    ),
554
-                );
555
-
556
-                $related_write_route = $related_route . '/' . '(?P<related_id>[^\/]+)';
557
-                $model_routes[ $related_write_route ] = array(
558
-                    array(
559
-                        'callback'        => array(
560
-                            'EventEspresso\core\libraries\rest_api\controllers\model\Write',
561
-                            'handleRequestAddRelation',
562
-                        ),
563
-                        'callback_args'   => array($version, $model_name, $relation_name),
564
-                        'methods'         => WP_REST_Server::EDITABLE,
565
-                        'hidden_endpoint' => $hidden_endpoint,
566
-                        'args'            => $this->_get_add_relation_query_params($model, $relation_obj->get_other_model(), $version)
567
-                    ),
568
-                    array(
569
-                        'callback'        => array(
570
-                            'EventEspresso\core\libraries\rest_api\controllers\model\Write',
571
-                            'handleRequestRemoveRelation',
572
-                        ),
573
-                        'callback_args'   => array($version, $model_name, $relation_name),
574
-                        'methods'         => WP_REST_Server::DELETABLE,
575
-                        'hidden_endpoint' => $hidden_endpoint,
576
-                        'args'            => array()
577
-                    ),
578
-                );
579
-            }
580
-        }
581
-        return $model_routes;
582
-    }
583
-
584
-
585
-    /**
586
-     * Gets the relative URI to a model's REST API plural route, after the EE4 versioned namespace,
587
-     * excluding the preceding slash.
588
-     * Eg you pass get_plural_route_to('Event') = 'events'
589
-     *
590
-     * @param EEM_Base $model
591
-     * @return string
592
-     */
593
-    public static function get_collection_route(EEM_Base $model)
594
-    {
595
-        return EEH_Inflector::pluralize_and_lower($model->get_this_model_name());
596
-    }
597
-
598
-
599
-    /**
600
-     * Gets the relative URI to a model's REST API singular route, after the EE4 versioned namespace,
601
-     * excluding the preceding slash.
602
-     * Eg you pass get_plural_route_to('Event', 12) = 'events/12'
603
-     *
604
-     * @param EEM_Base $model eg Event or Venue
605
-     * @param string   $id
606
-     * @return string
607
-     */
608
-    public static function get_entity_route($model, $id)
609
-    {
610
-        return EED_Core_Rest_Api::get_collection_route($model) . '/' . $id;
611
-    }
612
-
613
-
614
-    /**
615
-     * Gets the relative URI to a model's REST API singular route, after the EE4 versioned namespace,
616
-     * excluding the preceding slash.
617
-     * Eg you pass get_plural_route_to('Event', 12) = 'events/12'
618
-     *
619
-     * @param EEM_Base               $model eg Event or Venue
620
-     * @param string                 $id
621
-     * @param EE_Model_Relation_Base $relation_obj
622
-     * @return string
623
-     */
624
-    public static function get_relation_route_via(EEM_Base $model, $id, EE_Model_Relation_Base $relation_obj)
625
-    {
626
-        $related_model_name_endpoint_part = ModelRead::getRelatedEntityName(
627
-            $relation_obj->get_other_model()->get_this_model_name(),
628
-            $relation_obj
629
-        );
630
-        return EED_Core_Rest_Api::get_entity_route($model, $id) . '/' . $related_model_name_endpoint_part;
631
-    }
632
-
633
-
634
-    /**
635
-     * Adds onto the $relative_route the EE4 REST API versioned namespace.
636
-     * Eg if given '4.8.36' and 'events', will return 'ee/v4.8.36/events'
637
-     *
638
-     * @param string $relative_route
639
-     * @param string $version
640
-     * @return string
641
-     */
642
-    public static function get_versioned_route_to($relative_route, $version = '4.8.36')
643
-    {
644
-        return '/' . EED_Core_Rest_Api::ee_api_namespace . $version . '/' . $relative_route;
645
-    }
646
-
647
-
648
-    /**
649
-     * Adds all the RPC-style routes (remote procedure call-like routes, ie
650
-     * routes that don't conform to the traditional REST CRUD-style).
651
-     *
652
-     * @deprecated since 4.9.1
653
-     */
654
-    protected function _register_rpc_routes()
655
-    {
656
-        $routes = array();
657
-        foreach (self::versions_served() as $version => $hidden_endpoint) {
658
-            $routes[ self::ee_api_namespace . $version ] = $this->_get_rpc_route_data_for_version(
659
-                $version,
660
-                $hidden_endpoint
661
-            );
662
-        }
663
-        return $routes;
664
-    }
665
-
666
-
667
-    /**
668
-     * @param string  $version
669
-     * @param boolean $hidden_endpoint
670
-     * @return array
671
-     */
672
-    protected function _get_rpc_route_data_for_version($version, $hidden_endpoint = false)
673
-    {
674
-        $this_versions_routes = array();
675
-        // checkin endpoint
676
-        $this_versions_routes['registrations/(?P<REG_ID>\d+)/toggle_checkin_for_datetime/(?P<DTT_ID>\d+)'] = array(
677
-            array(
678
-                'callback'        => array(
679
-                    'EventEspresso\core\libraries\rest_api\controllers\rpc\Checkin',
680
-                    'handleRequestToggleCheckin',
681
-                ),
682
-                'methods'         => WP_REST_Server::CREATABLE,
683
-                'hidden_endpoint' => $hidden_endpoint,
684
-                'args'            => array(
685
-                    'force' => array(
686
-                        'required'    => false,
687
-                        'default'     => false,
688
-                        'description' => esc_html__(
689
-                        // @codingStandardsIgnoreStart
690
-                            'Whether to force toggle checkin, or to verify the registration status and allowed ticket uses',
691
-                            // @codingStandardsIgnoreEnd
692
-                            'event_espresso'
693
-                        ),
694
-                    ),
695
-                ),
696
-                'callback_args'   => array($version),
697
-            ),
698
-        );
699
-        return apply_filters(
700
-            'FHEE__EED_Core_Rest_Api___register_rpc_routes__this_versions_routes',
701
-            $this_versions_routes,
702
-            $version,
703
-            $hidden_endpoint
704
-        );
705
-    }
706
-
707
-
708
-    /**
709
-     * Gets the query params that can be used when request one or many
710
-     *
711
-     * @param EEM_Base $model
712
-     * @param string   $version
713
-     * @return array
714
-     */
715
-    protected function _get_response_selection_query_params(\EEM_Base $model, $version, $single_only = false)
716
-    {
717
-        $query_params = array(
718
-            'include'   => array(
719
-                'required' => false,
720
-                'default'  => '*',
721
-                'type'     => 'string',
722
-            ),
723
-            'calculate' => array(
724
-                'required'          => false,
725
-                'default'           => '',
726
-                'enum'              => self::$_field_calculator->retrieveCalculatedFieldsForModel($model),
727
-                'type'              => 'string',
728
-                // because we accept a CSV'd list of the enumerated strings, WP core validation and sanitization
729
-                // freaks out. We'll just validate this argument while handling the request
730
-                'validate_callback' => null,
731
-                'sanitize_callback' => null,
732
-            ),
733
-            'password' => array(
734
-                'required' => false,
735
-                'default' => '',
736
-                'type' => 'string'
737
-            )
738
-        );
739
-        return apply_filters(
740
-            'FHEE__EED_Core_Rest_Api___get_response_selection_query_params',
741
-            $query_params,
742
-            $model,
743
-            $version
744
-        );
745
-    }
746
-
747
-
748
-    /**
749
-     * Gets the parameters acceptable for delete requests
750
-     *
751
-     * @param \EEM_Base $model
752
-     * @param string    $version
753
-     * @return array
754
-     */
755
-    protected function _get_delete_query_params(\EEM_Base $model, $version)
756
-    {
757
-        $params_for_delete = array(
758
-            'allow_blocking' => array(
759
-                'required' => false,
760
-                'default'  => true,
761
-                'type'     => 'boolean',
762
-            ),
763
-        );
764
-        $params_for_delete['force'] = array(
765
-            'required' => false,
766
-            'default'  => false,
767
-            'type'     => 'boolean',
768
-        );
769
-        return apply_filters(
770
-            'FHEE__EED_Core_Rest_Api___get_delete_query_params',
771
-            $params_for_delete,
772
-            $model,
773
-            $version
774
-        );
775
-    }
776
-
777
-    protected function _get_add_relation_query_params(\EEM_Base $source_model, \EEM_Base $related_model, $version)
778
-    {
779
-        // if they're related through a HABTM relation, check for any non-FKs
780
-        $all_relation_settings = $source_model->relation_settings();
781
-        $relation_settings = $all_relation_settings[ $related_model->get_this_model_name() ];
782
-        $params = array();
783
-        if ($relation_settings instanceof EE_HABTM_Relation && $relation_settings->hasNonKeyFields()) {
784
-            foreach ($relation_settings->getNonKeyFields() as $field) {
785
-                /* @var $field EE_Model_Field_Base */
786
-                $params[ $field->get_name() ] = array(
787
-                    'required' => ! $field->is_nullable(),
788
-                    'default' => ModelDataTranslator::prepareFieldValueForJson($field, $field->get_default_value(), $version),
789
-                    'type' => $field->getSchemaType(),
790
-                    'validate_callbaack' => null,
791
-                    'sanitize_callback' => null
792
-                );
793
-            }
794
-        }
795
-        return $params;
796
-    }
797
-
798
-
799
-    /**
800
-     * Gets info about reading query params that are acceptable
801
-     *
802
-     * @param \EEM_Base $model eg 'Event' or 'Venue'
803
-     * @param  string   $version
804
-     * @return array    describing the args acceptable when querying this model
805
-     * @throws EE_Error
806
-     */
807
-    protected function _get_read_query_params(\EEM_Base $model, $version)
808
-    {
809
-        $default_orderby = array();
810
-        foreach ($model->get_combined_primary_key_fields() as $key_field) {
811
-            $default_orderby[ $key_field->get_name() ] = 'ASC';
812
-        }
813
-        return array_merge(
814
-            $this->_get_response_selection_query_params($model, $version),
815
-            array(
816
-                'where'    => array(
817
-                    'required'          => false,
818
-                    'default'           => array(),
819
-                    'type'              => 'object',
820
-                    // because we accept an almost infinite list of possible where conditions, WP
821
-                    // core validation and sanitization freaks out. We'll just validate this argument
822
-                    // while handling the request
823
-                    'validate_callback' => null,
824
-                    'sanitize_callback' => null,
825
-                ),
826
-                'limit'    => array(
827
-                    'required'          => false,
828
-                    'default'           => EED_Core_Rest_Api::get_default_query_limit(),
829
-                    'type'              => array(
830
-                        'array',
831
-                        'string',
832
-                        'integer',
833
-                    ),
834
-                    // because we accept a variety of types, WP core validation and sanitization
835
-                    // freaks out. We'll just validate this argument while handling the request
836
-                    'validate_callback' => null,
837
-                    'sanitize_callback' => null,
838
-                ),
839
-                'order_by' => array(
840
-                    'required'          => false,
841
-                    'default'           => $default_orderby,
842
-                    'type'              => array(
843
-                        'object',
844
-                        'string',
845
-                    ),// because we accept a variety of types, WP core validation and sanitization
846
-                    // freaks out. We'll just validate this argument while handling the request
847
-                    'validate_callback' => null,
848
-                    'sanitize_callback' => null,
849
-                ),
850
-                'group_by' => array(
851
-                    'required'          => false,
852
-                    'default'           => null,
853
-                    'type'              => array(
854
-                        'object',
855
-                        'string',
856
-                    ),
857
-                    // because we accept  an almost infinite list of possible groupings,
858
-                    // WP core validation and sanitization
859
-                    // freaks out. We'll just validate this argument while handling the request
860
-                    'validate_callback' => null,
861
-                    'sanitize_callback' => null,
862
-                ),
863
-                'having'   => array(
864
-                    'required'          => false,
865
-                    'default'           => null,
866
-                    'type'              => 'object',
867
-                    // because we accept an almost infinite list of possible where conditions, WP
868
-                    // core validation and sanitization freaks out. We'll just validate this argument
869
-                    // while handling the request
870
-                    'validate_callback' => null,
871
-                    'sanitize_callback' => null,
872
-                ),
873
-                'caps'     => array(
874
-                    'required' => false,
875
-                    'default'  => EEM_Base::caps_read,
876
-                    'type'     => 'string',
877
-                    'enum'     => array(
878
-                        EEM_Base::caps_read,
879
-                        EEM_Base::caps_read_admin,
880
-                        EEM_Base::caps_edit,
881
-                        EEM_Base::caps_delete,
882
-                    ),
883
-                ),
884
-            )
885
-        );
886
-    }
887
-
888
-
889
-    /**
890
-     * Gets parameter information for a model regarding writing data
891
-     *
892
-     * @param string           $model_name
893
-     * @param ModelVersionInfo $model_version_info
894
-     * @param boolean          $create                                       whether this is for request to create (in
895
-     *                                                                       which case we need all required params) or
896
-     *                                                                       just to update (in which case we don't
897
-     *                                                                       need those on every request)
898
-     * @return array
899
-     */
900
-    protected function _get_write_params(
901
-        $model_name,
902
-        ModelVersionInfo $model_version_info,
903
-        $create = false
904
-    ) {
905
-        $model = EE_Registry::instance()->load_model($model_name);
906
-        $fields = $model_version_info->fieldsOnModelInThisVersion($model);
907
-        $args_info = array();
908
-        foreach ($fields as $field_name => $field_obj) {
909
-            if ($field_obj->is_auto_increment()) {
910
-                // totally ignore auto increment IDs
911
-                continue;
912
-            }
913
-            $arg_info = $field_obj->getSchema();
914
-            $required = $create && ! $field_obj->is_nullable() && $field_obj->get_default_value() === null;
915
-            $arg_info['required'] = $required;
916
-            // remove the read-only flag. If it were read-only we wouldn't list it as an argument while writing, right?
917
-            unset($arg_info['readonly']);
918
-            $schema_properties = $field_obj->getSchemaProperties();
919
-            if (
920
-                isset($schema_properties['raw'])
921
-                && $field_obj->getSchemaType() === 'object'
922
-            ) {
923
-                // if there's a "raw" form of this argument, use those properties instead
924
-                $arg_info = array_replace(
925
-                    $arg_info,
926
-                    $schema_properties['raw']
927
-                );
928
-            }
929
-            $arg_info['default'] = ModelDataTranslator::prepareFieldValueForJson(
930
-                $field_obj,
931
-                $field_obj->get_default_value(),
932
-                $model_version_info->requestedVersion()
933
-            );
934
-            // we do our own validation and sanitization within the controller
935
-            if (function_exists('rest_validate_value_from_schema')) {
936
-                $sanitize_callback = array(
937
-                    'EED_Core_Rest_Api',
938
-                    'default_sanitize_callback',
939
-                );
940
-            } else {
941
-                $sanitize_callback = null;
942
-            }
943
-            $arg_info['sanitize_callback'] = $sanitize_callback;
944
-            $args_info[ $field_name ] = $arg_info;
945
-            if ($field_obj instanceof EE_Datetime_Field) {
946
-                $gmt_arg_info = $arg_info;
947
-                $gmt_arg_info['description'] = sprintf(
948
-                    esc_html__(
949
-                        '%1$s - the value for this field in UTC. Ignored if %2$s is provided.',
950
-                        'event_espresso'
951
-                    ),
952
-                    $field_obj->get_nicename(),
953
-                    $field_name
954
-                );
955
-                $args_info[ $field_name . '_gmt' ] = $gmt_arg_info;
956
-            }
957
-        }
958
-        return $args_info;
959
-    }
960
-
961
-
962
-    /**
963
-     * Replacement for WP API's 'rest_parse_request_arg'.
964
-     * If the value is blank but not required, don't bother validating it.
965
-     * Also, it uses our email validation instead of WP API's default.
966
-     *
967
-     * @param                 $value
968
-     * @param WP_REST_Request $request
969
-     * @param                 $param
970
-     * @return bool|true|WP_Error
971
-     * @throws InvalidArgumentException
972
-     * @throws InvalidInterfaceException
973
-     * @throws InvalidDataTypeException
974
-     */
975
-    public static function default_sanitize_callback($value, WP_REST_Request $request, $param)
976
-    {
977
-        $attributes = $request->get_attributes();
978
-        if (
979
-            ! isset($attributes['args'][ $param ])
980
-            || ! is_array($attributes['args'][ $param ])
981
-        ) {
982
-            $validation_result = true;
983
-        } else {
984
-            $args = $attributes['args'][ $param ];
985
-            if (
986
-                (
987
-                    $value === ''
988
-                    || $value === null
989
-                )
990
-                && (! isset($args['required'])
991
-                    || $args['required'] === false
992
-                )
993
-            ) {
994
-                // not required and not provided? that's cool
995
-                $validation_result = true;
996
-            } elseif (
997
-                isset($args['format'])
998
-                      && $args['format'] === 'email'
999
-            ) {
1000
-                $validation_result = true;
1001
-                if (! self::_validate_email($value)) {
1002
-                    $validation_result = new WP_Error(
1003
-                        'rest_invalid_param',
1004
-                        esc_html__(
1005
-                            'The email address is not valid or does not exist.',
1006
-                            'event_espresso'
1007
-                        )
1008
-                    );
1009
-                }
1010
-            } else {
1011
-                $validation_result = rest_validate_value_from_schema($value, $args, $param);
1012
-            }
1013
-        }
1014
-        if (is_wp_error($validation_result)) {
1015
-            return $validation_result;
1016
-        }
1017
-        return rest_sanitize_request_arg($value, $request, $param);
1018
-    }
1019
-
1020
-
1021
-    /**
1022
-     * Returns whether or not this email address is valid. Copied from EE_Email_Validation_Strategy::_validate_email()
1023
-     *
1024
-     * @param $email
1025
-     * @return bool
1026
-     * @throws InvalidArgumentException
1027
-     * @throws InvalidInterfaceException
1028
-     * @throws InvalidDataTypeException
1029
-     */
1030
-    protected static function _validate_email($email)
1031
-    {
1032
-        try {
1033
-            EmailAddressFactory::create($email);
1034
-            return true;
1035
-        } catch (EmailValidationException $e) {
1036
-            return false;
1037
-        }
1038
-    }
1039
-
1040
-
1041
-    /**
1042
-     * Gets routes for the config
1043
-     *
1044
-     * @return array @see _register_model_routes
1045
-     * @deprecated since version 4.9.1
1046
-     */
1047
-    protected function _register_config_routes()
1048
-    {
1049
-        $config_routes = array();
1050
-        foreach (self::versions_served() as $version => $hidden_endpoint) {
1051
-            $config_routes[ self::ee_api_namespace . $version ] = $this->_get_config_route_data_for_version(
1052
-                $version,
1053
-                $hidden_endpoint
1054
-            );
1055
-        }
1056
-        return $config_routes;
1057
-    }
1058
-
1059
-
1060
-    /**
1061
-     * Gets routes for the config for the specified version
1062
-     *
1063
-     * @param string  $version
1064
-     * @param boolean $hidden_endpoint
1065
-     * @return array
1066
-     */
1067
-    protected function _get_config_route_data_for_version($version, $hidden_endpoint)
1068
-    {
1069
-        return array(
1070
-            'config'    => array(
1071
-                array(
1072
-                    'callback'        => array(
1073
-                        'EventEspresso\core\libraries\rest_api\controllers\config\Read',
1074
-                        'handleRequest',
1075
-                    ),
1076
-                    'methods'         => WP_REST_Server::READABLE,
1077
-                    'hidden_endpoint' => $hidden_endpoint,
1078
-                    'callback_args'   => array($version),
1079
-                ),
1080
-            ),
1081
-            'site_info' => array(
1082
-                array(
1083
-                    'callback'        => array(
1084
-                        'EventEspresso\core\libraries\rest_api\controllers\config\Read',
1085
-                        'handleRequestSiteInfo',
1086
-                    ),
1087
-                    'methods'         => WP_REST_Server::READABLE,
1088
-                    'hidden_endpoint' => $hidden_endpoint,
1089
-                    'callback_args'   => array($version),
1090
-                ),
1091
-            ),
1092
-        );
1093
-    }
1094
-
1095
-
1096
-    /**
1097
-     * Gets the meta info routes
1098
-     *
1099
-     * @return array @see _register_model_routes
1100
-     * @deprecated since version 4.9.1
1101
-     */
1102
-    protected function _register_meta_routes()
1103
-    {
1104
-        $meta_routes = array();
1105
-        foreach (self::versions_served() as $version => $hidden_endpoint) {
1106
-            $meta_routes[ self::ee_api_namespace . $version ] = $this->_get_meta_route_data_for_version(
1107
-                $version,
1108
-                $hidden_endpoint
1109
-            );
1110
-        }
1111
-        return $meta_routes;
1112
-    }
1113
-
1114
-
1115
-    /**
1116
-     * @param string  $version
1117
-     * @param boolean $hidden_endpoint
1118
-     * @return array
1119
-     */
1120
-    protected function _get_meta_route_data_for_version($version, $hidden_endpoint = false)
1121
-    {
1122
-        return array(
1123
-            'resources' => array(
1124
-                array(
1125
-                    'callback'        => array(
1126
-                        'EventEspresso\core\libraries\rest_api\controllers\model\Meta',
1127
-                        'handleRequestModelsMeta',
1128
-                    ),
1129
-                    'methods'         => WP_REST_Server::READABLE,
1130
-                    'hidden_endpoint' => $hidden_endpoint,
1131
-                    'callback_args'   => array($version),
1132
-                ),
1133
-            ),
1134
-        );
1135
-    }
1136
-
1137
-
1138
-    /**
1139
-     * Tries to hide old 4.6 endpoints from the
1140
-     *
1141
-     * @param array $route_data
1142
-     * @return array
1143
-     * @throws \EE_Error
1144
-     */
1145
-    public static function hide_old_endpoints($route_data)
1146
-    {
1147
-        // allow API clients to override which endpoints get hidden, in case
1148
-        // they want to discover particular endpoints
1149
-        // also, we don't have access to the request so we have to just grab it from the superglobal
1150
-        $force_show_ee_namespace = ltrim(
1151
-            EED_Core_Rest_Api::getRequest()->getRequestParam('force_show_ee_namespace'),
1152
-            '/'
1153
-        );
1154
-        foreach (EED_Core_Rest_Api::get_ee_route_data() as $namespace => $relative_urls) {
1155
-            foreach ($relative_urls as $resource_name => $endpoints) {
1156
-                foreach ($endpoints as $key => $endpoint) {
1157
-                    // skip schema and other route options
1158
-                    if (! is_numeric($key)) {
1159
-                        continue;
1160
-                    }
1161
-                    // by default, hide "hidden_endpoint"s, unless the request indicates
1162
-                    // to $force_show_ee_namespace, in which case only show that one
1163
-                    // namespace's endpoints (and hide all others)
1164
-                    if (
1165
-                        ($force_show_ee_namespace !== '' && $force_show_ee_namespace !== $namespace)
1166
-                        || ($endpoint['hidden_endpoint'] && $force_show_ee_namespace === '')
1167
-                    ) {
1168
-                        $full_route = '/' . ltrim($namespace, '/');
1169
-                        $full_route .= '/' . ltrim($resource_name, '/');
1170
-                        unset($route_data[ $full_route ]);
1171
-                    }
1172
-                }
1173
-            }
1174
-        }
1175
-        return $route_data;
1176
-    }
1177
-
1178
-
1179
-    /**
1180
-     * Returns an array describing which versions of core support serving requests for.
1181
-     * Keys are core versions' major and minor version, and values are the
1182
-     * LOWEST requested version they can serve. Eg, 4.7 can serve requests for 4.6-like
1183
-     * data by just removing a few models and fields from the responses. However, 4.15 might remove
1184
-     * the answers table entirely, in which case it would be very difficult for
1185
-     * it to serve 4.6-style responses.
1186
-     * Versions of core that are missing from this array are unknowns.
1187
-     * previous ver
1188
-     *
1189
-     * @return array
1190
-     */
1191
-    public static function version_compatibilities()
1192
-    {
1193
-        return apply_filters(
1194
-            'FHEE__EED_Core_REST_API__version_compatibilities',
1195
-            array(
1196
-                '4.8.29' => '4.8.29',
1197
-                '4.8.33' => '4.8.29',
1198
-                '4.8.34' => '4.8.29',
1199
-                '4.8.36' => '4.8.29',
1200
-            )
1201
-        );
1202
-    }
1203
-
1204
-
1205
-    /**
1206
-     * Gets the latest API version served. Eg if there
1207
-     * are two versions served of the API, 4.8.29 and 4.8.32, and
1208
-     * we are on core version 4.8.34, it will return the string "4.8.32"
1209
-     *
1210
-     * @return string
1211
-     */
1212
-    public static function latest_rest_api_version()
1213
-    {
1214
-        $versions_served = \EED_Core_Rest_Api::versions_served();
1215
-        $versions_served_keys = array_keys($versions_served);
1216
-        return end($versions_served_keys);
1217
-    }
1218
-
1219
-
1220
-    /**
1221
-     * Using EED_Core_Rest_Api::version_compatibilities(), determines what version of
1222
-     * EE the API can serve requests for. Eg, if we are on 4.15 of core, and
1223
-     * we can serve requests from 4.12 or later, this will return array( '4.12', '4.13', '4.14', '4.15' ).
1224
-     * We also indicate whether or not this version should be put in the index or not
1225
-     *
1226
-     * @return array keys are API version numbers (just major and minor numbers), and values
1227
-     * are whether or not they should be hidden
1228
-     */
1229
-    public static function versions_served()
1230
-    {
1231
-        $versions_served = array();
1232
-        $possibly_served_versions = EED_Core_Rest_Api::version_compatibilities();
1233
-        $lowest_compatible_version = end($possibly_served_versions);
1234
-        reset($possibly_served_versions);
1235
-        $versions_served_historically = array_keys($possibly_served_versions);
1236
-        $latest_version = end($versions_served_historically);
1237
-        reset($versions_served_historically);
1238
-        // for each version of core we have ever served:
1239
-        foreach ($versions_served_historically as $key_versioned_endpoint) {
1240
-            // if it's not above the current core version, and it's compatible with the current version of core
1241
-
1242
-            if ($key_versioned_endpoint === $latest_version) {
1243
-                // don't hide the latest version in the index
1244
-                $versions_served[ $key_versioned_endpoint ] = false;
1245
-            } elseif (
1246
-                version_compare($key_versioned_endpoint, $lowest_compatible_version, '>=')
1247
-                && version_compare($key_versioned_endpoint, EED_Core_Rest_Api::core_version(), '<')
1248
-            ) {
1249
-                // include, but hide, previous versions which are still supported
1250
-                $versions_served[ $key_versioned_endpoint ] = true;
1251
-            } elseif (
1252
-                apply_filters(
1253
-                    'FHEE__EED_Core_Rest_Api__versions_served__include_incompatible_versions',
1254
-                    false,
1255
-                    $possibly_served_versions
1256
-                )
1257
-            ) {
1258
-                // if a version is no longer supported, don't include it in index or list of versions served
1259
-                $versions_served[ $key_versioned_endpoint ] = true;
1260
-            }
1261
-        }
1262
-        return $versions_served;
1263
-    }
1264
-
1265
-
1266
-    /**
1267
-     * Gets the major and minor version of EE core's version string
1268
-     *
1269
-     * @return string
1270
-     */
1271
-    public static function core_version()
1272
-    {
1273
-        return apply_filters(
1274
-            'FHEE__EED_Core_REST_API__core_version',
1275
-            implode(
1276
-                '.',
1277
-                array_slice(
1278
-                    explode(
1279
-                        '.',
1280
-                        espresso_version()
1281
-                    ),
1282
-                    0,
1283
-                    3
1284
-                )
1285
-            )
1286
-        );
1287
-    }
1288
-
1289
-
1290
-    /**
1291
-     * Gets the default limit that should be used when querying for resources
1292
-     *
1293
-     * @return int
1294
-     */
1295
-    public static function get_default_query_limit()
1296
-    {
1297
-        // we actually don't use a const because we want folks to always use
1298
-        // this method, not the const directly
1299
-        return apply_filters(
1300
-            'FHEE__EED_Core_Rest_Api__get_default_query_limit',
1301
-            50
1302
-        );
1303
-    }
1304
-
1305
-
1306
-    /**
1307
-     *
1308
-     * @param string $version api version string (i.e. '4.8.36')
1309
-     * @return array
1310
-     */
1311
-    public static function getCollectionRoutesIndexedByModelName($version = '')
1312
-    {
1313
-        $version = empty($version) ? self::latest_rest_api_version() : $version;
1314
-        $model_names = self::model_names_with_plural_routes($version);
1315
-        $collection_routes = array();
1316
-        foreach ($model_names as $model_name => $model_class_name) {
1317
-            $collection_routes[ strtolower($model_name) ] = '/' . self::ee_api_namespace . $version . '/'
1318
-                                                            . EEH_Inflector::pluralize_and_lower($model_name);
1319
-        }
1320
-        return $collection_routes;
1321
-    }
1322
-
1323
-
1324
-    /**
1325
-     * Returns an array of primary key names indexed by model names.
1326
-     * @param string $version
1327
-     * @return array
1328
-     */
1329
-    public static function getPrimaryKeyNamesIndexedByModelName($version = '')
1330
-    {
1331
-        $version = empty($version) ? self::latest_rest_api_version() : $version;
1332
-        $model_names = self::model_names_with_plural_routes($version);
1333
-        $primary_key_items = array();
1334
-        foreach ($model_names as $model_name => $model_class_name) {
1335
-            $primary_keys = $model_class_name::instance()->get_combined_primary_key_fields();
1336
-            foreach ($primary_keys as $primary_key_name => $primary_key_field) {
1337
-                if (count($primary_keys) > 1) {
1338
-                    $primary_key_items[ strtolower($model_name) ][] = $primary_key_name;
1339
-                } else {
1340
-                    $primary_key_items[ strtolower($model_name) ] = $primary_key_name;
1341
-                }
1342
-            }
1343
-        }
1344
-        return $primary_key_items;
1345
-    }
1346
-
1347
-    /**
1348
-     * Determines the EE REST API debug mode is activated, or not.
1349
-     * @since 4.9.76.p
1350
-     * @return bool
1351
-     */
1352
-    public static function debugMode()
1353
-    {
1354
-        static $debug_mode = null; // could be class prop
1355
-        if ($debug_mode === null) {
1356
-            $debug_mode = defined('EE_REST_API_DEBUG_MODE') && EE_REST_API_DEBUG_MODE;
1357
-        }
1358
-        return $debug_mode;
1359
-    }
1360
-
1361
-
1362
-
1363
-    /**
1364
-     *    run - initial module setup
1365
-     *
1366
-     * @access    public
1367
-     * @param  WP $WP
1368
-     * @return    void
1369
-     */
1370
-    public function run($WP)
1371
-    {
1372
-    }
25
+	const ee_api_namespace = Domain::API_NAMESPACE;
26
+
27
+	const ee_api_namespace_for_regex = 'ee\/v([^/]*)\/';
28
+
29
+	const saved_routes_option_names = 'ee_core_routes';
30
+
31
+	/**
32
+	 * string used in _links response bodies to make them globally unique.
33
+	 *
34
+	 * @see http://v2.wp-api.org/extending/linking/
35
+	 */
36
+	const ee_api_link_namespace = 'https://api.eventespresso.com/';
37
+
38
+	/**
39
+	 * @var CalculatedModelFields
40
+	 */
41
+	protected static $_field_calculator;
42
+
43
+
44
+	/**
45
+	 * @return EED_Core_Rest_Api|EED_Module
46
+	 */
47
+	public static function instance()
48
+	{
49
+		self::$_field_calculator = LoaderFactory::getLoader()->load('EventEspresso\core\libraries\rest_api\CalculatedModelFields');
50
+		return parent::get_instance(__CLASS__);
51
+	}
52
+
53
+
54
+	/**
55
+	 *    set_hooks - for hooking into EE Core, other modules, etc
56
+	 *
57
+	 * @access    public
58
+	 * @return    void
59
+	 */
60
+	public static function set_hooks()
61
+	{
62
+		self::set_hooks_both();
63
+	}
64
+
65
+
66
+	/**
67
+	 *    set_hooks_admin - for hooking into EE Admin Core, other modules, etc
68
+	 *
69
+	 * @access    public
70
+	 * @return    void
71
+	 */
72
+	public static function set_hooks_admin()
73
+	{
74
+		self::set_hooks_both();
75
+	}
76
+
77
+
78
+	public static function set_hooks_both()
79
+	{
80
+		add_action('rest_api_init', array('EED_Core_Rest_Api', 'set_hooks_rest_api'), 5);
81
+		add_action('rest_api_init', array('EED_Core_Rest_Api', 'register_routes'), 10);
82
+		add_filter('rest_route_data', array('EED_Core_Rest_Api', 'hide_old_endpoints'), 10, 2);
83
+		add_filter(
84
+			'rest_index',
85
+			array('EventEspresso\core\libraries\rest_api\controllers\model\Meta', 'filterEeMetadataIntoIndex')
86
+		);
87
+		EED_Core_Rest_Api::invalidate_cached_route_data_on_version_change();
88
+	}
89
+
90
+
91
+	/**
92
+	 * sets up hooks which only need to be included as part of REST API requests;
93
+	 * other requests like to the frontend or admin etc don't need them
94
+	 *
95
+	 * @throws \EE_Error
96
+	 */
97
+	public static function set_hooks_rest_api()
98
+	{
99
+		// set hooks which account for changes made to the API
100
+		EED_Core_Rest_Api::_set_hooks_for_changes();
101
+	}
102
+
103
+
104
+	/**
105
+	 * public wrapper of _set_hooks_for_changes.
106
+	 * Loads all the hooks which make requests to old versions of the API
107
+	 * appear the same as they always did
108
+	 *
109
+	 * @throws EE_Error
110
+	 */
111
+	public static function set_hooks_for_changes()
112
+	{
113
+		self::_set_hooks_for_changes();
114
+	}
115
+
116
+
117
+	/**
118
+	 * Loads all the hooks which make requests to old versions of the API
119
+	 * appear the same as they always did
120
+	 *
121
+	 * @throws EE_Error
122
+	 */
123
+	protected static function _set_hooks_for_changes()
124
+	{
125
+		$folder_contents = EEH_File::get_contents_of_folders(array(EE_LIBRARIES . 'rest_api/changes'), false);
126
+		foreach ($folder_contents as $classname_in_namespace => $filepath) {
127
+			// ignore the base parent class
128
+			// and legacy named classes
129
+			if (
130
+				$classname_in_namespace === 'ChangesInBase'
131
+				|| strpos($classname_in_namespace, 'Changes_In_') === 0
132
+			) {
133
+				continue;
134
+			}
135
+			$full_classname = 'EventEspresso\core\libraries\rest_api\changes\\' . $classname_in_namespace;
136
+			if (class_exists($full_classname)) {
137
+				$instance_of_class = new $full_classname();
138
+				if ($instance_of_class instanceof ChangesInBase) {
139
+					$instance_of_class->setHooks();
140
+				}
141
+			}
142
+		}
143
+	}
144
+
145
+
146
+	/**
147
+	 * Filters the WP routes to add our EE-related ones. This takes a bit of time
148
+	 * so we actually prefer to only do it when an EE plugin is activated or upgraded
149
+	 *
150
+	 * @throws \EE_Error
151
+	 */
152
+	public static function register_routes()
153
+	{
154
+		foreach (EED_Core_Rest_Api::get_ee_route_data() as $namespace => $relative_routes) {
155
+			foreach ($relative_routes as $relative_route => $data_for_multiple_endpoints) {
156
+				/**
157
+				 * @var array     $data_for_multiple_endpoints numerically indexed array
158
+				 *                                         but can also contain route options like {
159
+				 * @type array    $schema                      {
160
+				 * @type callable $schema_callback
161
+				 * @type array    $callback_args               arguments that will be passed to the callback, after the
162
+				 * WP_REST_Request of course
163
+				 * }
164
+				 * }
165
+				 */
166
+				// when registering routes, register all the endpoints' data at the same time
167
+				$multiple_endpoint_args = array();
168
+				foreach ($data_for_multiple_endpoints as $endpoint_key => $data_for_single_endpoint) {
169
+					/**
170
+					 * @var array     $data_for_single_endpoint {
171
+					 * @type callable $callback
172
+					 * @type string methods
173
+					 * @type array args
174
+					 * @type array _links
175
+					 * @type array    $callback_args            arguments that will be passed to the callback, after the
176
+					 * WP_REST_Request of course
177
+					 * }
178
+					 */
179
+					// skip route options
180
+					if (! is_numeric($endpoint_key)) {
181
+						continue;
182
+					}
183
+					if (! isset($data_for_single_endpoint['callback'], $data_for_single_endpoint['methods'])) {
184
+						throw new EE_Error(
185
+							esc_html__(
186
+							// @codingStandardsIgnoreStart
187
+								'Endpoint configuration data needs to have entries "callback" (callable) and "methods" (comma-separated list of accepts HTTP methods).',
188
+								// @codingStandardsIgnoreEnd
189
+								'event_espresso'
190
+							)
191
+						);
192
+					}
193
+					$callback = $data_for_single_endpoint['callback'];
194
+					$single_endpoint_args = array(
195
+						'methods' => $data_for_single_endpoint['methods'],
196
+						'args'    => isset($data_for_single_endpoint['args']) ? $data_for_single_endpoint['args']
197
+							: array(),
198
+					);
199
+					if (isset($data_for_single_endpoint['_links'])) {
200
+						$single_endpoint_args['_links'] = $data_for_single_endpoint['_links'];
201
+					}
202
+					if (isset($data_for_single_endpoint['callback_args'])) {
203
+						$callback_args = $data_for_single_endpoint['callback_args'];
204
+						$single_endpoint_args['callback'] = function (\WP_REST_Request $request) use (
205
+							$callback,
206
+							$callback_args
207
+						) {
208
+							array_unshift($callback_args, $request);
209
+							return call_user_func_array(
210
+								$callback,
211
+								$callback_args
212
+							);
213
+						};
214
+					} else {
215
+						$single_endpoint_args['callback'] = $data_for_single_endpoint['callback'];
216
+					}
217
+					// As of WordPress 5.5, if a permission_callback is not provided,
218
+					// the REST API will issue a _doing_it_wrong notice.
219
+					// Since the EE REST API defers capabilities to the db model system,
220
+					// we will just use the generic WP callback for public endpoints
221
+					if (! isset($single_endpoint_args['permission_callback'])) {
222
+						$single_endpoint_args['permission_callback'] = '__return_true';
223
+					}
224
+					$multiple_endpoint_args[] = $single_endpoint_args;
225
+				}
226
+				if (isset($data_for_multiple_endpoints['schema'])) {
227
+					$schema_route_data = $data_for_multiple_endpoints['schema'];
228
+					$schema_callback = $schema_route_data['schema_callback'];
229
+					$callback_args = $schema_route_data['callback_args'];
230
+					$multiple_endpoint_args['schema'] = function () use ($schema_callback, $callback_args) {
231
+						return call_user_func_array(
232
+							$schema_callback,
233
+							$callback_args
234
+						);
235
+					};
236
+				}
237
+				register_rest_route(
238
+					$namespace,
239
+					$relative_route,
240
+					$multiple_endpoint_args
241
+				);
242
+			}
243
+		}
244
+	}
245
+
246
+
247
+	/**
248
+	 * Checks if there was a version change or something that merits invalidating the cached
249
+	 * route data. If so, invalidates the cached route data so that it gets refreshed
250
+	 * next time the WP API is used
251
+	 */
252
+	public static function invalidate_cached_route_data_on_version_change()
253
+	{
254
+		if (EE_System::instance()->detect_req_type() !== EE_System::req_type_normal) {
255
+			EED_Core_Rest_Api::invalidate_cached_route_data();
256
+		}
257
+		foreach (EE_Registry::instance()->addons as $addon) {
258
+			if ($addon instanceof EE_Addon && $addon->detect_req_type() !== EE_System::req_type_normal) {
259
+				EED_Core_Rest_Api::invalidate_cached_route_data();
260
+			}
261
+		}
262
+	}
263
+
264
+
265
+	/**
266
+	 * Removes the cached route data so it will get refreshed next time the WP API is used
267
+	 */
268
+	public static function invalidate_cached_route_data()
269
+	{
270
+		// delete the saved EE REST API routes
271
+		foreach (EED_Core_Rest_Api::versions_served() as $version => $hidden) {
272
+			delete_option(EED_Core_Rest_Api::saved_routes_option_names . $version);
273
+		}
274
+	}
275
+
276
+
277
+	/**
278
+	 * Gets the EE route data
279
+	 *
280
+	 * @return array top-level key is the namespace, next-level key is the route and its value is array{
281
+	 * @throws \EE_Error
282
+	 * @type string|array $callback
283
+	 * @type string       $methods
284
+	 * @type boolean      $hidden_endpoint
285
+	 * }
286
+	 */
287
+	public static function get_ee_route_data()
288
+	{
289
+		$ee_routes = array();
290
+		foreach (self::versions_served() as $version => $hidden_endpoints) {
291
+			$ee_routes[ self::ee_api_namespace . $version ] = self::_get_ee_route_data_for_version(
292
+				$version,
293
+				$hidden_endpoints
294
+			);
295
+		}
296
+		return $ee_routes;
297
+	}
298
+
299
+
300
+	/**
301
+	 * Gets the EE route data from the wp options if it exists already,
302
+	 * otherwise re-generates it and saves it to the option
303
+	 *
304
+	 * @param string  $version
305
+	 * @param boolean $hidden_endpoints
306
+	 * @return array
307
+	 * @throws \EE_Error
308
+	 */
309
+	protected static function _get_ee_route_data_for_version($version, $hidden_endpoints = false)
310
+	{
311
+		$ee_routes = get_option(self::saved_routes_option_names . $version, null);
312
+		if (! $ee_routes || EED_Core_Rest_Api::debugMode()) {
313
+			$ee_routes = self::_save_ee_route_data_for_version($version, $hidden_endpoints);
314
+		}
315
+		return $ee_routes;
316
+	}
317
+
318
+
319
+	/**
320
+	 * Saves the EE REST API route data to a wp option and returns it
321
+	 *
322
+	 * @param string  $version
323
+	 * @param boolean $hidden_endpoints
324
+	 * @return mixed|null
325
+	 * @throws \EE_Error
326
+	 */
327
+	protected static function _save_ee_route_data_for_version($version, $hidden_endpoints = false)
328
+	{
329
+		$instance = self::instance();
330
+		$routes = apply_filters(
331
+			'EED_Core_Rest_Api__save_ee_route_data_for_version__routes',
332
+			array_replace_recursive(
333
+				$instance->_get_config_route_data_for_version($version, $hidden_endpoints),
334
+				$instance->_get_meta_route_data_for_version($version, $hidden_endpoints),
335
+				$instance->_get_model_route_data_for_version($version, $hidden_endpoints),
336
+				$instance->_get_rpc_route_data_for_version($version, $hidden_endpoints)
337
+			)
338
+		);
339
+		$option_name = self::saved_routes_option_names . $version;
340
+		if (get_option($option_name)) {
341
+			update_option($option_name, $routes, true);
342
+		} else {
343
+			add_option($option_name, $routes, null, 'no');
344
+		}
345
+		return $routes;
346
+	}
347
+
348
+
349
+	/**
350
+	 * Calculates all the EE routes and saves it to a WordPress option so we don't
351
+	 * need to calculate it on every request
352
+	 *
353
+	 * @deprecated since version 4.9.1
354
+	 * @return void
355
+	 */
356
+	public static function save_ee_routes()
357
+	{
358
+		if (EE_Maintenance_Mode::instance()->models_can_query()) {
359
+			$instance = self::instance();
360
+			$routes = apply_filters(
361
+				'EED_Core_Rest_Api__save_ee_routes__routes',
362
+				array_replace_recursive(
363
+					$instance->_register_config_routes(),
364
+					$instance->_register_meta_routes(),
365
+					$instance->_register_model_routes(),
366
+					$instance->_register_rpc_routes()
367
+				)
368
+			);
369
+			update_option(self::saved_routes_option_names, $routes, true);
370
+		}
371
+	}
372
+
373
+
374
+	/**
375
+	 * Gets all the route information relating to EE models
376
+	 *
377
+	 * @return array @see get_ee_route_data
378
+	 * @deprecated since version 4.9.1
379
+	 */
380
+	protected function _register_model_routes()
381
+	{
382
+		$model_routes = array();
383
+		foreach (self::versions_served() as $version => $hidden_endpoint) {
384
+			$model_routes[ EED_Core_Rest_Api::ee_api_namespace
385
+						   . $version ] = $this->_get_config_route_data_for_version($version, $hidden_endpoint);
386
+		}
387
+		return $model_routes;
388
+	}
389
+
390
+
391
+	/**
392
+	 * Decides whether or not to add write endpoints for this model.
393
+	 *
394
+	 * Currently, this defaults to exclude all global tables and models
395
+	 * which would allow inserting WP core data (we don't want to duplicate
396
+	 * what WP API does, as it's unnecessary, extra work, and potentially extra bugs)
397
+	 *
398
+	 * @param EEM_Base $model
399
+	 * @return bool
400
+	 */
401
+	public static function should_have_write_endpoints(EEM_Base $model)
402
+	{
403
+		if ($model->is_wp_core_model()) {
404
+			return false;
405
+		}
406
+		foreach ($model->get_tables() as $table) {
407
+			if ($table->is_global()) {
408
+				return false;
409
+			}
410
+		}
411
+		return true;
412
+	}
413
+
414
+
415
+	/**
416
+	 * Gets the names of all models which should have plural routes (eg `ee/v4.8.36/events`)
417
+	 * in this versioned namespace of EE4
418
+	 *
419
+	 * @param $version
420
+	 * @return array keys are model names (eg 'Event') and values ar either classnames (eg 'EEM_Event')
421
+	 */
422
+	public static function model_names_with_plural_routes($version)
423
+	{
424
+		$model_version_info = new ModelVersionInfo($version);
425
+		$models_to_register = $model_version_info->modelsForRequestedVersion();
426
+		// let's not bother having endpoints for extra metas
427
+		unset(
428
+			$models_to_register['Extra_Meta'],
429
+			$models_to_register['Extra_Join'],
430
+			$models_to_register['Post_Meta']
431
+		);
432
+		return apply_filters(
433
+			'FHEE__EED_Core_REST_API___register_model_routes',
434
+			$models_to_register
435
+		);
436
+	}
437
+
438
+
439
+	/**
440
+	 * Gets the route data for EE models in the specified version
441
+	 *
442
+	 * @param string  $version
443
+	 * @param boolean $hidden_endpoint
444
+	 * @return array
445
+	 * @throws EE_Error
446
+	 */
447
+	protected function _get_model_route_data_for_version($version, $hidden_endpoint = false)
448
+	{
449
+		$model_routes = array();
450
+		$model_version_info = new ModelVersionInfo($version);
451
+		foreach (EED_Core_Rest_Api::model_names_with_plural_routes($version) as $model_name => $model_classname) {
452
+			$model = \EE_Registry::instance()->load_model($model_name);
453
+			// if this isn't a valid model then let's skip iterate to the next item in the loop.
454
+			if (! $model instanceof EEM_Base) {
455
+				continue;
456
+			}
457
+			// yes we could just register one route for ALL models, but then they wouldn't show up in the index
458
+			$plural_model_route = EED_Core_Rest_Api::get_collection_route($model);
459
+			$singular_model_route = EED_Core_Rest_Api::get_entity_route($model, '(?P<id>[^\/]+)');
460
+			$model_routes[ $plural_model_route ] = array(
461
+				array(
462
+					'callback'        => array(
463
+						'EventEspresso\core\libraries\rest_api\controllers\model\Read',
464
+						'handleRequestGetAll',
465
+					),
466
+					'callback_args'   => array($version, $model_name),
467
+					'methods'         => WP_REST_Server::READABLE,
468
+					'hidden_endpoint' => $hidden_endpoint,
469
+					'args'            => $this->_get_read_query_params($model, $version),
470
+					'_links'          => array(
471
+						'self' => rest_url(EED_Core_Rest_Api::ee_api_namespace . $version . $singular_model_route),
472
+					),
473
+				),
474
+				'schema' => array(
475
+					'schema_callback' => array(
476
+						'EventEspresso\core\libraries\rest_api\controllers\model\Read',
477
+						'handleSchemaRequest',
478
+					),
479
+					'callback_args'   => array($version, $model_name),
480
+				),
481
+			);
482
+			$model_routes[ $singular_model_route ] = array(
483
+				array(
484
+					'callback'        => array(
485
+						'EventEspresso\core\libraries\rest_api\controllers\model\Read',
486
+						'handleRequestGetOne',
487
+					),
488
+					'callback_args'   => array($version, $model_name),
489
+					'methods'         => WP_REST_Server::READABLE,
490
+					'hidden_endpoint' => $hidden_endpoint,
491
+					'args'            => $this->_get_response_selection_query_params($model, $version, true),
492
+				),
493
+			);
494
+			if (
495
+				apply_filters(
496
+					'FHEE__EED_Core_Rest_Api___get_model_route_data_for_version__add_write_endpoints',
497
+					EED_Core_Rest_Api::should_have_write_endpoints($model),
498
+					$model
499
+				)
500
+			) {
501
+				$model_routes[ $plural_model_route ][] = array(
502
+					'callback'        => array(
503
+						'EventEspresso\core\libraries\rest_api\controllers\model\Write',
504
+						'handleRequestInsert',
505
+					),
506
+					'callback_args'   => array($version, $model_name),
507
+					'methods'         => WP_REST_Server::CREATABLE,
508
+					'hidden_endpoint' => $hidden_endpoint,
509
+					'args'            => $this->_get_write_params($model_name, $model_version_info, true),
510
+				);
511
+				$model_routes[ $singular_model_route ] = array_merge(
512
+					$model_routes[ $singular_model_route ],
513
+					array(
514
+						array(
515
+							'callback'        => array(
516
+								'EventEspresso\core\libraries\rest_api\controllers\model\Write',
517
+								'handleRequestUpdate',
518
+							),
519
+							'callback_args'   => array($version, $model_name),
520
+							'methods'         => WP_REST_Server::EDITABLE,
521
+							'hidden_endpoint' => $hidden_endpoint,
522
+							'args'            => $this->_get_write_params($model_name, $model_version_info),
523
+						),
524
+						array(
525
+							'callback'        => array(
526
+								'EventEspresso\core\libraries\rest_api\controllers\model\Write',
527
+								'handleRequestDelete',
528
+							),
529
+							'callback_args'   => array($version, $model_name),
530
+							'methods'         => WP_REST_Server::DELETABLE,
531
+							'hidden_endpoint' => $hidden_endpoint,
532
+							'args'            => $this->_get_delete_query_params($model, $version),
533
+						),
534
+					)
535
+				);
536
+			}
537
+			foreach ($model->relation_settings() as $relation_name => $relation_obj) {
538
+				$related_route = EED_Core_Rest_Api::get_relation_route_via(
539
+					$model,
540
+					'(?P<id>[^\/]+)',
541
+					$relation_obj
542
+				);
543
+				$model_routes[ $related_route ] = array(
544
+					array(
545
+						'callback'        => array(
546
+							'EventEspresso\core\libraries\rest_api\controllers\model\Read',
547
+							'handleRequestGetRelated',
548
+						),
549
+						'callback_args'   => array($version, $model_name, $relation_name),
550
+						'methods'         => WP_REST_Server::READABLE,
551
+						'hidden_endpoint' => $hidden_endpoint,
552
+						'args'            => $this->_get_read_query_params($relation_obj->get_other_model(), $version),
553
+					),
554
+				);
555
+
556
+				$related_write_route = $related_route . '/' . '(?P<related_id>[^\/]+)';
557
+				$model_routes[ $related_write_route ] = array(
558
+					array(
559
+						'callback'        => array(
560
+							'EventEspresso\core\libraries\rest_api\controllers\model\Write',
561
+							'handleRequestAddRelation',
562
+						),
563
+						'callback_args'   => array($version, $model_name, $relation_name),
564
+						'methods'         => WP_REST_Server::EDITABLE,
565
+						'hidden_endpoint' => $hidden_endpoint,
566
+						'args'            => $this->_get_add_relation_query_params($model, $relation_obj->get_other_model(), $version)
567
+					),
568
+					array(
569
+						'callback'        => array(
570
+							'EventEspresso\core\libraries\rest_api\controllers\model\Write',
571
+							'handleRequestRemoveRelation',
572
+						),
573
+						'callback_args'   => array($version, $model_name, $relation_name),
574
+						'methods'         => WP_REST_Server::DELETABLE,
575
+						'hidden_endpoint' => $hidden_endpoint,
576
+						'args'            => array()
577
+					),
578
+				);
579
+			}
580
+		}
581
+		return $model_routes;
582
+	}
583
+
584
+
585
+	/**
586
+	 * Gets the relative URI to a model's REST API plural route, after the EE4 versioned namespace,
587
+	 * excluding the preceding slash.
588
+	 * Eg you pass get_plural_route_to('Event') = 'events'
589
+	 *
590
+	 * @param EEM_Base $model
591
+	 * @return string
592
+	 */
593
+	public static function get_collection_route(EEM_Base $model)
594
+	{
595
+		return EEH_Inflector::pluralize_and_lower($model->get_this_model_name());
596
+	}
597
+
598
+
599
+	/**
600
+	 * Gets the relative URI to a model's REST API singular route, after the EE4 versioned namespace,
601
+	 * excluding the preceding slash.
602
+	 * Eg you pass get_plural_route_to('Event', 12) = 'events/12'
603
+	 *
604
+	 * @param EEM_Base $model eg Event or Venue
605
+	 * @param string   $id
606
+	 * @return string
607
+	 */
608
+	public static function get_entity_route($model, $id)
609
+	{
610
+		return EED_Core_Rest_Api::get_collection_route($model) . '/' . $id;
611
+	}
612
+
613
+
614
+	/**
615
+	 * Gets the relative URI to a model's REST API singular route, after the EE4 versioned namespace,
616
+	 * excluding the preceding slash.
617
+	 * Eg you pass get_plural_route_to('Event', 12) = 'events/12'
618
+	 *
619
+	 * @param EEM_Base               $model eg Event or Venue
620
+	 * @param string                 $id
621
+	 * @param EE_Model_Relation_Base $relation_obj
622
+	 * @return string
623
+	 */
624
+	public static function get_relation_route_via(EEM_Base $model, $id, EE_Model_Relation_Base $relation_obj)
625
+	{
626
+		$related_model_name_endpoint_part = ModelRead::getRelatedEntityName(
627
+			$relation_obj->get_other_model()->get_this_model_name(),
628
+			$relation_obj
629
+		);
630
+		return EED_Core_Rest_Api::get_entity_route($model, $id) . '/' . $related_model_name_endpoint_part;
631
+	}
632
+
633
+
634
+	/**
635
+	 * Adds onto the $relative_route the EE4 REST API versioned namespace.
636
+	 * Eg if given '4.8.36' and 'events', will return 'ee/v4.8.36/events'
637
+	 *
638
+	 * @param string $relative_route
639
+	 * @param string $version
640
+	 * @return string
641
+	 */
642
+	public static function get_versioned_route_to($relative_route, $version = '4.8.36')
643
+	{
644
+		return '/' . EED_Core_Rest_Api::ee_api_namespace . $version . '/' . $relative_route;
645
+	}
646
+
647
+
648
+	/**
649
+	 * Adds all the RPC-style routes (remote procedure call-like routes, ie
650
+	 * routes that don't conform to the traditional REST CRUD-style).
651
+	 *
652
+	 * @deprecated since 4.9.1
653
+	 */
654
+	protected function _register_rpc_routes()
655
+	{
656
+		$routes = array();
657
+		foreach (self::versions_served() as $version => $hidden_endpoint) {
658
+			$routes[ self::ee_api_namespace . $version ] = $this->_get_rpc_route_data_for_version(
659
+				$version,
660
+				$hidden_endpoint
661
+			);
662
+		}
663
+		return $routes;
664
+	}
665
+
666
+
667
+	/**
668
+	 * @param string  $version
669
+	 * @param boolean $hidden_endpoint
670
+	 * @return array
671
+	 */
672
+	protected function _get_rpc_route_data_for_version($version, $hidden_endpoint = false)
673
+	{
674
+		$this_versions_routes = array();
675
+		// checkin endpoint
676
+		$this_versions_routes['registrations/(?P<REG_ID>\d+)/toggle_checkin_for_datetime/(?P<DTT_ID>\d+)'] = array(
677
+			array(
678
+				'callback'        => array(
679
+					'EventEspresso\core\libraries\rest_api\controllers\rpc\Checkin',
680
+					'handleRequestToggleCheckin',
681
+				),
682
+				'methods'         => WP_REST_Server::CREATABLE,
683
+				'hidden_endpoint' => $hidden_endpoint,
684
+				'args'            => array(
685
+					'force' => array(
686
+						'required'    => false,
687
+						'default'     => false,
688
+						'description' => esc_html__(
689
+						// @codingStandardsIgnoreStart
690
+							'Whether to force toggle checkin, or to verify the registration status and allowed ticket uses',
691
+							// @codingStandardsIgnoreEnd
692
+							'event_espresso'
693
+						),
694
+					),
695
+				),
696
+				'callback_args'   => array($version),
697
+			),
698
+		);
699
+		return apply_filters(
700
+			'FHEE__EED_Core_Rest_Api___register_rpc_routes__this_versions_routes',
701
+			$this_versions_routes,
702
+			$version,
703
+			$hidden_endpoint
704
+		);
705
+	}
706
+
707
+
708
+	/**
709
+	 * Gets the query params that can be used when request one or many
710
+	 *
711
+	 * @param EEM_Base $model
712
+	 * @param string   $version
713
+	 * @return array
714
+	 */
715
+	protected function _get_response_selection_query_params(\EEM_Base $model, $version, $single_only = false)
716
+	{
717
+		$query_params = array(
718
+			'include'   => array(
719
+				'required' => false,
720
+				'default'  => '*',
721
+				'type'     => 'string',
722
+			),
723
+			'calculate' => array(
724
+				'required'          => false,
725
+				'default'           => '',
726
+				'enum'              => self::$_field_calculator->retrieveCalculatedFieldsForModel($model),
727
+				'type'              => 'string',
728
+				// because we accept a CSV'd list of the enumerated strings, WP core validation and sanitization
729
+				// freaks out. We'll just validate this argument while handling the request
730
+				'validate_callback' => null,
731
+				'sanitize_callback' => null,
732
+			),
733
+			'password' => array(
734
+				'required' => false,
735
+				'default' => '',
736
+				'type' => 'string'
737
+			)
738
+		);
739
+		return apply_filters(
740
+			'FHEE__EED_Core_Rest_Api___get_response_selection_query_params',
741
+			$query_params,
742
+			$model,
743
+			$version
744
+		);
745
+	}
746
+
747
+
748
+	/**
749
+	 * Gets the parameters acceptable for delete requests
750
+	 *
751
+	 * @param \EEM_Base $model
752
+	 * @param string    $version
753
+	 * @return array
754
+	 */
755
+	protected function _get_delete_query_params(\EEM_Base $model, $version)
756
+	{
757
+		$params_for_delete = array(
758
+			'allow_blocking' => array(
759
+				'required' => false,
760
+				'default'  => true,
761
+				'type'     => 'boolean',
762
+			),
763
+		);
764
+		$params_for_delete['force'] = array(
765
+			'required' => false,
766
+			'default'  => false,
767
+			'type'     => 'boolean',
768
+		);
769
+		return apply_filters(
770
+			'FHEE__EED_Core_Rest_Api___get_delete_query_params',
771
+			$params_for_delete,
772
+			$model,
773
+			$version
774
+		);
775
+	}
776
+
777
+	protected function _get_add_relation_query_params(\EEM_Base $source_model, \EEM_Base $related_model, $version)
778
+	{
779
+		// if they're related through a HABTM relation, check for any non-FKs
780
+		$all_relation_settings = $source_model->relation_settings();
781
+		$relation_settings = $all_relation_settings[ $related_model->get_this_model_name() ];
782
+		$params = array();
783
+		if ($relation_settings instanceof EE_HABTM_Relation && $relation_settings->hasNonKeyFields()) {
784
+			foreach ($relation_settings->getNonKeyFields() as $field) {
785
+				/* @var $field EE_Model_Field_Base */
786
+				$params[ $field->get_name() ] = array(
787
+					'required' => ! $field->is_nullable(),
788
+					'default' => ModelDataTranslator::prepareFieldValueForJson($field, $field->get_default_value(), $version),
789
+					'type' => $field->getSchemaType(),
790
+					'validate_callbaack' => null,
791
+					'sanitize_callback' => null
792
+				);
793
+			}
794
+		}
795
+		return $params;
796
+	}
797
+
798
+
799
+	/**
800
+	 * Gets info about reading query params that are acceptable
801
+	 *
802
+	 * @param \EEM_Base $model eg 'Event' or 'Venue'
803
+	 * @param  string   $version
804
+	 * @return array    describing the args acceptable when querying this model
805
+	 * @throws EE_Error
806
+	 */
807
+	protected function _get_read_query_params(\EEM_Base $model, $version)
808
+	{
809
+		$default_orderby = array();
810
+		foreach ($model->get_combined_primary_key_fields() as $key_field) {
811
+			$default_orderby[ $key_field->get_name() ] = 'ASC';
812
+		}
813
+		return array_merge(
814
+			$this->_get_response_selection_query_params($model, $version),
815
+			array(
816
+				'where'    => array(
817
+					'required'          => false,
818
+					'default'           => array(),
819
+					'type'              => 'object',
820
+					// because we accept an almost infinite list of possible where conditions, WP
821
+					// core validation and sanitization freaks out. We'll just validate this argument
822
+					// while handling the request
823
+					'validate_callback' => null,
824
+					'sanitize_callback' => null,
825
+				),
826
+				'limit'    => array(
827
+					'required'          => false,
828
+					'default'           => EED_Core_Rest_Api::get_default_query_limit(),
829
+					'type'              => array(
830
+						'array',
831
+						'string',
832
+						'integer',
833
+					),
834
+					// because we accept a variety of types, WP core validation and sanitization
835
+					// freaks out. We'll just validate this argument while handling the request
836
+					'validate_callback' => null,
837
+					'sanitize_callback' => null,
838
+				),
839
+				'order_by' => array(
840
+					'required'          => false,
841
+					'default'           => $default_orderby,
842
+					'type'              => array(
843
+						'object',
844
+						'string',
845
+					),// because we accept a variety of types, WP core validation and sanitization
846
+					// freaks out. We'll just validate this argument while handling the request
847
+					'validate_callback' => null,
848
+					'sanitize_callback' => null,
849
+				),
850
+				'group_by' => array(
851
+					'required'          => false,
852
+					'default'           => null,
853
+					'type'              => array(
854
+						'object',
855
+						'string',
856
+					),
857
+					// because we accept  an almost infinite list of possible groupings,
858
+					// WP core validation and sanitization
859
+					// freaks out. We'll just validate this argument while handling the request
860
+					'validate_callback' => null,
861
+					'sanitize_callback' => null,
862
+				),
863
+				'having'   => array(
864
+					'required'          => false,
865
+					'default'           => null,
866
+					'type'              => 'object',
867
+					// because we accept an almost infinite list of possible where conditions, WP
868
+					// core validation and sanitization freaks out. We'll just validate this argument
869
+					// while handling the request
870
+					'validate_callback' => null,
871
+					'sanitize_callback' => null,
872
+				),
873
+				'caps'     => array(
874
+					'required' => false,
875
+					'default'  => EEM_Base::caps_read,
876
+					'type'     => 'string',
877
+					'enum'     => array(
878
+						EEM_Base::caps_read,
879
+						EEM_Base::caps_read_admin,
880
+						EEM_Base::caps_edit,
881
+						EEM_Base::caps_delete,
882
+					),
883
+				),
884
+			)
885
+		);
886
+	}
887
+
888
+
889
+	/**
890
+	 * Gets parameter information for a model regarding writing data
891
+	 *
892
+	 * @param string           $model_name
893
+	 * @param ModelVersionInfo $model_version_info
894
+	 * @param boolean          $create                                       whether this is for request to create (in
895
+	 *                                                                       which case we need all required params) or
896
+	 *                                                                       just to update (in which case we don't
897
+	 *                                                                       need those on every request)
898
+	 * @return array
899
+	 */
900
+	protected function _get_write_params(
901
+		$model_name,
902
+		ModelVersionInfo $model_version_info,
903
+		$create = false
904
+	) {
905
+		$model = EE_Registry::instance()->load_model($model_name);
906
+		$fields = $model_version_info->fieldsOnModelInThisVersion($model);
907
+		$args_info = array();
908
+		foreach ($fields as $field_name => $field_obj) {
909
+			if ($field_obj->is_auto_increment()) {
910
+				// totally ignore auto increment IDs
911
+				continue;
912
+			}
913
+			$arg_info = $field_obj->getSchema();
914
+			$required = $create && ! $field_obj->is_nullable() && $field_obj->get_default_value() === null;
915
+			$arg_info['required'] = $required;
916
+			// remove the read-only flag. If it were read-only we wouldn't list it as an argument while writing, right?
917
+			unset($arg_info['readonly']);
918
+			$schema_properties = $field_obj->getSchemaProperties();
919
+			if (
920
+				isset($schema_properties['raw'])
921
+				&& $field_obj->getSchemaType() === 'object'
922
+			) {
923
+				// if there's a "raw" form of this argument, use those properties instead
924
+				$arg_info = array_replace(
925
+					$arg_info,
926
+					$schema_properties['raw']
927
+				);
928
+			}
929
+			$arg_info['default'] = ModelDataTranslator::prepareFieldValueForJson(
930
+				$field_obj,
931
+				$field_obj->get_default_value(),
932
+				$model_version_info->requestedVersion()
933
+			);
934
+			// we do our own validation and sanitization within the controller
935
+			if (function_exists('rest_validate_value_from_schema')) {
936
+				$sanitize_callback = array(
937
+					'EED_Core_Rest_Api',
938
+					'default_sanitize_callback',
939
+				);
940
+			} else {
941
+				$sanitize_callback = null;
942
+			}
943
+			$arg_info['sanitize_callback'] = $sanitize_callback;
944
+			$args_info[ $field_name ] = $arg_info;
945
+			if ($field_obj instanceof EE_Datetime_Field) {
946
+				$gmt_arg_info = $arg_info;
947
+				$gmt_arg_info['description'] = sprintf(
948
+					esc_html__(
949
+						'%1$s - the value for this field in UTC. Ignored if %2$s is provided.',
950
+						'event_espresso'
951
+					),
952
+					$field_obj->get_nicename(),
953
+					$field_name
954
+				);
955
+				$args_info[ $field_name . '_gmt' ] = $gmt_arg_info;
956
+			}
957
+		}
958
+		return $args_info;
959
+	}
960
+
961
+
962
+	/**
963
+	 * Replacement for WP API's 'rest_parse_request_arg'.
964
+	 * If the value is blank but not required, don't bother validating it.
965
+	 * Also, it uses our email validation instead of WP API's default.
966
+	 *
967
+	 * @param                 $value
968
+	 * @param WP_REST_Request $request
969
+	 * @param                 $param
970
+	 * @return bool|true|WP_Error
971
+	 * @throws InvalidArgumentException
972
+	 * @throws InvalidInterfaceException
973
+	 * @throws InvalidDataTypeException
974
+	 */
975
+	public static function default_sanitize_callback($value, WP_REST_Request $request, $param)
976
+	{
977
+		$attributes = $request->get_attributes();
978
+		if (
979
+			! isset($attributes['args'][ $param ])
980
+			|| ! is_array($attributes['args'][ $param ])
981
+		) {
982
+			$validation_result = true;
983
+		} else {
984
+			$args = $attributes['args'][ $param ];
985
+			if (
986
+				(
987
+					$value === ''
988
+					|| $value === null
989
+				)
990
+				&& (! isset($args['required'])
991
+					|| $args['required'] === false
992
+				)
993
+			) {
994
+				// not required and not provided? that's cool
995
+				$validation_result = true;
996
+			} elseif (
997
+				isset($args['format'])
998
+					  && $args['format'] === 'email'
999
+			) {
1000
+				$validation_result = true;
1001
+				if (! self::_validate_email($value)) {
1002
+					$validation_result = new WP_Error(
1003
+						'rest_invalid_param',
1004
+						esc_html__(
1005
+							'The email address is not valid or does not exist.',
1006
+							'event_espresso'
1007
+						)
1008
+					);
1009
+				}
1010
+			} else {
1011
+				$validation_result = rest_validate_value_from_schema($value, $args, $param);
1012
+			}
1013
+		}
1014
+		if (is_wp_error($validation_result)) {
1015
+			return $validation_result;
1016
+		}
1017
+		return rest_sanitize_request_arg($value, $request, $param);
1018
+	}
1019
+
1020
+
1021
+	/**
1022
+	 * Returns whether or not this email address is valid. Copied from EE_Email_Validation_Strategy::_validate_email()
1023
+	 *
1024
+	 * @param $email
1025
+	 * @return bool
1026
+	 * @throws InvalidArgumentException
1027
+	 * @throws InvalidInterfaceException
1028
+	 * @throws InvalidDataTypeException
1029
+	 */
1030
+	protected static function _validate_email($email)
1031
+	{
1032
+		try {
1033
+			EmailAddressFactory::create($email);
1034
+			return true;
1035
+		} catch (EmailValidationException $e) {
1036
+			return false;
1037
+		}
1038
+	}
1039
+
1040
+
1041
+	/**
1042
+	 * Gets routes for the config
1043
+	 *
1044
+	 * @return array @see _register_model_routes
1045
+	 * @deprecated since version 4.9.1
1046
+	 */
1047
+	protected function _register_config_routes()
1048
+	{
1049
+		$config_routes = array();
1050
+		foreach (self::versions_served() as $version => $hidden_endpoint) {
1051
+			$config_routes[ self::ee_api_namespace . $version ] = $this->_get_config_route_data_for_version(
1052
+				$version,
1053
+				$hidden_endpoint
1054
+			);
1055
+		}
1056
+		return $config_routes;
1057
+	}
1058
+
1059
+
1060
+	/**
1061
+	 * Gets routes for the config for the specified version
1062
+	 *
1063
+	 * @param string  $version
1064
+	 * @param boolean $hidden_endpoint
1065
+	 * @return array
1066
+	 */
1067
+	protected function _get_config_route_data_for_version($version, $hidden_endpoint)
1068
+	{
1069
+		return array(
1070
+			'config'    => array(
1071
+				array(
1072
+					'callback'        => array(
1073
+						'EventEspresso\core\libraries\rest_api\controllers\config\Read',
1074
+						'handleRequest',
1075
+					),
1076
+					'methods'         => WP_REST_Server::READABLE,
1077
+					'hidden_endpoint' => $hidden_endpoint,
1078
+					'callback_args'   => array($version),
1079
+				),
1080
+			),
1081
+			'site_info' => array(
1082
+				array(
1083
+					'callback'        => array(
1084
+						'EventEspresso\core\libraries\rest_api\controllers\config\Read',
1085
+						'handleRequestSiteInfo',
1086
+					),
1087
+					'methods'         => WP_REST_Server::READABLE,
1088
+					'hidden_endpoint' => $hidden_endpoint,
1089
+					'callback_args'   => array($version),
1090
+				),
1091
+			),
1092
+		);
1093
+	}
1094
+
1095
+
1096
+	/**
1097
+	 * Gets the meta info routes
1098
+	 *
1099
+	 * @return array @see _register_model_routes
1100
+	 * @deprecated since version 4.9.1
1101
+	 */
1102
+	protected function _register_meta_routes()
1103
+	{
1104
+		$meta_routes = array();
1105
+		foreach (self::versions_served() as $version => $hidden_endpoint) {
1106
+			$meta_routes[ self::ee_api_namespace . $version ] = $this->_get_meta_route_data_for_version(
1107
+				$version,
1108
+				$hidden_endpoint
1109
+			);
1110
+		}
1111
+		return $meta_routes;
1112
+	}
1113
+
1114
+
1115
+	/**
1116
+	 * @param string  $version
1117
+	 * @param boolean $hidden_endpoint
1118
+	 * @return array
1119
+	 */
1120
+	protected function _get_meta_route_data_for_version($version, $hidden_endpoint = false)
1121
+	{
1122
+		return array(
1123
+			'resources' => array(
1124
+				array(
1125
+					'callback'        => array(
1126
+						'EventEspresso\core\libraries\rest_api\controllers\model\Meta',
1127
+						'handleRequestModelsMeta',
1128
+					),
1129
+					'methods'         => WP_REST_Server::READABLE,
1130
+					'hidden_endpoint' => $hidden_endpoint,
1131
+					'callback_args'   => array($version),
1132
+				),
1133
+			),
1134
+		);
1135
+	}
1136
+
1137
+
1138
+	/**
1139
+	 * Tries to hide old 4.6 endpoints from the
1140
+	 *
1141
+	 * @param array $route_data
1142
+	 * @return array
1143
+	 * @throws \EE_Error
1144
+	 */
1145
+	public static function hide_old_endpoints($route_data)
1146
+	{
1147
+		// allow API clients to override which endpoints get hidden, in case
1148
+		// they want to discover particular endpoints
1149
+		// also, we don't have access to the request so we have to just grab it from the superglobal
1150
+		$force_show_ee_namespace = ltrim(
1151
+			EED_Core_Rest_Api::getRequest()->getRequestParam('force_show_ee_namespace'),
1152
+			'/'
1153
+		);
1154
+		foreach (EED_Core_Rest_Api::get_ee_route_data() as $namespace => $relative_urls) {
1155
+			foreach ($relative_urls as $resource_name => $endpoints) {
1156
+				foreach ($endpoints as $key => $endpoint) {
1157
+					// skip schema and other route options
1158
+					if (! is_numeric($key)) {
1159
+						continue;
1160
+					}
1161
+					// by default, hide "hidden_endpoint"s, unless the request indicates
1162
+					// to $force_show_ee_namespace, in which case only show that one
1163
+					// namespace's endpoints (and hide all others)
1164
+					if (
1165
+						($force_show_ee_namespace !== '' && $force_show_ee_namespace !== $namespace)
1166
+						|| ($endpoint['hidden_endpoint'] && $force_show_ee_namespace === '')
1167
+					) {
1168
+						$full_route = '/' . ltrim($namespace, '/');
1169
+						$full_route .= '/' . ltrim($resource_name, '/');
1170
+						unset($route_data[ $full_route ]);
1171
+					}
1172
+				}
1173
+			}
1174
+		}
1175
+		return $route_data;
1176
+	}
1177
+
1178
+
1179
+	/**
1180
+	 * Returns an array describing which versions of core support serving requests for.
1181
+	 * Keys are core versions' major and minor version, and values are the
1182
+	 * LOWEST requested version they can serve. Eg, 4.7 can serve requests for 4.6-like
1183
+	 * data by just removing a few models and fields from the responses. However, 4.15 might remove
1184
+	 * the answers table entirely, in which case it would be very difficult for
1185
+	 * it to serve 4.6-style responses.
1186
+	 * Versions of core that are missing from this array are unknowns.
1187
+	 * previous ver
1188
+	 *
1189
+	 * @return array
1190
+	 */
1191
+	public static function version_compatibilities()
1192
+	{
1193
+		return apply_filters(
1194
+			'FHEE__EED_Core_REST_API__version_compatibilities',
1195
+			array(
1196
+				'4.8.29' => '4.8.29',
1197
+				'4.8.33' => '4.8.29',
1198
+				'4.8.34' => '4.8.29',
1199
+				'4.8.36' => '4.8.29',
1200
+			)
1201
+		);
1202
+	}
1203
+
1204
+
1205
+	/**
1206
+	 * Gets the latest API version served. Eg if there
1207
+	 * are two versions served of the API, 4.8.29 and 4.8.32, and
1208
+	 * we are on core version 4.8.34, it will return the string "4.8.32"
1209
+	 *
1210
+	 * @return string
1211
+	 */
1212
+	public static function latest_rest_api_version()
1213
+	{
1214
+		$versions_served = \EED_Core_Rest_Api::versions_served();
1215
+		$versions_served_keys = array_keys($versions_served);
1216
+		return end($versions_served_keys);
1217
+	}
1218
+
1219
+
1220
+	/**
1221
+	 * Using EED_Core_Rest_Api::version_compatibilities(), determines what version of
1222
+	 * EE the API can serve requests for. Eg, if we are on 4.15 of core, and
1223
+	 * we can serve requests from 4.12 or later, this will return array( '4.12', '4.13', '4.14', '4.15' ).
1224
+	 * We also indicate whether or not this version should be put in the index or not
1225
+	 *
1226
+	 * @return array keys are API version numbers (just major and minor numbers), and values
1227
+	 * are whether or not they should be hidden
1228
+	 */
1229
+	public static function versions_served()
1230
+	{
1231
+		$versions_served = array();
1232
+		$possibly_served_versions = EED_Core_Rest_Api::version_compatibilities();
1233
+		$lowest_compatible_version = end($possibly_served_versions);
1234
+		reset($possibly_served_versions);
1235
+		$versions_served_historically = array_keys($possibly_served_versions);
1236
+		$latest_version = end($versions_served_historically);
1237
+		reset($versions_served_historically);
1238
+		// for each version of core we have ever served:
1239
+		foreach ($versions_served_historically as $key_versioned_endpoint) {
1240
+			// if it's not above the current core version, and it's compatible with the current version of core
1241
+
1242
+			if ($key_versioned_endpoint === $latest_version) {
1243
+				// don't hide the latest version in the index
1244
+				$versions_served[ $key_versioned_endpoint ] = false;
1245
+			} elseif (
1246
+				version_compare($key_versioned_endpoint, $lowest_compatible_version, '>=')
1247
+				&& version_compare($key_versioned_endpoint, EED_Core_Rest_Api::core_version(), '<')
1248
+			) {
1249
+				// include, but hide, previous versions which are still supported
1250
+				$versions_served[ $key_versioned_endpoint ] = true;
1251
+			} elseif (
1252
+				apply_filters(
1253
+					'FHEE__EED_Core_Rest_Api__versions_served__include_incompatible_versions',
1254
+					false,
1255
+					$possibly_served_versions
1256
+				)
1257
+			) {
1258
+				// if a version is no longer supported, don't include it in index or list of versions served
1259
+				$versions_served[ $key_versioned_endpoint ] = true;
1260
+			}
1261
+		}
1262
+		return $versions_served;
1263
+	}
1264
+
1265
+
1266
+	/**
1267
+	 * Gets the major and minor version of EE core's version string
1268
+	 *
1269
+	 * @return string
1270
+	 */
1271
+	public static function core_version()
1272
+	{
1273
+		return apply_filters(
1274
+			'FHEE__EED_Core_REST_API__core_version',
1275
+			implode(
1276
+				'.',
1277
+				array_slice(
1278
+					explode(
1279
+						'.',
1280
+						espresso_version()
1281
+					),
1282
+					0,
1283
+					3
1284
+				)
1285
+			)
1286
+		);
1287
+	}
1288
+
1289
+
1290
+	/**
1291
+	 * Gets the default limit that should be used when querying for resources
1292
+	 *
1293
+	 * @return int
1294
+	 */
1295
+	public static function get_default_query_limit()
1296
+	{
1297
+		// we actually don't use a const because we want folks to always use
1298
+		// this method, not the const directly
1299
+		return apply_filters(
1300
+			'FHEE__EED_Core_Rest_Api__get_default_query_limit',
1301
+			50
1302
+		);
1303
+	}
1304
+
1305
+
1306
+	/**
1307
+	 *
1308
+	 * @param string $version api version string (i.e. '4.8.36')
1309
+	 * @return array
1310
+	 */
1311
+	public static function getCollectionRoutesIndexedByModelName($version = '')
1312
+	{
1313
+		$version = empty($version) ? self::latest_rest_api_version() : $version;
1314
+		$model_names = self::model_names_with_plural_routes($version);
1315
+		$collection_routes = array();
1316
+		foreach ($model_names as $model_name => $model_class_name) {
1317
+			$collection_routes[ strtolower($model_name) ] = '/' . self::ee_api_namespace . $version . '/'
1318
+															. EEH_Inflector::pluralize_and_lower($model_name);
1319
+		}
1320
+		return $collection_routes;
1321
+	}
1322
+
1323
+
1324
+	/**
1325
+	 * Returns an array of primary key names indexed by model names.
1326
+	 * @param string $version
1327
+	 * @return array
1328
+	 */
1329
+	public static function getPrimaryKeyNamesIndexedByModelName($version = '')
1330
+	{
1331
+		$version = empty($version) ? self::latest_rest_api_version() : $version;
1332
+		$model_names = self::model_names_with_plural_routes($version);
1333
+		$primary_key_items = array();
1334
+		foreach ($model_names as $model_name => $model_class_name) {
1335
+			$primary_keys = $model_class_name::instance()->get_combined_primary_key_fields();
1336
+			foreach ($primary_keys as $primary_key_name => $primary_key_field) {
1337
+				if (count($primary_keys) > 1) {
1338
+					$primary_key_items[ strtolower($model_name) ][] = $primary_key_name;
1339
+				} else {
1340
+					$primary_key_items[ strtolower($model_name) ] = $primary_key_name;
1341
+				}
1342
+			}
1343
+		}
1344
+		return $primary_key_items;
1345
+	}
1346
+
1347
+	/**
1348
+	 * Determines the EE REST API debug mode is activated, or not.
1349
+	 * @since 4.9.76.p
1350
+	 * @return bool
1351
+	 */
1352
+	public static function debugMode()
1353
+	{
1354
+		static $debug_mode = null; // could be class prop
1355
+		if ($debug_mode === null) {
1356
+			$debug_mode = defined('EE_REST_API_DEBUG_MODE') && EE_REST_API_DEBUG_MODE;
1357
+		}
1358
+		return $debug_mode;
1359
+	}
1360
+
1361
+
1362
+
1363
+	/**
1364
+	 *    run - initial module setup
1365
+	 *
1366
+	 * @access    public
1367
+	 * @param  WP $WP
1368
+	 * @return    void
1369
+	 */
1370
+	public function run($WP)
1371
+	{
1372
+	}
1373 1373
 }
Please login to merge, or discard this patch.
modules/ticket_selector/EED_Ticket_Selector.module.php 2 patches
Spacing   +8 added lines, -8 removed lines patch added patch discarded remove patch
@@ -138,10 +138,10 @@  discard block
 block discarded – undo
138 138
         if (defined('TICKET_SELECTOR_ASSETS_URL')) {
139 139
             return;
140 140
         }
141
-        define('TICKET_SELECTOR_ASSETS_URL', plugin_dir_url(__FILE__) . 'assets/');
141
+        define('TICKET_SELECTOR_ASSETS_URL', plugin_dir_url(__FILE__).'assets/');
142 142
         define(
143 143
             'TICKET_SELECTOR_TEMPLATES_PATH',
144
-            str_replace('\\', '/', plugin_dir_path(__FILE__)) . 'templates/'
144
+            str_replace('\\', '/', plugin_dir_path(__FILE__)).'templates/'
145 145
         );
146 146
         // initialize config
147 147
         EED_Ticket_Selector::instance()->set_config();
@@ -163,7 +163,7 @@  discard block
 block discarded – undo
163 163
      */
164 164
     public static function ticketSelector()
165 165
     {
166
-        if (! EED_Ticket_Selector::$ticket_selector instanceof DisplayTicketSelector) {
166
+        if ( ! EED_Ticket_Selector::$ticket_selector instanceof DisplayTicketSelector) {
167 167
             EED_Ticket_Selector::$ticket_selector = new DisplayTicketSelector(
168 168
                 EED_Ticket_Selector::getRequest(),
169 169
                 EED_Ticket_Selector::ticketConfig(),
@@ -190,7 +190,7 @@  discard block
 block discarded – undo
190 190
      */
191 191
     public static function getIframeEmbedButton()
192 192
     {
193
-        if (! self::$iframe_embed_button instanceof TicketSelectorIframeEmbedButton) {
193
+        if ( ! self::$iframe_embed_button instanceof TicketSelectorIframeEmbedButton) {
194 194
             self::$iframe_embed_button = new TicketSelectorIframeEmbedButton();
195 195
         }
196 196
         return self::$iframe_embed_button;
@@ -298,7 +298,7 @@  discard block
 block discarded – undo
298 298
             // add some style
299 299
             wp_register_style(
300 300
                 'ticket_selector',
301
-                TICKET_SELECTOR_ASSETS_URL . 'ticket_selector.css',
301
+                TICKET_SELECTOR_ASSETS_URL.'ticket_selector.css',
302 302
                 [],
303 303
                 EVENT_ESPRESSO_VERSION
304 304
             );
@@ -306,7 +306,7 @@  discard block
 block discarded – undo
306 306
             // make it dance
307 307
             wp_register_script(
308 308
                 'ticket_selector',
309
-                TICKET_SELECTOR_ASSETS_URL . 'ticket_selector.js',
309
+                TICKET_SELECTOR_ASSETS_URL.'ticket_selector.js',
310 310
                 ['espresso_core'],
311 311
                 EVENT_ESPRESSO_VERSION,
312 312
                 true
@@ -353,7 +353,7 @@  discard block
 block discarded – undo
353 353
      */
354 354
     public static function iframeCss(array $iframe_css)
355 355
     {
356
-        $iframe_css['ticket_selector'] = TICKET_SELECTOR_ASSETS_URL . 'ticket_selector.css';
356
+        $iframe_css['ticket_selector'] = TICKET_SELECTOR_ASSETS_URL.'ticket_selector.css';
357 357
         return $iframe_css;
358 358
     }
359 359
 
@@ -366,7 +366,7 @@  discard block
 block discarded – undo
366 366
      */
367 367
     public static function iframeJs(array $iframe_js)
368 368
     {
369
-        $iframe_js['ticket_selector'] = TICKET_SELECTOR_ASSETS_URL . 'ticket_selector.js';
369
+        $iframe_js['ticket_selector'] = TICKET_SELECTOR_ASSETS_URL.'ticket_selector.js';
370 370
         return $iframe_js;
371 371
     }
372 372
 
Please login to merge, or discard this patch.
Indentation   +487 added lines, -487 removed lines patch added patch discarded remove patch
@@ -18,491 +18,491 @@
 block discarded – undo
18 18
  */
19 19
 class EED_Ticket_Selector extends EED_Module
20 20
 {
21
-    /**
22
-     * @var DisplayTicketSelector $ticket_selector
23
-     */
24
-    private static $ticket_selector;
25
-
26
-    /**
27
-     * @var TicketSelectorIframeEmbedButton $iframe_embed_button
28
-     */
29
-    private static $iframe_embed_button;
30
-
31
-
32
-    /**
33
-     * @return EED_Module|EED_Ticket_Selector
34
-     * @throws EE_Error
35
-     * @throws ReflectionException
36
-     */
37
-    public static function instance()
38
-    {
39
-        return parent::get_instance(__CLASS__);
40
-    }
41
-
42
-
43
-    /**
44
-     * @return EE_Ticket_Selector_Config
45
-     * @throws EE_Error
46
-     * @throws ReflectionException
47
-     */
48
-    public static function ticketConfig()
49
-    {
50
-        EED_Ticket_Selector::instance()->set_config();
51
-        return EED_Ticket_Selector::instance()->config();
52
-    }
53
-
54
-
55
-    /**
56
-     * @return void
57
-     */
58
-    protected function set_config()
59
-    {
60
-        if ($this->_config instanceof EE_Ticket_Selector_Config) {
61
-            return;
62
-        }
63
-        $this->set_config_section('template_settings');
64
-        $this->set_config_class('EE_Ticket_Selector_Config');
65
-        $this->set_config_name('EED_Ticket_Selector');
66
-    }
67
-
68
-
69
-    /**
70
-     *    set_hooks - for hooking into EE Core, other modules, etc
71
-     *
72
-     * @return void
73
-     */
74
-    public static function set_hooks()
75
-    {
76
-        // routing
77
-        EE_Config::register_route(
78
-            'iframe',
79
-            'EED_Ticket_Selector',
80
-            'ticket_selector_iframe',
81
-            'ticket_selector'
82
-        );
83
-        EE_Config::register_route(
84
-            'process_ticket_selections',
85
-            'EED_Ticket_Selector',
86
-            'process_ticket_selections'
87
-        );
88
-        EE_Config::register_route(
89
-            'cancel_ticket_selections',
90
-            'EED_Ticket_Selector',
91
-            'cancel_ticket_selections'
92
-        );
93
-        add_action('wp_loaded', ['EED_Ticket_Selector', 'set_definitions'], 2);
94
-        add_action('AHEE_event_details_header_bottom', ['EED_Ticket_Selector', 'display_ticket_selector'], 10, 1);
95
-        add_action('wp_enqueue_scripts', ['EED_Ticket_Selector', 'translate_js_strings'], 0);
96
-        add_action('wp_enqueue_scripts', ['EED_Ticket_Selector', 'load_tckt_slctr_assets'], 10);
97
-        EED_Ticket_Selector::loadIframeAssets();
98
-    }
99
-
100
-
101
-    /**
102
-     *    set_hooks_admin - for hooking into EE Admin Core, other modules, etc
103
-     *
104
-     * @return void
105
-     */
106
-    public static function set_hooks_admin()
107
-    {
108
-        // hook into the end of the \EE_Admin_Page::_load_page_dependencies()
109
-        // to load assets for "espresso_events" page on the "edit" route (action)
110
-        add_action(
111
-            'FHEE__EE_Admin_Page___load_page_dependencies__after_load__espresso_events__edit',
112
-            ['EED_Ticket_Selector', 'ticket_selector_iframe_embed_button'],
113
-            10
114
-        );
115
-        /**
116
-         * Make sure assets for the ticket selector are loaded on the espresso registrations route so  admin side
117
-         * registrations work.
118
-         */
119
-        add_action(
120
-            'FHEE__EE_Admin_Page___load_page_dependencies__after_load__espresso_registrations__new_registration',
121
-            ['EED_Ticket_Selector', 'set_definitions'],
122
-            10
123
-        );
124
-    }
125
-
126
-
127
-    /**
128
-     *    set_definitions
129
-     *
130
-     * @return void
131
-     * @throws EE_Error
132
-     * @throws ReflectionException
133
-     */
134
-    public static function set_definitions()
135
-    {
136
-        // don't do this twice
137
-        if (defined('TICKET_SELECTOR_ASSETS_URL')) {
138
-            return;
139
-        }
140
-        define('TICKET_SELECTOR_ASSETS_URL', plugin_dir_url(__FILE__) . 'assets/');
141
-        define(
142
-            'TICKET_SELECTOR_TEMPLATES_PATH',
143
-            str_replace('\\', '/', plugin_dir_path(__FILE__)) . 'templates/'
144
-        );
145
-        // initialize config
146
-        EED_Ticket_Selector::instance()->set_config();
147
-        // if config is not set, initialize
148
-        if (
149
-            ! EE_Registry::instance()->CFG->template_settings->EED_Ticket_Selector instanceof EE_Ticket_Selector_Config
150
-        ) {
151
-            EED_Ticket_Selector::instance()->set_config();
152
-            EE_Registry::instance()->CFG->template_settings->EED_Ticket_Selector =
153
-                EED_Ticket_Selector::instance()->config();
154
-        }
155
-    }
156
-
157
-
158
-    /**
159
-     * @return DisplayTicketSelector
160
-     * @throws EE_Error
161
-     * @throws ReflectionException
162
-     */
163
-    public static function ticketSelector()
164
-    {
165
-        if (! EED_Ticket_Selector::$ticket_selector instanceof DisplayTicketSelector) {
166
-            EED_Ticket_Selector::$ticket_selector = new DisplayTicketSelector(
167
-                EED_Ticket_Selector::getRequest(),
168
-                EED_Ticket_Selector::ticketConfig(),
169
-                EED_Events_Archive::is_iframe()
170
-            );
171
-        }
172
-        return EED_Ticket_Selector::$ticket_selector;
173
-    }
174
-
175
-
176
-    /**
177
-     * gets the ball rolling
178
-     *
179
-     * @param WP $WP
180
-     * @return void
181
-     */
182
-    public function run($WP)
183
-    {
184
-    }
185
-
186
-
187
-    /**
188
-     * @return TicketSelectorIframeEmbedButton
189
-     */
190
-    public static function getIframeEmbedButton()
191
-    {
192
-        if (! self::$iframe_embed_button instanceof TicketSelectorIframeEmbedButton) {
193
-            self::$iframe_embed_button = new TicketSelectorIframeEmbedButton();
194
-        }
195
-        return self::$iframe_embed_button;
196
-    }
197
-
198
-
199
-    /**
200
-     * ticket_selector_iframe_embed_button
201
-     *
202
-     * @return void
203
-     */
204
-    public static function ticket_selector_iframe_embed_button()
205
-    {
206
-        $iframe_embed_button = EED_Ticket_Selector::getIframeEmbedButton();
207
-        $iframe_embed_button->addEventEditorIframeEmbedButton();
208
-    }
209
-
210
-
211
-    /**
212
-     * ticket_selector_iframe
213
-     *
214
-     * @return void
215
-     * @throws DomainException
216
-     */
217
-    public function ticket_selector_iframe()
218
-    {
219
-        EE_Dependency_Map::register_dependencies(
220
-            TicketSelectorIframe::class,
221
-            [
222
-                'EEM_Event'                                            => EE_Dependency_Map::load_from_cache,
223
-                'EventEspresso\core\services\request\CurrentPage'      => EE_Dependency_Map::load_from_cache,
224
-                'EventEspresso\core\services\request\RequestInterface' => EE_Dependency_Map::load_from_cache,
225
-            ]
226
-        );
227
-        $ticket_selector_iframe = LoaderFactory::getLoader()->getNew(TicketSelectorIframe::class);
228
-        $ticket_selector_iframe->display();
229
-    }
230
-
231
-
232
-    /**
233
-     * creates buttons for selecting number of attendees for an event
234
-     *
235
-     * @param WP_Post|int $event
236
-     * @param bool        $view_details
237
-     * @return string
238
-     * @throws EE_Error
239
-     * @throws ReflectionException
240
-     */
241
-    public static function display_ticket_selector($event = null, $view_details = false)
242
-    {
243
-        return EED_Ticket_Selector::ticketSelector()->display($event, $view_details);
244
-    }
245
-
246
-
247
-    /**
248
-     * @return bool  or FALSE
249
-     * @throws EE_Error
250
-     * @throws InvalidArgumentException
251
-     * @throws InvalidInterfaceException
252
-     * @throws InvalidDataTypeException
253
-     * @throws ReflectionException
254
-     */
255
-    public function process_ticket_selections()
256
-    {
257
-        /** @var EventEspresso\modules\ticket_selector\ProcessTicketSelector $form */
258
-        $form = LoaderFactory::getLoader()->getShared('EventEspresso\modules\ticket_selector\ProcessTicketSelector');
259
-        return $form->processTicketSelections();
260
-    }
261
-
262
-
263
-    /**
264
-     * @return bool
265
-     * @throws InvalidArgumentException
266
-     * @throws InvalidInterfaceException
267
-     * @throws InvalidDataTypeException
268
-     * @throws EE_Error
269
-     * @throws ReflectionException
270
-     */
271
-    public static function cancel_ticket_selections()
272
-    {
273
-        /** @var EventEspresso\modules\ticket_selector\ProcessTicketSelector $form */
274
-        $form = LoaderFactory::getLoader()->getShared('EventEspresso\modules\ticket_selector\ProcessTicketSelector');
275
-        return $form->cancelTicketSelections();
276
-    }
277
-
278
-
279
-    /**
280
-     * @return void
281
-     */
282
-    public static function translate_js_strings()
283
-    {
284
-        EE_Registry::$i18n_js_strings['please_select_date_filter_notice'] = esc_html__(
285
-            'please select a datetime',
286
-            'event_espresso'
287
-        );
288
-    }
289
-
290
-
291
-    /**
292
-     * @return void
293
-     */
294
-    public static function load_tckt_slctr_assets()
295
-    {
296
-        if (apply_filters('FHEE__EED_Ticket_Selector__load_tckt_slctr_assets', false)) {
297
-            // add some style
298
-            wp_register_style(
299
-                'ticket_selector',
300
-                TICKET_SELECTOR_ASSETS_URL . 'ticket_selector.css',
301
-                [],
302
-                EVENT_ESPRESSO_VERSION
303
-            );
304
-            wp_enqueue_style('ticket_selector');
305
-            // make it dance
306
-            wp_register_script(
307
-                'ticket_selector',
308
-                TICKET_SELECTOR_ASSETS_URL . 'ticket_selector.js',
309
-                ['espresso_core'],
310
-                EVENT_ESPRESSO_VERSION,
311
-                true
312
-            );
313
-            wp_enqueue_script('ticket_selector');
314
-            require_once EE_LIBRARIES
315
-                         . 'form_sections/strategies/display/EE_Checkbox_Dropdown_Selector_Display_Strategy.strategy.php';
316
-            EE_Checkbox_Dropdown_Selector_Display_Strategy::enqueue_styles_and_scripts();
317
-        }
318
-    }
319
-
320
-
321
-    /**
322
-     * @return void
323
-     */
324
-    public static function loadIframeAssets()
325
-    {
326
-        // for event lists
327
-        add_filter(
328
-            'FHEE__EventEspresso_modules_events_archive_EventsArchiveIframe__display__css',
329
-            ['EED_Ticket_Selector', 'iframeCss']
330
-        );
331
-        add_filter(
332
-            'FHEE__EventEspresso_modules_events_archive_EventsArchiveIframe__display__js',
333
-            ['EED_Ticket_Selector', 'iframeJs']
334
-        );
335
-        // for ticket selectors
336
-        add_filter(
337
-            'FHEE__EED_Ticket_Selector__ticket_selector_iframe__css',
338
-            ['EED_Ticket_Selector', 'iframeCss']
339
-        );
340
-        add_filter(
341
-            'FHEE__EED_Ticket_Selector__ticket_selector_iframe__js',
342
-            ['EED_Ticket_Selector', 'iframeJs']
343
-        );
344
-    }
345
-
346
-
347
-    /**
348
-     * Informs the rest of the forms system what CSS and JS is needed to display the input
349
-     *
350
-     * @param array $iframe_css
351
-     * @return array
352
-     */
353
-    public static function iframeCss(array $iframe_css)
354
-    {
355
-        $iframe_css['ticket_selector'] = TICKET_SELECTOR_ASSETS_URL . 'ticket_selector.css';
356
-        return $iframe_css;
357
-    }
358
-
359
-
360
-    /**
361
-     * Informs the rest of the forms system what CSS and JS is needed to display the input
362
-     *
363
-     * @param array $iframe_js
364
-     * @return array
365
-     */
366
-    public static function iframeJs(array $iframe_js)
367
-    {
368
-        $iframe_js['ticket_selector'] = TICKET_SELECTOR_ASSETS_URL . 'ticket_selector.js';
369
-        return $iframe_js;
370
-    }
371
-
372
-
373
-    /****************************** DEPRECATED ******************************/
374
-
375
-
376
-    /**
377
-     * @return string
378
-     * @throws EE_Error
379
-     * @throws ReflectionException
380
-     * @deprecated
381
-     */
382
-    public static function display_view_details_btn()
383
-    {
384
-        // todo add doing_it_wrong() notice during next major version
385
-        return EED_Ticket_Selector::ticketSelector()->displayViewDetailsButton();
386
-    }
387
-
388
-
389
-    /**
390
-     * @return string
391
-     * @throws EE_Error
392
-     * @throws ReflectionException
393
-     * @deprecated
394
-     */
395
-    public static function display_ticket_selector_submit()
396
-    {
397
-        // todo add doing_it_wrong() notice during next major version
398
-        return EED_Ticket_Selector::ticketSelector()->displaySubmitButton();
399
-    }
400
-
401
-
402
-    /**
403
-     * @param string $permalink_string
404
-     * @param int    $id
405
-     * @param string $new_title
406
-     * @param string $new_slug
407
-     * @return string
408
-     * @throws InvalidArgumentException
409
-     * @throws InvalidDataTypeException
410
-     * @throws InvalidInterfaceException
411
-     * @deprecated
412
-     */
413
-    public static function iframe_code_button($permalink_string, $id, $new_title = '', $new_slug = '')
414
-    {
415
-        $request = self::getRequest();
416
-        // todo add doing_it_wrong() notice during next major version
417
-        if (
418
-            $request->getRequestParam('page') === 'espresso_events'
419
-            && $request->getRequestParam('action') === 'edit'
420
-        ) {
421
-            $iframe_embed_button = EED_Ticket_Selector::getIframeEmbedButton();
422
-            $iframe_embed_button->addEventEditorIframeEmbedButton();
423
-        }
424
-        return '';
425
-    }
426
-
427
-
428
-    /**
429
-     * @param int    $ID
430
-     * @param string $external_url
431
-     * @return string
432
-     * @throws EE_Error
433
-     * @throws ReflectionException
434
-     * @deprecated
435
-     */
436
-    public static function ticket_selector_form_open($ID = 0, $external_url = '')
437
-    {
438
-        // todo add doing_it_wrong() notice during next major version
439
-        return EED_Ticket_Selector::ticketSelector()->formOpen($ID, $external_url);
440
-    }
441
-
442
-
443
-    /**
444
-     * @return string
445
-     * @throws EE_Error
446
-     * @throws ReflectionException
447
-     * @deprecated
448
-     */
449
-    public static function ticket_selector_form_close()
450
-    {
451
-        // todo add doing_it_wrong() notice during next major version
452
-        return EED_Ticket_Selector::ticketSelector()->formClose();
453
-    }
454
-
455
-
456
-    /**
457
-     * @return string
458
-     * @throws EE_Error
459
-     * @throws ReflectionException
460
-     * @deprecated
461
-     */
462
-    public static function no_tkt_slctr_end_dv()
463
-    {
464
-        // todo add doing_it_wrong() notice during next major version
465
-        return EED_Ticket_Selector::ticketSelector()->ticketSelectorEndDiv();
466
-    }
467
-
468
-
469
-    /**
470
-     * @return string
471
-     * @throws EE_Error
472
-     * @throws ReflectionException
473
-     * @deprecated 4.9.13
474
-     */
475
-    public static function tkt_slctr_end_dv()
476
-    {
477
-        return EED_Ticket_Selector::ticketSelector()->clearTicketSelector();
478
-    }
479
-
480
-
481
-    /**
482
-     * @return string
483
-     * @throws EE_Error
484
-     * @throws ReflectionException
485
-     * @deprecated
486
-     */
487
-    public static function clear_tkt_slctr()
488
-    {
489
-        return EED_Ticket_Selector::ticketSelector()->clearTicketSelector();
490
-    }
491
-
492
-
493
-    /**
494
-     * @deprecated
495
-     */
496
-    public static function load_tckt_slctr_assets_admin()
497
-    {
498
-        $request = self::getRequest();
499
-        // todo add doing_it_wrong() notice during next major version
500
-        if (
501
-            $request->getRequestParam('page') === 'espresso_events'
502
-            && $request->getRequestParam('action') === 'edit'
503
-        ) {
504
-            $iframe_embed_button = EED_Ticket_Selector::getIframeEmbedButton();
505
-            $iframe_embed_button->embedButtonAssets();
506
-        }
507
-    }
21
+	/**
22
+	 * @var DisplayTicketSelector $ticket_selector
23
+	 */
24
+	private static $ticket_selector;
25
+
26
+	/**
27
+	 * @var TicketSelectorIframeEmbedButton $iframe_embed_button
28
+	 */
29
+	private static $iframe_embed_button;
30
+
31
+
32
+	/**
33
+	 * @return EED_Module|EED_Ticket_Selector
34
+	 * @throws EE_Error
35
+	 * @throws ReflectionException
36
+	 */
37
+	public static function instance()
38
+	{
39
+		return parent::get_instance(__CLASS__);
40
+	}
41
+
42
+
43
+	/**
44
+	 * @return EE_Ticket_Selector_Config
45
+	 * @throws EE_Error
46
+	 * @throws ReflectionException
47
+	 */
48
+	public static function ticketConfig()
49
+	{
50
+		EED_Ticket_Selector::instance()->set_config();
51
+		return EED_Ticket_Selector::instance()->config();
52
+	}
53
+
54
+
55
+	/**
56
+	 * @return void
57
+	 */
58
+	protected function set_config()
59
+	{
60
+		if ($this->_config instanceof EE_Ticket_Selector_Config) {
61
+			return;
62
+		}
63
+		$this->set_config_section('template_settings');
64
+		$this->set_config_class('EE_Ticket_Selector_Config');
65
+		$this->set_config_name('EED_Ticket_Selector');
66
+	}
67
+
68
+
69
+	/**
70
+	 *    set_hooks - for hooking into EE Core, other modules, etc
71
+	 *
72
+	 * @return void
73
+	 */
74
+	public static function set_hooks()
75
+	{
76
+		// routing
77
+		EE_Config::register_route(
78
+			'iframe',
79
+			'EED_Ticket_Selector',
80
+			'ticket_selector_iframe',
81
+			'ticket_selector'
82
+		);
83
+		EE_Config::register_route(
84
+			'process_ticket_selections',
85
+			'EED_Ticket_Selector',
86
+			'process_ticket_selections'
87
+		);
88
+		EE_Config::register_route(
89
+			'cancel_ticket_selections',
90
+			'EED_Ticket_Selector',
91
+			'cancel_ticket_selections'
92
+		);
93
+		add_action('wp_loaded', ['EED_Ticket_Selector', 'set_definitions'], 2);
94
+		add_action('AHEE_event_details_header_bottom', ['EED_Ticket_Selector', 'display_ticket_selector'], 10, 1);
95
+		add_action('wp_enqueue_scripts', ['EED_Ticket_Selector', 'translate_js_strings'], 0);
96
+		add_action('wp_enqueue_scripts', ['EED_Ticket_Selector', 'load_tckt_slctr_assets'], 10);
97
+		EED_Ticket_Selector::loadIframeAssets();
98
+	}
99
+
100
+
101
+	/**
102
+	 *    set_hooks_admin - for hooking into EE Admin Core, other modules, etc
103
+	 *
104
+	 * @return void
105
+	 */
106
+	public static function set_hooks_admin()
107
+	{
108
+		// hook into the end of the \EE_Admin_Page::_load_page_dependencies()
109
+		// to load assets for "espresso_events" page on the "edit" route (action)
110
+		add_action(
111
+			'FHEE__EE_Admin_Page___load_page_dependencies__after_load__espresso_events__edit',
112
+			['EED_Ticket_Selector', 'ticket_selector_iframe_embed_button'],
113
+			10
114
+		);
115
+		/**
116
+		 * Make sure assets for the ticket selector are loaded on the espresso registrations route so  admin side
117
+		 * registrations work.
118
+		 */
119
+		add_action(
120
+			'FHEE__EE_Admin_Page___load_page_dependencies__after_load__espresso_registrations__new_registration',
121
+			['EED_Ticket_Selector', 'set_definitions'],
122
+			10
123
+		);
124
+	}
125
+
126
+
127
+	/**
128
+	 *    set_definitions
129
+	 *
130
+	 * @return void
131
+	 * @throws EE_Error
132
+	 * @throws ReflectionException
133
+	 */
134
+	public static function set_definitions()
135
+	{
136
+		// don't do this twice
137
+		if (defined('TICKET_SELECTOR_ASSETS_URL')) {
138
+			return;
139
+		}
140
+		define('TICKET_SELECTOR_ASSETS_URL', plugin_dir_url(__FILE__) . 'assets/');
141
+		define(
142
+			'TICKET_SELECTOR_TEMPLATES_PATH',
143
+			str_replace('\\', '/', plugin_dir_path(__FILE__)) . 'templates/'
144
+		);
145
+		// initialize config
146
+		EED_Ticket_Selector::instance()->set_config();
147
+		// if config is not set, initialize
148
+		if (
149
+			! EE_Registry::instance()->CFG->template_settings->EED_Ticket_Selector instanceof EE_Ticket_Selector_Config
150
+		) {
151
+			EED_Ticket_Selector::instance()->set_config();
152
+			EE_Registry::instance()->CFG->template_settings->EED_Ticket_Selector =
153
+				EED_Ticket_Selector::instance()->config();
154
+		}
155
+	}
156
+
157
+
158
+	/**
159
+	 * @return DisplayTicketSelector
160
+	 * @throws EE_Error
161
+	 * @throws ReflectionException
162
+	 */
163
+	public static function ticketSelector()
164
+	{
165
+		if (! EED_Ticket_Selector::$ticket_selector instanceof DisplayTicketSelector) {
166
+			EED_Ticket_Selector::$ticket_selector = new DisplayTicketSelector(
167
+				EED_Ticket_Selector::getRequest(),
168
+				EED_Ticket_Selector::ticketConfig(),
169
+				EED_Events_Archive::is_iframe()
170
+			);
171
+		}
172
+		return EED_Ticket_Selector::$ticket_selector;
173
+	}
174
+
175
+
176
+	/**
177
+	 * gets the ball rolling
178
+	 *
179
+	 * @param WP $WP
180
+	 * @return void
181
+	 */
182
+	public function run($WP)
183
+	{
184
+	}
185
+
186
+
187
+	/**
188
+	 * @return TicketSelectorIframeEmbedButton
189
+	 */
190
+	public static function getIframeEmbedButton()
191
+	{
192
+		if (! self::$iframe_embed_button instanceof TicketSelectorIframeEmbedButton) {
193
+			self::$iframe_embed_button = new TicketSelectorIframeEmbedButton();
194
+		}
195
+		return self::$iframe_embed_button;
196
+	}
197
+
198
+
199
+	/**
200
+	 * ticket_selector_iframe_embed_button
201
+	 *
202
+	 * @return void
203
+	 */
204
+	public static function ticket_selector_iframe_embed_button()
205
+	{
206
+		$iframe_embed_button = EED_Ticket_Selector::getIframeEmbedButton();
207
+		$iframe_embed_button->addEventEditorIframeEmbedButton();
208
+	}
209
+
210
+
211
+	/**
212
+	 * ticket_selector_iframe
213
+	 *
214
+	 * @return void
215
+	 * @throws DomainException
216
+	 */
217
+	public function ticket_selector_iframe()
218
+	{
219
+		EE_Dependency_Map::register_dependencies(
220
+			TicketSelectorIframe::class,
221
+			[
222
+				'EEM_Event'                                            => EE_Dependency_Map::load_from_cache,
223
+				'EventEspresso\core\services\request\CurrentPage'      => EE_Dependency_Map::load_from_cache,
224
+				'EventEspresso\core\services\request\RequestInterface' => EE_Dependency_Map::load_from_cache,
225
+			]
226
+		);
227
+		$ticket_selector_iframe = LoaderFactory::getLoader()->getNew(TicketSelectorIframe::class);
228
+		$ticket_selector_iframe->display();
229
+	}
230
+
231
+
232
+	/**
233
+	 * creates buttons for selecting number of attendees for an event
234
+	 *
235
+	 * @param WP_Post|int $event
236
+	 * @param bool        $view_details
237
+	 * @return string
238
+	 * @throws EE_Error
239
+	 * @throws ReflectionException
240
+	 */
241
+	public static function display_ticket_selector($event = null, $view_details = false)
242
+	{
243
+		return EED_Ticket_Selector::ticketSelector()->display($event, $view_details);
244
+	}
245
+
246
+
247
+	/**
248
+	 * @return bool  or FALSE
249
+	 * @throws EE_Error
250
+	 * @throws InvalidArgumentException
251
+	 * @throws InvalidInterfaceException
252
+	 * @throws InvalidDataTypeException
253
+	 * @throws ReflectionException
254
+	 */
255
+	public function process_ticket_selections()
256
+	{
257
+		/** @var EventEspresso\modules\ticket_selector\ProcessTicketSelector $form */
258
+		$form = LoaderFactory::getLoader()->getShared('EventEspresso\modules\ticket_selector\ProcessTicketSelector');
259
+		return $form->processTicketSelections();
260
+	}
261
+
262
+
263
+	/**
264
+	 * @return bool
265
+	 * @throws InvalidArgumentException
266
+	 * @throws InvalidInterfaceException
267
+	 * @throws InvalidDataTypeException
268
+	 * @throws EE_Error
269
+	 * @throws ReflectionException
270
+	 */
271
+	public static function cancel_ticket_selections()
272
+	{
273
+		/** @var EventEspresso\modules\ticket_selector\ProcessTicketSelector $form */
274
+		$form = LoaderFactory::getLoader()->getShared('EventEspresso\modules\ticket_selector\ProcessTicketSelector');
275
+		return $form->cancelTicketSelections();
276
+	}
277
+
278
+
279
+	/**
280
+	 * @return void
281
+	 */
282
+	public static function translate_js_strings()
283
+	{
284
+		EE_Registry::$i18n_js_strings['please_select_date_filter_notice'] = esc_html__(
285
+			'please select a datetime',
286
+			'event_espresso'
287
+		);
288
+	}
289
+
290
+
291
+	/**
292
+	 * @return void
293
+	 */
294
+	public static function load_tckt_slctr_assets()
295
+	{
296
+		if (apply_filters('FHEE__EED_Ticket_Selector__load_tckt_slctr_assets', false)) {
297
+			// add some style
298
+			wp_register_style(
299
+				'ticket_selector',
300
+				TICKET_SELECTOR_ASSETS_URL . 'ticket_selector.css',
301
+				[],
302
+				EVENT_ESPRESSO_VERSION
303
+			);
304
+			wp_enqueue_style('ticket_selector');
305
+			// make it dance
306
+			wp_register_script(
307
+				'ticket_selector',
308
+				TICKET_SELECTOR_ASSETS_URL . 'ticket_selector.js',
309
+				['espresso_core'],
310
+				EVENT_ESPRESSO_VERSION,
311
+				true
312
+			);
313
+			wp_enqueue_script('ticket_selector');
314
+			require_once EE_LIBRARIES
315
+						 . 'form_sections/strategies/display/EE_Checkbox_Dropdown_Selector_Display_Strategy.strategy.php';
316
+			EE_Checkbox_Dropdown_Selector_Display_Strategy::enqueue_styles_and_scripts();
317
+		}
318
+	}
319
+
320
+
321
+	/**
322
+	 * @return void
323
+	 */
324
+	public static function loadIframeAssets()
325
+	{
326
+		// for event lists
327
+		add_filter(
328
+			'FHEE__EventEspresso_modules_events_archive_EventsArchiveIframe__display__css',
329
+			['EED_Ticket_Selector', 'iframeCss']
330
+		);
331
+		add_filter(
332
+			'FHEE__EventEspresso_modules_events_archive_EventsArchiveIframe__display__js',
333
+			['EED_Ticket_Selector', 'iframeJs']
334
+		);
335
+		// for ticket selectors
336
+		add_filter(
337
+			'FHEE__EED_Ticket_Selector__ticket_selector_iframe__css',
338
+			['EED_Ticket_Selector', 'iframeCss']
339
+		);
340
+		add_filter(
341
+			'FHEE__EED_Ticket_Selector__ticket_selector_iframe__js',
342
+			['EED_Ticket_Selector', 'iframeJs']
343
+		);
344
+	}
345
+
346
+
347
+	/**
348
+	 * Informs the rest of the forms system what CSS and JS is needed to display the input
349
+	 *
350
+	 * @param array $iframe_css
351
+	 * @return array
352
+	 */
353
+	public static function iframeCss(array $iframe_css)
354
+	{
355
+		$iframe_css['ticket_selector'] = TICKET_SELECTOR_ASSETS_URL . 'ticket_selector.css';
356
+		return $iframe_css;
357
+	}
358
+
359
+
360
+	/**
361
+	 * Informs the rest of the forms system what CSS and JS is needed to display the input
362
+	 *
363
+	 * @param array $iframe_js
364
+	 * @return array
365
+	 */
366
+	public static function iframeJs(array $iframe_js)
367
+	{
368
+		$iframe_js['ticket_selector'] = TICKET_SELECTOR_ASSETS_URL . 'ticket_selector.js';
369
+		return $iframe_js;
370
+	}
371
+
372
+
373
+	/****************************** DEPRECATED ******************************/
374
+
375
+
376
+	/**
377
+	 * @return string
378
+	 * @throws EE_Error
379
+	 * @throws ReflectionException
380
+	 * @deprecated
381
+	 */
382
+	public static function display_view_details_btn()
383
+	{
384
+		// todo add doing_it_wrong() notice during next major version
385
+		return EED_Ticket_Selector::ticketSelector()->displayViewDetailsButton();
386
+	}
387
+
388
+
389
+	/**
390
+	 * @return string
391
+	 * @throws EE_Error
392
+	 * @throws ReflectionException
393
+	 * @deprecated
394
+	 */
395
+	public static function display_ticket_selector_submit()
396
+	{
397
+		// todo add doing_it_wrong() notice during next major version
398
+		return EED_Ticket_Selector::ticketSelector()->displaySubmitButton();
399
+	}
400
+
401
+
402
+	/**
403
+	 * @param string $permalink_string
404
+	 * @param int    $id
405
+	 * @param string $new_title
406
+	 * @param string $new_slug
407
+	 * @return string
408
+	 * @throws InvalidArgumentException
409
+	 * @throws InvalidDataTypeException
410
+	 * @throws InvalidInterfaceException
411
+	 * @deprecated
412
+	 */
413
+	public static function iframe_code_button($permalink_string, $id, $new_title = '', $new_slug = '')
414
+	{
415
+		$request = self::getRequest();
416
+		// todo add doing_it_wrong() notice during next major version
417
+		if (
418
+			$request->getRequestParam('page') === 'espresso_events'
419
+			&& $request->getRequestParam('action') === 'edit'
420
+		) {
421
+			$iframe_embed_button = EED_Ticket_Selector::getIframeEmbedButton();
422
+			$iframe_embed_button->addEventEditorIframeEmbedButton();
423
+		}
424
+		return '';
425
+	}
426
+
427
+
428
+	/**
429
+	 * @param int    $ID
430
+	 * @param string $external_url
431
+	 * @return string
432
+	 * @throws EE_Error
433
+	 * @throws ReflectionException
434
+	 * @deprecated
435
+	 */
436
+	public static function ticket_selector_form_open($ID = 0, $external_url = '')
437
+	{
438
+		// todo add doing_it_wrong() notice during next major version
439
+		return EED_Ticket_Selector::ticketSelector()->formOpen($ID, $external_url);
440
+	}
441
+
442
+
443
+	/**
444
+	 * @return string
445
+	 * @throws EE_Error
446
+	 * @throws ReflectionException
447
+	 * @deprecated
448
+	 */
449
+	public static function ticket_selector_form_close()
450
+	{
451
+		// todo add doing_it_wrong() notice during next major version
452
+		return EED_Ticket_Selector::ticketSelector()->formClose();
453
+	}
454
+
455
+
456
+	/**
457
+	 * @return string
458
+	 * @throws EE_Error
459
+	 * @throws ReflectionException
460
+	 * @deprecated
461
+	 */
462
+	public static function no_tkt_slctr_end_dv()
463
+	{
464
+		// todo add doing_it_wrong() notice during next major version
465
+		return EED_Ticket_Selector::ticketSelector()->ticketSelectorEndDiv();
466
+	}
467
+
468
+
469
+	/**
470
+	 * @return string
471
+	 * @throws EE_Error
472
+	 * @throws ReflectionException
473
+	 * @deprecated 4.9.13
474
+	 */
475
+	public static function tkt_slctr_end_dv()
476
+	{
477
+		return EED_Ticket_Selector::ticketSelector()->clearTicketSelector();
478
+	}
479
+
480
+
481
+	/**
482
+	 * @return string
483
+	 * @throws EE_Error
484
+	 * @throws ReflectionException
485
+	 * @deprecated
486
+	 */
487
+	public static function clear_tkt_slctr()
488
+	{
489
+		return EED_Ticket_Selector::ticketSelector()->clearTicketSelector();
490
+	}
491
+
492
+
493
+	/**
494
+	 * @deprecated
495
+	 */
496
+	public static function load_tckt_slctr_assets_admin()
497
+	{
498
+		$request = self::getRequest();
499
+		// todo add doing_it_wrong() notice during next major version
500
+		if (
501
+			$request->getRequestParam('page') === 'espresso_events'
502
+			&& $request->getRequestParam('action') === 'edit'
503
+		) {
504
+			$iframe_embed_button = EED_Ticket_Selector::getIframeEmbedButton();
505
+			$iframe_embed_button->embedButtonAssets();
506
+		}
507
+	}
508 508
 }
Please login to merge, or discard this patch.
support/templates/support_admin_details_contact_support.template.php 1 patch
Indentation   +68 added lines, -68 removed lines patch added patch discarded remove patch
@@ -3,102 +3,102 @@
 block discarded – undo
3 3
 
4 4
     <h4>
5 5
         <?php
6
-        esc_html_e(
7
-            'You may be able to find an answer for your question or concern here:',
8
-            'event_espresso'
9
-        );
10
-        ?>
6
+		esc_html_e(
7
+			'You may be able to find an answer for your question or concern here:',
8
+			'event_espresso'
9
+		);
10
+		?>
11 11
     </h4>
12 12
     <ol>
13 13
         <li>
14 14
             <strong><em><?php esc_html_e('A known issue.', 'event_espresso'); ?></em></strong>
15 15
             <?php
16
-            printf(
17
-                esc_html__(
18
-                    'Some themes and plugins have %1$sknown conflicts%2$s with Event Espresso. (You can also browse the %3$sEvent Espresso support pages%2$s or %4$sEvent Espresso support forums%2$s to see if other members have experienced and solved the problem.)',
19
-                    'event_espresso'
20
-                ),
21
-                '<a href="https://eventespresso.com/wiki/known-third-party-plugin-theme-conflicts/" target="_blank">',
22
-                '</a>',
23
-                '<a href="https://eventespresso.com/support/documentation/versioned-docs/?doc_ver=ee4" target="_blank">',
24
-                '<a href="https://eventespresso.com/support/forums/" target="_blank">'
25
-            );
26
-            ?>
16
+			printf(
17
+				esc_html__(
18
+					'Some themes and plugins have %1$sknown conflicts%2$s with Event Espresso. (You can also browse the %3$sEvent Espresso support pages%2$s or %4$sEvent Espresso support forums%2$s to see if other members have experienced and solved the problem.)',
19
+					'event_espresso'
20
+				),
21
+				'<a href="https://eventespresso.com/wiki/known-third-party-plugin-theme-conflicts/" target="_blank">',
22
+				'</a>',
23
+				'<a href="https://eventespresso.com/support/documentation/versioned-docs/?doc_ver=ee4" target="_blank">',
24
+				'<a href="https://eventespresso.com/support/forums/" target="_blank">'
25
+			);
26
+			?>
27 27
         </li>
28 28
         <li>
29 29
             <strong><em><?php esc_html_e('A plugin conflict.', 'event_espresso'); ?></em></strong>
30 30
             <?php
31
-            esc_html_e(
32
-                'You can check to see if there is a plugin conflict by temporarily deactivating all plugins except for Event Espresso. If the problem goes away, then reactivate your plugins one by one until the issue returns. This will help you pinpoint the source of the conflict.',
33
-                'event_espresso'
34
-            );
35
-            ?>
31
+			esc_html_e(
32
+				'You can check to see if there is a plugin conflict by temporarily deactivating all plugins except for Event Espresso. If the problem goes away, then reactivate your plugins one by one until the issue returns. This will help you pinpoint the source of the conflict.',
33
+				'event_espresso'
34
+			);
35
+			?>
36 36
         </li>
37 37
         <li>
38 38
             <strong><em><?php esc_html_e('A theme conflict.', 'event_espresso'); ?></em></strong>
39 39
             <?php
40
-            $default_theme = wp_get_theme(WP_DEFAULT_THEME);
40
+			$default_theme = wp_get_theme(WP_DEFAULT_THEME);
41 41
 
42
-            if ($default_theme->exists()) {
43
-                printf(
44
-                    esc_html__(
45
-                        'If your problem is not a known issue or caused by a plugin, then try activating %s (the default WordPress theme).',
46
-                        'event_espresso'
47
-                    ),
48
-                    $default_theme->get('Name')
49
-                );
50
-            } else {
51
-                esc_html_e(
52
-                    'If your problem is not a known issue or caused by a plugin, then try activating the default WordPress theme.',
53
-                    'event_espresso'
54
-                );
55
-            }
56
-            ?>
42
+			if ($default_theme->exists()) {
43
+				printf(
44
+					esc_html__(
45
+						'If your problem is not a known issue or caused by a plugin, then try activating %s (the default WordPress theme).',
46
+						'event_espresso'
47
+					),
48
+					$default_theme->get('Name')
49
+				);
50
+			} else {
51
+				esc_html_e(
52
+					'If your problem is not a known issue or caused by a plugin, then try activating the default WordPress theme.',
53
+					'event_espresso'
54
+				);
55
+			}
56
+			?>
57 57
             <?php
58
-            esc_html_e(
59
-                'If this solves the problem for you, then something in your theme is causing this issue. Check to see if an update is available for your WordPress theme or reach out to the theme author.',
60
-                'event_espresso'
61
-            );
62
-            ?>
58
+			esc_html_e(
59
+				'If this solves the problem for you, then something in your theme is causing this issue. Check to see if an update is available for your WordPress theme or reach out to the theme author.',
60
+				'event_espresso'
61
+			);
62
+			?>
63 63
         </li>
64 64
     </ol>
65 65
 
66 66
     <p>
67 67
         <?php
68
-        esc_html_e(
69
-            'If none of the suggestions above help you find a solution, then feel free to reach out to the support team at Event Espresso.',
70
-            'event_espresso'
71
-        );
72
-        ?>
68
+		esc_html_e(
69
+			'If none of the suggestions above help you find a solution, then feel free to reach out to the support team at Event Espresso.',
70
+			'event_espresso'
71
+		);
72
+		?>
73 73
     </p>
74 74
     <p>
75 75
         <?php
76
-        printf(
77
-            esc_html__(
78
-                'Login to your account on EventEspresso.com and %1$screate a support post in our member support forums%2$s. Use a %3$sclear and descriptive title%4$s in your support post, %3$sdescribe the issue to the best of your knowledge%4$s, and %3$snever post any sensitive information such as login details%4$s. Be sure to also include %5$simportant information in the section below%2$s about your WordPress site.',
79
-                'event_espresso'
80
-            ),
81
-            '<a href="https://eventespresso.com/support/forums/" target="_blank">',
82
-            '</a>',
83
-            '<strong>',
84
-            '</strong>',
85
-            '<a href="#espresso_important_information_settings">'
86
-        );
87
-        ?>
76
+		printf(
77
+			esc_html__(
78
+				'Login to your account on EventEspresso.com and %1$screate a support post in our member support forums%2$s. Use a %3$sclear and descriptive title%4$s in your support post, %3$sdescribe the issue to the best of your knowledge%4$s, and %3$snever post any sensitive information such as login details%4$s. Be sure to also include %5$simportant information in the section below%2$s about your WordPress site.',
79
+				'event_espresso'
80
+			),
81
+			'<a href="https://eventespresso.com/support/forums/" target="_blank">',
82
+			'</a>',
83
+			'<strong>',
84
+			'</strong>',
85
+			'<a href="#espresso_important_information_settings">'
86
+		);
87
+		?>
88 88
     </p>
89 89
 
90 90
     <h4><?php esc_html_e('Have an emergency?', 'event_espresso'); ?></h4>
91 91
 
92 92
     <p>
93 93
         <?php
94
-        printf(
95
-            esc_html__(
96
-                'We offer support tokens to members that need help with a time-sensitive issue. A support token will provide you with up to 30 minutes of one-on-one time with a team member at Event Espresso. If you have an emergency and need help quickly, then please %1$spurchase a support token%2$s.',
97
-                'event_espresso'
98
-            ),
99
-            '<a href="https://eventespresso.com/product/premium-support-token/?utm_source=ee4_plugin_admin&utm_medium=link&utm_campaign=help_support_tab&utm_content=support_token" target="_blank">',
100
-            '</a>'
101
-        );
102
-        ?>
94
+		printf(
95
+			esc_html__(
96
+				'We offer support tokens to members that need help with a time-sensitive issue. A support token will provide you with up to 30 minutes of one-on-one time with a team member at Event Espresso. If you have an emergency and need help quickly, then please %1$spurchase a support token%2$s.',
97
+				'event_espresso'
98
+			),
99
+			'<a href="https://eventespresso.com/product/premium-support-token/?utm_source=ee4_plugin_admin&utm_medium=link&utm_campaign=help_support_tab&utm_content=support_token" target="_blank">',
100
+			'</a>'
101
+		);
102
+		?>
103 103
     </p>
104 104
 </div>
105 105
\ No newline at end of file
Please login to merge, or discard this patch.
admin_pages/registration_form/Registration_Form_Admin_Page.core.php 2 patches
Spacing   +30 added lines, -30 removed lines patch added patch discarded remove patch
@@ -53,8 +53,8 @@  discard block
 block discarded – undo
53 53
      */
54 54
     public function __construct($routing = true)
55 55
     {
56
-        require_once(EE_MODELS . 'EEM_Question.model.php');
57
-        require_once(EE_MODELS . 'EEM_Question_Group.model.php');
56
+        require_once(EE_MODELS.'EEM_Question.model.php');
57
+        require_once(EE_MODELS.'EEM_Question_Group.model.php');
58 58
         $this->_question_model       = EEM_Question::instance();
59 59
         $this->_question_group_model = EEM_Question_Group::instance();
60 60
         parent::__construct($routing);
@@ -91,7 +91,7 @@  discard block
 block discarded – undo
91 91
      */
92 92
     protected function _set_page_routes()
93 93
     {
94
-        $qst_id             =
94
+        $qst_id =
95 95
             ! empty($this->_req_data['QST_ID'])
96 96
                 ? $this->_req_data['QST_ID']
97 97
                 : 0;
@@ -234,7 +234,7 @@  discard block
 block discarded – undo
234 234
     {
235 235
         wp_register_style(
236 236
             'espresso_registration',
237
-            REGISTRATION_FORM_ASSETS_URL . 'espresso_registration_form_admin.css',
237
+            REGISTRATION_FORM_ASSETS_URL.'espresso_registration_form_admin.css',
238 238
             [],
239 239
             EVENT_ESPRESSO_VERSION
240 240
         );
@@ -291,7 +291,7 @@  discard block
 block discarded – undo
291 291
         $this->load_scripts_styles_forms();
292 292
         wp_register_script(
293 293
             'espresso_registration_form_single',
294
-            REGISTRATION_FORM_ASSETS_URL . 'espresso_registration_form_admin.js',
294
+            REGISTRATION_FORM_ASSETS_URL.'espresso_registration_form_admin.js',
295 295
             ['jquery-ui-sortable'],
296 296
             EVENT_ESPRESSO_VERSION,
297 297
             true
@@ -310,7 +310,7 @@  discard block
 block discarded – undo
310 310
 
311 311
     public function recaptcha_info_help_tab()
312 312
     {
313
-        $template = REGISTRATION_FORM_TEMPLATE_PATH . 'recaptcha_info_help_tab.template.php';
313
+        $template = REGISTRATION_FORM_TEMPLATE_PATH.'recaptcha_info_help_tab.template.php';
314 314
         EEH_Template::display_template($template, []);
315 315
     }
316 316
 
@@ -359,16 +359,16 @@  discard block
 block discarded – undo
359 359
     {
360 360
         $this->_admin_page_title              = esc_html__('Question Groups (Preview)', 'event_espresso');
361 361
         $this->_template_args['preview_img']  =
362
-            '<img src="' . REGISTRATION_FORM_ASSETS_URL . 'caf_reg_form_preview.jpg" alt="'
362
+            '<img src="'.REGISTRATION_FORM_ASSETS_URL.'caf_reg_form_preview.jpg" alt="'
363 363
             . esc_attr__(
364 364
                 'Preview Question Groups Overview List Table screenshot',
365 365
                 'event_espresso'
366
-            ) . '" />';
366
+            ).'" />';
367 367
         $this->_template_args['preview_text'] = '<strong>'
368 368
                                                 . esc_html__(
369 369
                                                     'Question Groups is a feature that is only available in the premium version of Event Espresso 4 which is available with a support license purchase on EventEspresso.com. With the Question Groups feature you are able to create new question groups, edit existing question groups, and create and edit new questions and add them to question groups.',
370 370
                                                     'event_espresso'
371
-                                                ) . '</strong>';
371
+                                                ).'</strong>';
372 372
         $this->display_admin_caf_preview_page('question_groups_tab');
373 373
     }
374 374
 
@@ -387,7 +387,7 @@  discard block
 block discarded – undo
387 387
 
388 388
         // some initial checks for proper values.
389 389
         // if QST_admin_only, then no matter what QST_required is we disable.
390
-        if (! empty($this->_req_data['QST_admin_only'])) {
390
+        if ( ! empty($this->_req_data['QST_admin_only'])) {
391 391
             $this->_req_data['QST_required'] = 0;
392 392
         }
393 393
         // if the question shouldn't have a max length, don't let them set one
@@ -414,19 +414,19 @@  discard block
 block discarded – undo
414 414
                 $QSG_name = isset($this->_req_data['QSG_name'])
415 415
                     ? $this->_req_data['QSG_name']
416 416
                     : '';
417
-                $set_column_values[ $fieldName ] = sanitize_title($QSG_name) . '-' . uniqid('', true);
417
+                $set_column_values[$fieldName] = sanitize_title($QSG_name).'-'.uniqid('', true);
418 418
             } elseif (
419 419
                 $fieldName === 'QST_admin_label'
420 420
                 && (isset($this->_req_data['QST_admin_label']) && empty($this->_req_data['QST_admin_label']))
421 421
             ) {
422 422
                 // the admin label is blank, use a slug version of the question text
423
-                $QST_text                        =
423
+                $QST_text =
424 424
                     isset($this->_req_data['QST_display_text'])
425 425
                         ? $this->_req_data['QST_display_text']
426 426
                         : '';
427
-                $set_column_values[ $fieldName ] = sanitize_title(wp_trim_words($QST_text, 10));
428
-            } elseif ($fieldName === 'QST_admin_only' && (! isset($this->_req_data['QST_admin_only']))) {
429
-                $set_column_values[ $fieldName ] = 0;
427
+                $set_column_values[$fieldName] = sanitize_title(wp_trim_words($QST_text, 10));
428
+            } elseif ($fieldName === 'QST_admin_only' && ( ! isset($this->_req_data['QST_admin_only']))) {
429
+                $set_column_values[$fieldName] = 0;
430 430
             } elseif ($fieldName === 'QST_max') {
431 431
                 $qst_system = EEM_Question::instance()->get_var(
432 432
                     [
@@ -438,23 +438,23 @@  discard block
 block discarded – undo
438 438
                     ],
439 439
                     'QST_system'
440 440
                 );
441
-                $max_max    = EEM_Question::instance()->absolute_max_for_system_question($qst_system);
441
+                $max_max = EEM_Question::instance()->absolute_max_for_system_question($qst_system);
442 442
                 if (
443 443
                     empty($this->_req_data['QST_max']) || $this->_req_data['QST_max'] > $max_max
444 444
                 ) {
445
-                    $set_column_values[ $fieldName ] = $max_max;
445
+                    $set_column_values[$fieldName] = $max_max;
446 446
                 }
447 447
             }
448 448
 
449 449
 
450 450
             // only add a property to the array if it's not null (otherwise the model should just use the default value)
451 451
             if (
452
-                ! isset($set_column_values[ $fieldName ]) && isset($this->_req_data[ $fieldName ])
452
+                ! isset($set_column_values[$fieldName]) && isset($this->_req_data[$fieldName])
453 453
             ) {
454
-                $set_column_values[ $fieldName ] = $this->_req_data[ $fieldName ];
454
+                $set_column_values[$fieldName] = $this->_req_data[$fieldName];
455 455
             }
456 456
         }
457
-        return $set_column_values;// validation fo this data to be performed by the model before insertion.
457
+        return $set_column_values; // validation fo this data to be performed by the model before insertion.
458 458
     }
459 459
 
460 460
 
@@ -496,7 +496,7 @@  discard block
 block discarded – undo
496 496
         // add PRC_ID to title if editing
497 497
         $this->_admin_page_title =
498 498
             $ID
499
-                ? $this->_admin_page_title . ' # ' . $ID
499
+                ? $this->_admin_page_title.' # '.$ID
500 500
                 : $this->_admin_page_title;
501 501
         if ($ID) {
502 502
             $question                 = $this->_question_model->get_one_by_ID($ID);
@@ -532,7 +532,7 @@  discard block
 block discarded – undo
532 532
         $this->_template_args['question_type_descriptions'] = $this->_get_question_type_descriptions();
533 533
         $this->_set_publish_post_box_vars('id', $ID);
534 534
         $this->_template_args['admin_page_content'] = EEH_Template::display_template(
535
-            REGISTRATION_FORM_TEMPLATE_PATH . 'questions_main_meta_box.template.php',
535
+            REGISTRATION_FORM_TEMPLATE_PATH.'questions_main_meta_box.template.php',
536 536
             $this->_template_args,
537 537
             true
538 538
         );
@@ -554,7 +554,7 @@  discard block
 block discarded – undo
554 554
         $question_type_descriptions = EEM_Question::instance()->question_descriptions();
555 555
         foreach ($question_type_descriptions as $type => $question_type_description) {
556 556
             if ($type == 'HTML_TEXTAREA') {
557
-                $html                      = new EE_Simple_HTML_Validation_Strategy();
557
+                $html = new EE_Simple_HTML_Validation_Strategy();
558 558
                 $question_type_description .= sprintf(
559 559
                     esc_html__('%1$s(allowed tags: %2$s)', 'event_espresso'),
560 560
                     '<br/>',
@@ -563,7 +563,7 @@  discard block
 block discarded – undo
563 563
             }
564 564
             $descriptions .= EEH_HTML::p(
565 565
                 $question_type_description,
566
-                'question_type_description-' . $type,
566
+                'question_type_description-'.$type,
567 567
                 'question_type_description description',
568 568
                 'display:none;'
569 569
             );
@@ -598,11 +598,11 @@  discard block
 block discarded – undo
598 598
             // trash removed options, save old ones
599 599
             // get list of all options
600 600
             $options = $question->options();
601
-            if (! empty($options)) {
601
+            if ( ! empty($options)) {
602 602
                 foreach ($options as $option_ID => $option) {
603 603
                     $option_req_index = $this->_get_option_req_data_index($option_ID);
604 604
                     if ($option_req_index !== false) {
605
-                        $option->save($this->_req_data['question_options'][ $option_req_index ]);
605
+                        $option->save($this->_req_data['question_options'][$option_req_index]);
606 606
                     } else {
607 607
                         // not found, remove it
608 608
                         $option->delete();
@@ -693,11 +693,11 @@  discard block
 block discarded – undo
693 693
             (isset($this->_req_data['order']) && ! empty($this->_req_data['order']))
694 694
                 ? $this->_req_data['order']
695 695
                 : 'ASC';
696
-        $orderby_field            =
696
+        $orderby_field =
697 697
             $model instanceof EEM_Question
698 698
                 ? 'QST_ID'
699 699
                 : 'QSG_order';
700
-        $field_to_order_by        =
700
+        $field_to_order_by =
701 701
             empty($this->_req_data['orderby'])
702 702
                 ? $orderby_field
703 703
                 : $this->_req_data['orderby'];
@@ -706,7 +706,7 @@  discard block
 block discarded – undo
706 706
             array_key_exists('s', $this->_req_data)
707 707
                 ? $this->_req_data['s']
708 708
                 : null;
709
-        if (! empty($search_string)) {
709
+        if ( ! empty($search_string)) {
710 710
             if ($model instanceof EEM_Question_Group) {
711 711
                 $query_params[0] = [
712 712
                     'OR' => [
@@ -768,7 +768,7 @@  discard block
 block discarded – undo
768 768
         $QST          = EEM_Question::instance();
769 769
         $query_params = $this->get_query_params($QST, $per_page, $current_page);
770 770
         if ($count) {
771
-            $where   =
771
+            $where =
772 772
                 isset($query_params[0])
773 773
                     ? [$query_params[0]]
774 774
                     : [];
Please login to merge, or discard this patch.
Indentation   +764 added lines, -764 removed lines patch added patch discarded remove patch
@@ -15,707 +15,707 @@  discard block
 block discarded – undo
15 15
  */
16 16
 class Registration_Form_Admin_Page extends EE_Admin_Page
17 17
 {
18
-    /**
19
-     * holds the specific question object for the question details screen
20
-     *
21
-     * @var EE_Question $_question
22
-     */
23
-    protected $_question;
24
-
25
-    /**
26
-     * holds the specific question group object for the question group details screen
27
-     *
28
-     * @var EE_Question_Group $_question_group
29
-     */
30
-    protected $_question_group;
31
-
32
-    /**
33
-     *_question_model EEM_Question model instance (for queries)
34
-     *
35
-     * @var EEM_Question $_question_model ;
36
-     */
37
-    protected $_question_model;
38
-
39
-    /**
40
-     * _question_group_model EEM_Question_group instance (for queries)
41
-     *
42
-     * @var EEM_Question_Group $_question_group_model
43
-     */
44
-    protected $_question_group_model;
45
-
46
-
47
-    /**
48
-     * @Constructor
49
-     * @param bool $routing indicate whether we want to just load the object and handle routing or just load the object.
50
-     * @throws EE_Error
51
-     * @throws ReflectionException
52
-     */
53
-    public function __construct($routing = true)
54
-    {
55
-        require_once(EE_MODELS . 'EEM_Question.model.php');
56
-        require_once(EE_MODELS . 'EEM_Question_Group.model.php');
57
-        $this->_question_model       = EEM_Question::instance();
58
-        $this->_question_group_model = EEM_Question_Group::instance();
59
-        parent::__construct($routing);
60
-    }
61
-
62
-
63
-    protected function _init_page_props()
64
-    {
65
-        $this->page_slug        = REGISTRATION_FORM_PG_SLUG;
66
-        $this->page_label       = esc_html__('Registration Form', 'event_espresso');
67
-        $this->_admin_base_url  = REGISTRATION_FORM_ADMIN_URL;
68
-        $this->_admin_base_path = REGISTRATION_FORM_ADMIN;
69
-    }
70
-
71
-
72
-    protected function _ajax_hooks()
73
-    {
74
-    }
75
-
76
-
77
-    protected function _define_page_props()
78
-    {
79
-        $this->_admin_page_title = esc_html__('Registration Form', 'event_espresso');
80
-        $this->_labels           = [
81
-            'buttons' => [
82
-                'edit_question' => esc_html__('Edit Question', 'event_espresso'),
83
-            ],
84
-        ];
85
-    }
86
-
87
-
88
-    /**
89
-     *_set_page_routes
90
-     */
91
-    protected function _set_page_routes()
92
-    {
93
-        $qst_id             =
94
-            ! empty($this->_req_data['QST_ID'])
95
-                ? $this->_req_data['QST_ID']
96
-                : 0;
97
-        $this->_page_routes = [
98
-            'default' => [
99
-                'func'       => '_questions_overview_list_table',
100
-                'capability' => 'ee_read_questions',
101
-            ],
102
-
103
-            'edit_question' => [
104
-                'func'       => '_edit_question',
105
-                'capability' => 'ee_edit_question',
106
-                'obj_id'     => $qst_id,
107
-                'args'       => ['edit'],
108
-            ],
109
-
110
-            'question_groups' => [
111
-                'func'       => '_questions_groups_preview',
112
-                'capability' => 'ee_read_question_groups',
113
-            ],
114
-
115
-            'update_question' => [
116
-                'func'       => '_insert_or_update_question',
117
-                'args'       => ['new_question' => false],
118
-                'capability' => 'ee_edit_question',
119
-                'obj_id'     => $qst_id,
120
-                'noheader'   => true,
121
-            ],
122
-        ];
123
-    }
124
-
125
-
126
-    protected function _set_page_config()
127
-    {
128
-        $this->_page_config = [
129
-            'default' => [
130
-                'nav'           => [
131
-                    'label' => esc_html__('Questions', 'event_espresso'),
132
-                    'order' => 10,
133
-                ],
134
-                'list_table'    => 'Registration_Form_Questions_Admin_List_Table',
135
-                'metaboxes'     => $this->_default_espresso_metaboxes,
136
-                'help_tabs'     => [
137
-                    'registration_form_questions_overview_help_tab'                           => [
138
-                        'title'    => esc_html__('Questions Overview', 'event_espresso'),
139
-                        'filename' => 'registration_form_questions_overview',
140
-                    ],
141
-                    'registration_form_questions_overview_table_column_headings_help_tab'     => [
142
-                        'title'    => esc_html__('Questions Overview Table Column Headings', 'event_espresso'),
143
-                        'filename' => 'registration_form_questions_overview_table_column_headings',
144
-                    ],
145
-                    'registration_form_questions_overview_views_bulk_actions_search_help_tab' => [
146
-                        'title'    => esc_html__('Question Overview Views & Bulk Actions & Search', 'event_espresso'),
147
-                        'filename' => 'registration_form_questions_overview_views_bulk_actions_search',
148
-                    ],
149
-                ],
150
-                'require_nonce' => false,
151
-                'qtips'         => [
152
-                    'EE_Registration_Form_Tips',
153
-                ]/**/
154
-            ],
155
-
156
-            'question_groups' => [
157
-                'nav'           => [
158
-                    'label' => esc_html__('Question Groups', 'event_espresso'),
159
-                    'order' => 20,
160
-                ],
161
-                'metaboxes'     => $this->_default_espresso_metaboxes,
162
-                'help_tabs'     => [
163
-                    'registration_form_question_groups_help_tab' => [
164
-                        'title'    => esc_html__('Question Groups', 'event_espresso'),
165
-                        'filename' => 'registration_form_question_groups',
166
-                    ],
167
-                ],
168
-                'require_nonce' => false,
169
-            ],
170
-
171
-            'edit_question' => [
172
-                'nav'           => [
173
-                    'label'      => esc_html__('Edit Question', 'event_espresso'),
174
-                    'order'      => 15,
175
-                    'persistent' => false,
176
-                    'url'        => isset($this->_req_data['question_id'])
177
-                        ? add_query_arg(
178
-                            ['question_id' => $this->_req_data['question_id']],
179
-                            $this->_current_page_view_url
180
-                        )
181
-                        : $this->_admin_base_url,
182
-                ],
183
-                'metaboxes'     => array_merge($this->_default_espresso_metaboxes, ['_publish_post_box']),
184
-                'help_tabs'     => [
185
-                    'registration_form_edit_question_group_help_tab' => [
186
-                        'title'    => esc_html__('Edit Question', 'event_espresso'),
187
-                        'filename' => 'registration_form_edit_question',
188
-                    ],
189
-                ],
190
-                'require_nonce' => false,
191
-            ],
192
-        ];
193
-    }
194
-
195
-
196
-    protected function _add_screen_options()
197
-    {
198
-        // todo
199
-    }
200
-
201
-
202
-    protected function _add_screen_options_default()
203
-    {
204
-        $page_title              = $this->_admin_page_title;
205
-        $this->_admin_page_title = esc_html__('Questions', 'event_espresso');
206
-        $this->_per_page_screen_option();
207
-        $this->_admin_page_title = $page_title;
208
-    }
209
-
210
-
211
-    protected function _add_screen_options_question_groups()
212
-    {
213
-        $page_title              = $this->_admin_page_title;
214
-        $this->_admin_page_title = esc_html__('Question Groups', 'event_espresso');
215
-        $this->_per_page_screen_option();
216
-        $this->_admin_page_title = $page_title;
217
-    }
218
-
219
-
220
-    // none of the below group are currently used for Event Categories
221
-    protected function _add_feature_pointers()
222
-    {
223
-    }
224
-
225
-
226
-    public function load_scripts_styles()
227
-    {
228
-        wp_register_style(
229
-            'espresso_registration',
230
-            REGISTRATION_FORM_ASSETS_URL . 'espresso_registration_form_admin.css',
231
-            [],
232
-            EVENT_ESPRESSO_VERSION
233
-        );
234
-        wp_enqueue_style('espresso_registration');
235
-    }
236
-
237
-
238
-    public function admin_init()
239
-    {
240
-    }
241
-
242
-
243
-    public function admin_notices()
244
-    {
245
-    }
246
-
247
-
248
-    public function admin_footer_scripts()
249
-    {
250
-    }
251
-
252
-
253
-    public function load_scripts_styles_default()
254
-    {
255
-    }
256
-
257
-
258
-    /**
259
-     * @throws EE_Error
260
-     */
261
-    public function load_scripts_styles_add_question()
262
-    {
263
-        $this->load_scripts_styles_question_details();
264
-    }
265
-
266
-
267
-    /**
268
-     * @throws EE_Error
269
-     */
270
-    public function load_scripts_styles_edit_question()
271
-    {
272
-        $this->load_scripts_styles_question_details();
273
-    }
274
-
275
-
276
-    /**
277
-     * Loads the JS required for adding or editing a question
278
-     *
279
-     * @throws EE_Error
280
-     * @throws EE_Error
281
-     */
282
-    protected function load_scripts_styles_question_details()
283
-    {
284
-        $this->load_scripts_styles_forms();
285
-        wp_register_script(
286
-            'espresso_registration_form_single',
287
-            REGISTRATION_FORM_ASSETS_URL . 'espresso_registration_form_admin.js',
288
-            ['jquery-ui-sortable'],
289
-            EVENT_ESPRESSO_VERSION,
290
-            true
291
-        );
292
-        wp_enqueue_script('espresso_registration_form_single');
293
-        wp_localize_script(
294
-            'espresso_registration_form_single',
295
-            'ee_question_data',
296
-            [
297
-                'question_types_with_max'    => EEM_Question::instance()->questionTypesWithMaxLength(),
298
-                'question_type_with_options' => EEM_Question::instance()->question_types_with_options(),
299
-            ]
300
-        );
301
-    }
302
-
303
-
304
-    public function recaptcha_info_help_tab()
305
-    {
306
-        $template = REGISTRATION_FORM_TEMPLATE_PATH . 'recaptcha_info_help_tab.template.php';
307
-        EEH_Template::display_template($template, []);
308
-    }
309
-
310
-
311
-    public function load_scripts_styles_forms()
312
-    {
313
-        // styles
314
-        wp_enqueue_style('espresso-ui-theme');
315
-        // scripts
316
-        wp_enqueue_script('ee_admin_js');
317
-    }
318
-
319
-
320
-    protected function _set_list_table_views_default()
321
-    {
322
-        $this->_views = [
323
-            'all' => [
324
-                'slug'  => 'all',
325
-                'label' => esc_html__('View All Questions', 'event_espresso'),
326
-                'count' => 0,
327
-            ],
328
-        ];
329
-
330
-        if (
331
-            EE_Registry::instance()->CAP->current_user_can(
332
-                'ee_delete_questions',
333
-                'espresso_registration_form_trash_questions'
334
-            )
335
-        ) {
336
-            $this->_views['trash'] = [
337
-                'slug'  => 'trash',
338
-                'label' => esc_html__('Trash', 'event_espresso'),
339
-                'count' => 0,
340
-            ];
341
-        }
342
-    }
343
-
344
-
345
-    /**
346
-     * This just previews the question groups tab that comes in caffeinated.
347
-     *
348
-     * @return void html
349
-     * @throws EE_Error
350
-     */
351
-    protected function _questions_groups_preview()
352
-    {
353
-        $this->_admin_page_title              = esc_html__('Question Groups (Preview)', 'event_espresso');
354
-        $this->_template_args['preview_img']  =
355
-            '<img src="' . REGISTRATION_FORM_ASSETS_URL . 'caf_reg_form_preview.jpg" alt="'
356
-            . esc_attr__(
357
-                'Preview Question Groups Overview List Table screenshot',
358
-                'event_espresso'
359
-            ) . '" />';
360
-        $this->_template_args['preview_text'] = '<strong>'
361
-                                                . esc_html__(
362
-                                                    'Question Groups is a feature that is only available in the premium version of Event Espresso 4 which is available with a support license purchase on EventEspresso.com. With the Question Groups feature you are able to create new question groups, edit existing question groups, and create and edit new questions and add them to question groups.',
363
-                                                    'event_espresso'
364
-                                                ) . '</strong>';
365
-        $this->display_admin_caf_preview_page('question_groups_tab');
366
-    }
367
-
368
-
369
-    /**
370
-     * Extracts the question field's values from the POST request to update or insert them
371
-     *
372
-     * @param EEM_Base $model
373
-     * @return array where each key is the name of a model's field/db column, and each value is its value.
374
-     * @throws EE_Error
375
-     */
376
-    protected function _set_column_values_for(EEM_Base $model)
377
-    {
378
-        do_action('AHEE_log', __FILE__, __FUNCTION__, '');
379
-        $set_column_values = [];
380
-
381
-        // some initial checks for proper values.
382
-        // if QST_admin_only, then no matter what QST_required is we disable.
383
-        if (! empty($this->_req_data['QST_admin_only'])) {
384
-            $this->_req_data['QST_required'] = 0;
385
-        }
386
-        // if the question shouldn't have a max length, don't let them set one
387
-        if (
388
-            ! isset(
389
-                $this->_req_data['QST_type'],
390
-                $this->_req_data['QST_max']
391
-            )
392
-            || ! in_array(
393
-                $this->_req_data['QST_type'],
394
-                EEM_Question::instance()->questionTypesWithMaxLength(),
395
-                true
396
-            )
397
-        ) {
398
-            // they're not allowed to set the max
399
-            $this->_req_data['QST_max'] = null;
400
-        }
401
-        foreach ($model->field_settings() as $fieldName => $settings) {
402
-            // basically if QSG_identifier is empty or not set
403
-            if (
404
-                $fieldName === 'QSG_identifier'
405
-                && (isset($this->_req_data['QSG_identifier']) && empty($this->_req_data['QSG_identifier']))
406
-            ) {
407
-                $QSG_name = isset($this->_req_data['QSG_name'])
408
-                    ? $this->_req_data['QSG_name']
409
-                    : '';
410
-                $set_column_values[ $fieldName ] = sanitize_title($QSG_name) . '-' . uniqid('', true);
411
-            } elseif (
412
-                $fieldName === 'QST_admin_label'
413
-                && (isset($this->_req_data['QST_admin_label']) && empty($this->_req_data['QST_admin_label']))
414
-            ) {
415
-                // the admin label is blank, use a slug version of the question text
416
-                $QST_text                        =
417
-                    isset($this->_req_data['QST_display_text'])
418
-                        ? $this->_req_data['QST_display_text']
419
-                        : '';
420
-                $set_column_values[ $fieldName ] = sanitize_title(wp_trim_words($QST_text, 10));
421
-            } elseif ($fieldName === 'QST_admin_only' && (! isset($this->_req_data['QST_admin_only']))) {
422
-                $set_column_values[ $fieldName ] = 0;
423
-            } elseif ($fieldName === 'QST_max') {
424
-                $qst_system = EEM_Question::instance()->get_var(
425
-                    [
426
-                        [
427
-                            'QST_ID' => isset($this->_req_data['QST_ID'])
428
-                                ? $this->_req_data['QST_ID']
429
-                                : 0,
430
-                        ],
431
-                    ],
432
-                    'QST_system'
433
-                );
434
-                $max_max    = EEM_Question::instance()->absolute_max_for_system_question($qst_system);
435
-                if (
436
-                    empty($this->_req_data['QST_max']) || $this->_req_data['QST_max'] > $max_max
437
-                ) {
438
-                    $set_column_values[ $fieldName ] = $max_max;
439
-                }
440
-            }
441
-
442
-
443
-            // only add a property to the array if it's not null (otherwise the model should just use the default value)
444
-            if (
445
-                ! isset($set_column_values[ $fieldName ]) && isset($this->_req_data[ $fieldName ])
446
-            ) {
447
-                $set_column_values[ $fieldName ] = $this->_req_data[ $fieldName ];
448
-            }
449
-        }
450
-        return $set_column_values;// validation fo this data to be performed by the model before insertion.
451
-    }
452
-
453
-
454
-    /**
455
-     *_questions_overview_list_table
456
-     *
457
-     * @throws EE_Error
458
-     */
459
-    protected function _questions_overview_list_table()
460
-    {
461
-        $this->_search_btn_label = esc_html__('Questions', 'event_espresso');
462
-        $this->display_admin_list_table_page_with_sidebar();
463
-    }
464
-
465
-
466
-    /**
467
-     * _edit_question
468
-     *
469
-     * @throws EE_Error
470
-     * @throws ReflectionException
471
-     */
472
-    protected function _edit_question()
473
-    {
474
-        $ID = isset($this->_req_data['QST_ID']) && ! empty($this->_req_data['QST_ID'])
475
-            ? absint($this->_req_data['QST_ID'])
476
-            : false;
477
-
478
-        switch ($this->_req_action) {
479
-            case 'add_question':
480
-                $this->_admin_page_title = esc_html__('Add Question', 'event_espresso');
481
-                break;
482
-            case 'edit_question':
483
-                $this->_admin_page_title = esc_html__('Edit Question', 'event_espresso');
484
-                break;
485
-            default:
486
-                $this->_admin_page_title = ucwords(str_replace('_', ' ', $this->_req_action));
487
-        }
488
-
489
-        // add PRC_ID to title if editing
490
-        $this->_admin_page_title =
491
-            $ID
492
-                ? $this->_admin_page_title . ' # ' . $ID
493
-                : $this->_admin_page_title;
494
-        if ($ID) {
495
-            $question                 = $this->_question_model->get_one_by_ID($ID);
496
-            $additional_hidden_fields = ['QST_ID' => ['type' => 'hidden', 'value' => $ID]];
497
-            $this->_set_add_edit_form_tags('update_question', $additional_hidden_fields);
498
-        } else {
499
-            $question = EE_Question::new_instance();
500
-            $question->set_order_to_latest();
501
-            $this->_set_add_edit_form_tags('insert_question');
502
-        }
503
-        if ($question->system_ID() === EEM_Attendee::system_question_phone) {
504
-            $question_types = array_intersect_key(
505
-                EEM_Question::instance()->allowed_question_types(),
506
-                array_flip(
507
-                    [
508
-                        EEM_Question::QST_type_text,
509
-                        EEM_Question::QST_type_us_phone,
510
-                    ]
511
-                )
512
-            );
513
-        } else {
514
-            $question_types = $question->has_answers()
515
-                ? $this->_question_model->question_types_in_same_category($question->type())
516
-                : $this->_question_model->allowed_question_types();
517
-        }
518
-        $this->_template_args['QST_ID']                     = $ID;
519
-        $this->_template_args['question']                   = $question;
520
-        $this->_template_args['question_types']             = $question_types;
521
-        $this->_template_args['max_max']                    =
522
-            EEM_Question::instance()->absolute_max_for_system_question(
523
-                $question->system_ID()
524
-            );
525
-        $this->_template_args['question_type_descriptions'] = $this->_get_question_type_descriptions();
526
-        $this->_set_publish_post_box_vars('id', $ID);
527
-        $this->_template_args['admin_page_content'] = EEH_Template::display_template(
528
-            REGISTRATION_FORM_TEMPLATE_PATH . 'questions_main_meta_box.template.php',
529
-            $this->_template_args,
530
-            true
531
-        );
532
-
533
-        // the details template wrapper
534
-        $this->display_admin_page_with_sidebar();
535
-    }
536
-
537
-
538
-    /**
539
-     * @return string
540
-     * @throws EE_Error
541
-     * @throws ReflectionException
542
-     */
543
-    protected function _get_question_type_descriptions()
544
-    {
545
-        EE_Registry::instance()->load_helper('HTML');
546
-        $descriptions               = '';
547
-        $question_type_descriptions = EEM_Question::instance()->question_descriptions();
548
-        foreach ($question_type_descriptions as $type => $question_type_description) {
549
-            if ($type == 'HTML_TEXTAREA') {
550
-                $html                      = new EE_Simple_HTML_Validation_Strategy();
551
-                $question_type_description .= sprintf(
552
-                    esc_html__('%1$s(allowed tags: %2$s)', 'event_espresso'),
553
-                    '<br/>',
554
-                    $html->get_list_of_allowed_tags()
555
-                );
556
-            }
557
-            $descriptions .= EEH_HTML::p(
558
-                $question_type_description,
559
-                'question_type_description-' . $type,
560
-                'question_type_description description',
561
-                'display:none;'
562
-            );
563
-        }
564
-        return $descriptions;
565
-    }
566
-
567
-
568
-    /**
569
-     * @param bool|true $new_question
570
-     * @throws EE_Error
571
-     * @throws ReflectionException
572
-     */
573
-    protected function _insert_or_update_question($new_question = true)
574
-    {
575
-        do_action('AHEE_log', __FILE__, __FUNCTION__, '');
576
-        $set_column_values = $this->_set_column_values_for($this->_question_model);
577
-        if ($new_question) {
578
-            $question    = EE_Question::new_instance($set_column_values);
579
-            $action_desc = 'added';
580
-        } else {
581
-            $question = EEM_Question::instance()->get_one_by_ID(absint($this->_req_data['QST_ID']));
582
-            foreach ($set_column_values as $field => $new_value) {
583
-                $question->set($field, $new_value);
584
-            }
585
-            $action_desc = 'updated';
586
-        }
587
-        $success = $question->save();
588
-        $ID      = $question->ID();
589
-        if ($ID && $question->should_have_question_options()) {
590
-            // save the related options
591
-            // trash removed options, save old ones
592
-            // get list of all options
593
-            $options = $question->options();
594
-            if (! empty($options)) {
595
-                foreach ($options as $option_ID => $option) {
596
-                    $option_req_index = $this->_get_option_req_data_index($option_ID);
597
-                    if ($option_req_index !== false) {
598
-                        $option->save($this->_req_data['question_options'][ $option_req_index ]);
599
-                    } else {
600
-                        // not found, remove it
601
-                        $option->delete();
602
-                    }
603
-                }
604
-            }
605
-            // save new related options
606
-            foreach ($this->_req_data['question_options'] as $index => $option_req_data) {
607
-                // skip $index that is from our sample
608
-                if ($index === 'xxcountxx') {
609
-                    continue;
610
-                }
611
-                // note we allow saving blank options.
612
-                if (empty($option_req_data['QSO_ID'])) {
613
-                    // no ID! save it!
614
-                    $new_option = EE_Question_Option::new_instance(
615
-                        [
616
-                            'QSO_value' => $option_req_data['QSO_value'],
617
-                            'QSO_desc'  => $option_req_data['QSO_desc'],
618
-                            'QSO_order' => $option_req_data['QSO_order'],
619
-                            'QST_ID'    => $question->ID(),
620
-                        ]
621
-                    );
622
-                    $new_option->save();
623
-                }
624
-            }
625
-        }
626
-        $query_args = ['action' => 'edit_question', 'QST_ID' => $ID];
627
-        if ($success !== 0) {
628
-            $msg = $new_question
629
-                ? sprintf(
630
-                    esc_html__('The %s has been created', 'event_espresso'),
631
-                    $this->_question_model->item_name()
632
-                )
633
-                : sprintf(
634
-                    esc_html__('The %s has been updated', 'event_espresso'),
635
-                    $this->_question_model->item_name()
636
-                );
637
-            EE_Error::add_success($msg);
638
-        }
639
-
640
-        $this->_redirect_after_action(false, '', $action_desc, $query_args, true);
641
-    }
642
-
643
-
644
-    /**
645
-     * Upon saving a question, there should be an array of 'question_options'. This array is index numerically, but not
646
-     * by ID
647
-     * (this is done because new question options don't have an ID, but we may want to add multiple simultaneously).
648
-     * So, this function gets the index in that request data array called question_options. Returns FALSE if not found.
649
-     *
650
-     * @param int $ID of the question option to find
651
-     * @return int index in question_options array if successful, FALSE if unsuccessful
652
-     */
653
-    protected function _get_option_req_data_index($ID)
654
-    {
655
-        $req_data_for_question_options = $this->_req_data['question_options'];
656
-        foreach ($req_data_for_question_options as $num => $option_data) {
657
-            if (array_key_exists('QSO_ID', $option_data) && (int) $option_data['QSO_ID'] === $ID) {
658
-                return $num;
659
-            }
660
-        }
661
-        return false;
662
-    }
663
-
664
-
665
-
666
-
667
-    /***********/
668
-    /* QUERIES */
669
-    /**
670
-     * For internal use in getting all the query parameters
671
-     * (because it's pretty well the same between question, question groups,
672
-     * and for both when searching for trashed and untrashed ones)
673
-     *
674
-     * @param EEM_Base $model either EEM_Question or EEM_Question_Group
675
-     * @param int      $per_page
676
-     * @param int      $current_page
677
-     * @return array model query params, @see
678
-     *               https://github.com/eventespresso/event-espresso-core/tree/master/docs/G--Model-System/model-query-params.md
679
-     */
680
-    protected function get_query_params($model, $per_page = 10, $current_page = 10)
681
-    {
682
-        $query_params             = [];
683
-        $offset                   = ($current_page - 1) * $per_page;
684
-        $query_params['limit']    = [$offset, $per_page];
685
-        $order                    =
686
-            (isset($this->_req_data['order']) && ! empty($this->_req_data['order']))
687
-                ? $this->_req_data['order']
688
-                : 'ASC';
689
-        $orderby_field            =
690
-            $model instanceof EEM_Question
691
-                ? 'QST_ID'
692
-                : 'QSG_order';
693
-        $field_to_order_by        =
694
-            empty($this->_req_data['orderby'])
695
-                ? $orderby_field
696
-                : $this->_req_data['orderby'];
697
-        $query_params['order_by'] = [$field_to_order_by => $order];
698
-        $search_string            =
699
-            array_key_exists('s', $this->_req_data)
700
-                ? $this->_req_data['s']
701
-                : null;
702
-        if (! empty($search_string)) {
703
-            if ($model instanceof EEM_Question_Group) {
704
-                $query_params[0] = [
705
-                    'OR' => [
706
-                        'QSG_name' => ['LIKE', "%$search_string%"],
707
-                        'QSG_desc' => ['LIKE', "%$search_string%"],
708
-                    ],
709
-                ];
710
-            } else {
711
-                $query_params[0] = [
712
-                    'QST_display_text' => ['LIKE', "%$search_string%"],
713
-                ];
714
-            }
715
-        }
716
-
717
-        // capability checks (just leaving this commented out for reference because it illustrates some complicated query params that could be useful when fully implemented)
718
-        /*if ( $model instanceof EEM_Question_Group ) {
18
+	/**
19
+	 * holds the specific question object for the question details screen
20
+	 *
21
+	 * @var EE_Question $_question
22
+	 */
23
+	protected $_question;
24
+
25
+	/**
26
+	 * holds the specific question group object for the question group details screen
27
+	 *
28
+	 * @var EE_Question_Group $_question_group
29
+	 */
30
+	protected $_question_group;
31
+
32
+	/**
33
+	 *_question_model EEM_Question model instance (for queries)
34
+	 *
35
+	 * @var EEM_Question $_question_model ;
36
+	 */
37
+	protected $_question_model;
38
+
39
+	/**
40
+	 * _question_group_model EEM_Question_group instance (for queries)
41
+	 *
42
+	 * @var EEM_Question_Group $_question_group_model
43
+	 */
44
+	protected $_question_group_model;
45
+
46
+
47
+	/**
48
+	 * @Constructor
49
+	 * @param bool $routing indicate whether we want to just load the object and handle routing or just load the object.
50
+	 * @throws EE_Error
51
+	 * @throws ReflectionException
52
+	 */
53
+	public function __construct($routing = true)
54
+	{
55
+		require_once(EE_MODELS . 'EEM_Question.model.php');
56
+		require_once(EE_MODELS . 'EEM_Question_Group.model.php');
57
+		$this->_question_model       = EEM_Question::instance();
58
+		$this->_question_group_model = EEM_Question_Group::instance();
59
+		parent::__construct($routing);
60
+	}
61
+
62
+
63
+	protected function _init_page_props()
64
+	{
65
+		$this->page_slug        = REGISTRATION_FORM_PG_SLUG;
66
+		$this->page_label       = esc_html__('Registration Form', 'event_espresso');
67
+		$this->_admin_base_url  = REGISTRATION_FORM_ADMIN_URL;
68
+		$this->_admin_base_path = REGISTRATION_FORM_ADMIN;
69
+	}
70
+
71
+
72
+	protected function _ajax_hooks()
73
+	{
74
+	}
75
+
76
+
77
+	protected function _define_page_props()
78
+	{
79
+		$this->_admin_page_title = esc_html__('Registration Form', 'event_espresso');
80
+		$this->_labels           = [
81
+			'buttons' => [
82
+				'edit_question' => esc_html__('Edit Question', 'event_espresso'),
83
+			],
84
+		];
85
+	}
86
+
87
+
88
+	/**
89
+	 *_set_page_routes
90
+	 */
91
+	protected function _set_page_routes()
92
+	{
93
+		$qst_id             =
94
+			! empty($this->_req_data['QST_ID'])
95
+				? $this->_req_data['QST_ID']
96
+				: 0;
97
+		$this->_page_routes = [
98
+			'default' => [
99
+				'func'       => '_questions_overview_list_table',
100
+				'capability' => 'ee_read_questions',
101
+			],
102
+
103
+			'edit_question' => [
104
+				'func'       => '_edit_question',
105
+				'capability' => 'ee_edit_question',
106
+				'obj_id'     => $qst_id,
107
+				'args'       => ['edit'],
108
+			],
109
+
110
+			'question_groups' => [
111
+				'func'       => '_questions_groups_preview',
112
+				'capability' => 'ee_read_question_groups',
113
+			],
114
+
115
+			'update_question' => [
116
+				'func'       => '_insert_or_update_question',
117
+				'args'       => ['new_question' => false],
118
+				'capability' => 'ee_edit_question',
119
+				'obj_id'     => $qst_id,
120
+				'noheader'   => true,
121
+			],
122
+		];
123
+	}
124
+
125
+
126
+	protected function _set_page_config()
127
+	{
128
+		$this->_page_config = [
129
+			'default' => [
130
+				'nav'           => [
131
+					'label' => esc_html__('Questions', 'event_espresso'),
132
+					'order' => 10,
133
+				],
134
+				'list_table'    => 'Registration_Form_Questions_Admin_List_Table',
135
+				'metaboxes'     => $this->_default_espresso_metaboxes,
136
+				'help_tabs'     => [
137
+					'registration_form_questions_overview_help_tab'                           => [
138
+						'title'    => esc_html__('Questions Overview', 'event_espresso'),
139
+						'filename' => 'registration_form_questions_overview',
140
+					],
141
+					'registration_form_questions_overview_table_column_headings_help_tab'     => [
142
+						'title'    => esc_html__('Questions Overview Table Column Headings', 'event_espresso'),
143
+						'filename' => 'registration_form_questions_overview_table_column_headings',
144
+					],
145
+					'registration_form_questions_overview_views_bulk_actions_search_help_tab' => [
146
+						'title'    => esc_html__('Question Overview Views & Bulk Actions & Search', 'event_espresso'),
147
+						'filename' => 'registration_form_questions_overview_views_bulk_actions_search',
148
+					],
149
+				],
150
+				'require_nonce' => false,
151
+				'qtips'         => [
152
+					'EE_Registration_Form_Tips',
153
+				]/**/
154
+			],
155
+
156
+			'question_groups' => [
157
+				'nav'           => [
158
+					'label' => esc_html__('Question Groups', 'event_espresso'),
159
+					'order' => 20,
160
+				],
161
+				'metaboxes'     => $this->_default_espresso_metaboxes,
162
+				'help_tabs'     => [
163
+					'registration_form_question_groups_help_tab' => [
164
+						'title'    => esc_html__('Question Groups', 'event_espresso'),
165
+						'filename' => 'registration_form_question_groups',
166
+					],
167
+				],
168
+				'require_nonce' => false,
169
+			],
170
+
171
+			'edit_question' => [
172
+				'nav'           => [
173
+					'label'      => esc_html__('Edit Question', 'event_espresso'),
174
+					'order'      => 15,
175
+					'persistent' => false,
176
+					'url'        => isset($this->_req_data['question_id'])
177
+						? add_query_arg(
178
+							['question_id' => $this->_req_data['question_id']],
179
+							$this->_current_page_view_url
180
+						)
181
+						: $this->_admin_base_url,
182
+				],
183
+				'metaboxes'     => array_merge($this->_default_espresso_metaboxes, ['_publish_post_box']),
184
+				'help_tabs'     => [
185
+					'registration_form_edit_question_group_help_tab' => [
186
+						'title'    => esc_html__('Edit Question', 'event_espresso'),
187
+						'filename' => 'registration_form_edit_question',
188
+					],
189
+				],
190
+				'require_nonce' => false,
191
+			],
192
+		];
193
+	}
194
+
195
+
196
+	protected function _add_screen_options()
197
+	{
198
+		// todo
199
+	}
200
+
201
+
202
+	protected function _add_screen_options_default()
203
+	{
204
+		$page_title              = $this->_admin_page_title;
205
+		$this->_admin_page_title = esc_html__('Questions', 'event_espresso');
206
+		$this->_per_page_screen_option();
207
+		$this->_admin_page_title = $page_title;
208
+	}
209
+
210
+
211
+	protected function _add_screen_options_question_groups()
212
+	{
213
+		$page_title              = $this->_admin_page_title;
214
+		$this->_admin_page_title = esc_html__('Question Groups', 'event_espresso');
215
+		$this->_per_page_screen_option();
216
+		$this->_admin_page_title = $page_title;
217
+	}
218
+
219
+
220
+	// none of the below group are currently used for Event Categories
221
+	protected function _add_feature_pointers()
222
+	{
223
+	}
224
+
225
+
226
+	public function load_scripts_styles()
227
+	{
228
+		wp_register_style(
229
+			'espresso_registration',
230
+			REGISTRATION_FORM_ASSETS_URL . 'espresso_registration_form_admin.css',
231
+			[],
232
+			EVENT_ESPRESSO_VERSION
233
+		);
234
+		wp_enqueue_style('espresso_registration');
235
+	}
236
+
237
+
238
+	public function admin_init()
239
+	{
240
+	}
241
+
242
+
243
+	public function admin_notices()
244
+	{
245
+	}
246
+
247
+
248
+	public function admin_footer_scripts()
249
+	{
250
+	}
251
+
252
+
253
+	public function load_scripts_styles_default()
254
+	{
255
+	}
256
+
257
+
258
+	/**
259
+	 * @throws EE_Error
260
+	 */
261
+	public function load_scripts_styles_add_question()
262
+	{
263
+		$this->load_scripts_styles_question_details();
264
+	}
265
+
266
+
267
+	/**
268
+	 * @throws EE_Error
269
+	 */
270
+	public function load_scripts_styles_edit_question()
271
+	{
272
+		$this->load_scripts_styles_question_details();
273
+	}
274
+
275
+
276
+	/**
277
+	 * Loads the JS required for adding or editing a question
278
+	 *
279
+	 * @throws EE_Error
280
+	 * @throws EE_Error
281
+	 */
282
+	protected function load_scripts_styles_question_details()
283
+	{
284
+		$this->load_scripts_styles_forms();
285
+		wp_register_script(
286
+			'espresso_registration_form_single',
287
+			REGISTRATION_FORM_ASSETS_URL . 'espresso_registration_form_admin.js',
288
+			['jquery-ui-sortable'],
289
+			EVENT_ESPRESSO_VERSION,
290
+			true
291
+		);
292
+		wp_enqueue_script('espresso_registration_form_single');
293
+		wp_localize_script(
294
+			'espresso_registration_form_single',
295
+			'ee_question_data',
296
+			[
297
+				'question_types_with_max'    => EEM_Question::instance()->questionTypesWithMaxLength(),
298
+				'question_type_with_options' => EEM_Question::instance()->question_types_with_options(),
299
+			]
300
+		);
301
+	}
302
+
303
+
304
+	public function recaptcha_info_help_tab()
305
+	{
306
+		$template = REGISTRATION_FORM_TEMPLATE_PATH . 'recaptcha_info_help_tab.template.php';
307
+		EEH_Template::display_template($template, []);
308
+	}
309
+
310
+
311
+	public function load_scripts_styles_forms()
312
+	{
313
+		// styles
314
+		wp_enqueue_style('espresso-ui-theme');
315
+		// scripts
316
+		wp_enqueue_script('ee_admin_js');
317
+	}
318
+
319
+
320
+	protected function _set_list_table_views_default()
321
+	{
322
+		$this->_views = [
323
+			'all' => [
324
+				'slug'  => 'all',
325
+				'label' => esc_html__('View All Questions', 'event_espresso'),
326
+				'count' => 0,
327
+			],
328
+		];
329
+
330
+		if (
331
+			EE_Registry::instance()->CAP->current_user_can(
332
+				'ee_delete_questions',
333
+				'espresso_registration_form_trash_questions'
334
+			)
335
+		) {
336
+			$this->_views['trash'] = [
337
+				'slug'  => 'trash',
338
+				'label' => esc_html__('Trash', 'event_espresso'),
339
+				'count' => 0,
340
+			];
341
+		}
342
+	}
343
+
344
+
345
+	/**
346
+	 * This just previews the question groups tab that comes in caffeinated.
347
+	 *
348
+	 * @return void html
349
+	 * @throws EE_Error
350
+	 */
351
+	protected function _questions_groups_preview()
352
+	{
353
+		$this->_admin_page_title              = esc_html__('Question Groups (Preview)', 'event_espresso');
354
+		$this->_template_args['preview_img']  =
355
+			'<img src="' . REGISTRATION_FORM_ASSETS_URL . 'caf_reg_form_preview.jpg" alt="'
356
+			. esc_attr__(
357
+				'Preview Question Groups Overview List Table screenshot',
358
+				'event_espresso'
359
+			) . '" />';
360
+		$this->_template_args['preview_text'] = '<strong>'
361
+												. esc_html__(
362
+													'Question Groups is a feature that is only available in the premium version of Event Espresso 4 which is available with a support license purchase on EventEspresso.com. With the Question Groups feature you are able to create new question groups, edit existing question groups, and create and edit new questions and add them to question groups.',
363
+													'event_espresso'
364
+												) . '</strong>';
365
+		$this->display_admin_caf_preview_page('question_groups_tab');
366
+	}
367
+
368
+
369
+	/**
370
+	 * Extracts the question field's values from the POST request to update or insert them
371
+	 *
372
+	 * @param EEM_Base $model
373
+	 * @return array where each key is the name of a model's field/db column, and each value is its value.
374
+	 * @throws EE_Error
375
+	 */
376
+	protected function _set_column_values_for(EEM_Base $model)
377
+	{
378
+		do_action('AHEE_log', __FILE__, __FUNCTION__, '');
379
+		$set_column_values = [];
380
+
381
+		// some initial checks for proper values.
382
+		// if QST_admin_only, then no matter what QST_required is we disable.
383
+		if (! empty($this->_req_data['QST_admin_only'])) {
384
+			$this->_req_data['QST_required'] = 0;
385
+		}
386
+		// if the question shouldn't have a max length, don't let them set one
387
+		if (
388
+			! isset(
389
+				$this->_req_data['QST_type'],
390
+				$this->_req_data['QST_max']
391
+			)
392
+			|| ! in_array(
393
+				$this->_req_data['QST_type'],
394
+				EEM_Question::instance()->questionTypesWithMaxLength(),
395
+				true
396
+			)
397
+		) {
398
+			// they're not allowed to set the max
399
+			$this->_req_data['QST_max'] = null;
400
+		}
401
+		foreach ($model->field_settings() as $fieldName => $settings) {
402
+			// basically if QSG_identifier is empty or not set
403
+			if (
404
+				$fieldName === 'QSG_identifier'
405
+				&& (isset($this->_req_data['QSG_identifier']) && empty($this->_req_data['QSG_identifier']))
406
+			) {
407
+				$QSG_name = isset($this->_req_data['QSG_name'])
408
+					? $this->_req_data['QSG_name']
409
+					: '';
410
+				$set_column_values[ $fieldName ] = sanitize_title($QSG_name) . '-' . uniqid('', true);
411
+			} elseif (
412
+				$fieldName === 'QST_admin_label'
413
+				&& (isset($this->_req_data['QST_admin_label']) && empty($this->_req_data['QST_admin_label']))
414
+			) {
415
+				// the admin label is blank, use a slug version of the question text
416
+				$QST_text                        =
417
+					isset($this->_req_data['QST_display_text'])
418
+						? $this->_req_data['QST_display_text']
419
+						: '';
420
+				$set_column_values[ $fieldName ] = sanitize_title(wp_trim_words($QST_text, 10));
421
+			} elseif ($fieldName === 'QST_admin_only' && (! isset($this->_req_data['QST_admin_only']))) {
422
+				$set_column_values[ $fieldName ] = 0;
423
+			} elseif ($fieldName === 'QST_max') {
424
+				$qst_system = EEM_Question::instance()->get_var(
425
+					[
426
+						[
427
+							'QST_ID' => isset($this->_req_data['QST_ID'])
428
+								? $this->_req_data['QST_ID']
429
+								: 0,
430
+						],
431
+					],
432
+					'QST_system'
433
+				);
434
+				$max_max    = EEM_Question::instance()->absolute_max_for_system_question($qst_system);
435
+				if (
436
+					empty($this->_req_data['QST_max']) || $this->_req_data['QST_max'] > $max_max
437
+				) {
438
+					$set_column_values[ $fieldName ] = $max_max;
439
+				}
440
+			}
441
+
442
+
443
+			// only add a property to the array if it's not null (otherwise the model should just use the default value)
444
+			if (
445
+				! isset($set_column_values[ $fieldName ]) && isset($this->_req_data[ $fieldName ])
446
+			) {
447
+				$set_column_values[ $fieldName ] = $this->_req_data[ $fieldName ];
448
+			}
449
+		}
450
+		return $set_column_values;// validation fo this data to be performed by the model before insertion.
451
+	}
452
+
453
+
454
+	/**
455
+	 *_questions_overview_list_table
456
+	 *
457
+	 * @throws EE_Error
458
+	 */
459
+	protected function _questions_overview_list_table()
460
+	{
461
+		$this->_search_btn_label = esc_html__('Questions', 'event_espresso');
462
+		$this->display_admin_list_table_page_with_sidebar();
463
+	}
464
+
465
+
466
+	/**
467
+	 * _edit_question
468
+	 *
469
+	 * @throws EE_Error
470
+	 * @throws ReflectionException
471
+	 */
472
+	protected function _edit_question()
473
+	{
474
+		$ID = isset($this->_req_data['QST_ID']) && ! empty($this->_req_data['QST_ID'])
475
+			? absint($this->_req_data['QST_ID'])
476
+			: false;
477
+
478
+		switch ($this->_req_action) {
479
+			case 'add_question':
480
+				$this->_admin_page_title = esc_html__('Add Question', 'event_espresso');
481
+				break;
482
+			case 'edit_question':
483
+				$this->_admin_page_title = esc_html__('Edit Question', 'event_espresso');
484
+				break;
485
+			default:
486
+				$this->_admin_page_title = ucwords(str_replace('_', ' ', $this->_req_action));
487
+		}
488
+
489
+		// add PRC_ID to title if editing
490
+		$this->_admin_page_title =
491
+			$ID
492
+				? $this->_admin_page_title . ' # ' . $ID
493
+				: $this->_admin_page_title;
494
+		if ($ID) {
495
+			$question                 = $this->_question_model->get_one_by_ID($ID);
496
+			$additional_hidden_fields = ['QST_ID' => ['type' => 'hidden', 'value' => $ID]];
497
+			$this->_set_add_edit_form_tags('update_question', $additional_hidden_fields);
498
+		} else {
499
+			$question = EE_Question::new_instance();
500
+			$question->set_order_to_latest();
501
+			$this->_set_add_edit_form_tags('insert_question');
502
+		}
503
+		if ($question->system_ID() === EEM_Attendee::system_question_phone) {
504
+			$question_types = array_intersect_key(
505
+				EEM_Question::instance()->allowed_question_types(),
506
+				array_flip(
507
+					[
508
+						EEM_Question::QST_type_text,
509
+						EEM_Question::QST_type_us_phone,
510
+					]
511
+				)
512
+			);
513
+		} else {
514
+			$question_types = $question->has_answers()
515
+				? $this->_question_model->question_types_in_same_category($question->type())
516
+				: $this->_question_model->allowed_question_types();
517
+		}
518
+		$this->_template_args['QST_ID']                     = $ID;
519
+		$this->_template_args['question']                   = $question;
520
+		$this->_template_args['question_types']             = $question_types;
521
+		$this->_template_args['max_max']                    =
522
+			EEM_Question::instance()->absolute_max_for_system_question(
523
+				$question->system_ID()
524
+			);
525
+		$this->_template_args['question_type_descriptions'] = $this->_get_question_type_descriptions();
526
+		$this->_set_publish_post_box_vars('id', $ID);
527
+		$this->_template_args['admin_page_content'] = EEH_Template::display_template(
528
+			REGISTRATION_FORM_TEMPLATE_PATH . 'questions_main_meta_box.template.php',
529
+			$this->_template_args,
530
+			true
531
+		);
532
+
533
+		// the details template wrapper
534
+		$this->display_admin_page_with_sidebar();
535
+	}
536
+
537
+
538
+	/**
539
+	 * @return string
540
+	 * @throws EE_Error
541
+	 * @throws ReflectionException
542
+	 */
543
+	protected function _get_question_type_descriptions()
544
+	{
545
+		EE_Registry::instance()->load_helper('HTML');
546
+		$descriptions               = '';
547
+		$question_type_descriptions = EEM_Question::instance()->question_descriptions();
548
+		foreach ($question_type_descriptions as $type => $question_type_description) {
549
+			if ($type == 'HTML_TEXTAREA') {
550
+				$html                      = new EE_Simple_HTML_Validation_Strategy();
551
+				$question_type_description .= sprintf(
552
+					esc_html__('%1$s(allowed tags: %2$s)', 'event_espresso'),
553
+					'<br/>',
554
+					$html->get_list_of_allowed_tags()
555
+				);
556
+			}
557
+			$descriptions .= EEH_HTML::p(
558
+				$question_type_description,
559
+				'question_type_description-' . $type,
560
+				'question_type_description description',
561
+				'display:none;'
562
+			);
563
+		}
564
+		return $descriptions;
565
+	}
566
+
567
+
568
+	/**
569
+	 * @param bool|true $new_question
570
+	 * @throws EE_Error
571
+	 * @throws ReflectionException
572
+	 */
573
+	protected function _insert_or_update_question($new_question = true)
574
+	{
575
+		do_action('AHEE_log', __FILE__, __FUNCTION__, '');
576
+		$set_column_values = $this->_set_column_values_for($this->_question_model);
577
+		if ($new_question) {
578
+			$question    = EE_Question::new_instance($set_column_values);
579
+			$action_desc = 'added';
580
+		} else {
581
+			$question = EEM_Question::instance()->get_one_by_ID(absint($this->_req_data['QST_ID']));
582
+			foreach ($set_column_values as $field => $new_value) {
583
+				$question->set($field, $new_value);
584
+			}
585
+			$action_desc = 'updated';
586
+		}
587
+		$success = $question->save();
588
+		$ID      = $question->ID();
589
+		if ($ID && $question->should_have_question_options()) {
590
+			// save the related options
591
+			// trash removed options, save old ones
592
+			// get list of all options
593
+			$options = $question->options();
594
+			if (! empty($options)) {
595
+				foreach ($options as $option_ID => $option) {
596
+					$option_req_index = $this->_get_option_req_data_index($option_ID);
597
+					if ($option_req_index !== false) {
598
+						$option->save($this->_req_data['question_options'][ $option_req_index ]);
599
+					} else {
600
+						// not found, remove it
601
+						$option->delete();
602
+					}
603
+				}
604
+			}
605
+			// save new related options
606
+			foreach ($this->_req_data['question_options'] as $index => $option_req_data) {
607
+				// skip $index that is from our sample
608
+				if ($index === 'xxcountxx') {
609
+					continue;
610
+				}
611
+				// note we allow saving blank options.
612
+				if (empty($option_req_data['QSO_ID'])) {
613
+					// no ID! save it!
614
+					$new_option = EE_Question_Option::new_instance(
615
+						[
616
+							'QSO_value' => $option_req_data['QSO_value'],
617
+							'QSO_desc'  => $option_req_data['QSO_desc'],
618
+							'QSO_order' => $option_req_data['QSO_order'],
619
+							'QST_ID'    => $question->ID(),
620
+						]
621
+					);
622
+					$new_option->save();
623
+				}
624
+			}
625
+		}
626
+		$query_args = ['action' => 'edit_question', 'QST_ID' => $ID];
627
+		if ($success !== 0) {
628
+			$msg = $new_question
629
+				? sprintf(
630
+					esc_html__('The %s has been created', 'event_espresso'),
631
+					$this->_question_model->item_name()
632
+				)
633
+				: sprintf(
634
+					esc_html__('The %s has been updated', 'event_espresso'),
635
+					$this->_question_model->item_name()
636
+				);
637
+			EE_Error::add_success($msg);
638
+		}
639
+
640
+		$this->_redirect_after_action(false, '', $action_desc, $query_args, true);
641
+	}
642
+
643
+
644
+	/**
645
+	 * Upon saving a question, there should be an array of 'question_options'. This array is index numerically, but not
646
+	 * by ID
647
+	 * (this is done because new question options don't have an ID, but we may want to add multiple simultaneously).
648
+	 * So, this function gets the index in that request data array called question_options. Returns FALSE if not found.
649
+	 *
650
+	 * @param int $ID of the question option to find
651
+	 * @return int index in question_options array if successful, FALSE if unsuccessful
652
+	 */
653
+	protected function _get_option_req_data_index($ID)
654
+	{
655
+		$req_data_for_question_options = $this->_req_data['question_options'];
656
+		foreach ($req_data_for_question_options as $num => $option_data) {
657
+			if (array_key_exists('QSO_ID', $option_data) && (int) $option_data['QSO_ID'] === $ID) {
658
+				return $num;
659
+			}
660
+		}
661
+		return false;
662
+	}
663
+
664
+
665
+
666
+
667
+	/***********/
668
+	/* QUERIES */
669
+	/**
670
+	 * For internal use in getting all the query parameters
671
+	 * (because it's pretty well the same between question, question groups,
672
+	 * and for both when searching for trashed and untrashed ones)
673
+	 *
674
+	 * @param EEM_Base $model either EEM_Question or EEM_Question_Group
675
+	 * @param int      $per_page
676
+	 * @param int      $current_page
677
+	 * @return array model query params, @see
678
+	 *               https://github.com/eventespresso/event-espresso-core/tree/master/docs/G--Model-System/model-query-params.md
679
+	 */
680
+	protected function get_query_params($model, $per_page = 10, $current_page = 10)
681
+	{
682
+		$query_params             = [];
683
+		$offset                   = ($current_page - 1) * $per_page;
684
+		$query_params['limit']    = [$offset, $per_page];
685
+		$order                    =
686
+			(isset($this->_req_data['order']) && ! empty($this->_req_data['order']))
687
+				? $this->_req_data['order']
688
+				: 'ASC';
689
+		$orderby_field            =
690
+			$model instanceof EEM_Question
691
+				? 'QST_ID'
692
+				: 'QSG_order';
693
+		$field_to_order_by        =
694
+			empty($this->_req_data['orderby'])
695
+				? $orderby_field
696
+				: $this->_req_data['orderby'];
697
+		$query_params['order_by'] = [$field_to_order_by => $order];
698
+		$search_string            =
699
+			array_key_exists('s', $this->_req_data)
700
+				? $this->_req_data['s']
701
+				: null;
702
+		if (! empty($search_string)) {
703
+			if ($model instanceof EEM_Question_Group) {
704
+				$query_params[0] = [
705
+					'OR' => [
706
+						'QSG_name' => ['LIKE', "%$search_string%"],
707
+						'QSG_desc' => ['LIKE', "%$search_string%"],
708
+					],
709
+				];
710
+			} else {
711
+				$query_params[0] = [
712
+					'QST_display_text' => ['LIKE', "%$search_string%"],
713
+				];
714
+			}
715
+		}
716
+
717
+		// capability checks (just leaving this commented out for reference because it illustrates some complicated query params that could be useful when fully implemented)
718
+		/*if ( $model instanceof EEM_Question_Group ) {
719 719
             if ( ! EE_Registry::instance()->CAP->current_user_can( 'edit_others_question_groups', 'espresso_registration_form_edit_question_group' ) ) {
720 720
                 $query_params[0] = array(
721 721
                     'AND' => array(
@@ -745,67 +745,67 @@  discard block
 block discarded – undo
745 745
             }
746 746
         }/**/
747 747
 
748
-        return $query_params;
749
-    }
750
-
751
-
752
-    /**
753
-     * @param int        $per_page
754
-     * @param int        $current_page
755
-     * @param bool|false $count
756
-     * @return EE_Base_Class[]|EE_Question_Group[]|EE_Soft_Delete_Base_Class[]|int
757
-     * @throws EE_Error
758
-     */
759
-    public function get_questions($per_page = 10, $current_page = 1, $count = false)
760
-    {
761
-        $QST          = EEM_Question::instance();
762
-        $query_params = $this->get_query_params($QST, $per_page, $current_page);
763
-        if ($count) {
764
-            $where   =
765
-                isset($query_params[0])
766
-                    ? [$query_params[0]]
767
-                    : [];
768
-            $results = $QST->count($where);
769
-        } else {
770
-            $results = $QST->get_all($query_params);
771
-        }
772
-        return $results;
773
-    }
774
-
775
-
776
-    /**
777
-     * @param            $per_page
778
-     * @param int        $current_page
779
-     * @param bool|false $count
780
-     * @return EE_Soft_Delete_Base_Class[]|int
781
-     * @throws EE_Error
782
-     */
783
-    public function get_trashed_questions($per_page, $current_page = 1, $count = false)
784
-    {
785
-        $query_params = $this->get_query_params(EEM_Question::instance(), $per_page, $current_page);
786
-        $where        =
787
-            isset($query_params[0])
788
-                ? [$query_params[0]]
789
-                : [];
790
-        return $count
791
-            ? EEM_Question::instance()->count_deleted($where)
792
-            : EEM_Question::instance()->get_all_deleted($query_params);
793
-    }
794
-
795
-
796
-    /**
797
-     * @param            $per_page
798
-     * @param int        $current_page
799
-     * @param bool|false $count
800
-     * @return EE_Base_Class[]|EE_Question_Group[]|EE_Soft_Delete_Base_Class[]
801
-     * @throws EE_Error
802
-     */
803
-    public function get_question_groups($per_page, $current_page = 1, $count = false)
804
-    {
805
-        $questionGroupModel = EEM_Question_Group::instance();
806
-        // note: this a subclass of EEM_Soft_Delete_Base, so this is actually only getting non-trashed items
807
-        return $questionGroupModel->get_all(
808
-            $this->get_query_params($questionGroupModel, $per_page, $current_page)
809
-        );
810
-    }
748
+		return $query_params;
749
+	}
750
+
751
+
752
+	/**
753
+	 * @param int        $per_page
754
+	 * @param int        $current_page
755
+	 * @param bool|false $count
756
+	 * @return EE_Base_Class[]|EE_Question_Group[]|EE_Soft_Delete_Base_Class[]|int
757
+	 * @throws EE_Error
758
+	 */
759
+	public function get_questions($per_page = 10, $current_page = 1, $count = false)
760
+	{
761
+		$QST          = EEM_Question::instance();
762
+		$query_params = $this->get_query_params($QST, $per_page, $current_page);
763
+		if ($count) {
764
+			$where   =
765
+				isset($query_params[0])
766
+					? [$query_params[0]]
767
+					: [];
768
+			$results = $QST->count($where);
769
+		} else {
770
+			$results = $QST->get_all($query_params);
771
+		}
772
+		return $results;
773
+	}
774
+
775
+
776
+	/**
777
+	 * @param            $per_page
778
+	 * @param int        $current_page
779
+	 * @param bool|false $count
780
+	 * @return EE_Soft_Delete_Base_Class[]|int
781
+	 * @throws EE_Error
782
+	 */
783
+	public function get_trashed_questions($per_page, $current_page = 1, $count = false)
784
+	{
785
+		$query_params = $this->get_query_params(EEM_Question::instance(), $per_page, $current_page);
786
+		$where        =
787
+			isset($query_params[0])
788
+				? [$query_params[0]]
789
+				: [];
790
+		return $count
791
+			? EEM_Question::instance()->count_deleted($where)
792
+			: EEM_Question::instance()->get_all_deleted($query_params);
793
+	}
794
+
795
+
796
+	/**
797
+	 * @param            $per_page
798
+	 * @param int        $current_page
799
+	 * @param bool|false $count
800
+	 * @return EE_Base_Class[]|EE_Question_Group[]|EE_Soft_Delete_Base_Class[]
801
+	 * @throws EE_Error
802
+	 */
803
+	public function get_question_groups($per_page, $current_page = 1, $count = false)
804
+	{
805
+		$questionGroupModel = EEM_Question_Group::instance();
806
+		// note: this a subclass of EEM_Soft_Delete_Base, so this is actually only getting non-trashed items
807
+		return $questionGroupModel->get_all(
808
+			$this->get_query_params($questionGroupModel, $per_page, $current_page)
809
+		);
810
+	}
811 811
 }
Please login to merge, or discard this patch.
caffeinated/core/libraries/shortcodes/EE_Question_List_Shortcodes.lib.php 2 patches
Spacing   +4 added lines, -4 removed lines patch added patch discarded remove patch
@@ -94,16 +94,16 @@
 block discarded – undo
94 94
             ? $this->_extra_data['template']['question_list']
95 95
             : $template;
96 96
         $ans_result       = '';
97
-        $answers          = ! empty($this->_extra_data['data']->registrations[ $reg_obj->ID() ]['ans_objs'])
98
-            ? $this->_extra_data['data']->registrations[ $reg_obj->ID() ]['ans_objs']
97
+        $answers          = ! empty($this->_extra_data['data']->registrations[$reg_obj->ID()]['ans_objs'])
98
+            ? $this->_extra_data['data']->registrations[$reg_obj->ID()]['ans_objs']
99 99
             : [];
100 100
         $questions        = ! empty($this->_extra_data['data']->questions)
101 101
             ? $this->_extra_data['data']->questions
102 102
             : [];
103 103
         foreach ($answers as $answer) {
104 104
             // first see if the question is in our $questions array.  If not then try to get from answer object
105
-            $question = isset($questions[ $answer->ID() ])
106
-                ? $questions[ $answer->ID() ]
105
+            $question = isset($questions[$answer->ID()])
106
+                ? $questions[$answer->ID()]
107 107
                 : null;
108 108
             $question = ! $question instanceof EE_Question
109 109
                 ? $answer->question()
Please login to merge, or discard this patch.
Indentation   +95 added lines, -95 removed lines patch added patch discarded remove patch
@@ -15,109 +15,109 @@
 block discarded – undo
15 15
  */
16 16
 class EE_Question_List_Shortcodes extends EE_Shortcodes
17 17
 {
18
-    public function __construct()
19
-    {
20
-        parent::__construct();
21
-    }
18
+	public function __construct()
19
+	{
20
+		parent::__construct();
21
+	}
22 22
 
23 23
 
24
-    protected function _init_props()
25
-    {
26
-        $this->label       = esc_html__('Questions and Answers Shortcodes', 'event_espresso');
27
-        $this->description = esc_html__('All shortcodes related to custom questions and answers', 'event_espresso');
28
-        $this->_shortcodes = [
29
-            '[QUESTION_LIST]' => esc_html__(
30
-                'This is used to indicate where you want the list of questions and answers to show for the registrant.  You place this within the "[attendee_list]" field.',
31
-                'event_espresso'
32
-            ),
33
-        ];
34
-    }
24
+	protected function _init_props()
25
+	{
26
+		$this->label       = esc_html__('Questions and Answers Shortcodes', 'event_espresso');
27
+		$this->description = esc_html__('All shortcodes related to custom questions and answers', 'event_espresso');
28
+		$this->_shortcodes = [
29
+			'[QUESTION_LIST]' => esc_html__(
30
+				'This is used to indicate where you want the list of questions and answers to show for the registrant.  You place this within the "[attendee_list]" field.',
31
+				'event_espresso'
32
+			),
33
+		];
34
+	}
35 35
 
36 36
 
37
-    /**
38
-     * @throws EE_Error
39
-     * @throws ReflectionException
40
-     */
41
-    protected function _parser($shortcode)
42
-    {
43
-        switch ($shortcode) {
44
-            case '[QUESTION_LIST]':
45
-                return $this->_get_question_list();
46
-        }
47
-        return '';
48
-    }
37
+	/**
38
+	 * @throws EE_Error
39
+	 * @throws ReflectionException
40
+	 */
41
+	protected function _parser($shortcode)
42
+	{
43
+		switch ($shortcode) {
44
+			case '[QUESTION_LIST]':
45
+				return $this->_get_question_list();
46
+		}
47
+		return '';
48
+	}
49 49
 
50 50
 
51
-    /**
52
-     * @throws EE_Error
53
-     * @throws ReflectionException
54
-     */
55
-    protected function _get_question_list()
56
-    {
57
-        $this->_validate_list_requirements();
51
+	/**
52
+	 * @throws EE_Error
53
+	 * @throws ReflectionException
54
+	 */
55
+	protected function _get_question_list()
56
+	{
57
+		$this->_validate_list_requirements();
58 58
 
59
-        // for when [QUESTION_LIST] is used in the [attendee_list] field.
60
-        if ($this->_data['data'] instanceof EE_Registration) {
61
-            return $this->_get_question_answer_list_for_attendee();
62
-        }
63
-        // for when [QUESTION_LIST] is used in the main content field.
64
-        if (
65
-            $this->_data['data'] instanceof EE_Messages_Addressee
66
-            && $this->_data['data']->reg_obj instanceof EE_Registration
67
-        ) {
68
-            return $this->_get_question_answer_list_for_attendee($this->_data['data']->reg_obj);
69
-        }
70
-        return '';
71
-    }
59
+		// for when [QUESTION_LIST] is used in the [attendee_list] field.
60
+		if ($this->_data['data'] instanceof EE_Registration) {
61
+			return $this->_get_question_answer_list_for_attendee();
62
+		}
63
+		// for when [QUESTION_LIST] is used in the main content field.
64
+		if (
65
+			$this->_data['data'] instanceof EE_Messages_Addressee
66
+			&& $this->_data['data']->reg_obj instanceof EE_Registration
67
+		) {
68
+			return $this->_get_question_answer_list_for_attendee($this->_data['data']->reg_obj);
69
+		}
70
+		return '';
71
+	}
72 72
 
73 73
 
74
-    /**
75
-     * Note when we parse the "[question_list]" shortcode for attendees we're actually going to retrieve the list of
76
-     * answers for that attendee since that is what we really need (we can derive the questions from the answers);
77
-     *
78
-     * @param null $reg_obj
79
-     * @return string parsed template.
80
-     * @throws EE_Error
81
-     * @throws ReflectionException
82
-     */
83
-    private function _get_question_answer_list_for_attendee($reg_obj = null)
84
-    {
85
-        $valid_shortcodes = ['question'];
86
-        $reg_obj          = $reg_obj instanceof EE_Registration
87
-            ? $reg_obj
88
-            : $this->_data['data'];
89
-        $template         = is_array($this->_data['template']) && isset($this->_data['template']['question_list'])
90
-            ? $this->_data['template']['question_list']
91
-            : '';
92
-        $template         = empty($template) && isset($this->_extra_data['template']['question_list'])
93
-            ? $this->_extra_data['template']['question_list']
94
-            : $template;
95
-        $ans_result       = '';
96
-        $answers          = ! empty($this->_extra_data['data']->registrations[ $reg_obj->ID() ]['ans_objs'])
97
-            ? $this->_extra_data['data']->registrations[ $reg_obj->ID() ]['ans_objs']
98
-            : [];
99
-        $questions        = ! empty($this->_extra_data['data']->questions)
100
-            ? $this->_extra_data['data']->questions
101
-            : [];
102
-        foreach ($answers as $answer) {
103
-            // first see if the question is in our $questions array.  If not then try to get from answer object
104
-            $question = isset($questions[ $answer->ID() ])
105
-                ? $questions[ $answer->ID() ]
106
-                : null;
107
-            $question = ! $question instanceof EE_Question
108
-                ? $answer->question()
109
-                : $question;
110
-            if ($question instanceof EE_Question and $question->admin_only()) {
111
-                continue;
112
-            }
113
-            $ans_result .= $this->_shortcode_helper->parse_question_list_template(
114
-                $template,
115
-                $answer,
116
-                $valid_shortcodes,
117
-                $this->_extra_data
118
-            );
119
-        }
74
+	/**
75
+	 * Note when we parse the "[question_list]" shortcode for attendees we're actually going to retrieve the list of
76
+	 * answers for that attendee since that is what we really need (we can derive the questions from the answers);
77
+	 *
78
+	 * @param null $reg_obj
79
+	 * @return string parsed template.
80
+	 * @throws EE_Error
81
+	 * @throws ReflectionException
82
+	 */
83
+	private function _get_question_answer_list_for_attendee($reg_obj = null)
84
+	{
85
+		$valid_shortcodes = ['question'];
86
+		$reg_obj          = $reg_obj instanceof EE_Registration
87
+			? $reg_obj
88
+			: $this->_data['data'];
89
+		$template         = is_array($this->_data['template']) && isset($this->_data['template']['question_list'])
90
+			? $this->_data['template']['question_list']
91
+			: '';
92
+		$template         = empty($template) && isset($this->_extra_data['template']['question_list'])
93
+			? $this->_extra_data['template']['question_list']
94
+			: $template;
95
+		$ans_result       = '';
96
+		$answers          = ! empty($this->_extra_data['data']->registrations[ $reg_obj->ID() ]['ans_objs'])
97
+			? $this->_extra_data['data']->registrations[ $reg_obj->ID() ]['ans_objs']
98
+			: [];
99
+		$questions        = ! empty($this->_extra_data['data']->questions)
100
+			? $this->_extra_data['data']->questions
101
+			: [];
102
+		foreach ($answers as $answer) {
103
+			// first see if the question is in our $questions array.  If not then try to get from answer object
104
+			$question = isset($questions[ $answer->ID() ])
105
+				? $questions[ $answer->ID() ]
106
+				: null;
107
+			$question = ! $question instanceof EE_Question
108
+				? $answer->question()
109
+				: $question;
110
+			if ($question instanceof EE_Question and $question->admin_only()) {
111
+				continue;
112
+			}
113
+			$ans_result .= $this->_shortcode_helper->parse_question_list_template(
114
+				$template,
115
+				$answer,
116
+				$valid_shortcodes,
117
+				$this->_extra_data
118
+			);
119
+		}
120 120
 
121
-        return $ans_result;
122
-    }
121
+		return $ans_result;
122
+	}
123 123
 }
Please login to merge, or discard this patch.