Completed
Branch models-cleanup/model-relations (db5ca7)
by
unknown
13:03 queued 08:35
created
core/services/container/OpenCoffeeShop.php 2 patches
Indentation   +178 added lines, -178 removed lines patch added patch discarded remove patch
@@ -20,192 +20,192 @@
 block discarded – undo
20 20
 class OpenCoffeeShop
21 21
 {
22 22
 
23
-    /**
24
-     * @var CoffeeShop $CoffeeShop
25
-     */
26
-    private $CoffeeShop;
23
+	/**
24
+	 * @var CoffeeShop $CoffeeShop
25
+	 */
26
+	private $CoffeeShop;
27 27
 
28 28
 
29
-    /**
30
-     * OpenCoffeeShop constructor
31
-     *
32
-     * @throws InvalidInterfaceException
33
-     */
34
-    public function __construct()
35
-    {
36
-        // instantiate the DI container
37
-        $this->CoffeeShop = new CoffeeShop();
38
-    }
29
+	/**
30
+	 * OpenCoffeeShop constructor
31
+	 *
32
+	 * @throws InvalidInterfaceException
33
+	 */
34
+	public function __construct()
35
+	{
36
+		// instantiate the DI container
37
+		$this->CoffeeShop = new CoffeeShop();
38
+	}
39 39
 
40 40
 
41
-    // phpcs:disable PSR1.Methods.CamelCapsMethodName.NotCamelCaps
42
-    /**
43
-     * @return CoffeeShop
44
-     */
45
-    public function CoffeeShop()
46
-    {
47
-        return $this->CoffeeShop;
48
-    }
41
+	// phpcs:disable PSR1.Methods.CamelCapsMethodName.NotCamelCaps
42
+	/**
43
+	 * @return CoffeeShop
44
+	 */
45
+	public function CoffeeShop()
46
+	{
47
+		return $this->CoffeeShop;
48
+	}
49 49
 
50 50
 
51
-    /**
52
-     * configure coffee makers which control the different kinds of brews
53
-     * ( shared services, new factory objects, etc )
54
-     *
55
-     * @throws InvalidEntityException
56
-     */
57
-    public function setupCoffeeMakers()
58
-    {
59
-        // create a dependency injector class for resolving class constructor arguments
60
-        $DependencyInjector = new DependencyInjector(
61
-            $this->CoffeeShop,
62
-            new \EEH_Array()
63
-        );
64
-        // and some coffeemakers, one for creating new instances
65
-        $this->CoffeeShop->addCoffeeMaker(
66
-            new NewCoffeeMaker($this->CoffeeShop, $DependencyInjector),
67
-            CoffeeMaker::BREW_NEW
68
-        );
69
-        // one for shared services
70
-        $this->CoffeeShop->addCoffeeMaker(
71
-            new SharedCoffeeMaker($this->CoffeeShop, $DependencyInjector),
72
-            CoffeeMaker::BREW_SHARED
73
-        );
74
-        // and one for classes that only get loaded
75
-        $this->CoffeeShop->addCoffeeMaker(
76
-            new LoadOnlyCoffeeMaker($this->CoffeeShop, $DependencyInjector),
77
-            CoffeeMaker::BREW_LOAD_ONLY
78
-        );
79
-    }
51
+	/**
52
+	 * configure coffee makers which control the different kinds of brews
53
+	 * ( shared services, new factory objects, etc )
54
+	 *
55
+	 * @throws InvalidEntityException
56
+	 */
57
+	public function setupCoffeeMakers()
58
+	{
59
+		// create a dependency injector class for resolving class constructor arguments
60
+		$DependencyInjector = new DependencyInjector(
61
+			$this->CoffeeShop,
62
+			new \EEH_Array()
63
+		);
64
+		// and some coffeemakers, one for creating new instances
65
+		$this->CoffeeShop->addCoffeeMaker(
66
+			new NewCoffeeMaker($this->CoffeeShop, $DependencyInjector),
67
+			CoffeeMaker::BREW_NEW
68
+		);
69
+		// one for shared services
70
+		$this->CoffeeShop->addCoffeeMaker(
71
+			new SharedCoffeeMaker($this->CoffeeShop, $DependencyInjector),
72
+			CoffeeMaker::BREW_SHARED
73
+		);
74
+		// and one for classes that only get loaded
75
+		$this->CoffeeShop->addCoffeeMaker(
76
+			new LoadOnlyCoffeeMaker($this->CoffeeShop, $DependencyInjector),
77
+			CoffeeMaker::BREW_LOAD_ONLY
78
+		);
79
+	}
80 80
 
81 81
 
82
-    /**
83
-     * Recipes define how to load legacy classes
84
-     *
85
-     * @throws InvalidIdentifierException
86
-     */
87
-    public function addRecipes()
88
-    {
89
-        // add default recipe, which should handle loading for most PSR-4 compatible classes
90
-        // as long as they are not type hinting for interfaces
91
-        $this->CoffeeShop->addRecipe(
92
-            new Recipe(
93
-                Recipe::DEFAULT_ID
94
-            )
95
-        );
96
-        // PSR-4 compatible class with aliases
97
-        $this->CoffeeShop->addRecipe(
98
-            new Recipe(
99
-                'CommandHandlerManager',
100
-                'EventEspresso\core\services\commands\CommandHandlerManager',
101
-                array(
102
-                    'CommandHandlerManagerInterface',
103
-                    'EventEspresso\core\services\commands\CommandHandlerManagerInterface',
104
-                ),
105
-                array(),
106
-                CoffeeMaker::BREW_SHARED
107
-            )
108
-        );
109
-        // PSR-4 compatible class with aliases, which dependency on CommandHandlerManager
110
-        $this->CoffeeShop->addRecipe(
111
-            new Recipe(
112
-                'CommandBus',
113
-                'EventEspresso\core\services\commands\CommandBus',
114
-                array(
115
-                    'CommandBusInterface',
116
-                    'EventEspresso\core\services\commands\CommandBusInterface',
117
-                ),
118
-                array(),
119
-                CoffeeMaker::BREW_SHARED
120
-            )
121
-        );
122
-        // LEGACY classes that are NOT compatible with PSR-4 autoloading, and so must specify a filepath
123
-        // add a wildcard recipe for loading legacy core interfaces
124
-        $this->CoffeeShop->addRecipe(
125
-            new Recipe(
126
-                'EEI_*',
127
-                '',
128
-                array(),
129
-                array(),
130
-                CoffeeMaker::BREW_LOAD_ONLY,
131
-                array(
132
-                    EE_INTERFACES . '*.php',
133
-                    EE_INTERFACES . '*.interfaces.php',
134
-                )
135
-            )
136
-        );
137
-        // add a wildcard recipe for loading models
138
-        $this->CoffeeShop->addRecipe(
139
-            new Recipe(
140
-                'EEM_*',
141
-                '',
142
-                array(),
143
-                array(),
144
-                CoffeeMaker::BREW_SHARED,
145
-                EE_MODELS . '*.model.php'
146
-            )
147
-        );
148
-        // add a wildcard recipe for loading core classes
149
-        $this->CoffeeShop->addRecipe(
150
-            new Recipe(
151
-                'EE_*',
152
-                '',
153
-                array(),
154
-                array(),
155
-                CoffeeMaker::BREW_SHARED,
156
-                array(
157
-                    EE_CORE . '*.core.php',
158
-                    EE_ADMIN . '*.core.php',
159
-                    EE_CPTS . '*.core.php',
160
-                    EE_CORE . 'data_migration_scripts/*.core.php',
161
-                )
162
-            )
163
-        );
164
-        // load admin page parent class
165
-        $this->CoffeeShop->addRecipe(
166
-            new Recipe(
167
-                'EE_Admin_Page*',
168
-                '',
169
-                array(),
170
-                array(),
171
-                CoffeeMaker::BREW_LOAD_ONLY,
172
-                array(EE_ADMIN . '*.core.php')
173
-            )
174
-        );
175
-        // add a wildcard recipe for loading core classes
176
-        // $this->CoffeeShop->addRecipe(
177
-        //     new Recipe(
178
-        //         '*_Admin_Page',
179
-        //         '',
180
-        //         array(),
181
-        //         array(),
182
-        //         CoffeeMaker::BREW_SHARED,
183
-        //         array(
184
-        //             EE_ADMIN_PAGES . 'transactions/*.core.php',
185
-        //         )
186
-        //     )
187
-        // );
188
-    }
82
+	/**
83
+	 * Recipes define how to load legacy classes
84
+	 *
85
+	 * @throws InvalidIdentifierException
86
+	 */
87
+	public function addRecipes()
88
+	{
89
+		// add default recipe, which should handle loading for most PSR-4 compatible classes
90
+		// as long as they are not type hinting for interfaces
91
+		$this->CoffeeShop->addRecipe(
92
+			new Recipe(
93
+				Recipe::DEFAULT_ID
94
+			)
95
+		);
96
+		// PSR-4 compatible class with aliases
97
+		$this->CoffeeShop->addRecipe(
98
+			new Recipe(
99
+				'CommandHandlerManager',
100
+				'EventEspresso\core\services\commands\CommandHandlerManager',
101
+				array(
102
+					'CommandHandlerManagerInterface',
103
+					'EventEspresso\core\services\commands\CommandHandlerManagerInterface',
104
+				),
105
+				array(),
106
+				CoffeeMaker::BREW_SHARED
107
+			)
108
+		);
109
+		// PSR-4 compatible class with aliases, which dependency on CommandHandlerManager
110
+		$this->CoffeeShop->addRecipe(
111
+			new Recipe(
112
+				'CommandBus',
113
+				'EventEspresso\core\services\commands\CommandBus',
114
+				array(
115
+					'CommandBusInterface',
116
+					'EventEspresso\core\services\commands\CommandBusInterface',
117
+				),
118
+				array(),
119
+				CoffeeMaker::BREW_SHARED
120
+			)
121
+		);
122
+		// LEGACY classes that are NOT compatible with PSR-4 autoloading, and so must specify a filepath
123
+		// add a wildcard recipe for loading legacy core interfaces
124
+		$this->CoffeeShop->addRecipe(
125
+			new Recipe(
126
+				'EEI_*',
127
+				'',
128
+				array(),
129
+				array(),
130
+				CoffeeMaker::BREW_LOAD_ONLY,
131
+				array(
132
+					EE_INTERFACES . '*.php',
133
+					EE_INTERFACES . '*.interfaces.php',
134
+				)
135
+			)
136
+		);
137
+		// add a wildcard recipe for loading models
138
+		$this->CoffeeShop->addRecipe(
139
+			new Recipe(
140
+				'EEM_*',
141
+				'',
142
+				array(),
143
+				array(),
144
+				CoffeeMaker::BREW_SHARED,
145
+				EE_MODELS . '*.model.php'
146
+			)
147
+		);
148
+		// add a wildcard recipe for loading core classes
149
+		$this->CoffeeShop->addRecipe(
150
+			new Recipe(
151
+				'EE_*',
152
+				'',
153
+				array(),
154
+				array(),
155
+				CoffeeMaker::BREW_SHARED,
156
+				array(
157
+					EE_CORE . '*.core.php',
158
+					EE_ADMIN . '*.core.php',
159
+					EE_CPTS . '*.core.php',
160
+					EE_CORE . 'data_migration_scripts/*.core.php',
161
+				)
162
+			)
163
+		);
164
+		// load admin page parent class
165
+		$this->CoffeeShop->addRecipe(
166
+			new Recipe(
167
+				'EE_Admin_Page*',
168
+				'',
169
+				array(),
170
+				array(),
171
+				CoffeeMaker::BREW_LOAD_ONLY,
172
+				array(EE_ADMIN . '*.core.php')
173
+			)
174
+		);
175
+		// add a wildcard recipe for loading core classes
176
+		// $this->CoffeeShop->addRecipe(
177
+		//     new Recipe(
178
+		//         '*_Admin_Page',
179
+		//         '',
180
+		//         array(),
181
+		//         array(),
182
+		//         CoffeeMaker::BREW_SHARED,
183
+		//         array(
184
+		//             EE_ADMIN_PAGES . 'transactions/*.core.php',
185
+		//         )
186
+		//     )
187
+		// );
188
+	}
189 189
 
190 190
 
191
-    /**
192
-     * bootstrap EE and the request stack
193
-     *
194
-     * @throws ServiceNotFoundException
195
-     * @throws InvalidClassException
196
-     * @throws InvalidDataTypeException
197
-     * @throws InvalidIdentifierException
198
-     * @throws exceptions\ServiceExistsException
199
-     * @throws OutOfBoundsException
200
-     * @throws exceptions\InstantiationException
201
-     */
202
-    public function firstBrew()
203
-    {
204
-        $this->CoffeeShop->brew(
205
-            'EventEspresso\core\services\request\Request',
206
-            array($_GET, $_POST, $_COOKIE, $_SERVER)
207
-        );
208
-        $this->CoffeeShop->brew('EventEspresso\core\services\request\Response');
209
-        $this->CoffeeShop->brew('EE_Bootstrap');
210
-    }
191
+	/**
192
+	 * bootstrap EE and the request stack
193
+	 *
194
+	 * @throws ServiceNotFoundException
195
+	 * @throws InvalidClassException
196
+	 * @throws InvalidDataTypeException
197
+	 * @throws InvalidIdentifierException
198
+	 * @throws exceptions\ServiceExistsException
199
+	 * @throws OutOfBoundsException
200
+	 * @throws exceptions\InstantiationException
201
+	 */
202
+	public function firstBrew()
203
+	{
204
+		$this->CoffeeShop->brew(
205
+			'EventEspresso\core\services\request\Request',
206
+			array($_GET, $_POST, $_COOKIE, $_SERVER)
207
+		);
208
+		$this->CoffeeShop->brew('EventEspresso\core\services\request\Response');
209
+		$this->CoffeeShop->brew('EE_Bootstrap');
210
+	}
211 211
 }
Please login to merge, or discard this patch.
Spacing   +8 added lines, -8 removed lines patch added patch discarded remove patch
@@ -129,8 +129,8 @@  discard block
 block discarded – undo
129 129
                 array(),
130 130
                 CoffeeMaker::BREW_LOAD_ONLY,
131 131
                 array(
132
-                    EE_INTERFACES . '*.php',
133
-                    EE_INTERFACES . '*.interfaces.php',
132
+                    EE_INTERFACES.'*.php',
133
+                    EE_INTERFACES.'*.interfaces.php',
134 134
                 )
135 135
             )
136 136
         );
@@ -142,7 +142,7 @@  discard block
 block discarded – undo
142 142
                 array(),
143 143
                 array(),
144 144
                 CoffeeMaker::BREW_SHARED,
145
-                EE_MODELS . '*.model.php'
145
+                EE_MODELS.'*.model.php'
146 146
             )
147 147
         );
148 148
         // add a wildcard recipe for loading core classes
@@ -154,10 +154,10 @@  discard block
 block discarded – undo
154 154
                 array(),
155 155
                 CoffeeMaker::BREW_SHARED,
156 156
                 array(
157
-                    EE_CORE . '*.core.php',
158
-                    EE_ADMIN . '*.core.php',
159
-                    EE_CPTS . '*.core.php',
160
-                    EE_CORE . 'data_migration_scripts/*.core.php',
157
+                    EE_CORE.'*.core.php',
158
+                    EE_ADMIN.'*.core.php',
159
+                    EE_CPTS.'*.core.php',
160
+                    EE_CORE.'data_migration_scripts/*.core.php',
161 161
                 )
162 162
             )
163 163
         );
@@ -169,7 +169,7 @@  discard block
 block discarded – undo
169 169
                 array(),
170 170
                 array(),
171 171
                 CoffeeMaker::BREW_LOAD_ONLY,
172
-                array(EE_ADMIN . '*.core.php')
172
+                array(EE_ADMIN.'*.core.php')
173 173
             )
174 174
         );
175 175
         // add a wildcard recipe for loading core classes
Please login to merge, or discard this patch.
core/services/licensing/LicenseService.php 2 patches
Indentation   +90 added lines, -90 removed lines patch added patch discarded remove patch
@@ -15,94 +15,94 @@
 block discarded – undo
15 15
  */
16 16
 class LicenseService
17 17
 {
18
-    /**
19
-     * @var Config
20
-     */
21
-    private $config;
22
-
23
-
24
-    /**
25
-     * @var Stats
26
-     */
27
-    private $stats_collection;
28
-
29
-    public function __construct(Stats $stats_collection, Config $config)
30
-    {
31
-        $this->config = $config;
32
-        $this->stats_collection = $stats_collection;
33
-        $this->loadPueClient();
34
-    }
35
-
36
-    private function loadPueClient()
37
-    {
38
-        // PUE Auto Upgrades stuff
39
-        if (is_readable(EE_THIRD_PARTY . 'pue/pue-client.php')) { // include the file
40
-            require_once(EE_THIRD_PARTY . 'pue/pue-client.php');
41
-
42
-            // $options needs to be an array with the included keys as listed.
43
-            $options = array(
44
-                // 'optionName' => '', //(optional) - used as the reference for saving update information in the
45
-                // clients options table.  Will be automatically set if left blank.
46
-                'apikey'                => $this->config->siteLicenseKey(),
47
-                // (required), you will need to obtain the apikey that the client gets from your site and
48
-                // then saves in their sites options table (see 'getting an api-key' below)
49
-                'lang_domain'           => $this->config->i18nDomain(),
50
-                // (optional) - put here whatever reference you are using for the localization of your plugin (if it's
51
-                // localized).  That way strings in this file will be included in the translation for your plugin.
52
-                'checkPeriod'           => $this->config->checkPeriod(),
53
-                // (optional) - use this parameter to indicate how often you want the client's install to ping your
54
-                // server for update checks.  The integer indicates hours.  If you don't include this parameter it will
55
-                // default to 12 hours.
56
-                'option_key'            => $this->config->optionKey(),
57
-                // this is what is used to reference the api_key in your plugin options.  PUE uses this to trigger
58
-                // updating your information message whenever this option_key is modified.
59
-                'options_page_slug'     => $this->config->optionsPageSlug(),
60
-                'plugin_basename'       => EE_PLUGIN_BASENAME,
61
-                'use_wp_update'         => true,
62
-                // if TRUE then you want FREE versions of the plugin to be updated from WP
63
-                'extra_stats'           => $this->stats_collection->statsCallback(),
64
-                'turn_on_notices_saved' => true,
65
-            );
66
-            // initiate the class and start the plugin update engine!
67
-            new PluginUpdateEngineChecker(
68
-                $this->config->hostServerUrl(),
69
-                $this->config->pluginSlug(),
70
-                $options
71
-            );
72
-        }
73
-    }
74
-
75
-
76
-    /**
77
-     * This is a handy helper method for retrieving whether there is an update available for the given plugin.
78
-     *
79
-     * @param  string $basename Use the equivalent result from plugin_basename() for this param as WP uses that to
80
-     *                          identify plugins. Defaults to core update
81
-     * @return boolean           True if update available, false if not.
82
-     */
83
-    public static function isUpdateAvailable($basename = '')
84
-    {
85
-        $basename = ! empty($basename) ? $basename : EE_PLUGIN_BASENAME;
86
-
87
-        $update = false;
88
-
89
-        // should take "event-espresso-core/espresso.php" and change to "/event-espresso-core"
90
-        $folder = '/' . dirname($basename);
91
-
92
-        $plugins = get_plugins($folder);
93
-        $current = get_site_transient('update_plugins');
94
-
95
-        foreach ((array) $plugins as $plugin_file => $plugin_data) {
96
-            if (isset($current->response['plugin_file'])) {
97
-                $update = true;
98
-            }
99
-        }
100
-
101
-        // it's possible that there is an update but an invalid site-license-key is in use
102
-        if (get_site_option('pue_json_error_' . $basename)) {
103
-            $update = true;
104
-        }
105
-
106
-        return $update;
107
-    }
18
+	/**
19
+	 * @var Config
20
+	 */
21
+	private $config;
22
+
23
+
24
+	/**
25
+	 * @var Stats
26
+	 */
27
+	private $stats_collection;
28
+
29
+	public function __construct(Stats $stats_collection, Config $config)
30
+	{
31
+		$this->config = $config;
32
+		$this->stats_collection = $stats_collection;
33
+		$this->loadPueClient();
34
+	}
35
+
36
+	private function loadPueClient()
37
+	{
38
+		// PUE Auto Upgrades stuff
39
+		if (is_readable(EE_THIRD_PARTY . 'pue/pue-client.php')) { // include the file
40
+			require_once(EE_THIRD_PARTY . 'pue/pue-client.php');
41
+
42
+			// $options needs to be an array with the included keys as listed.
43
+			$options = array(
44
+				// 'optionName' => '', //(optional) - used as the reference for saving update information in the
45
+				// clients options table.  Will be automatically set if left blank.
46
+				'apikey'                => $this->config->siteLicenseKey(),
47
+				// (required), you will need to obtain the apikey that the client gets from your site and
48
+				// then saves in their sites options table (see 'getting an api-key' below)
49
+				'lang_domain'           => $this->config->i18nDomain(),
50
+				// (optional) - put here whatever reference you are using for the localization of your plugin (if it's
51
+				// localized).  That way strings in this file will be included in the translation for your plugin.
52
+				'checkPeriod'           => $this->config->checkPeriod(),
53
+				// (optional) - use this parameter to indicate how often you want the client's install to ping your
54
+				// server for update checks.  The integer indicates hours.  If you don't include this parameter it will
55
+				// default to 12 hours.
56
+				'option_key'            => $this->config->optionKey(),
57
+				// this is what is used to reference the api_key in your plugin options.  PUE uses this to trigger
58
+				// updating your information message whenever this option_key is modified.
59
+				'options_page_slug'     => $this->config->optionsPageSlug(),
60
+				'plugin_basename'       => EE_PLUGIN_BASENAME,
61
+				'use_wp_update'         => true,
62
+				// if TRUE then you want FREE versions of the plugin to be updated from WP
63
+				'extra_stats'           => $this->stats_collection->statsCallback(),
64
+				'turn_on_notices_saved' => true,
65
+			);
66
+			// initiate the class and start the plugin update engine!
67
+			new PluginUpdateEngineChecker(
68
+				$this->config->hostServerUrl(),
69
+				$this->config->pluginSlug(),
70
+				$options
71
+			);
72
+		}
73
+	}
74
+
75
+
76
+	/**
77
+	 * This is a handy helper method for retrieving whether there is an update available for the given plugin.
78
+	 *
79
+	 * @param  string $basename Use the equivalent result from plugin_basename() for this param as WP uses that to
80
+	 *                          identify plugins. Defaults to core update
81
+	 * @return boolean           True if update available, false if not.
82
+	 */
83
+	public static function isUpdateAvailable($basename = '')
84
+	{
85
+		$basename = ! empty($basename) ? $basename : EE_PLUGIN_BASENAME;
86
+
87
+		$update = false;
88
+
89
+		// should take "event-espresso-core/espresso.php" and change to "/event-espresso-core"
90
+		$folder = '/' . dirname($basename);
91
+
92
+		$plugins = get_plugins($folder);
93
+		$current = get_site_transient('update_plugins');
94
+
95
+		foreach ((array) $plugins as $plugin_file => $plugin_data) {
96
+			if (isset($current->response['plugin_file'])) {
97
+				$update = true;
98
+			}
99
+		}
100
+
101
+		// it's possible that there is an update but an invalid site-license-key is in use
102
+		if (get_site_option('pue_json_error_' . $basename)) {
103
+			$update = true;
104
+		}
105
+
106
+		return $update;
107
+	}
108 108
 }
Please login to merge, or discard this patch.
Spacing   +4 added lines, -4 removed lines patch added patch discarded remove patch
@@ -36,8 +36,8 @@  discard block
 block discarded – undo
36 36
     private function loadPueClient()
37 37
     {
38 38
         // PUE Auto Upgrades stuff
39
-        if (is_readable(EE_THIRD_PARTY . 'pue/pue-client.php')) { // include the file
40
-            require_once(EE_THIRD_PARTY . 'pue/pue-client.php');
39
+        if (is_readable(EE_THIRD_PARTY.'pue/pue-client.php')) { // include the file
40
+            require_once(EE_THIRD_PARTY.'pue/pue-client.php');
41 41
 
42 42
             // $options needs to be an array with the included keys as listed.
43 43
             $options = array(
@@ -87,7 +87,7 @@  discard block
 block discarded – undo
87 87
         $update = false;
88 88
 
89 89
         // should take "event-espresso-core/espresso.php" and change to "/event-espresso-core"
90
-        $folder = '/' . dirname($basename);
90
+        $folder = '/'.dirname($basename);
91 91
 
92 92
         $plugins = get_plugins($folder);
93 93
         $current = get_site_transient('update_plugins');
@@ -99,7 +99,7 @@  discard block
 block discarded – undo
99 99
         }
100 100
 
101 101
         // it's possible that there is an update but an invalid site-license-key is in use
102
-        if (get_site_option('pue_json_error_' . $basename)) {
102
+        if (get_site_option('pue_json_error_'.$basename)) {
103 103
             $update = true;
104 104
         }
105 105
 
Please login to merge, or discard this patch.
display_strategies/number_bubbles/NumberBubblesProgressStepsDisplay.php 2 patches
Indentation   +23 added lines, -23 removed lines patch added patch discarded remove patch
@@ -16,29 +16,29 @@
 block discarded – undo
16 16
 {
17 17
 
18 18
 
19
-    /**
20
-     * used for setting up css and js required for the display strategy
21
-     *
22
-     * @return void
23
-     */
24
-    public function enqueueStylesAndScripts()
25
-    {
26
-        // core/services/progress_steps/display_strategies/number_bubbles/number_bubbles.css
27
-        wp_enqueue_style(
28
-            'ee_progress_steps_display_number_bubbles',
29
-            plugin_dir_url(__FILE__) . 'number_bubbles.css'
30
-        );
31
-    }
19
+	/**
20
+	 * used for setting up css and js required for the display strategy
21
+	 *
22
+	 * @return void
23
+	 */
24
+	public function enqueueStylesAndScripts()
25
+	{
26
+		// core/services/progress_steps/display_strategies/number_bubbles/number_bubbles.css
27
+		wp_enqueue_style(
28
+			'ee_progress_steps_display_number_bubbles',
29
+			plugin_dir_url(__FILE__) . 'number_bubbles.css'
30
+		);
31
+	}
32 32
 
33 33
 
34
-    /**
35
-     * loads and returns a full server path to the template used for the display strategy
36
-     *
37
-     * @return string
38
-     */
39
-    public function getTemplate()
40
-    {
41
-        // return plugin_dir_path( __FILE__ ) . 'number_bubbles.template.php';
42
-        return __DIR__ . '/number_bubbles.template.php';
43
-    }
34
+	/**
35
+	 * loads and returns a full server path to the template used for the display strategy
36
+	 *
37
+	 * @return string
38
+	 */
39
+	public function getTemplate()
40
+	{
41
+		// return plugin_dir_path( __FILE__ ) . 'number_bubbles.template.php';
42
+		return __DIR__ . '/number_bubbles.template.php';
43
+	}
44 44
 }
Please login to merge, or discard this patch.
Spacing   +2 added lines, -2 removed lines patch added patch discarded remove patch
@@ -26,7 +26,7 @@  discard block
 block discarded – undo
26 26
         // core/services/progress_steps/display_strategies/number_bubbles/number_bubbles.css
27 27
         wp_enqueue_style(
28 28
             'ee_progress_steps_display_number_bubbles',
29
-            plugin_dir_url(__FILE__) . 'number_bubbles.css'
29
+            plugin_dir_url(__FILE__).'number_bubbles.css'
30 30
         );
31 31
     }
32 32
 
@@ -39,6 +39,6 @@  discard block
 block discarded – undo
39 39
     public function getTemplate()
40 40
     {
41 41
         // return plugin_dir_path( __FILE__ ) . 'number_bubbles.template.php';
42
-        return __DIR__ . '/number_bubbles.template.php';
42
+        return __DIR__.'/number_bubbles.template.php';
43 43
     }
44 44
 }
Please login to merge, or discard this patch.
core/services/shortcodes/LegacyShortcodesManager.php 2 patches
Spacing   +14 added lines, -14 removed lines patch added patch discarded remove patch
@@ -74,7 +74,7 @@  discard block
 block discarded – undo
74 74
             'FHEE__EE_Config__register_shortcodes__shortcodes_to_register',
75 75
             array()
76 76
         );
77
-        if (! empty($shortcodes_to_register)) {
77
+        if ( ! empty($shortcodes_to_register)) {
78 78
             // cycle thru shortcode folders
79 79
             foreach ($shortcodes_to_register as $shortcode_path) {
80 80
                 // add to list of installed shortcode modules
@@ -119,44 +119,44 @@  discard block
 block discarded – undo
119 119
             // remove last segment
120 120
             array_pop($shortcode_path);
121 121
             // glue it back together
122
-            $shortcode_path = implode('/', $shortcode_path) . '/';
122
+            $shortcode_path = implode('/', $shortcode_path).'/';
123 123
         } else {
124 124
             // we need to generate the filename based off of the folder name
125 125
             // grab and sanitize shortcode directory name
126 126
             $shortcode = sanitize_key(basename($shortcode_path));
127
-            $shortcode_path = rtrim($shortcode_path, '/') . '/';
127
+            $shortcode_path = rtrim($shortcode_path, '/').'/';
128 128
         }
129 129
         // create classname from shortcode directory or file name
130 130
         $shortcode = str_replace(' ', '_', ucwords(str_replace('_', ' ', $shortcode)));
131 131
         // add class prefix
132
-        $shortcode_class = 'EES_' . $shortcode;
132
+        $shortcode_class = 'EES_'.$shortcode;
133 133
         // does the shortcode exist ?
134
-        if (! is_readable($shortcode_path . '/' . $shortcode_class . $shortcode_ext)) {
134
+        if ( ! is_readable($shortcode_path.'/'.$shortcode_class.$shortcode_ext)) {
135 135
             $msg = sprintf(
136 136
                 esc_html__(
137 137
                     'The requested %1$s shortcode file could not be found or is not readable due to file permissions. It should be in %2$s',
138 138
                     'event_espresso'
139 139
                 ),
140 140
                 $shortcode_class,
141
-                $shortcode_path . '/' . $shortcode_class . $shortcode_ext
141
+                $shortcode_path.'/'.$shortcode_class.$shortcode_ext
142 142
             );
143
-            EE_Error::add_error($msg . '||' . $msg, __FILE__, __FUNCTION__, __LINE__);
143
+            EE_Error::add_error($msg.'||'.$msg, __FILE__, __FUNCTION__, __LINE__);
144 144
             return false;
145 145
         }
146 146
         // load the shortcode class file
147
-        require_once($shortcode_path . $shortcode_class . $shortcode_ext);
147
+        require_once($shortcode_path.$shortcode_class.$shortcode_ext);
148 148
         // verify that class exists
149
-        if (! class_exists($shortcode_class)) {
149
+        if ( ! class_exists($shortcode_class)) {
150 150
             $msg = sprintf(
151 151
                 esc_html__('The requested %s shortcode class does not exist.', 'event_espresso'),
152 152
                 $shortcode_class
153 153
             );
154
-            EE_Error::add_error($msg . '||' . $msg, __FILE__, __FUNCTION__, __LINE__);
154
+            EE_Error::add_error($msg.'||'.$msg, __FILE__, __FUNCTION__, __LINE__);
155 155
             return false;
156 156
         }
157 157
         $shortcode = strtoupper($shortcode);
158 158
         // add to array of registered shortcodes
159
-        $this->registry->shortcodes->{$shortcode} = $shortcode_path . $shortcode_class . $shortcode_ext;
159
+        $this->registry->shortcodes->{$shortcode} = $shortcode_path.$shortcode_class.$shortcode_ext;
160 160
         return true;
161 161
     }
162 162
 
@@ -173,7 +173,7 @@  discard block
 block discarded – undo
173 173
         // cycle thru shortcode folders
174 174
         foreach ($this->registry->shortcodes as $shortcode => $shortcode_path) {
175 175
             // add class prefix
176
-            $shortcode_class = 'EES_' . $shortcode;
176
+            $shortcode_class = 'EES_'.$shortcode;
177 177
             // fire the shortcode class's set_hooks methods in case it needs to hook into other parts of the system
178 178
             // which set hooks ?
179 179
             if (is_admin()) {
@@ -189,7 +189,7 @@  discard block
 block discarded – undo
189 189
                 $shortcode_tag = strtoupper($shortcode);
190 190
                 // but first check if the shortcode has already
191 191
                 // been added before assigning 'fallback_shortcode_processor'
192
-                if (! shortcode_exists($shortcode_tag)) {
192
+                if ( ! shortcode_exists($shortcode_tag)) {
193 193
                     // NOTE: this shortcode declaration will get overridden if the shortcode
194 194
                     // is successfully detected in the post content in initializeShortcode()
195 195
                     add_shortcode($shortcode_tag, array($shortcode_class, 'fallback_shortcode_processor'));
@@ -395,7 +395,7 @@  discard block
 block discarded – undo
395 395
      */
396 396
     public static function addShortcodeClassPrefix($class_name)
397 397
     {
398
-        return strpos($class_name, 'EES_') === 0 ? $class_name : 'EES_' . $class_name;
398
+        return strpos($class_name, 'EES_') === 0 ? $class_name : 'EES_'.$class_name;
399 399
     }
400 400
 
401 401
 
Please login to merge, or discard this patch.
Indentation   +412 added lines, -412 removed lines patch added patch discarded remove patch
@@ -21,417 +21,417 @@
 block discarded – undo
21 21
 class LegacyShortcodesManager
22 22
 {
23 23
 
24
-    /**
25
-     * @var EE_Registry $registry
26
-     */
27
-    private $registry;
28
-
29
-
30
-    /**
31
-     * LegacyShortcodesManager constructor.
32
-     *
33
-     * @param \EE_Registry $registry
34
-     */
35
-    public function __construct(EE_Registry $registry)
36
-    {
37
-        $this->registry = $registry;
38
-    }
39
-
40
-
41
-    /**
42
-     * @return EE_Registry
43
-     */
44
-    public function registry()
45
-    {
46
-        return $this->registry;
47
-    }
48
-
49
-
50
-    /**
51
-     * registerShortcodes
52
-     *
53
-     * @return void
54
-     */
55
-    public function registerShortcodes()
56
-    {
57
-        $this->registry->shortcodes = $this->getShortcodes();
58
-    }
59
-
60
-
61
-    /**
62
-     * getShortcodes
63
-     *
64
-     * @return array
65
-     */
66
-    public function getShortcodes()
67
-    {
68
-        // previously this method would glob the shortcodes directory
69
-        // then filter that list of shortcodes to register,
70
-        // but now we are going to just supply an empty array.
71
-        // this allows any shortcodes that have not yet been converted to the new system
72
-        // to still get loaded and processed, albeit using the same legacy logic as before
73
-        $shortcodes_to_register = apply_filters(
74
-            'FHEE__EE_Config__register_shortcodes__shortcodes_to_register',
75
-            array()
76
-        );
77
-        if (! empty($shortcodes_to_register)) {
78
-            // cycle thru shortcode folders
79
-            foreach ($shortcodes_to_register as $shortcode_path) {
80
-                // add to list of installed shortcode modules
81
-                $this->registerShortcode($shortcode_path);
82
-            }
83
-        }
84
-        // filter list of installed modules
85
-        return apply_filters(
86
-            'FHEE__EE_Config___register_shortcodes__installed_shortcodes',
87
-            ! empty($this->registry->shortcodes)
88
-                ? $this->registry->shortcodes
89
-                : array()
90
-        );
91
-    }
92
-
93
-
94
-    /**
95
-     *    register_shortcode - makes core aware of this shortcode
96
-     *
97
-     * @access    public
98
-     * @param    string $shortcode_path - full path up to and including shortcode folder
99
-     * @return    bool
100
-     */
101
-    public function registerShortcode($shortcode_path = null)
102
-    {
103
-        do_action('AHEE__EE_Config__register_shortcode__begin', $shortcode_path);
104
-        $shortcode_ext = '.shortcode.php';
105
-        // make all separators match
106
-        $shortcode_path = str_replace(array('\\', '/'), '/', $shortcode_path);
107
-        // does the file path INCLUDE the actual file name as part of the path ?
108
-        if (strpos($shortcode_path, $shortcode_ext) !== false) {
109
-            // grab shortcode file name from directory name and break apart at dots
110
-            $shortcode_file = explode('.', basename($shortcode_path));
111
-            // take first segment from file name pieces and remove class prefix if it exists
112
-            $shortcode = strpos($shortcode_file[0], 'EES_') === 0
113
-                ? substr($shortcode_file[0], 4)
114
-                : $shortcode_file[0];
115
-            // sanitize shortcode directory name
116
-            $shortcode = sanitize_key($shortcode);
117
-            // now we need to rebuild the shortcode path
118
-            $shortcode_path = explode('/', $shortcode_path);
119
-            // remove last segment
120
-            array_pop($shortcode_path);
121
-            // glue it back together
122
-            $shortcode_path = implode('/', $shortcode_path) . '/';
123
-        } else {
124
-            // we need to generate the filename based off of the folder name
125
-            // grab and sanitize shortcode directory name
126
-            $shortcode = sanitize_key(basename($shortcode_path));
127
-            $shortcode_path = rtrim($shortcode_path, '/') . '/';
128
-        }
129
-        // create classname from shortcode directory or file name
130
-        $shortcode = str_replace(' ', '_', ucwords(str_replace('_', ' ', $shortcode)));
131
-        // add class prefix
132
-        $shortcode_class = 'EES_' . $shortcode;
133
-        // does the shortcode exist ?
134
-        if (! is_readable($shortcode_path . '/' . $shortcode_class . $shortcode_ext)) {
135
-            $msg = sprintf(
136
-                esc_html__(
137
-                    'The requested %1$s shortcode file could not be found or is not readable due to file permissions. It should be in %2$s',
138
-                    'event_espresso'
139
-                ),
140
-                $shortcode_class,
141
-                $shortcode_path . '/' . $shortcode_class . $shortcode_ext
142
-            );
143
-            EE_Error::add_error($msg . '||' . $msg, __FILE__, __FUNCTION__, __LINE__);
144
-            return false;
145
-        }
146
-        // load the shortcode class file
147
-        require_once($shortcode_path . $shortcode_class . $shortcode_ext);
148
-        // verify that class exists
149
-        if (! class_exists($shortcode_class)) {
150
-            $msg = sprintf(
151
-                esc_html__('The requested %s shortcode class does not exist.', 'event_espresso'),
152
-                $shortcode_class
153
-            );
154
-            EE_Error::add_error($msg . '||' . $msg, __FILE__, __FUNCTION__, __LINE__);
155
-            return false;
156
-        }
157
-        $shortcode = strtoupper($shortcode);
158
-        // add to array of registered shortcodes
159
-        $this->registry->shortcodes->{$shortcode} = $shortcode_path . $shortcode_class . $shortcode_ext;
160
-        return true;
161
-    }
162
-
163
-
164
-    /**
165
-     *    _initialize_shortcodes
166
-     *    allow shortcodes to set hooks for the rest of the system
167
-     *
168
-     * @access private
169
-     * @return void
170
-     */
171
-    public function addShortcodes()
172
-    {
173
-        // cycle thru shortcode folders
174
-        foreach ($this->registry->shortcodes as $shortcode => $shortcode_path) {
175
-            // add class prefix
176
-            $shortcode_class = 'EES_' . $shortcode;
177
-            // fire the shortcode class's set_hooks methods in case it needs to hook into other parts of the system
178
-            // which set hooks ?
179
-            if (is_admin()) {
180
-                // fire immediately
181
-                call_user_func(array($shortcode_class, 'set_hooks_admin'));
182
-            } else {
183
-                // delay until other systems are online
184
-                add_action(
185
-                    'AHEE__EE_System__set_hooks_for_shortcodes_modules_and_addons',
186
-                    array($shortcode_class, 'set_hooks')
187
-                );
188
-                // convert classname to UPPERCASE and create WP shortcode.
189
-                $shortcode_tag = strtoupper($shortcode);
190
-                // but first check if the shortcode has already
191
-                // been added before assigning 'fallback_shortcode_processor'
192
-                if (! shortcode_exists($shortcode_tag)) {
193
-                    // NOTE: this shortcode declaration will get overridden if the shortcode
194
-                    // is successfully detected in the post content in initializeShortcode()
195
-                    add_shortcode($shortcode_tag, array($shortcode_class, 'fallback_shortcode_processor'));
196
-                }
197
-            }
198
-        }
199
-    }
200
-
201
-
202
-    /**
203
-     * callback for the WP "get_header" hook point
204
-     * checks posts for EE shortcodes, and initializes them,
205
-     * then toggles filter switch that loads core default assets
206
-     *
207
-     * @param \WP_Query $wp_query
208
-     * @return void
209
-     */
210
-    public function initializeShortcodes(WP_Query $wp_query)
211
-    {
212
-        if (
213
-            empty($this->registry->shortcodes)
214
-            || defined('EE_TESTS_DIR')
215
-            || ! $wp_query->is_main_query()
216
-            || is_admin()
217
-        ) {
218
-            return;
219
-        }
220
-        global $wp;
221
-        /** @var EE_Front_controller $Front_Controller */
222
-        $Front_Controller = $this->registry->load_core('Front_Controller', array(), false);
223
-        do_action('AHEE__EE_Front_Controller__initialize_shortcodes__begin', $wp, $Front_Controller);
224
-        $Front_Controller->Request_Handler()->set_request_vars();
225
-        // grab post_name from request
226
-        $current_post = apply_filters(
227
-            'FHEE__EE_Front_Controller__initialize_shortcodes__current_post_name',
228
-            $Front_Controller->Request_Handler()->get('post_name')
229
-        );
230
-        $show_on_front = get_option('show_on_front');
231
-        // if it's not set, then check if frontpage is blog
232
-        if (empty($current_post)) {
233
-            // yup.. this is the posts page, prepare to load all shortcode modules
234
-            $current_post = 'posts';
235
-            // unless..
236
-            if ($show_on_front === 'page') {
237
-                // some other page is set as the homepage
238
-                $page_on_front = get_option('page_on_front');
239
-                if ($page_on_front) {
240
-                    // k now we need to find the post_name for this page
241
-                    global $wpdb;
242
-                    $page_on_front = $wpdb->get_var(
243
-                        $wpdb->prepare(
244
-                            "SELECT post_name from {$wpdb->posts} WHERE post_type='page' AND post_status NOT IN ('auto-draft', 'inherit', 'trash') AND ID=%d",
245
-                            $page_on_front
246
-                        )
247
-                    );
248
-                    // set the current post slug to what it actually is
249
-                    $current_post = $page_on_front ? $page_on_front : $current_post;
250
-                }
251
-            }
252
-        }
253
-        // in case $current_post is hierarchical like: /parent-page/current-page
254
-        $current_post = basename($current_post);
255
-        if (
24
+	/**
25
+	 * @var EE_Registry $registry
26
+	 */
27
+	private $registry;
28
+
29
+
30
+	/**
31
+	 * LegacyShortcodesManager constructor.
32
+	 *
33
+	 * @param \EE_Registry $registry
34
+	 */
35
+	public function __construct(EE_Registry $registry)
36
+	{
37
+		$this->registry = $registry;
38
+	}
39
+
40
+
41
+	/**
42
+	 * @return EE_Registry
43
+	 */
44
+	public function registry()
45
+	{
46
+		return $this->registry;
47
+	}
48
+
49
+
50
+	/**
51
+	 * registerShortcodes
52
+	 *
53
+	 * @return void
54
+	 */
55
+	public function registerShortcodes()
56
+	{
57
+		$this->registry->shortcodes = $this->getShortcodes();
58
+	}
59
+
60
+
61
+	/**
62
+	 * getShortcodes
63
+	 *
64
+	 * @return array
65
+	 */
66
+	public function getShortcodes()
67
+	{
68
+		// previously this method would glob the shortcodes directory
69
+		// then filter that list of shortcodes to register,
70
+		// but now we are going to just supply an empty array.
71
+		// this allows any shortcodes that have not yet been converted to the new system
72
+		// to still get loaded and processed, albeit using the same legacy logic as before
73
+		$shortcodes_to_register = apply_filters(
74
+			'FHEE__EE_Config__register_shortcodes__shortcodes_to_register',
75
+			array()
76
+		);
77
+		if (! empty($shortcodes_to_register)) {
78
+			// cycle thru shortcode folders
79
+			foreach ($shortcodes_to_register as $shortcode_path) {
80
+				// add to list of installed shortcode modules
81
+				$this->registerShortcode($shortcode_path);
82
+			}
83
+		}
84
+		// filter list of installed modules
85
+		return apply_filters(
86
+			'FHEE__EE_Config___register_shortcodes__installed_shortcodes',
87
+			! empty($this->registry->shortcodes)
88
+				? $this->registry->shortcodes
89
+				: array()
90
+		);
91
+	}
92
+
93
+
94
+	/**
95
+	 *    register_shortcode - makes core aware of this shortcode
96
+	 *
97
+	 * @access    public
98
+	 * @param    string $shortcode_path - full path up to and including shortcode folder
99
+	 * @return    bool
100
+	 */
101
+	public function registerShortcode($shortcode_path = null)
102
+	{
103
+		do_action('AHEE__EE_Config__register_shortcode__begin', $shortcode_path);
104
+		$shortcode_ext = '.shortcode.php';
105
+		// make all separators match
106
+		$shortcode_path = str_replace(array('\\', '/'), '/', $shortcode_path);
107
+		// does the file path INCLUDE the actual file name as part of the path ?
108
+		if (strpos($shortcode_path, $shortcode_ext) !== false) {
109
+			// grab shortcode file name from directory name and break apart at dots
110
+			$shortcode_file = explode('.', basename($shortcode_path));
111
+			// take first segment from file name pieces and remove class prefix if it exists
112
+			$shortcode = strpos($shortcode_file[0], 'EES_') === 0
113
+				? substr($shortcode_file[0], 4)
114
+				: $shortcode_file[0];
115
+			// sanitize shortcode directory name
116
+			$shortcode = sanitize_key($shortcode);
117
+			// now we need to rebuild the shortcode path
118
+			$shortcode_path = explode('/', $shortcode_path);
119
+			// remove last segment
120
+			array_pop($shortcode_path);
121
+			// glue it back together
122
+			$shortcode_path = implode('/', $shortcode_path) . '/';
123
+		} else {
124
+			// we need to generate the filename based off of the folder name
125
+			// grab and sanitize shortcode directory name
126
+			$shortcode = sanitize_key(basename($shortcode_path));
127
+			$shortcode_path = rtrim($shortcode_path, '/') . '/';
128
+		}
129
+		// create classname from shortcode directory or file name
130
+		$shortcode = str_replace(' ', '_', ucwords(str_replace('_', ' ', $shortcode)));
131
+		// add class prefix
132
+		$shortcode_class = 'EES_' . $shortcode;
133
+		// does the shortcode exist ?
134
+		if (! is_readable($shortcode_path . '/' . $shortcode_class . $shortcode_ext)) {
135
+			$msg = sprintf(
136
+				esc_html__(
137
+					'The requested %1$s shortcode file could not be found or is not readable due to file permissions. It should be in %2$s',
138
+					'event_espresso'
139
+				),
140
+				$shortcode_class,
141
+				$shortcode_path . '/' . $shortcode_class . $shortcode_ext
142
+			);
143
+			EE_Error::add_error($msg . '||' . $msg, __FILE__, __FUNCTION__, __LINE__);
144
+			return false;
145
+		}
146
+		// load the shortcode class file
147
+		require_once($shortcode_path . $shortcode_class . $shortcode_ext);
148
+		// verify that class exists
149
+		if (! class_exists($shortcode_class)) {
150
+			$msg = sprintf(
151
+				esc_html__('The requested %s shortcode class does not exist.', 'event_espresso'),
152
+				$shortcode_class
153
+			);
154
+			EE_Error::add_error($msg . '||' . $msg, __FILE__, __FUNCTION__, __LINE__);
155
+			return false;
156
+		}
157
+		$shortcode = strtoupper($shortcode);
158
+		// add to array of registered shortcodes
159
+		$this->registry->shortcodes->{$shortcode} = $shortcode_path . $shortcode_class . $shortcode_ext;
160
+		return true;
161
+	}
162
+
163
+
164
+	/**
165
+	 *    _initialize_shortcodes
166
+	 *    allow shortcodes to set hooks for the rest of the system
167
+	 *
168
+	 * @access private
169
+	 * @return void
170
+	 */
171
+	public function addShortcodes()
172
+	{
173
+		// cycle thru shortcode folders
174
+		foreach ($this->registry->shortcodes as $shortcode => $shortcode_path) {
175
+			// add class prefix
176
+			$shortcode_class = 'EES_' . $shortcode;
177
+			// fire the shortcode class's set_hooks methods in case it needs to hook into other parts of the system
178
+			// which set hooks ?
179
+			if (is_admin()) {
180
+				// fire immediately
181
+				call_user_func(array($shortcode_class, 'set_hooks_admin'));
182
+			} else {
183
+				// delay until other systems are online
184
+				add_action(
185
+					'AHEE__EE_System__set_hooks_for_shortcodes_modules_and_addons',
186
+					array($shortcode_class, 'set_hooks')
187
+				);
188
+				// convert classname to UPPERCASE and create WP shortcode.
189
+				$shortcode_tag = strtoupper($shortcode);
190
+				// but first check if the shortcode has already
191
+				// been added before assigning 'fallback_shortcode_processor'
192
+				if (! shortcode_exists($shortcode_tag)) {
193
+					// NOTE: this shortcode declaration will get overridden if the shortcode
194
+					// is successfully detected in the post content in initializeShortcode()
195
+					add_shortcode($shortcode_tag, array($shortcode_class, 'fallback_shortcode_processor'));
196
+				}
197
+			}
198
+		}
199
+	}
200
+
201
+
202
+	/**
203
+	 * callback for the WP "get_header" hook point
204
+	 * checks posts for EE shortcodes, and initializes them,
205
+	 * then toggles filter switch that loads core default assets
206
+	 *
207
+	 * @param \WP_Query $wp_query
208
+	 * @return void
209
+	 */
210
+	public function initializeShortcodes(WP_Query $wp_query)
211
+	{
212
+		if (
213
+			empty($this->registry->shortcodes)
214
+			|| defined('EE_TESTS_DIR')
215
+			|| ! $wp_query->is_main_query()
216
+			|| is_admin()
217
+		) {
218
+			return;
219
+		}
220
+		global $wp;
221
+		/** @var EE_Front_controller $Front_Controller */
222
+		$Front_Controller = $this->registry->load_core('Front_Controller', array(), false);
223
+		do_action('AHEE__EE_Front_Controller__initialize_shortcodes__begin', $wp, $Front_Controller);
224
+		$Front_Controller->Request_Handler()->set_request_vars();
225
+		// grab post_name from request
226
+		$current_post = apply_filters(
227
+			'FHEE__EE_Front_Controller__initialize_shortcodes__current_post_name',
228
+			$Front_Controller->Request_Handler()->get('post_name')
229
+		);
230
+		$show_on_front = get_option('show_on_front');
231
+		// if it's not set, then check if frontpage is blog
232
+		if (empty($current_post)) {
233
+			// yup.. this is the posts page, prepare to load all shortcode modules
234
+			$current_post = 'posts';
235
+			// unless..
236
+			if ($show_on_front === 'page') {
237
+				// some other page is set as the homepage
238
+				$page_on_front = get_option('page_on_front');
239
+				if ($page_on_front) {
240
+					// k now we need to find the post_name for this page
241
+					global $wpdb;
242
+					$page_on_front = $wpdb->get_var(
243
+						$wpdb->prepare(
244
+							"SELECT post_name from {$wpdb->posts} WHERE post_type='page' AND post_status NOT IN ('auto-draft', 'inherit', 'trash') AND ID=%d",
245
+							$page_on_front
246
+						)
247
+					);
248
+					// set the current post slug to what it actually is
249
+					$current_post = $page_on_front ? $page_on_front : $current_post;
250
+				}
251
+			}
252
+		}
253
+		// in case $current_post is hierarchical like: /parent-page/current-page
254
+		$current_post = basename($current_post);
255
+		if (
256 256
 // is current page/post the "blog" page ?
257
-            $current_post === EE_Config::get_page_for_posts()
258
-            // or are we on a category page?
259
-            || (
260
-                is_array(term_exists($current_post, 'category'))
261
-                || array_key_exists('category_name', $wp->query_vars)
262
-            )
263
-        ) {
264
-            // initialize all legacy shortcodes
265
-            $load_assets = $this->parseContentForShortcodes('', true);
266
-        } else {
267
-            global $wpdb;
268
-            $post_content = $wpdb->get_var(
269
-                $wpdb->prepare(
270
-                    "SELECT post_content from {$wpdb->posts} WHERE post_status NOT IN ('auto-draft', 'inherit', 'trash') AND post_name=%s",
271
-                    $current_post
272
-                )
273
-            );
274
-            $load_assets = $this->parseContentForShortcodes($post_content);
275
-        }
276
-        if ($load_assets) {
277
-            $this->registry->REQ->set_espresso_page(true);
278
-            add_filter('FHEE_load_css', '__return_true');
279
-            add_filter('FHEE_load_js', '__return_true');
280
-        }
281
-        do_action('AHEE__EE_Front_Controller__initialize_shortcodes__end', $Front_Controller);
282
-    }
283
-
284
-
285
-    /**
286
-     * checks supplied content against list of legacy shortcodes,
287
-     * then initializes any found shortcodes, and returns true.
288
-     * returns false if no shortcodes found.
289
-     *
290
-     * @param string $content
291
-     * @param bool   $load_all if true, then ALL active legacy shortcodes will be initialized
292
-     * @return bool
293
-     */
294
-    public function parseContentForShortcodes($content = '', $load_all = false)
295
-    {
296
-        $has_shortcode = false;
297
-        foreach ($this->registry->shortcodes as $shortcode_class => $shortcode) {
298
-            if ($load_all || has_shortcode($content, $shortcode_class)) {
299
-                // load up the shortcode
300
-                $this->initializeShortcode($shortcode_class);
301
-                $has_shortcode = true;
302
-            }
303
-        }
304
-        return $has_shortcode;
305
-    }
306
-
307
-
308
-    /**
309
-     * given a shortcode name, will instantiate the shortcode and call it's run() method
310
-     *
311
-     * @param string $shortcode_class
312
-     * @param WP     $wp
313
-     */
314
-    public function initializeShortcode($shortcode_class = '', WP $wp = null)
315
-    {
316
-        // don't do anything if shortcode is already initialized
317
-        if (
318
-            empty($this->registry->shortcodes->{$shortcode_class})
319
-            || ! is_string($this->registry->shortcodes->{$shortcode_class})
320
-        ) {
321
-            return;
322
-        }
323
-        // let's pause to reflect on this...
324
-        $sc_reflector = new ReflectionClass(LegacyShortcodesManager::addShortcodeClassPrefix($shortcode_class));
325
-        // ensure that class is actually a shortcode
326
-        if (
327
-            defined('WP_DEBUG')
328
-            && WP_DEBUG === true
329
-            && ! $sc_reflector->isSubclassOf('EES_Shortcode')
330
-        ) {
331
-            EE_Error::add_error(
332
-                sprintf(
333
-                    esc_html__(
334
-                        'The requested %s shortcode is not of the class "EES_Shortcode". Please check your files.',
335
-                        'event_espresso'
336
-                    ),
337
-                    $shortcode_class
338
-                ),
339
-                __FILE__,
340
-                __FUNCTION__,
341
-                __LINE__
342
-            );
343
-            add_filter('FHEE_run_EE_the_content', '__return_true');
344
-            return;
345
-        }
346
-        global $wp;
347
-        // and pass the request object to the run method
348
-        $this->registry->shortcodes->{$shortcode_class} = $sc_reflector->newInstance();
349
-        // fire the shortcode class's run method, so that it can activate resources
350
-        $this->registry->shortcodes->{$shortcode_class}->run($wp);
351
-    }
352
-
353
-
354
-    /**
355
-     * get classname, remove EES_prefix, and convert to UPPERCASE
356
-     *
357
-     * @param string $class_name
358
-     * @return string
359
-     */
360
-    public static function generateShortcodeTagFromClassName($class_name)
361
-    {
362
-        return strtoupper(str_replace('EES_', '', $class_name));
363
-    }
364
-
365
-
366
-    /**
367
-     * add EES_prefix and Capitalize words
368
-     *
369
-     * @param string $tag
370
-     * @return string
371
-     */
372
-    public static function generateShortcodeClassNameFromTag($tag)
373
-    {
374
-        // order of operation runs from inside to out
375
-        // 5) maybe add prefix
376
-        return LegacyShortcodesManager::addShortcodeClassPrefix(
377
-            // 4) find spaces, replace with underscores
378
-            str_replace(
379
-                ' ',
380
-                '_',
381
-                // 3) capitalize first letter of each word
382
-                ucwords(
383
-                    // 2) also change to lowercase so ucwords() will work
384
-                    strtolower(
385
-                        // 1) find underscores, replace with spaces so ucwords() will work
386
-                        str_replace(
387
-                            '_',
388
-                            ' ',
389
-                            $tag
390
-                        )
391
-                    )
392
-                )
393
-            )
394
-        );
395
-    }
396
-
397
-
398
-    /**
399
-     * maybe add EES_prefix
400
-     *
401
-     * @param string $class_name
402
-     * @return string
403
-     */
404
-    public static function addShortcodeClassPrefix($class_name)
405
-    {
406
-        return strpos($class_name, 'EES_') === 0 ? $class_name : 'EES_' . $class_name;
407
-    }
408
-
409
-
410
-    /**
411
-     * @return array
412
-     */
413
-    public function getEspressoShortcodeTags()
414
-    {
415
-        static $shortcode_tags = array();
416
-        if (empty($shortcode_tags)) {
417
-            $shortcode_tags = array_keys((array) $this->registry->shortcodes);
418
-        }
419
-        return $shortcode_tags;
420
-    }
421
-
422
-
423
-    /**
424
-     * @param string $content
425
-     * @return string
426
-     */
427
-    public function doShortcode($content)
428
-    {
429
-        foreach ($this->getEspressoShortcodeTags() as $shortcode_tag) {
430
-            if (strpos($content, $shortcode_tag) !== false) {
431
-                $shortcode_class = LegacyShortcodesManager::generateShortcodeClassNameFromTag($shortcode_tag);
432
-                $this->initializeShortcode($shortcode_class);
433
-            }
434
-        }
435
-        return do_shortcode($content);
436
-    }
257
+			$current_post === EE_Config::get_page_for_posts()
258
+			// or are we on a category page?
259
+			|| (
260
+				is_array(term_exists($current_post, 'category'))
261
+				|| array_key_exists('category_name', $wp->query_vars)
262
+			)
263
+		) {
264
+			// initialize all legacy shortcodes
265
+			$load_assets = $this->parseContentForShortcodes('', true);
266
+		} else {
267
+			global $wpdb;
268
+			$post_content = $wpdb->get_var(
269
+				$wpdb->prepare(
270
+					"SELECT post_content from {$wpdb->posts} WHERE post_status NOT IN ('auto-draft', 'inherit', 'trash') AND post_name=%s",
271
+					$current_post
272
+				)
273
+			);
274
+			$load_assets = $this->parseContentForShortcodes($post_content);
275
+		}
276
+		if ($load_assets) {
277
+			$this->registry->REQ->set_espresso_page(true);
278
+			add_filter('FHEE_load_css', '__return_true');
279
+			add_filter('FHEE_load_js', '__return_true');
280
+		}
281
+		do_action('AHEE__EE_Front_Controller__initialize_shortcodes__end', $Front_Controller);
282
+	}
283
+
284
+
285
+	/**
286
+	 * checks supplied content against list of legacy shortcodes,
287
+	 * then initializes any found shortcodes, and returns true.
288
+	 * returns false if no shortcodes found.
289
+	 *
290
+	 * @param string $content
291
+	 * @param bool   $load_all if true, then ALL active legacy shortcodes will be initialized
292
+	 * @return bool
293
+	 */
294
+	public function parseContentForShortcodes($content = '', $load_all = false)
295
+	{
296
+		$has_shortcode = false;
297
+		foreach ($this->registry->shortcodes as $shortcode_class => $shortcode) {
298
+			if ($load_all || has_shortcode($content, $shortcode_class)) {
299
+				// load up the shortcode
300
+				$this->initializeShortcode($shortcode_class);
301
+				$has_shortcode = true;
302
+			}
303
+		}
304
+		return $has_shortcode;
305
+	}
306
+
307
+
308
+	/**
309
+	 * given a shortcode name, will instantiate the shortcode and call it's run() method
310
+	 *
311
+	 * @param string $shortcode_class
312
+	 * @param WP     $wp
313
+	 */
314
+	public function initializeShortcode($shortcode_class = '', WP $wp = null)
315
+	{
316
+		// don't do anything if shortcode is already initialized
317
+		if (
318
+			empty($this->registry->shortcodes->{$shortcode_class})
319
+			|| ! is_string($this->registry->shortcodes->{$shortcode_class})
320
+		) {
321
+			return;
322
+		}
323
+		// let's pause to reflect on this...
324
+		$sc_reflector = new ReflectionClass(LegacyShortcodesManager::addShortcodeClassPrefix($shortcode_class));
325
+		// ensure that class is actually a shortcode
326
+		if (
327
+			defined('WP_DEBUG')
328
+			&& WP_DEBUG === true
329
+			&& ! $sc_reflector->isSubclassOf('EES_Shortcode')
330
+		) {
331
+			EE_Error::add_error(
332
+				sprintf(
333
+					esc_html__(
334
+						'The requested %s shortcode is not of the class "EES_Shortcode". Please check your files.',
335
+						'event_espresso'
336
+					),
337
+					$shortcode_class
338
+				),
339
+				__FILE__,
340
+				__FUNCTION__,
341
+				__LINE__
342
+			);
343
+			add_filter('FHEE_run_EE_the_content', '__return_true');
344
+			return;
345
+		}
346
+		global $wp;
347
+		// and pass the request object to the run method
348
+		$this->registry->shortcodes->{$shortcode_class} = $sc_reflector->newInstance();
349
+		// fire the shortcode class's run method, so that it can activate resources
350
+		$this->registry->shortcodes->{$shortcode_class}->run($wp);
351
+	}
352
+
353
+
354
+	/**
355
+	 * get classname, remove EES_prefix, and convert to UPPERCASE
356
+	 *
357
+	 * @param string $class_name
358
+	 * @return string
359
+	 */
360
+	public static function generateShortcodeTagFromClassName($class_name)
361
+	{
362
+		return strtoupper(str_replace('EES_', '', $class_name));
363
+	}
364
+
365
+
366
+	/**
367
+	 * add EES_prefix and Capitalize words
368
+	 *
369
+	 * @param string $tag
370
+	 * @return string
371
+	 */
372
+	public static function generateShortcodeClassNameFromTag($tag)
373
+	{
374
+		// order of operation runs from inside to out
375
+		// 5) maybe add prefix
376
+		return LegacyShortcodesManager::addShortcodeClassPrefix(
377
+			// 4) find spaces, replace with underscores
378
+			str_replace(
379
+				' ',
380
+				'_',
381
+				// 3) capitalize first letter of each word
382
+				ucwords(
383
+					// 2) also change to lowercase so ucwords() will work
384
+					strtolower(
385
+						// 1) find underscores, replace with spaces so ucwords() will work
386
+						str_replace(
387
+							'_',
388
+							' ',
389
+							$tag
390
+						)
391
+					)
392
+				)
393
+			)
394
+		);
395
+	}
396
+
397
+
398
+	/**
399
+	 * maybe add EES_prefix
400
+	 *
401
+	 * @param string $class_name
402
+	 * @return string
403
+	 */
404
+	public static function addShortcodeClassPrefix($class_name)
405
+	{
406
+		return strpos($class_name, 'EES_') === 0 ? $class_name : 'EES_' . $class_name;
407
+	}
408
+
409
+
410
+	/**
411
+	 * @return array
412
+	 */
413
+	public function getEspressoShortcodeTags()
414
+	{
415
+		static $shortcode_tags = array();
416
+		if (empty($shortcode_tags)) {
417
+			$shortcode_tags = array_keys((array) $this->registry->shortcodes);
418
+		}
419
+		return $shortcode_tags;
420
+	}
421
+
422
+
423
+	/**
424
+	 * @param string $content
425
+	 * @return string
426
+	 */
427
+	public function doShortcode($content)
428
+	{
429
+		foreach ($this->getEspressoShortcodeTags() as $shortcode_tag) {
430
+			if (strpos($content, $shortcode_tag) !== false) {
431
+				$shortcode_class = LegacyShortcodesManager::generateShortcodeClassNameFromTag($shortcode_tag);
432
+				$this->initializeShortcode($shortcode_class);
433
+			}
434
+		}
435
+		return do_shortcode($content);
436
+	}
437 437
 }
Please login to merge, or discard this patch.
core/espresso_definitions.php 2 patches
Indentation   +11 added lines, -11 removed lines patch added patch discarded remove patch
@@ -7,16 +7,16 @@  discard block
 block discarded – undo
7 7
 define('EE_SUPPORT_EMAIL', '[email protected]');
8 8
 // used to be DIRECTORY_SEPARATOR, but that caused issues on windows
9 9
 if (! defined('DS')) {
10
-    define('DS', '/');
10
+	define('DS', '/');
11 11
 }
12 12
 if (! defined('PS')) {
13
-    define('PS', PATH_SEPARATOR);
13
+	define('PS', PATH_SEPARATOR);
14 14
 }
15 15
 if (! defined('SP')) {
16
-    define('SP', ' ');
16
+	define('SP', ' ');
17 17
 }
18 18
 if (! defined('EENL')) {
19
-    define('EENL', "\n");
19
+	define('EENL', "\n");
20 20
 }
21 21
 // define the plugin directory and URL
22 22
 define('EE_PLUGIN_BASENAME', plugin_basename(EVENT_ESPRESSO_MAIN_FILE));
@@ -70,16 +70,16 @@  discard block
 block discarded – undo
70 70
 define('EE_LANGUAGES_SAFE_DIR', EVENT_ESPRESSO_UPLOAD_DIR . 'languages/');
71 71
 // check for DOMPDF fonts in uploads
72 72
 if (file_exists(EVENT_ESPRESSO_UPLOAD_DIR . 'fonts/')) {
73
-    define('DOMPDF_FONT_DIR', EVENT_ESPRESSO_UPLOAD_DIR . 'fonts/');
73
+	define('DOMPDF_FONT_DIR', EVENT_ESPRESSO_UPLOAD_DIR . 'fonts/');
74 74
 }
75 75
 // ajax constants
76 76
 define(
77
-    'EE_FRONT_AJAX',
78
-    isset($_REQUEST['ee_front_ajax']) || isset($_REQUEST['data']['ee_front_ajax'])
77
+	'EE_FRONT_AJAX',
78
+	isset($_REQUEST['ee_front_ajax']) || isset($_REQUEST['data']['ee_front_ajax'])
79 79
 );
80 80
 define(
81
-    'EE_ADMIN_AJAX',
82
-    isset($_REQUEST['ee_admin_ajax']) || isset($_REQUEST['data']['ee_admin_ajax'])
81
+	'EE_ADMIN_AJAX',
82
+	isset($_REQUEST['ee_admin_ajax']) || isset($_REQUEST['data']['ee_admin_ajax'])
83 83
 );
84 84
 // just a handy constant occasionally needed for finding values representing infinity in the DB
85 85
 // you're better to use this than its straight value (currently -1) in case you ever
@@ -87,9 +87,9 @@  discard block
 block discarded – undo
87 87
 define('EE_INF_IN_DB', -1);
88 88
 define('EE_INF', INF > (float) PHP_INT_MAX ? INF : PHP_INT_MAX);
89 89
 if (! defined('EE_DEBUG')) {
90
-    define('EE_DEBUG', false);
90
+	define('EE_DEBUG', false);
91 91
 }
92 92
 // for older WP versions
93 93
 if (! defined('MONTH_IN_SECONDS')) {
94
-    define('MONTH_IN_SECONDS', DAY_IN_SECONDS * 30);
94
+	define('MONTH_IN_SECONDS', DAY_IN_SECONDS * 30);
95 95
 }
Please login to merge, or discard this patch.
Spacing   +45 added lines, -45 removed lines patch added patch discarded remove patch
@@ -6,71 +6,71 @@  discard block
 block discarded – undo
6 6
 define('EE_MIN_PHP_VER_RECOMMENDED', '5.6.32');
7 7
 define('EE_SUPPORT_EMAIL', '[email protected]');
8 8
 // used to be DIRECTORY_SEPARATOR, but that caused issues on windows
9
-if (! defined('DS')) {
9
+if ( ! defined('DS')) {
10 10
     define('DS', '/');
11 11
 }
12
-if (! defined('PS')) {
12
+if ( ! defined('PS')) {
13 13
     define('PS', PATH_SEPARATOR);
14 14
 }
15
-if (! defined('SP')) {
15
+if ( ! defined('SP')) {
16 16
     define('SP', ' ');
17 17
 }
18
-if (! defined('EENL')) {
18
+if ( ! defined('EENL')) {
19 19
     define('EENL', "\n");
20 20
 }
21 21
 // define the plugin directory and URL
22 22
 define('EE_PLUGIN_BASENAME', plugin_basename(EVENT_ESPRESSO_MAIN_FILE));
23
-define('EE_PLUGIN_DIR_PATH', dirname(EVENT_ESPRESSO_MAIN_FILE) . '/');
23
+define('EE_PLUGIN_DIR_PATH', dirname(EVENT_ESPRESSO_MAIN_FILE).'/');
24 24
 define('EE_PLUGIN_DIR_URL', plugin_dir_url(EVENT_ESPRESSO_MAIN_FILE));
25 25
 // main root folder paths
26
-define('EE_ADMIN_PAGES', EE_PLUGIN_DIR_PATH . 'admin_pages/');
27
-define('EE_CORE', EE_PLUGIN_DIR_PATH . 'core/');
28
-define('EE_MODULES', EE_PLUGIN_DIR_PATH . 'modules/');
29
-define('EE_PUBLIC', EE_PLUGIN_DIR_PATH . 'public/');
30
-define('EE_SHORTCODES', EE_PLUGIN_DIR_PATH . 'shortcodes/');
31
-define('EE_WIDGETS', EE_PLUGIN_DIR_PATH . 'widgets/');
32
-define('EE_PAYMENT_METHODS', EE_PLUGIN_DIR_PATH . 'payment_methods/');
33
-define('EE_CAFF_PATH', EE_PLUGIN_DIR_PATH . 'caffeinated/');
26
+define('EE_ADMIN_PAGES', EE_PLUGIN_DIR_PATH.'admin_pages/');
27
+define('EE_CORE', EE_PLUGIN_DIR_PATH.'core/');
28
+define('EE_MODULES', EE_PLUGIN_DIR_PATH.'modules/');
29
+define('EE_PUBLIC', EE_PLUGIN_DIR_PATH.'public/');
30
+define('EE_SHORTCODES', EE_PLUGIN_DIR_PATH.'shortcodes/');
31
+define('EE_WIDGETS', EE_PLUGIN_DIR_PATH.'widgets/');
32
+define('EE_PAYMENT_METHODS', EE_PLUGIN_DIR_PATH.'payment_methods/');
33
+define('EE_CAFF_PATH', EE_PLUGIN_DIR_PATH.'caffeinated/');
34 34
 // core system paths
35
-define('EE_ADMIN', EE_CORE . 'admin/');
36
-define('EE_CPTS', EE_CORE . 'CPTs/');
37
-define('EE_CLASSES', EE_CORE . 'db_classes/');
38
-define('EE_INTERFACES', EE_CORE . 'interfaces/');
39
-define('EE_BUSINESS', EE_CORE . 'business/');
40
-define('EE_MODELS', EE_CORE . 'db_models/');
41
-define('EE_HELPERS', EE_CORE . 'helpers/');
42
-define('EE_LIBRARIES', EE_CORE . 'libraries/');
43
-define('EE_TEMPLATES', EE_CORE . 'templates/');
44
-define('EE_THIRD_PARTY', EE_CORE . 'third_party_libs/');
45
-define('EE_GLOBAL_ASSETS', EE_TEMPLATES . 'global_assets/');
46
-define('EE_FORM_SECTIONS', EE_LIBRARIES . 'form_sections/');
35
+define('EE_ADMIN', EE_CORE.'admin/');
36
+define('EE_CPTS', EE_CORE.'CPTs/');
37
+define('EE_CLASSES', EE_CORE.'db_classes/');
38
+define('EE_INTERFACES', EE_CORE.'interfaces/');
39
+define('EE_BUSINESS', EE_CORE.'business/');
40
+define('EE_MODELS', EE_CORE.'db_models/');
41
+define('EE_HELPERS', EE_CORE.'helpers/');
42
+define('EE_LIBRARIES', EE_CORE.'libraries/');
43
+define('EE_TEMPLATES', EE_CORE.'templates/');
44
+define('EE_THIRD_PARTY', EE_CORE.'third_party_libs/');
45
+define('EE_GLOBAL_ASSETS', EE_TEMPLATES.'global_assets/');
46
+define('EE_FORM_SECTIONS', EE_LIBRARIES.'form_sections/');
47 47
 // gateways
48
-define('EE_GATEWAYS', EE_MODULES . 'gateways/');
49
-define('EE_GATEWAYS_URL', EE_PLUGIN_DIR_URL . 'modules/gateways/');
48
+define('EE_GATEWAYS', EE_MODULES.'gateways/');
49
+define('EE_GATEWAYS_URL', EE_PLUGIN_DIR_URL.'modules/gateways/');
50 50
 // asset URL paths
51
-define('EE_TEMPLATES_URL', EE_PLUGIN_DIR_URL . 'core/templates/');
52
-define('EE_GLOBAL_ASSETS_URL', EE_TEMPLATES_URL . 'global_assets/');
53
-define('EE_IMAGES_URL', EE_GLOBAL_ASSETS_URL . 'images/');
54
-define('EE_THIRD_PARTY_URL', EE_PLUGIN_DIR_URL . 'core/third_party_libs/');
55
-define('EE_HELPERS_ASSETS', EE_PLUGIN_DIR_URL . 'core/helpers/assets/');
56
-define('EE_LIBRARIES_URL', EE_PLUGIN_DIR_URL . 'core/libraries/');
51
+define('EE_TEMPLATES_URL', EE_PLUGIN_DIR_URL.'core/templates/');
52
+define('EE_GLOBAL_ASSETS_URL', EE_TEMPLATES_URL.'global_assets/');
53
+define('EE_IMAGES_URL', EE_GLOBAL_ASSETS_URL.'images/');
54
+define('EE_THIRD_PARTY_URL', EE_PLUGIN_DIR_URL.'core/third_party_libs/');
55
+define('EE_HELPERS_ASSETS', EE_PLUGIN_DIR_URL.'core/helpers/assets/');
56
+define('EE_LIBRARIES_URL', EE_PLUGIN_DIR_URL.'core/libraries/');
57 57
 // define upload paths
58 58
 $uploads = wp_upload_dir();
59 59
 // define the uploads directory and URL
60
-define('EVENT_ESPRESSO_UPLOAD_DIR', $uploads['basedir'] . '/espresso/');
61
-define('EVENT_ESPRESSO_UPLOAD_URL', $uploads['baseurl'] . '/espresso/');
60
+define('EVENT_ESPRESSO_UPLOAD_DIR', $uploads['basedir'].'/espresso/');
61
+define('EVENT_ESPRESSO_UPLOAD_URL', $uploads['baseurl'].'/espresso/');
62 62
 // define the templates directory and URL
63
-define('EVENT_ESPRESSO_TEMPLATE_DIR', $uploads['basedir'] . '/espresso/templates/');
64
-define('EVENT_ESPRESSO_TEMPLATE_URL', $uploads['baseurl'] . '/espresso/templates/');
63
+define('EVENT_ESPRESSO_TEMPLATE_DIR', $uploads['basedir'].'/espresso/templates/');
64
+define('EVENT_ESPRESSO_TEMPLATE_URL', $uploads['baseurl'].'/espresso/templates/');
65 65
 // define the gateway directory and URL
66
-define('EVENT_ESPRESSO_GATEWAY_DIR', $uploads['basedir'] . '/espresso/gateways/');
67
-define('EVENT_ESPRESSO_GATEWAY_URL', $uploads['baseurl'] . '/espresso/gateways/');
66
+define('EVENT_ESPRESSO_GATEWAY_DIR', $uploads['basedir'].'/espresso/gateways/');
67
+define('EVENT_ESPRESSO_GATEWAY_URL', $uploads['baseurl'].'/espresso/gateways/');
68 68
 // languages folder/path
69
-define('EE_LANGUAGES_SAFE_LOC', '../' . 'uploads/' . 'espresso/languages/');
70
-define('EE_LANGUAGES_SAFE_DIR', EVENT_ESPRESSO_UPLOAD_DIR . 'languages/');
69
+define('EE_LANGUAGES_SAFE_LOC', '../'.'uploads/'.'espresso/languages/');
70
+define('EE_LANGUAGES_SAFE_DIR', EVENT_ESPRESSO_UPLOAD_DIR.'languages/');
71 71
 // check for DOMPDF fonts in uploads
72
-if (file_exists(EVENT_ESPRESSO_UPLOAD_DIR . 'fonts/')) {
73
-    define('DOMPDF_FONT_DIR', EVENT_ESPRESSO_UPLOAD_DIR . 'fonts/');
72
+if (file_exists(EVENT_ESPRESSO_UPLOAD_DIR.'fonts/')) {
73
+    define('DOMPDF_FONT_DIR', EVENT_ESPRESSO_UPLOAD_DIR.'fonts/');
74 74
 }
75 75
 // ajax constants
76 76
 define(
@@ -86,10 +86,10 @@  discard block
 block discarded – undo
86 86
 // want to change its default value! or find when -1 means infinity
87 87
 define('EE_INF_IN_DB', -1);
88 88
 define('EE_INF', INF > (float) PHP_INT_MAX ? INF : PHP_INT_MAX);
89
-if (! defined('EE_DEBUG')) {
89
+if ( ! defined('EE_DEBUG')) {
90 90
     define('EE_DEBUG', false);
91 91
 }
92 92
 // for older WP versions
93
-if (! defined('MONTH_IN_SECONDS')) {
93
+if ( ! defined('MONTH_IN_SECONDS')) {
94 94
     define('MONTH_IN_SECONDS', DAY_IN_SECONDS * 30);
95 95
 }
Please login to merge, or discard this patch.
core/libraries/form_sections/base/EE_Form_Section_Proper.form.php 2 patches
Spacing   +38 added lines, -38 removed lines patch added patch discarded remove patch
@@ -111,8 +111,8 @@  discard block
 block discarded – undo
111 111
             // AND we are going to make sure they're in that specified order
112 112
             $reordered_subsections = array();
113 113
             foreach ($options_array['include'] as $input_name) {
114
-                if (isset($this->_subsections[ $input_name ])) {
115
-                    $reordered_subsections[ $input_name ] = $this->_subsections[ $input_name ];
114
+                if (isset($this->_subsections[$input_name])) {
115
+                    $reordered_subsections[$input_name] = $this->_subsections[$input_name];
116 116
                 }
117 117
             }
118 118
             $this->_subsections = $reordered_subsections;
@@ -124,7 +124,7 @@  discard block
 block discarded – undo
124 124
         if (isset($options_array['layout_strategy'])) {
125 125
             $this->_layout_strategy = $options_array['layout_strategy'];
126 126
         }
127
-        if (! $this->_layout_strategy) {
127
+        if ( ! $this->_layout_strategy) {
128 128
             $this->_layout_strategy = is_admin() ? new EE_Admin_Two_Column_Layout() : new EE_Two_Column_Layout();
129 129
         }
130 130
         $this->_layout_strategy->_construct_finalize($this);
@@ -313,7 +313,7 @@  discard block
 block discarded – undo
313 313
         if ($validate) {
314 314
             $this->_validate();
315 315
             // if it's invalid, we're going to want to re-display so remember what they submitted
316
-            if (! $this->is_valid()) {
316
+            if ( ! $this->is_valid()) {
317 317
                 $this->store_submitted_form_data_in_session();
318 318
             }
319 319
         }
@@ -426,11 +426,11 @@  discard block
 block discarded – undo
426 426
     public function populate_defaults($default_data)
427 427
     {
428 428
         foreach ($this->subsections(false) as $subsection_name => $subsection) {
429
-            if (isset($default_data[ $subsection_name ])) {
429
+            if (isset($default_data[$subsection_name])) {
430 430
                 if ($subsection instanceof EE_Form_Input_Base) {
431
-                    $subsection->set_default($default_data[ $subsection_name ]);
431
+                    $subsection->set_default($default_data[$subsection_name]);
432 432
                 } elseif ($subsection instanceof EE_Form_Section_Proper) {
433
-                    $subsection->populate_defaults($default_data[ $subsection_name ]);
433
+                    $subsection->populate_defaults($default_data[$subsection_name]);
434 434
                 }
435 435
             }
436 436
         }
@@ -445,7 +445,7 @@  discard block
 block discarded – undo
445 445
      */
446 446
     public function subsection_exists($name)
447 447
     {
448
-        return isset($this->_subsections[ $name ]) ? true : false;
448
+        return isset($this->_subsections[$name]) ? true : false;
449 449
     }
450 450
 
451 451
 
@@ -467,7 +467,7 @@  discard block
 block discarded – undo
467 467
         if ($require_construction_to_be_finalized) {
468 468
             $this->ensure_construct_finalized_called();
469 469
         }
470
-        return $this->subsection_exists($name) ? $this->_subsections[ $name ] : null;
470
+        return $this->subsection_exists($name) ? $this->_subsections[$name] : null;
471 471
     }
472 472
 
473 473
 
@@ -482,7 +482,7 @@  discard block
 block discarded – undo
482 482
         $validatable_subsections = array();
483 483
         foreach ($this->subsections() as $name => $obj) {
484 484
             if ($obj instanceof EE_Form_Section_Validatable) {
485
-                $validatable_subsections[ $name ] = $obj;
485
+                $validatable_subsections[$name] = $obj;
486 486
             }
487 487
         }
488 488
         return $validatable_subsections;
@@ -509,7 +509,7 @@  discard block
 block discarded – undo
509 509
             $name,
510 510
             $require_construction_to_be_finalized
511 511
         );
512
-        if (! $subsection instanceof EE_Form_Input_Base) {
512
+        if ( ! $subsection instanceof EE_Form_Input_Base) {
513 513
             throw new EE_Error(
514 514
                 sprintf(
515 515
                     esc_html__(
@@ -546,7 +546,7 @@  discard block
 block discarded – undo
546 546
             $name,
547 547
             $require_construction_to_be_finalized
548 548
         );
549
-        if (! $subsection instanceof EE_Form_Section_Proper) {
549
+        if ( ! $subsection instanceof EE_Form_Section_Proper) {
550 550
             throw new EE_Error(
551 551
                 sprintf(
552 552
                     esc_html__(
@@ -586,7 +586,7 @@  discard block
 block discarded – undo
586 586
     public function is_valid()
587 587
     {
588 588
         if ($this->is_valid === null) {
589
-            if (! $this->has_received_submission()) {
589
+            if ( ! $this->has_received_submission()) {
590 590
                 throw new EE_Error(
591 591
                     sprintf(
592 592
                         esc_html__(
@@ -596,14 +596,14 @@  discard block
 block discarded – undo
596 596
                     )
597 597
                 );
598 598
             }
599
-            if (! parent::is_valid()) {
599
+            if ( ! parent::is_valid()) {
600 600
                 $this->is_valid = false;
601 601
             } else {
602 602
                 // ok so no general errors to this entire form section.
603 603
                 // so let's check the subsections, but only set errors if that hasn't been done yet
604 604
                 $this->is_valid = true;
605 605
                 foreach ($this->get_validatable_subsections() as $subsection) {
606
-                    if (! $subsection->is_valid()) {
606
+                    if ( ! $subsection->is_valid()) {
607 607
                         $this->is_valid = false;
608 608
                     }
609 609
                 }
@@ -620,7 +620,7 @@  discard block
 block discarded – undo
620 620
      */
621 621
     protected function _set_default_name_if_empty()
622 622
     {
623
-        if (! $this->_name) {
623
+        if ( ! $this->_name) {
624 624
             $classname    = get_class($this);
625 625
             $default_name = str_replace('EE_', '', $classname);
626 626
             $this->_name  = $default_name;
@@ -710,7 +710,7 @@  discard block
 block discarded – undo
710 710
     {
711 711
         wp_register_script(
712 712
             'ee_form_section_validation',
713
-            EE_GLOBAL_ASSETS_URL . 'scripts' . '/form_section_validation.js',
713
+            EE_GLOBAL_ASSETS_URL.'scripts'.'/form_section_validation.js',
714 714
             array('jquery-validate', 'jquery-ui-datepicker', 'jquery-validate-extra-methods'),
715 715
             EVENT_ESPRESSO_VERSION,
716 716
             true
@@ -754,13 +754,13 @@  discard block
 block discarded – undo
754 754
         // we only want to localize vars ONCE for the entire form,
755 755
         // so if the form section doesn't have a parent, then it must be the top dog
756 756
         if ($return_for_subsection || ! $this->parent_section()) {
757
-            EE_Form_Section_Proper::$_js_localization['form_data'][ $this->html_id() ] = array(
757
+            EE_Form_Section_Proper::$_js_localization['form_data'][$this->html_id()] = array(
758 758
                 'form_section_id'  => $this->html_id(true),
759 759
                 'validation_rules' => $this->get_jquery_validation_rules(),
760 760
                 'other_data'       => $this->get_other_js_data(),
761 761
                 'errors'           => $this->subsection_validation_errors_by_html_name(),
762 762
             );
763
-            EE_Form_Section_Proper::$_scripts_localized                                = true;
763
+            EE_Form_Section_Proper::$_scripts_localized = true;
764 764
         }
765 765
     }
766 766
 
@@ -795,7 +795,7 @@  discard block
 block discarded – undo
795 795
         $inputs = array();
796 796
         foreach ($this->subsections() as $subsection) {
797 797
             if ($subsection instanceof EE_Form_Input_Base) {
798
-                $inputs[ $subsection->html_name() ] = $subsection;
798
+                $inputs[$subsection->html_name()] = $subsection;
799 799
             } elseif ($subsection instanceof EE_Form_Section_Proper) {
800 800
                 $inputs += $subsection->inputs_in_subsections();
801 801
             }
@@ -818,7 +818,7 @@  discard block
 block discarded – undo
818 818
         $errors = array();
819 819
         foreach ($inputs as $form_input) {
820 820
             if ($form_input instanceof EE_Form_Input_Base && $form_input->get_validation_errors()) {
821
-                $errors[ $form_input->html_name() ] = $form_input->get_validation_error_string();
821
+                $errors[$form_input->html_name()] = $form_input->get_validation_error_string();
822 822
             }
823 823
         }
824 824
         return $errors;
@@ -841,7 +841,7 @@  discard block
 block discarded – undo
841 841
         $email_validation_level = isset(EE_Registry::instance()->CFG->registration->email_validation_level)
842 842
             ? EE_Registry::instance()->CFG->registration->email_validation_level
843 843
             : 'wp_default';
844
-        EE_Form_Section_Proper::$_js_localization['email_validation_level']   = $email_validation_level;
844
+        EE_Form_Section_Proper::$_js_localization['email_validation_level'] = $email_validation_level;
845 845
         wp_enqueue_script('ee_form_section_validation');
846 846
         wp_localize_script(
847 847
             'ee_form_section_validation',
@@ -858,7 +858,7 @@  discard block
 block discarded – undo
858 858
      */
859 859
     public function ensure_scripts_localized()
860 860
     {
861
-        if (! EE_Form_Section_Proper::$_scripts_localized) {
861
+        if ( ! EE_Form_Section_Proper::$_scripts_localized) {
862 862
             $this->_enqueue_and_localize_form_js();
863 863
         }
864 864
     }
@@ -954,8 +954,8 @@  discard block
 block discarded – undo
954 954
         // reset the cache of whether this form is valid or not- we're re-validating it now
955 955
         $this->is_valid = null;
956 956
         foreach ($this->get_validatable_subsections() as $subsection_name => $subsection) {
957
-            if (method_exists($this, '_validate_' . $subsection_name)) {
958
-                call_user_func_array(array($this, '_validate_' . $subsection_name), array($subsection));
957
+            if (method_exists($this, '_validate_'.$subsection_name)) {
958
+                call_user_func_array(array($this, '_validate_'.$subsection_name), array($subsection));
959 959
             }
960 960
             $subsection->_validate();
961 961
         }
@@ -973,9 +973,9 @@  discard block
 block discarded – undo
973 973
         $inputs = array();
974 974
         foreach ($this->subsections() as $subsection_name => $subsection) {
975 975
             if ($subsection instanceof EE_Form_Section_Proper) {
976
-                $inputs[ $subsection_name ] = $subsection->valid_data();
976
+                $inputs[$subsection_name] = $subsection->valid_data();
977 977
             } elseif ($subsection instanceof EE_Form_Input_Base) {
978
-                $inputs[ $subsection_name ] = $subsection->normalized_value();
978
+                $inputs[$subsection_name] = $subsection->normalized_value();
979 979
             }
980 980
         }
981 981
         return $inputs;
@@ -993,7 +993,7 @@  discard block
 block discarded – undo
993 993
         $inputs = array();
994 994
         foreach ($this->subsections() as $subsection_name => $subsection) {
995 995
             if ($subsection instanceof EE_Form_Input_Base) {
996
-                $inputs[ $subsection_name ] = $subsection;
996
+                $inputs[$subsection_name] = $subsection;
997 997
             }
998 998
         }
999 999
         return $inputs;
@@ -1011,7 +1011,7 @@  discard block
 block discarded – undo
1011 1011
         $form_sections = array();
1012 1012
         foreach ($this->subsections() as $name => $obj) {
1013 1013
             if ($obj instanceof EE_Form_Section_Proper) {
1014
-                $form_sections[ $name ] = $obj;
1014
+                $form_sections[$name] = $obj;
1015 1015
             }
1016 1016
         }
1017 1017
         return $form_sections;
@@ -1118,7 +1118,7 @@  discard block
 block discarded – undo
1118 1118
         $input_values = array();
1119 1119
         foreach ($this->subsections() as $subsection_name => $subsection) {
1120 1120
             if ($subsection instanceof EE_Form_Input_Base) {
1121
-                $input_values[ $subsection_name ] = $pretty
1121
+                $input_values[$subsection_name] = $pretty
1122 1122
                     ? $subsection->pretty_value()
1123 1123
                     : $subsection->normalized_value();
1124 1124
             } elseif ($subsection instanceof EE_Form_Section_Proper && $include_subform_inputs) {
@@ -1130,7 +1130,7 @@  discard block
 block discarded – undo
1130 1130
                 if ($flatten) {
1131 1131
                     $input_values = array_merge($input_values, $subform_input_values);
1132 1132
                 } else {
1133
-                    $input_values[ $subsection_name ] = $subform_input_values;
1133
+                    $input_values[$subsection_name] = $subform_input_values;
1134 1134
                 }
1135 1135
             }
1136 1136
         }
@@ -1158,7 +1158,7 @@  discard block
 block discarded – undo
1158 1158
             if ($subsection instanceof EE_Form_Input_Base) {
1159 1159
                 // is this input part of an array of inputs?
1160 1160
                 if (strpos($subsection->html_name(), '[') !== false) {
1161
-                    $full_input_name  = EEH_Array::convert_array_values_to_keys(
1161
+                    $full_input_name = EEH_Array::convert_array_values_to_keys(
1162 1162
                         explode(
1163 1163
                             '[',
1164 1164
                             str_replace(']', '', $subsection->html_name())
@@ -1167,7 +1167,7 @@  discard block
 block discarded – undo
1167 1167
                     );
1168 1168
                     $submitted_values = array_replace_recursive($submitted_values, $full_input_name);
1169 1169
                 } else {
1170
-                    $submitted_values[ $subsection->html_name() ] = $subsection->raw_value();
1170
+                    $submitted_values[$subsection->html_name()] = $subsection->raw_value();
1171 1171
                 }
1172 1172
             } elseif ($subsection instanceof EE_Form_Section_Proper && $include_subforms) {
1173 1173
                 $subform_input_values = $subsection->submitted_values($include_subforms);
@@ -1202,7 +1202,7 @@  discard block
 block discarded – undo
1202 1202
     public function exclude(array $inputs_to_exclude = array())
1203 1203
     {
1204 1204
         foreach ($inputs_to_exclude as $input_to_exclude_name) {
1205
-            unset($this->_subsections[ $input_to_exclude_name ]);
1205
+            unset($this->_subsections[$input_to_exclude_name]);
1206 1206
         }
1207 1207
     }
1208 1208
 
@@ -1245,7 +1245,7 @@  discard block
 block discarded – undo
1245 1245
     public function add_subsections($new_subsections, $subsection_name_to_target = null, $add_before = true)
1246 1246
     {
1247 1247
         foreach ($new_subsections as $subsection_name => $subsection) {
1248
-            if (! $subsection instanceof EE_Form_Section_Base) {
1248
+            if ( ! $subsection instanceof EE_Form_Section_Base) {
1249 1249
                 EE_Error::add_error(
1250 1250
                     sprintf(
1251 1251
                         esc_html__(
@@ -1257,7 +1257,7 @@  discard block
 block discarded – undo
1257 1257
                         $this->name()
1258 1258
                     )
1259 1259
                 );
1260
-                unset($new_subsections[ $subsection_name ]);
1260
+                unset($new_subsections[$subsection_name]);
1261 1261
             }
1262 1262
         }
1263 1263
         $this->_subsections = EEH_Array::insert_into_array(
@@ -1372,7 +1372,7 @@  discard block
 block discarded – undo
1372 1372
     public function html_name_prefix()
1373 1373
     {
1374 1374
         if ($this->parent_section() instanceof EE_Form_Section_Proper) {
1375
-            return $this->parent_section()->html_name_prefix() . '[' . $this->name() . ']';
1375
+            return $this->parent_section()->html_name_prefix().'['.$this->name().']';
1376 1376
         }
1377 1377
         return $this->name();
1378 1378
     }
@@ -1412,7 +1412,7 @@  discard block
 block discarded – undo
1412 1412
      */
1413 1413
     public function ensure_construct_finalized_called()
1414 1414
     {
1415
-        if (! $this->_construction_finalized) {
1415
+        if ( ! $this->_construction_finalized) {
1416 1416
             $this->_construct_finalize($this->_parent_section, $this->_name);
1417 1417
         }
1418 1418
     }
Please login to merge, or discard this patch.
Indentation   +1526 added lines, -1526 removed lines patch added patch discarded remove patch
@@ -14,1530 +14,1530 @@
 block discarded – undo
14 14
 class EE_Form_Section_Proper extends EE_Form_Section_Validatable
15 15
 {
16 16
 
17
-    const SUBMITTED_FORM_DATA_SSN_KEY = 'submitted_form_data';
18
-
19
-    /**
20
-     * Subsections
21
-     *
22
-     * @var EE_Form_Section_Validatable[]
23
-     */
24
-    protected $_subsections = array();
25
-
26
-    /**
27
-     * Strategy for laying out the form
28
-     *
29
-     * @var EE_Form_Section_Layout_Base
30
-     */
31
-    protected $_layout_strategy;
32
-
33
-    /**
34
-     * Whether or not this form has received and validated a form submission yet
35
-     *
36
-     * @var boolean
37
-     */
38
-    protected $_received_submission = false;
39
-
40
-    /**
41
-     * message displayed to users upon successful form submission
42
-     *
43
-     * @var string
44
-     */
45
-    protected $_form_submission_success_message = '';
46
-
47
-    /**
48
-     * message displayed to users upon unsuccessful form submission
49
-     *
50
-     * @var string
51
-     */
52
-    protected $_form_submission_error_message = '';
53
-
54
-    /**
55
-     * @var array like $_REQUEST
56
-     */
57
-    protected $cached_request_data;
58
-
59
-    /**
60
-     * Stores whether this form (and its sub-sections) were found to be valid or not.
61
-     * Starts off as null, but once the form is validated, it set to either true or false
62
-     * @var boolean|null
63
-     */
64
-    protected $is_valid;
65
-
66
-    /**
67
-     * Stores all the data that will localized for form validation
68
-     *
69
-     * @var array
70
-     */
71
-    protected static $_js_localization = array();
72
-
73
-    /**
74
-     * whether or not the form's localized validation JS vars have been set
75
-     *
76
-     * @type boolean
77
-     */
78
-    protected static $_scripts_localized = false;
79
-
80
-
81
-    /**
82
-     * when constructing a proper form section, calls _construct_finalize on children
83
-     * so that they know who their parent is, and what name they've been given.
84
-     *
85
-     * @param array[] $options_array   {
86
-     * @type          $subsections     EE_Form_Section_Validatable[] where keys are the section's name
87
-     * @type          $include         string[] numerically-indexed where values are section names to be included,
88
-     *                                 and in that order. This is handy if you want
89
-     *                                 the subsections to be ordered differently than the default, and if you override
90
-     *                                 which fields are shown
91
-     * @type          $exclude         string[] values are subsections to be excluded. This is handy if you want
92
-     *                                 to remove certain default subsections (note: if you specify BOTH 'include' AND
93
-     *                                 'exclude', the inclusions will be applied first, and the exclusions will exclude
94
-     *                                 items from that list of inclusions)
95
-     * @type          $layout_strategy EE_Form_Section_Layout_Base strategy for laying out the form
96
-     *                                 } @see EE_Form_Section_Validatable::__construct()
97
-     * @throws EE_Error
98
-     */
99
-    public function __construct($options_array = array())
100
-    {
101
-        $options_array = (array) apply_filters(
102
-            'FHEE__EE_Form_Section_Proper___construct__options_array',
103
-            $options_array,
104
-            $this
105
-        );
106
-        // call parent first, as it may be setting the name
107
-        parent::__construct($options_array);
108
-        // if they've included subsections in the constructor, add them now
109
-        if (isset($options_array['include'])) {
110
-            // we are going to make sure we ONLY have those subsections to include
111
-            // AND we are going to make sure they're in that specified order
112
-            $reordered_subsections = array();
113
-            foreach ($options_array['include'] as $input_name) {
114
-                if (isset($this->_subsections[ $input_name ])) {
115
-                    $reordered_subsections[ $input_name ] = $this->_subsections[ $input_name ];
116
-                }
117
-            }
118
-            $this->_subsections = $reordered_subsections;
119
-        }
120
-        if (isset($options_array['exclude'])) {
121
-            $exclude            = $options_array['exclude'];
122
-            $this->_subsections = array_diff_key($this->_subsections, array_flip($exclude));
123
-        }
124
-        if (isset($options_array['layout_strategy'])) {
125
-            $this->_layout_strategy = $options_array['layout_strategy'];
126
-        }
127
-        if (! $this->_layout_strategy) {
128
-            $this->_layout_strategy = is_admin() ? new EE_Admin_Two_Column_Layout() : new EE_Two_Column_Layout();
129
-        }
130
-        $this->_layout_strategy->_construct_finalize($this);
131
-        // ok so we are definitely going to want the forms JS,
132
-        // so enqueue it or remember to enqueue it during wp_enqueue_scripts
133
-        if (did_action('wp_enqueue_scripts') || did_action('admin_enqueue_scripts')) {
134
-            // ok so they've constructed this object after when they should have.
135
-            // just enqueue the generic form scripts and initialize the form immediately in the JS
136
-            EE_Form_Section_Proper::wp_enqueue_scripts(true);
137
-        } else {
138
-            add_action('wp_enqueue_scripts', array('EE_Form_Section_Proper', 'wp_enqueue_scripts'));
139
-            add_action('admin_enqueue_scripts', array('EE_Form_Section_Proper', 'wp_enqueue_scripts'));
140
-        }
141
-        add_action('wp_footer', array($this, 'ensure_scripts_localized'), 1);
142
-        /**
143
-         * Gives other plugins a chance to hook in before construct finalize is called.
144
-         * The form probably doesn't yet have a parent form section.
145
-         * Since 4.9.32, when this action was introduced, this is the best place to add a subsection onto a form,
146
-         * assuming you don't care what the form section's name, HTML ID, or HTML name etc are.
147
-         * Also see AHEE__EE_Form_Section_Proper___construct_finalize__end
148
-         *
149
-         * @since 4.9.32
150
-         * @param EE_Form_Section_Proper $this          before __construct is done, but all of its logic,
151
-         *                                              except maybe calling _construct_finalize has been done
152
-         * @param array                  $options_array options passed into the constructor
153
-         */
154
-        do_action(
155
-            'AHEE__EE_Form_Input_Base___construct__before_construct_finalize_called',
156
-            $this,
157
-            $options_array
158
-        );
159
-        if (isset($options_array['name'])) {
160
-            $this->_construct_finalize(null, $options_array['name']);
161
-        }
162
-    }
163
-
164
-
165
-    /**
166
-     * Finishes construction given the parent form section and this form section's name
167
-     *
168
-     * @param EE_Form_Section_Proper $parent_form_section
169
-     * @param string                 $name
170
-     * @throws EE_Error
171
-     */
172
-    public function _construct_finalize($parent_form_section, $name)
173
-    {
174
-        parent::_construct_finalize($parent_form_section, $name);
175
-        $this->_set_default_name_if_empty();
176
-        $this->_set_default_html_id_if_empty();
177
-        foreach ($this->_subsections as $subsection_name => $subsection) {
178
-            if ($subsection instanceof EE_Form_Section_Base) {
179
-                $subsection->_construct_finalize($this, $subsection_name);
180
-            } else {
181
-                throw new EE_Error(
182
-                    sprintf(
183
-                        esc_html__(
184
-                            'Subsection "%s" is not an instanceof EE_Form_Section_Base on form "%s". It is a "%s"',
185
-                            'event_espresso'
186
-                        ),
187
-                        $subsection_name,
188
-                        get_class($this),
189
-                        $subsection ? get_class($subsection) : esc_html__('NULL', 'event_espresso')
190
-                    )
191
-                );
192
-            }
193
-        }
194
-        /**
195
-         * Action performed just after form has been given a name (and HTML ID etc) and is fully constructed.
196
-         * If you have code that should modify the form and needs it and its subsections to have a name, HTML ID
197
-         * (or other attributes derived from the name like the HTML label id, etc), this is where it should be done.
198
-         * This might only happen just before displaying the form, or just before it receives form submission data.
199
-         * If you need to modify the form or its subsections before _construct_finalize is called on it (and we've
200
-         * ensured it has a name, HTML IDs, etc
201
-         *
202
-         * @param EE_Form_Section_Proper      $this
203
-         * @param EE_Form_Section_Proper|null $parent_form_section
204
-         * @param string                      $name
205
-         */
206
-        do_action(
207
-            'AHEE__EE_Form_Section_Proper___construct_finalize__end',
208
-            $this,
209
-            $parent_form_section,
210
-            $name
211
-        );
212
-    }
213
-
214
-
215
-    /**
216
-     * Gets the layout strategy for this form section
217
-     *
218
-     * @return EE_Form_Section_Layout_Base
219
-     */
220
-    public function get_layout_strategy()
221
-    {
222
-        return $this->_layout_strategy;
223
-    }
224
-
225
-
226
-    /**
227
-     * Gets the HTML for a single input for this form section according
228
-     * to the layout strategy
229
-     *
230
-     * @param EE_Form_Input_Base $input
231
-     * @return string
232
-     */
233
-    public function get_html_for_input($input)
234
-    {
235
-        return $this->_layout_strategy->layout_input($input);
236
-    }
237
-
238
-
239
-    /**
240
-     * was_submitted - checks if form inputs are present in request data
241
-     * Basically an alias for form_data_present_in() (which is used by both
242
-     * proper form sections and form inputs)
243
-     *
244
-     * @param null $form_data
245
-     * @return boolean
246
-     * @throws EE_Error
247
-     */
248
-    public function was_submitted($form_data = null)
249
-    {
250
-        return $this->form_data_present_in($form_data);
251
-    }
252
-
253
-    /**
254
-     * Gets the cached request data; but if there is none, or $req_data was set with
255
-     * something different, refresh the cache, and then return it
256
-     * @param null $req_data
257
-     * @return array
258
-     */
259
-    protected function getCachedRequest($req_data = null)
260
-    {
261
-        if (
262
-            $this->cached_request_data === null
263
-            || (
264
-                $req_data !== null
265
-                && $req_data !== $this->cached_request_data
266
-            )
267
-        ) {
268
-            $req_data = apply_filters(
269
-                'FHEE__EE_Form_Section_Proper__receive_form_submission__req_data',
270
-                $req_data,
271
-                $this
272
-            );
273
-            if ($req_data === null) {
274
-                $req_data = array_merge($_GET, $_POST);
275
-            }
276
-            $req_data = apply_filters(
277
-                'FHEE__EE_Form_Section_Proper__receive_form_submission__request_data',
278
-                $req_data,
279
-                $this
280
-            );
281
-            $this->cached_request_data = (array) $req_data;
282
-        }
283
-        return $this->cached_request_data;
284
-    }
285
-
286
-
287
-    /**
288
-     * After the form section is initially created, call this to sanitize the data in the submission
289
-     * which relates to this form section, validate it, and set it as properties on the form.
290
-     *
291
-     * @param array|null $req_data should usually be $_POST (the default).
292
-     *                             However, you CAN supply a different array.
293
-     *                             Consider using set_defaults() instead however.
294
-     *                             (If you rendered the form in the page using echo $form_x->get_html()
295
-     *                             the inputs will have the correct name in the request data for this function
296
-     *                             to find them and populate the form with them.
297
-     *                             If you have a flat form (with only input subsections),
298
-     *                             you can supply a flat array where keys
299
-     *                             are the form input names and values are their values)
300
-     * @param boolean    $validate whether or not to perform validation on this data. Default is,
301
-     *                             of course, to validate that data, and set errors on the invalid values.
302
-     *                             But if the data has already been validated
303
-     *                             (eg you validated the data then stored it in the DB)
304
-     *                             you may want to skip this step.
305
-     * @throws InvalidArgumentException
306
-     * @throws InvalidInterfaceException
307
-     * @throws InvalidDataTypeException
308
-     * @throws EE_Error
309
-     */
310
-    public function receive_form_submission($req_data = null, $validate = true)
311
-    {
312
-        $req_data = $this->getCachedRequest($req_data);
313
-        $this->_normalize($req_data);
314
-        if ($validate) {
315
-            $this->_validate();
316
-            // if it's invalid, we're going to want to re-display so remember what they submitted
317
-            if (! $this->is_valid()) {
318
-                $this->store_submitted_form_data_in_session();
319
-            }
320
-        }
321
-        if ($this->submission_error_message() === '' && ! $this->is_valid()) {
322
-            $this->set_submission_error_message();
323
-        }
324
-        do_action(
325
-            'AHEE__EE_Form_Section_Proper__receive_form_submission__end',
326
-            $req_data,
327
-            $this,
328
-            $validate
329
-        );
330
-    }
331
-
332
-
333
-    /**
334
-     * caches the originally submitted input values in the session
335
-     * so that they can be used to repopulate the form if it failed validation
336
-     *
337
-     * @return boolean whether or not the data was successfully stored in the session
338
-     * @throws InvalidArgumentException
339
-     * @throws InvalidInterfaceException
340
-     * @throws InvalidDataTypeException
341
-     * @throws EE_Error
342
-     */
343
-    protected function store_submitted_form_data_in_session()
344
-    {
345
-        return EE_Registry::instance()->SSN->set_session_data(
346
-            array(
347
-                EE_Form_Section_Proper::SUBMITTED_FORM_DATA_SSN_KEY => $this->submitted_values(true),
348
-            )
349
-        );
350
-    }
351
-
352
-
353
-    /**
354
-     * retrieves the originally submitted input values in the session
355
-     * so that they can be used to repopulate the form if it failed validation
356
-     *
357
-     * @return array
358
-     * @throws InvalidArgumentException
359
-     * @throws InvalidInterfaceException
360
-     * @throws InvalidDataTypeException
361
-     */
362
-    protected function get_submitted_form_data_from_session()
363
-    {
364
-        $session = EE_Registry::instance()->SSN;
365
-        if ($session instanceof EE_Session) {
366
-            return $session->get_session_data(
367
-                EE_Form_Section_Proper::SUBMITTED_FORM_DATA_SSN_KEY
368
-            );
369
-        }
370
-        return array();
371
-    }
372
-
373
-
374
-    /**
375
-     * flushed the originally submitted input values from the session
376
-     *
377
-     * @return boolean whether or not the data was successfully removed from the session
378
-     * @throws InvalidArgumentException
379
-     * @throws InvalidInterfaceException
380
-     * @throws InvalidDataTypeException
381
-     */
382
-    public static function flush_submitted_form_data_from_session()
383
-    {
384
-        return EE_Registry::instance()->SSN->reset_data(
385
-            array(EE_Form_Section_Proper::SUBMITTED_FORM_DATA_SSN_KEY)
386
-        );
387
-    }
388
-
389
-
390
-    /**
391
-     * Populates this form and its subsections with data from the session.
392
-     * (Wrapper for EE_Form_Section_Proper::receive_form_submission, so it shows
393
-     * validation errors when displaying too)
394
-     * Returns true if the form was populated from the session, false otherwise
395
-     *
396
-     * @return boolean
397
-     * @throws InvalidArgumentException
398
-     * @throws InvalidInterfaceException
399
-     * @throws InvalidDataTypeException
400
-     * @throws EE_Error
401
-     */
402
-    public function populate_from_session()
403
-    {
404
-        $form_data_in_session = $this->get_submitted_form_data_from_session();
405
-        if (empty($form_data_in_session)) {
406
-            return false;
407
-        }
408
-        $this->receive_form_submission($form_data_in_session);
409
-        add_action('shutdown', array('EE_Form_Section_Proper', 'flush_submitted_form_data_from_session'));
410
-        if ($this->form_data_present_in($form_data_in_session)) {
411
-            return true;
412
-        }
413
-        return false;
414
-    }
415
-
416
-
417
-    /**
418
-     * Populates the default data for the form, given an array where keys are
419
-     * the input names, and values are their values (preferably normalized to be their
420
-     * proper PHP types, not all strings... although that should be ok too).
421
-     * Proper subsections are sub-arrays, the key being the subsection's name, and
422
-     * the value being an array formatted in teh same way
423
-     *
424
-     * @param array $default_data
425
-     * @throws EE_Error
426
-     */
427
-    public function populate_defaults($default_data)
428
-    {
429
-        foreach ($this->subsections(false) as $subsection_name => $subsection) {
430
-            if (isset($default_data[ $subsection_name ])) {
431
-                if ($subsection instanceof EE_Form_Input_Base) {
432
-                    $subsection->set_default($default_data[ $subsection_name ]);
433
-                } elseif ($subsection instanceof EE_Form_Section_Proper) {
434
-                    $subsection->populate_defaults($default_data[ $subsection_name ]);
435
-                }
436
-            }
437
-        }
438
-    }
439
-
440
-
441
-    /**
442
-     * returns true if subsection exists
443
-     *
444
-     * @param string $name
445
-     * @return boolean
446
-     */
447
-    public function subsection_exists($name)
448
-    {
449
-        return isset($this->_subsections[ $name ]) ? true : false;
450
-    }
451
-
452
-
453
-    /**
454
-     * Gets the subsection specified by its name
455
-     *
456
-     * @param string  $name
457
-     * @param boolean $require_construction_to_be_finalized most client code should leave this as TRUE
458
-     *                                                      so that the inputs will be properly configured.
459
-     *                                                      However, some client code may be ok
460
-     *                                                      with construction finalize being called later
461
-     *                                                      (realizing that the subsections' html names
462
-     *                                                      might not be set yet, etc.)
463
-     * @return EE_Form_Section_Base
464
-     * @throws EE_Error
465
-     */
466
-    public function get_subsection($name, $require_construction_to_be_finalized = true)
467
-    {
468
-        if ($require_construction_to_be_finalized) {
469
-            $this->ensure_construct_finalized_called();
470
-        }
471
-        return $this->subsection_exists($name) ? $this->_subsections[ $name ] : null;
472
-    }
473
-
474
-
475
-    /**
476
-     * Gets all the validatable subsections of this form section
477
-     *
478
-     * @return EE_Form_Section_Validatable[]
479
-     * @throws EE_Error
480
-     */
481
-    public function get_validatable_subsections()
482
-    {
483
-        $validatable_subsections = array();
484
-        foreach ($this->subsections() as $name => $obj) {
485
-            if ($obj instanceof EE_Form_Section_Validatable) {
486
-                $validatable_subsections[ $name ] = $obj;
487
-            }
488
-        }
489
-        return $validatable_subsections;
490
-    }
491
-
492
-
493
-    /**
494
-     * Gets an input by the given name. If not found, or if its not an EE_FOrm_Input_Base child,
495
-     * throw an EE_Error.
496
-     *
497
-     * @param string  $name
498
-     * @param boolean $require_construction_to_be_finalized most client code should
499
-     *                                                      leave this as TRUE so that the inputs will be properly
500
-     *                                                      configured. However, some client code may be ok with
501
-     *                                                      construction finalize being called later
502
-     *                                                      (realizing that the subsections' html names might not be
503
-     *                                                      set yet, etc.)
504
-     * @return EE_Form_Input_Base
505
-     * @throws EE_Error
506
-     */
507
-    public function get_input($name, $require_construction_to_be_finalized = true)
508
-    {
509
-        $subsection = $this->get_subsection(
510
-            $name,
511
-            $require_construction_to_be_finalized
512
-        );
513
-        if (! $subsection instanceof EE_Form_Input_Base) {
514
-            throw new EE_Error(
515
-                sprintf(
516
-                    esc_html__(
517
-                        "Subsection '%s' is not an instanceof EE_Form_Input_Base on form '%s'. It is a '%s'",
518
-                        'event_espresso'
519
-                    ),
520
-                    $name,
521
-                    get_class($this),
522
-                    $subsection ? get_class($subsection) : esc_html__('NULL', 'event_espresso')
523
-                )
524
-            );
525
-        }
526
-        return $subsection;
527
-    }
528
-
529
-
530
-    /**
531
-     * Like get_input(), gets the proper subsection of the form given the name,
532
-     * otherwise throws an EE_Error
533
-     *
534
-     * @param string  $name
535
-     * @param boolean $require_construction_to_be_finalized most client code should
536
-     *                                                      leave this as TRUE so that the inputs will be properly
537
-     *                                                      configured. However, some client code may be ok with
538
-     *                                                      construction finalize being called later
539
-     *                                                      (realizing that the subsections' html names might not be
540
-     *                                                      set yet, etc.)
541
-     * @return EE_Form_Section_Proper
542
-     * @throws EE_Error
543
-     */
544
-    public function get_proper_subsection($name, $require_construction_to_be_finalized = true)
545
-    {
546
-        $subsection = $this->get_subsection(
547
-            $name,
548
-            $require_construction_to_be_finalized
549
-        );
550
-        if (! $subsection instanceof EE_Form_Section_Proper) {
551
-            throw new EE_Error(
552
-                sprintf(
553
-                    esc_html__(
554
-                        "Subsection '%'s is not an instanceof EE_Form_Section_Proper on form '%s'",
555
-                        'event_espresso'
556
-                    ),
557
-                    $name,
558
-                    get_class($this)
559
-                )
560
-            );
561
-        }
562
-        return $subsection;
563
-    }
564
-
565
-
566
-    /**
567
-     * Gets the value of the specified input. Should be called after receive_form_submission()
568
-     * or populate_defaults() on the form, where the normalized value on the input is set.
569
-     *
570
-     * @param string $name
571
-     * @return mixed depending on the input's type and its normalization strategy
572
-     * @throws EE_Error
573
-     */
574
-    public function get_input_value($name)
575
-    {
576
-        $input = $this->get_input($name);
577
-        return $input->normalized_value();
578
-    }
579
-
580
-
581
-    /**
582
-     * Checks if this form section itself is valid, and then checks its subsections
583
-     *
584
-     * @throws EE_Error
585
-     * @return boolean
586
-     */
587
-    public function is_valid()
588
-    {
589
-        if ($this->is_valid === null) {
590
-            if (! $this->has_received_submission()) {
591
-                throw new EE_Error(
592
-                    sprintf(
593
-                        esc_html__(
594
-                            'You cannot check if a form is valid before receiving the form submission using receive_form_submission',
595
-                            'event_espresso'
596
-                        )
597
-                    )
598
-                );
599
-            }
600
-            if (! parent::is_valid()) {
601
-                $this->is_valid = false;
602
-            } else {
603
-                // ok so no general errors to this entire form section.
604
-                // so let's check the subsections, but only set errors if that hasn't been done yet
605
-                $this->is_valid = true;
606
-                foreach ($this->get_validatable_subsections() as $subsection) {
607
-                    if (! $subsection->is_valid()) {
608
-                        $this->is_valid = false;
609
-                    }
610
-                }
611
-            }
612
-        }
613
-        return $this->is_valid;
614
-    }
615
-
616
-
617
-    /**
618
-     * gets the default name of this form section if none is specified
619
-     *
620
-     * @return void
621
-     */
622
-    protected function _set_default_name_if_empty()
623
-    {
624
-        if (! $this->_name) {
625
-            $classname    = get_class($this);
626
-            $default_name = str_replace('EE_', '', $classname);
627
-            $this->_name  = $default_name;
628
-        }
629
-    }
630
-
631
-
632
-    /**
633
-     * Returns the HTML for the form, except for the form opening and closing tags
634
-     * (as the form section doesn't know where you necessarily want to send the information to),
635
-     * and except for a submit button. Enqueues JS and CSS; if called early enough we will
636
-     * try to enqueue them in the header, otherwise they'll be enqueued in the footer.
637
-     * Not doing_it_wrong because theoretically this CAN be used properly,
638
-     * provided its used during "wp_enqueue_scripts", or it doesn't need to enqueue
639
-     * any CSS.
640
-     *
641
-     * @throws InvalidArgumentException
642
-     * @throws InvalidInterfaceException
643
-     * @throws InvalidDataTypeException
644
-     * @throws EE_Error
645
-     */
646
-    public function get_html_and_js()
647
-    {
648
-        $this->enqueue_js();
649
-        return $this->get_html();
650
-    }
651
-
652
-
653
-    /**
654
-     * returns HTML for displaying this form section. recursively calls display_section() on all subsections
655
-     *
656
-     * @param bool $display_previously_submitted_data
657
-     * @return string
658
-     * @throws InvalidArgumentException
659
-     * @throws InvalidInterfaceException
660
-     * @throws InvalidDataTypeException
661
-     * @throws EE_Error
662
-     * @throws EE_Error
663
-     * @throws EE_Error
664
-     */
665
-    public function get_html($display_previously_submitted_data = true)
666
-    {
667
-        $this->ensure_construct_finalized_called();
668
-        if ($display_previously_submitted_data) {
669
-            $this->populate_from_session();
670
-        }
671
-        return $this->_form_html_filter
672
-            ? $this->_form_html_filter->filterHtml($this->_layout_strategy->layout_form(), $this)
673
-            : $this->_layout_strategy->layout_form();
674
-    }
675
-
676
-
677
-    /**
678
-     * enqueues JS and CSS for the form.
679
-     * It is preferred to call this before wp_enqueue_scripts so the
680
-     * scripts and styles can be put in the header, but if called later
681
-     * they will be put in the footer (which is OK for JS, but in HTML4 CSS should
682
-     * only be in the header; but in HTML5 its ok in the body.
683
-     * See http://stackoverflow.com/questions/4957446/load-external-css-file-in-body-tag.
684
-     * So if your form enqueues CSS, it's preferred to call this before wp_enqueue_scripts.)
685
-     *
686
-     * @return void
687
-     * @throws EE_Error
688
-     */
689
-    public function enqueue_js()
690
-    {
691
-        $this->_enqueue_and_localize_form_js();
692
-        foreach ($this->subsections() as $subsection) {
693
-            $subsection->enqueue_js();
694
-        }
695
-    }
696
-
697
-
698
-    /**
699
-     * adds a filter so that jquery validate gets enqueued in EE_System::wp_enqueue_scripts().
700
-     * This must be done BEFORE wp_enqueue_scripts() gets called, which is on
701
-     * the wp_enqueue_scripts hook.
702
-     * However, registering the form js and localizing it can happen when we
703
-     * actually output the form (which is preferred, seeing how teh form's fields
704
-     * could change until it's actually outputted)
705
-     *
706
-     * @param boolean $init_form_validation_automatically whether or not we want the form validation
707
-     *                                                    to be triggered automatically or not
708
-     * @return void
709
-     */
710
-    public static function wp_enqueue_scripts($init_form_validation_automatically = true)
711
-    {
712
-        wp_register_script(
713
-            'ee_form_section_validation',
714
-            EE_GLOBAL_ASSETS_URL . 'scripts' . '/form_section_validation.js',
715
-            array('jquery-validate', 'jquery-ui-datepicker', 'jquery-validate-extra-methods'),
716
-            EVENT_ESPRESSO_VERSION,
717
-            true
718
-        );
719
-        wp_localize_script(
720
-            'ee_form_section_validation',
721
-            'ee_form_section_validation_init',
722
-            array('init' => $init_form_validation_automatically ? '1' : '0')
723
-        );
724
-    }
725
-
726
-
727
-    /**
728
-     * gets the variables used by form_section_validation.js.
729
-     * This needs to be called AFTER we've called $this->_enqueue_jquery_validate_script,
730
-     * but before the wordpress hook wp_loaded
731
-     *
732
-     * @throws EE_Error
733
-     */
734
-    public function _enqueue_and_localize_form_js()
735
-    {
736
-        $this->ensure_construct_finalized_called();
737
-        // actually, we don't want to localize just yet. There may be other forms on the page.
738
-        // so we need to add our form section data to a static variable accessible by all form sections
739
-        // and localize it just before the footer
740
-        $this->localize_validation_rules();
741
-        add_action('wp_footer', array('EE_Form_Section_Proper', 'localize_script_for_all_forms'), 2);
742
-        add_action('admin_footer', array('EE_Form_Section_Proper', 'localize_script_for_all_forms'));
743
-    }
744
-
745
-
746
-    /**
747
-     * add our form section data to a static variable accessible by all form sections
748
-     *
749
-     * @param bool $return_for_subsection
750
-     * @return void
751
-     * @throws EE_Error
752
-     */
753
-    public function localize_validation_rules($return_for_subsection = false)
754
-    {
755
-        // we only want to localize vars ONCE for the entire form,
756
-        // so if the form section doesn't have a parent, then it must be the top dog
757
-        if ($return_for_subsection || ! $this->parent_section()) {
758
-            EE_Form_Section_Proper::$_js_localization['form_data'][ $this->html_id() ] = array(
759
-                'form_section_id'  => $this->html_id(true),
760
-                'validation_rules' => $this->get_jquery_validation_rules(),
761
-                'other_data'       => $this->get_other_js_data(),
762
-                'errors'           => $this->subsection_validation_errors_by_html_name(),
763
-            );
764
-            EE_Form_Section_Proper::$_scripts_localized                                = true;
765
-        }
766
-    }
767
-
768
-
769
-    /**
770
-     * Gets an array of extra data that will be useful for client-side javascript.
771
-     * This is primarily data added by inputs and forms in addition to any
772
-     * scripts they might enqueue
773
-     *
774
-     * @param array $form_other_js_data
775
-     * @return array
776
-     * @throws EE_Error
777
-     */
778
-    public function get_other_js_data($form_other_js_data = array())
779
-    {
780
-        foreach ($this->subsections() as $subsection) {
781
-            $form_other_js_data = $subsection->get_other_js_data($form_other_js_data);
782
-        }
783
-        return $form_other_js_data;
784
-    }
785
-
786
-
787
-    /**
788
-     * Gets a flat array of inputs for this form section and its subsections.
789
-     * Keys are their form names, and values are the inputs themselves
790
-     *
791
-     * @return EE_Form_Input_Base
792
-     * @throws EE_Error
793
-     */
794
-    public function inputs_in_subsections()
795
-    {
796
-        $inputs = array();
797
-        foreach ($this->subsections() as $subsection) {
798
-            if ($subsection instanceof EE_Form_Input_Base) {
799
-                $inputs[ $subsection->html_name() ] = $subsection;
800
-            } elseif ($subsection instanceof EE_Form_Section_Proper) {
801
-                $inputs += $subsection->inputs_in_subsections();
802
-            }
803
-        }
804
-        return $inputs;
805
-    }
806
-
807
-
808
-    /**
809
-     * Gets a flat array of all the validation errors.
810
-     * Keys are html names (because those should be unique)
811
-     * and values are a string of all their validation errors
812
-     *
813
-     * @return string[]
814
-     * @throws EE_Error
815
-     */
816
-    public function subsection_validation_errors_by_html_name()
817
-    {
818
-        $inputs = $this->inputs();
819
-        $errors = array();
820
-        foreach ($inputs as $form_input) {
821
-            if ($form_input instanceof EE_Form_Input_Base && $form_input->get_validation_errors()) {
822
-                $errors[ $form_input->html_name() ] = $form_input->get_validation_error_string();
823
-            }
824
-        }
825
-        return $errors;
826
-    }
827
-
828
-
829
-    /**
830
-     * passes all the form data required by the JS to the JS, and enqueues the few required JS files.
831
-     * Should be setup by each form during the _enqueues_and_localize_form_js
832
-     *
833
-     * @throws InvalidArgumentException
834
-     * @throws InvalidInterfaceException
835
-     * @throws InvalidDataTypeException
836
-     */
837
-    public static function localize_script_for_all_forms()
838
-    {
839
-        // allow inputs and stuff to hook in their JS and stuff here
840
-        do_action('AHEE__EE_Form_Section_Proper__localize_script_for_all_forms__begin');
841
-        EE_Form_Section_Proper::$_js_localization['localized_error_messages'] = EE_Form_Section_Proper::_get_localized_error_messages();
842
-        $email_validation_level = isset(EE_Registry::instance()->CFG->registration->email_validation_level)
843
-            ? EE_Registry::instance()->CFG->registration->email_validation_level
844
-            : 'wp_default';
845
-        EE_Form_Section_Proper::$_js_localization['email_validation_level']   = $email_validation_level;
846
-        wp_enqueue_script('ee_form_section_validation');
847
-        wp_localize_script(
848
-            'ee_form_section_validation',
849
-            'ee_form_section_vars',
850
-            EE_Form_Section_Proper::$_js_localization
851
-        );
852
-    }
853
-
854
-
855
-    /**
856
-     * ensure_scripts_localized
857
-     *
858
-     * @throws EE_Error
859
-     */
860
-    public function ensure_scripts_localized()
861
-    {
862
-        if (! EE_Form_Section_Proper::$_scripts_localized) {
863
-            $this->_enqueue_and_localize_form_js();
864
-        }
865
-    }
866
-
867
-
868
-    /**
869
-     * Gets the hard-coded validation error messages to be used in the JS. The convention
870
-     * is that the key here should be the same as the custom validation rule put in the JS file
871
-     *
872
-     * @return array keys are custom validation rules, and values are internationalized strings
873
-     */
874
-    private static function _get_localized_error_messages()
875
-    {
876
-        return array(
877
-            'validUrl' => esc_html__('This is not a valid absolute URL. Eg, http://domain.com/monkey.jpg', 'event_espresso'),
878
-            'regex'    => esc_html__('Please check your input', 'event_espresso'),
879
-        );
880
-    }
881
-
882
-
883
-    /**
884
-     * @return array
885
-     */
886
-    public static function js_localization()
887
-    {
888
-        return self::$_js_localization;
889
-    }
890
-
891
-
892
-    /**
893
-     * @return void
894
-     */
895
-    public static function reset_js_localization()
896
-    {
897
-        self::$_js_localization = array();
898
-    }
899
-
900
-
901
-    /**
902
-     * Gets the JS to put inside the jquery validation rules for subsection of this form section.
903
-     * See parent function for more...
904
-     *
905
-     * @return array
906
-     * @throws EE_Error
907
-     */
908
-    public function get_jquery_validation_rules()
909
-    {
910
-        $jquery_validation_rules = array();
911
-        foreach ($this->get_validatable_subsections() as $subsection) {
912
-            $jquery_validation_rules = array_merge(
913
-                $jquery_validation_rules,
914
-                $subsection->get_jquery_validation_rules()
915
-            );
916
-        }
917
-        return $jquery_validation_rules;
918
-    }
919
-
920
-
921
-    /**
922
-     * Sanitizes all the data and sets the sanitized value of each field
923
-     *
924
-     * @param array $req_data like $_POST
925
-     * @return void
926
-     * @throws EE_Error
927
-     */
928
-    protected function _normalize($req_data)
929
-    {
930
-        $this->_received_submission = true;
931
-        $this->_validation_errors   = array();
932
-        foreach ($this->get_validatable_subsections() as $subsection) {
933
-            try {
934
-                $subsection->_normalize($req_data);
935
-            } catch (EE_Validation_Error $e) {
936
-                $subsection->add_validation_error($e);
937
-            }
938
-        }
939
-    }
940
-
941
-
942
-    /**
943
-     * Performs validation on this form section and its subsections.
944
-     * For each subsection,
945
-     * calls _validate_{subsection_name} on THIS form (if the function exists)
946
-     * and passes it the subsection, then calls _validate on that subsection.
947
-     * If you need to perform validation on the form as a whole (considering multiple)
948
-     * you would be best to override this _validate method,
949
-     * calling parent::_validate() first.
950
-     *
951
-     * @throws EE_Error
952
-     */
953
-    protected function _validate()
954
-    {
955
-        // reset the cache of whether this form is valid or not- we're re-validating it now
956
-        $this->is_valid = null;
957
-        foreach ($this->get_validatable_subsections() as $subsection_name => $subsection) {
958
-            if (method_exists($this, '_validate_' . $subsection_name)) {
959
-                call_user_func_array(array($this, '_validate_' . $subsection_name), array($subsection));
960
-            }
961
-            $subsection->_validate();
962
-        }
963
-    }
964
-
965
-
966
-    /**
967
-     * Gets all the validated inputs for the form section
968
-     *
969
-     * @return array
970
-     * @throws EE_Error
971
-     */
972
-    public function valid_data()
973
-    {
974
-        $inputs = array();
975
-        foreach ($this->subsections() as $subsection_name => $subsection) {
976
-            if ($subsection instanceof EE_Form_Section_Proper) {
977
-                $inputs[ $subsection_name ] = $subsection->valid_data();
978
-            } elseif ($subsection instanceof EE_Form_Input_Base) {
979
-                $inputs[ $subsection_name ] = $subsection->normalized_value();
980
-            }
981
-        }
982
-        return $inputs;
983
-    }
984
-
985
-
986
-    /**
987
-     * Gets all the inputs on this form section
988
-     *
989
-     * @return EE_Form_Input_Base[]
990
-     * @throws EE_Error
991
-     */
992
-    public function inputs()
993
-    {
994
-        $inputs = array();
995
-        foreach ($this->subsections() as $subsection_name => $subsection) {
996
-            if ($subsection instanceof EE_Form_Input_Base) {
997
-                $inputs[ $subsection_name ] = $subsection;
998
-            }
999
-        }
1000
-        return $inputs;
1001
-    }
1002
-
1003
-
1004
-    /**
1005
-     * Gets all the subsections which are a proper form
1006
-     *
1007
-     * @return EE_Form_Section_Proper[]
1008
-     * @throws EE_Error
1009
-     */
1010
-    public function subforms()
1011
-    {
1012
-        $form_sections = array();
1013
-        foreach ($this->subsections() as $name => $obj) {
1014
-            if ($obj instanceof EE_Form_Section_Proper) {
1015
-                $form_sections[ $name ] = $obj;
1016
-            }
1017
-        }
1018
-        return $form_sections;
1019
-    }
1020
-
1021
-
1022
-    /**
1023
-     * Gets all the subsections (inputs, proper subsections, or html-only sections).
1024
-     * Consider using inputs() or subforms()
1025
-     * if you only want form inputs or proper form sections.
1026
-     *
1027
-     * @param boolean $require_construction_to_be_finalized most client code should
1028
-     *                                                      leave this as TRUE so that the inputs will be properly
1029
-     *                                                      configured. However, some client code may be ok with
1030
-     *                                                      construction finalize being called later
1031
-     *                                                      (realizing that the subsections' html names might not be
1032
-     *                                                      set yet, etc.)
1033
-     * @return EE_Form_Section_Proper[]
1034
-     * @throws EE_Error
1035
-     */
1036
-    public function subsections($require_construction_to_be_finalized = true)
1037
-    {
1038
-        if ($require_construction_to_be_finalized) {
1039
-            $this->ensure_construct_finalized_called();
1040
-        }
1041
-        return $this->_subsections;
1042
-    }
1043
-
1044
-
1045
-    /**
1046
-     * Returns whether this form has any subforms or inputs
1047
-     * @return bool
1048
-     */
1049
-    public function hasSubsections()
1050
-    {
1051
-        return ! empty($this->_subsections);
1052
-    }
1053
-
1054
-
1055
-    /**
1056
-     * Returns a simple array where keys are input names, and values are their normalized
1057
-     * values. (Similar to calling get_input_value on inputs)
1058
-     *
1059
-     * @param boolean $include_subform_inputs Whether to include inputs from subforms,
1060
-     *                                        or just this forms' direct children inputs
1061
-     * @param boolean $flatten                Whether to force the results into 1-dimensional array,
1062
-     *                                        or allow multidimensional array
1063
-     * @return array if $flatten is TRUE it will always be a 1-dimensional array
1064
-     *                                        with array keys being input names
1065
-     *                                        (regardless of whether they are from a subsection or not),
1066
-     *                                        and if $flatten is FALSE it can be a multidimensional array
1067
-     *                                        where keys are always subsection names and values are either
1068
-     *                                        the input's normalized value, or an array like the top-level array
1069
-     * @throws EE_Error
1070
-     */
1071
-    public function input_values($include_subform_inputs = false, $flatten = false)
1072
-    {
1073
-        return $this->_input_values(false, $include_subform_inputs, $flatten);
1074
-    }
1075
-
1076
-
1077
-    /**
1078
-     * Similar to EE_Form_Section_Proper::input_values(), except this returns the 'display_value'
1079
-     * of each input. On some inputs (especially radio boxes or checkboxes), the value stored
1080
-     * is not necessarily the value we want to display to users. This creates an array
1081
-     * where keys are the input names, and values are their display values
1082
-     *
1083
-     * @param boolean $include_subform_inputs Whether to include inputs from subforms,
1084
-     *                                        or just this forms' direct children inputs
1085
-     * @param boolean $flatten                Whether to force the results into 1-dimensional array,
1086
-     *                                        or allow multidimensional array
1087
-     * @return array if $flatten is TRUE it will always be a 1-dimensional array
1088
-     *                                        with array keys being input names
1089
-     *                                        (regardless of whether they are from a subsection or not),
1090
-     *                                        and if $flatten is FALSE it can be a multidimensional array
1091
-     *                                        where keys are always subsection names and values are either
1092
-     *                                        the input's normalized value, or an array like the top-level array
1093
-     * @throws EE_Error
1094
-     */
1095
-    public function input_pretty_values($include_subform_inputs = false, $flatten = false)
1096
-    {
1097
-        return $this->_input_values(true, $include_subform_inputs, $flatten);
1098
-    }
1099
-
1100
-
1101
-    /**
1102
-     * Gets the input values from the form
1103
-     *
1104
-     * @param boolean $pretty                 Whether to retrieve the pretty value,
1105
-     *                                        or just the normalized value
1106
-     * @param boolean $include_subform_inputs Whether to include inputs from subforms,
1107
-     *                                        or just this forms' direct children inputs
1108
-     * @param boolean $flatten                Whether to force the results into 1-dimensional array,
1109
-     *                                        or allow multidimensional array
1110
-     * @return array if $flatten is TRUE it will always be a 1-dimensional array with array keys being
1111
-     *                                        input names (regardless of whether they are from a subsection or not),
1112
-     *                                        and if $flatten is FALSE it can be a multidimensional array
1113
-     *                                        where keys are always subsection names and values are either
1114
-     *                                        the input's normalized value, or an array like the top-level array
1115
-     * @throws EE_Error
1116
-     */
1117
-    public function _input_values($pretty = false, $include_subform_inputs = false, $flatten = false)
1118
-    {
1119
-        $input_values = array();
1120
-        foreach ($this->subsections() as $subsection_name => $subsection) {
1121
-            if ($subsection instanceof EE_Form_Input_Base) {
1122
-                $input_values[ $subsection_name ] = $pretty
1123
-                    ? $subsection->pretty_value()
1124
-                    : $subsection->normalized_value();
1125
-            } elseif ($subsection instanceof EE_Form_Section_Proper && $include_subform_inputs) {
1126
-                $subform_input_values = $subsection->_input_values(
1127
-                    $pretty,
1128
-                    $include_subform_inputs,
1129
-                    $flatten
1130
-                );
1131
-                if ($flatten) {
1132
-                    $input_values = array_merge($input_values, $subform_input_values);
1133
-                } else {
1134
-                    $input_values[ $subsection_name ] = $subform_input_values;
1135
-                }
1136
-            }
1137
-        }
1138
-        return $input_values;
1139
-    }
1140
-
1141
-
1142
-    /**
1143
-     * Gets the originally submitted input values from the form
1144
-     *
1145
-     * @param boolean $include_subforms  Whether to include inputs from subforms,
1146
-     *                                   or just this forms' direct children inputs
1147
-     * @return array                     if $flatten is TRUE it will always be a 1-dimensional array
1148
-     *                                   with array keys being input names
1149
-     *                                   (regardless of whether they are from a subsection or not),
1150
-     *                                   and if $flatten is FALSE it can be a multidimensional array
1151
-     *                                   where keys are always subsection names and values are either
1152
-     *                                   the input's normalized value, or an array like the top-level array
1153
-     * @throws EE_Error
1154
-     */
1155
-    public function submitted_values($include_subforms = false)
1156
-    {
1157
-        $submitted_values = array();
1158
-        foreach ($this->subsections() as $subsection) {
1159
-            if ($subsection instanceof EE_Form_Input_Base) {
1160
-                // is this input part of an array of inputs?
1161
-                if (strpos($subsection->html_name(), '[') !== false) {
1162
-                    $full_input_name  = EEH_Array::convert_array_values_to_keys(
1163
-                        explode(
1164
-                            '[',
1165
-                            str_replace(']', '', $subsection->html_name())
1166
-                        ),
1167
-                        $subsection->raw_value()
1168
-                    );
1169
-                    $submitted_values = array_replace_recursive($submitted_values, $full_input_name);
1170
-                } else {
1171
-                    $submitted_values[ $subsection->html_name() ] = $subsection->raw_value();
1172
-                }
1173
-            } elseif ($subsection instanceof EE_Form_Section_Proper && $include_subforms) {
1174
-                $subform_input_values = $subsection->submitted_values($include_subforms);
1175
-                $submitted_values     = array_replace_recursive($submitted_values, $subform_input_values);
1176
-            }
1177
-        }
1178
-        return $submitted_values;
1179
-    }
1180
-
1181
-
1182
-    /**
1183
-     * Indicates whether or not this form has received a submission yet
1184
-     * (ie, had receive_form_submission called on it yet)
1185
-     *
1186
-     * @return boolean
1187
-     * @throws EE_Error
1188
-     */
1189
-    public function has_received_submission()
1190
-    {
1191
-        $this->ensure_construct_finalized_called();
1192
-        return $this->_received_submission;
1193
-    }
1194
-
1195
-
1196
-    /**
1197
-     * Equivalent to passing 'exclude' in the constructor's options array.
1198
-     * Removes the listed inputs from the form
1199
-     *
1200
-     * @param array $inputs_to_exclude values are the input names
1201
-     * @return void
1202
-     */
1203
-    public function exclude(array $inputs_to_exclude = array())
1204
-    {
1205
-        foreach ($inputs_to_exclude as $input_to_exclude_name) {
1206
-            unset($this->_subsections[ $input_to_exclude_name ]);
1207
-        }
1208
-    }
1209
-
1210
-
1211
-    /**
1212
-     * Changes these inputs' display strategy to be EE_Hidden_Display_Strategy.
1213
-     * @param array $inputs_to_hide
1214
-     * @throws EE_Error
1215
-     */
1216
-    public function hide(array $inputs_to_hide = array())
1217
-    {
1218
-        foreach ($inputs_to_hide as $input_to_hide) {
1219
-            $input = $this->get_input($input_to_hide);
1220
-            $input->set_display_strategy(new EE_Hidden_Display_Strategy());
1221
-        }
1222
-    }
1223
-
1224
-
1225
-    /**
1226
-     * add_subsections
1227
-     * Adds the listed subsections to the form section.
1228
-     * If $subsection_name_to_target is provided,
1229
-     * then new subsections are added before or after that subsection,
1230
-     * otherwise to the start or end of the entire subsections array.
1231
-     *
1232
-     * @param EE_Form_Section_Base[] $new_subsections           array of new form subsections
1233
-     *                                                          where keys are their names
1234
-     * @param string                 $subsection_name_to_target an existing for section that $new_subsections
1235
-     *                                                          should be added before or after
1236
-     *                                                          IF $subsection_name_to_target is null,
1237
-     *                                                          then $new_subsections will be added to
1238
-     *                                                          the beginning or end of the entire subsections array
1239
-     * @param boolean                $add_before                whether to add $new_subsections, before or after
1240
-     *                                                          $subsection_name_to_target,
1241
-     *                                                          or if $subsection_name_to_target is null,
1242
-     *                                                          before or after entire subsections array
1243
-     * @return void
1244
-     * @throws EE_Error
1245
-     */
1246
-    public function add_subsections($new_subsections, $subsection_name_to_target = null, $add_before = true)
1247
-    {
1248
-        foreach ($new_subsections as $subsection_name => $subsection) {
1249
-            if (! $subsection instanceof EE_Form_Section_Base) {
1250
-                EE_Error::add_error(
1251
-                    sprintf(
1252
-                        esc_html__(
1253
-                            "Trying to add a %s as a subsection (it was named '%s') to the form section '%s'. It was removed.",
1254
-                            'event_espresso'
1255
-                        ),
1256
-                        get_class($subsection),
1257
-                        $subsection_name,
1258
-                        $this->name()
1259
-                    )
1260
-                );
1261
-                unset($new_subsections[ $subsection_name ]);
1262
-            }
1263
-        }
1264
-        $this->_subsections = EEH_Array::insert_into_array(
1265
-            $this->_subsections,
1266
-            $new_subsections,
1267
-            $subsection_name_to_target,
1268
-            $add_before
1269
-        );
1270
-        if ($this->_construction_finalized) {
1271
-            foreach ($this->_subsections as $name => $subsection) {
1272
-                $subsection->_construct_finalize($this, $name);
1273
-            }
1274
-        }
1275
-    }
1276
-
1277
-
1278
-    /**
1279
-     * @param string $subsection_name
1280
-     * @param bool   $recursive
1281
-     * @return bool
1282
-     */
1283
-    public function has_subsection($subsection_name, $recursive = false)
1284
-    {
1285
-        foreach ($this->_subsections as $name => $subsection) {
1286
-            if (
1287
-                $name === $subsection_name
1288
-                || (
1289
-                    $recursive
1290
-                    && $subsection instanceof EE_Form_Section_Proper
1291
-                    && $subsection->has_subsection($subsection_name, $recursive)
1292
-                )
1293
-            ) {
1294
-                return true;
1295
-            }
1296
-        }
1297
-        return false;
1298
-    }
1299
-
1300
-
1301
-
1302
-    /**
1303
-     * Just gets all validatable subsections to clean their sensitive data
1304
-     *
1305
-     * @throws EE_Error
1306
-     */
1307
-    public function clean_sensitive_data()
1308
-    {
1309
-        foreach ($this->get_validatable_subsections() as $subsection) {
1310
-            $subsection->clean_sensitive_data();
1311
-        }
1312
-    }
1313
-
1314
-
1315
-    /**
1316
-     * Sets the submission error message (aka validation error message for this form section and all sub-sections)
1317
-     * @param string                           $form_submission_error_message
1318
-     * @param EE_Form_Section_Validatable $form_section unused
1319
-     * @throws EE_Error
1320
-     */
1321
-    public function set_submission_error_message(
1322
-        $form_submission_error_message = ''
1323
-    ) {
1324
-        $this->_form_submission_error_message = ! empty($form_submission_error_message)
1325
-            ? $form_submission_error_message
1326
-            : $this->getAllValidationErrorsString();
1327
-    }
1328
-
1329
-
1330
-    /**
1331
-     * Returns the cached error message. A default value is set for this during _validate(),
1332
-     * (called during receive_form_submission) but it can be explicitly set using
1333
-     * set_submission_error_message
1334
-     *
1335
-     * @return string
1336
-     */
1337
-    public function submission_error_message()
1338
-    {
1339
-        return $this->_form_submission_error_message;
1340
-    }
1341
-
1342
-
1343
-    /**
1344
-     * Sets a message to display if the data submitted to the form was valid.
1345
-     * @param string $form_submission_success_message
1346
-     */
1347
-    public function set_submission_success_message($form_submission_success_message = '')
1348
-    {
1349
-        $this->_form_submission_success_message = ! empty($form_submission_success_message)
1350
-            ? $form_submission_success_message
1351
-            : esc_html__('Form submitted successfully', 'event_espresso');
1352
-    }
1353
-
1354
-
1355
-    /**
1356
-     * Gets a message appropriate for display when the form is correctly submitted
1357
-     * @return string
1358
-     */
1359
-    public function submission_success_message()
1360
-    {
1361
-        return $this->_form_submission_success_message;
1362
-    }
1363
-
1364
-
1365
-    /**
1366
-     * Returns the prefix that should be used on child of this form section for
1367
-     * their html names. If this form section itself has a parent, prepends ITS
1368
-     * prefix onto this form section's prefix. Used primarily by
1369
-     * EE_Form_Input_Base::_set_default_html_name_if_empty
1370
-     *
1371
-     * @return string
1372
-     * @throws EE_Error
1373
-     */
1374
-    public function html_name_prefix()
1375
-    {
1376
-        if ($this->parent_section() instanceof EE_Form_Section_Proper) {
1377
-            return $this->parent_section()->html_name_prefix() . '[' . $this->name() . ']';
1378
-        }
1379
-        return $this->name();
1380
-    }
1381
-
1382
-
1383
-    /**
1384
-     * Gets the name, but first checks _construct_finalize has been called. If not,
1385
-     * calls it (assumes there is no parent and that we want the name to be whatever
1386
-     * was set, which is probably nothing, or the classname)
1387
-     *
1388
-     * @return string
1389
-     * @throws EE_Error
1390
-     */
1391
-    public function name()
1392
-    {
1393
-        $this->ensure_construct_finalized_called();
1394
-        return parent::name();
1395
-    }
1396
-
1397
-
1398
-    /**
1399
-     * @return EE_Form_Section_Proper
1400
-     * @throws EE_Error
1401
-     */
1402
-    public function parent_section()
1403
-    {
1404
-        $this->ensure_construct_finalized_called();
1405
-        return parent::parent_section();
1406
-    }
1407
-
1408
-
1409
-    /**
1410
-     * make sure construction finalized was called, otherwise children might not be ready
1411
-     *
1412
-     * @return void
1413
-     * @throws EE_Error
1414
-     */
1415
-    public function ensure_construct_finalized_called()
1416
-    {
1417
-        if (! $this->_construction_finalized) {
1418
-            $this->_construct_finalize($this->_parent_section, $this->_name);
1419
-        }
1420
-    }
1421
-
1422
-
1423
-    /**
1424
-     * Checks if any of this form section's inputs, or any of its children's inputs,
1425
-     * are in teh form data. If any are found, returns true. Else false
1426
-     *
1427
-     * @param array $req_data
1428
-     * @return boolean
1429
-     * @throws EE_Error
1430
-     */
1431
-    public function form_data_present_in($req_data = null)
1432
-    {
1433
-        $req_data = $this->getCachedRequest($req_data);
1434
-        foreach ($this->subsections() as $subsection) {
1435
-            if ($subsection instanceof EE_Form_Input_Base) {
1436
-                if ($subsection->form_data_present_in($req_data)) {
1437
-                    return true;
1438
-                }
1439
-            } elseif ($subsection instanceof EE_Form_Section_Proper) {
1440
-                if ($subsection->form_data_present_in($req_data)) {
1441
-                    return true;
1442
-                }
1443
-            }
1444
-        }
1445
-        return false;
1446
-    }
1447
-
1448
-
1449
-    /**
1450
-     * Gets validation errors for this form section and subsections
1451
-     * Similar to EE_Form_Section_Validatable::get_validation_errors() except this
1452
-     * gets the validation errors for ALL subsection
1453
-     *
1454
-     * @return EE_Validation_Error[]
1455
-     * @throws EE_Error
1456
-     */
1457
-    public function get_validation_errors_accumulated()
1458
-    {
1459
-        $validation_errors = $this->get_validation_errors();
1460
-        foreach ($this->get_validatable_subsections() as $subsection) {
1461
-            if ($subsection instanceof EE_Form_Section_Proper) {
1462
-                $validation_errors_on_this_subsection = $subsection->get_validation_errors_accumulated();
1463
-            } else {
1464
-                $validation_errors_on_this_subsection = $subsection->get_validation_errors();
1465
-            }
1466
-            if ($validation_errors_on_this_subsection) {
1467
-                $validation_errors = array_merge($validation_errors, $validation_errors_on_this_subsection);
1468
-            }
1469
-        }
1470
-        return $validation_errors;
1471
-    }
1472
-
1473
-    /**
1474
-     * Fetch validation errors from children and grandchildren and puts them in a single string.
1475
-     * This traverses the form section tree to generate this, but you probably want to instead use
1476
-     * get_form_submission_error_message() which is usually this message cached (or a custom validation error message)
1477
-     *
1478
-     * @return string
1479
-     * @since 4.9.59.p
1480
-     */
1481
-    protected function getAllValidationErrorsString()
1482
-    {
1483
-        $submission_error_messages = array();
1484
-        // bad, bad, bad registrant
1485
-        foreach ($this->get_validation_errors_accumulated() as $validation_error) {
1486
-            if ($validation_error instanceof EE_Validation_Error) {
1487
-                $form_section = $validation_error->get_form_section();
1488
-                if ($form_section instanceof EE_Form_Input_Base) {
1489
-                    $label = $validation_error->get_form_section()->html_label_text();
1490
-                } elseif ($form_section instanceof EE_Form_Section_Validatable) {
1491
-                    $label = $validation_error->get_form_section()->name();
1492
-                } else {
1493
-                    $label = esc_html__('Unknown', 'event_espresso');
1494
-                }
1495
-                $submission_error_messages[] = sprintf(
1496
-                    __('%s : %s', 'event_espresso'),
1497
-                    $label,
1498
-                    $validation_error->getMessage()
1499
-                );
1500
-            }
1501
-        }
1502
-        return implode('<br>', $submission_error_messages);
1503
-    }
1504
-
1505
-
1506
-    /**
1507
-     * This isn't just the name of an input, it's a path pointing to an input. The
1508
-     * path is similar to a folder path: slash (/) means to descend into a subsection,
1509
-     * dot-dot-slash (../) means to ascend into the parent section.
1510
-     * After a series of slashes and dot-dot-slashes, there should be the name of an input,
1511
-     * which will be returned.
1512
-     * Eg, if you want the related input to be conditional on a sibling input name 'foobar'
1513
-     * just use 'foobar'. If you want it to be conditional on an aunt/uncle input name
1514
-     * 'baz', use '../baz'. If you want it to be conditional on a cousin input,
1515
-     * the child of 'baz_section' named 'baz_child', use '../baz_section/baz_child'.
1516
-     * Etc
1517
-     *
1518
-     * @param string|false $form_section_path we accept false also because substr( '../', '../' ) = false
1519
-     * @return EE_Form_Section_Base
1520
-     * @throws EE_Error
1521
-     */
1522
-    public function find_section_from_path($form_section_path)
1523
-    {
1524
-        // check if we can find the input from purely going straight up the tree
1525
-        $input = parent::find_section_from_path($form_section_path);
1526
-        if ($input instanceof EE_Form_Section_Base) {
1527
-            return $input;
1528
-        }
1529
-        $next_slash_pos = strpos($form_section_path, '/');
1530
-        if ($next_slash_pos !== false) {
1531
-            $child_section_name = substr($form_section_path, 0, $next_slash_pos);
1532
-            $subpath            = substr($form_section_path, $next_slash_pos + 1);
1533
-        } else {
1534
-            $child_section_name = $form_section_path;
1535
-            $subpath            = '';
1536
-        }
1537
-        $child_section = $this->get_subsection($child_section_name);
1538
-        if ($child_section instanceof EE_Form_Section_Base) {
1539
-            return $child_section->find_section_from_path($subpath);
1540
-        }
1541
-        return null;
1542
-    }
17
+	const SUBMITTED_FORM_DATA_SSN_KEY = 'submitted_form_data';
18
+
19
+	/**
20
+	 * Subsections
21
+	 *
22
+	 * @var EE_Form_Section_Validatable[]
23
+	 */
24
+	protected $_subsections = array();
25
+
26
+	/**
27
+	 * Strategy for laying out the form
28
+	 *
29
+	 * @var EE_Form_Section_Layout_Base
30
+	 */
31
+	protected $_layout_strategy;
32
+
33
+	/**
34
+	 * Whether or not this form has received and validated a form submission yet
35
+	 *
36
+	 * @var boolean
37
+	 */
38
+	protected $_received_submission = false;
39
+
40
+	/**
41
+	 * message displayed to users upon successful form submission
42
+	 *
43
+	 * @var string
44
+	 */
45
+	protected $_form_submission_success_message = '';
46
+
47
+	/**
48
+	 * message displayed to users upon unsuccessful form submission
49
+	 *
50
+	 * @var string
51
+	 */
52
+	protected $_form_submission_error_message = '';
53
+
54
+	/**
55
+	 * @var array like $_REQUEST
56
+	 */
57
+	protected $cached_request_data;
58
+
59
+	/**
60
+	 * Stores whether this form (and its sub-sections) were found to be valid or not.
61
+	 * Starts off as null, but once the form is validated, it set to either true or false
62
+	 * @var boolean|null
63
+	 */
64
+	protected $is_valid;
65
+
66
+	/**
67
+	 * Stores all the data that will localized for form validation
68
+	 *
69
+	 * @var array
70
+	 */
71
+	protected static $_js_localization = array();
72
+
73
+	/**
74
+	 * whether or not the form's localized validation JS vars have been set
75
+	 *
76
+	 * @type boolean
77
+	 */
78
+	protected static $_scripts_localized = false;
79
+
80
+
81
+	/**
82
+	 * when constructing a proper form section, calls _construct_finalize on children
83
+	 * so that they know who their parent is, and what name they've been given.
84
+	 *
85
+	 * @param array[] $options_array   {
86
+	 * @type          $subsections     EE_Form_Section_Validatable[] where keys are the section's name
87
+	 * @type          $include         string[] numerically-indexed where values are section names to be included,
88
+	 *                                 and in that order. This is handy if you want
89
+	 *                                 the subsections to be ordered differently than the default, and if you override
90
+	 *                                 which fields are shown
91
+	 * @type          $exclude         string[] values are subsections to be excluded. This is handy if you want
92
+	 *                                 to remove certain default subsections (note: if you specify BOTH 'include' AND
93
+	 *                                 'exclude', the inclusions will be applied first, and the exclusions will exclude
94
+	 *                                 items from that list of inclusions)
95
+	 * @type          $layout_strategy EE_Form_Section_Layout_Base strategy for laying out the form
96
+	 *                                 } @see EE_Form_Section_Validatable::__construct()
97
+	 * @throws EE_Error
98
+	 */
99
+	public function __construct($options_array = array())
100
+	{
101
+		$options_array = (array) apply_filters(
102
+			'FHEE__EE_Form_Section_Proper___construct__options_array',
103
+			$options_array,
104
+			$this
105
+		);
106
+		// call parent first, as it may be setting the name
107
+		parent::__construct($options_array);
108
+		// if they've included subsections in the constructor, add them now
109
+		if (isset($options_array['include'])) {
110
+			// we are going to make sure we ONLY have those subsections to include
111
+			// AND we are going to make sure they're in that specified order
112
+			$reordered_subsections = array();
113
+			foreach ($options_array['include'] as $input_name) {
114
+				if (isset($this->_subsections[ $input_name ])) {
115
+					$reordered_subsections[ $input_name ] = $this->_subsections[ $input_name ];
116
+				}
117
+			}
118
+			$this->_subsections = $reordered_subsections;
119
+		}
120
+		if (isset($options_array['exclude'])) {
121
+			$exclude            = $options_array['exclude'];
122
+			$this->_subsections = array_diff_key($this->_subsections, array_flip($exclude));
123
+		}
124
+		if (isset($options_array['layout_strategy'])) {
125
+			$this->_layout_strategy = $options_array['layout_strategy'];
126
+		}
127
+		if (! $this->_layout_strategy) {
128
+			$this->_layout_strategy = is_admin() ? new EE_Admin_Two_Column_Layout() : new EE_Two_Column_Layout();
129
+		}
130
+		$this->_layout_strategy->_construct_finalize($this);
131
+		// ok so we are definitely going to want the forms JS,
132
+		// so enqueue it or remember to enqueue it during wp_enqueue_scripts
133
+		if (did_action('wp_enqueue_scripts') || did_action('admin_enqueue_scripts')) {
134
+			// ok so they've constructed this object after when they should have.
135
+			// just enqueue the generic form scripts and initialize the form immediately in the JS
136
+			EE_Form_Section_Proper::wp_enqueue_scripts(true);
137
+		} else {
138
+			add_action('wp_enqueue_scripts', array('EE_Form_Section_Proper', 'wp_enqueue_scripts'));
139
+			add_action('admin_enqueue_scripts', array('EE_Form_Section_Proper', 'wp_enqueue_scripts'));
140
+		}
141
+		add_action('wp_footer', array($this, 'ensure_scripts_localized'), 1);
142
+		/**
143
+		 * Gives other plugins a chance to hook in before construct finalize is called.
144
+		 * The form probably doesn't yet have a parent form section.
145
+		 * Since 4.9.32, when this action was introduced, this is the best place to add a subsection onto a form,
146
+		 * assuming you don't care what the form section's name, HTML ID, or HTML name etc are.
147
+		 * Also see AHEE__EE_Form_Section_Proper___construct_finalize__end
148
+		 *
149
+		 * @since 4.9.32
150
+		 * @param EE_Form_Section_Proper $this          before __construct is done, but all of its logic,
151
+		 *                                              except maybe calling _construct_finalize has been done
152
+		 * @param array                  $options_array options passed into the constructor
153
+		 */
154
+		do_action(
155
+			'AHEE__EE_Form_Input_Base___construct__before_construct_finalize_called',
156
+			$this,
157
+			$options_array
158
+		);
159
+		if (isset($options_array['name'])) {
160
+			$this->_construct_finalize(null, $options_array['name']);
161
+		}
162
+	}
163
+
164
+
165
+	/**
166
+	 * Finishes construction given the parent form section and this form section's name
167
+	 *
168
+	 * @param EE_Form_Section_Proper $parent_form_section
169
+	 * @param string                 $name
170
+	 * @throws EE_Error
171
+	 */
172
+	public function _construct_finalize($parent_form_section, $name)
173
+	{
174
+		parent::_construct_finalize($parent_form_section, $name);
175
+		$this->_set_default_name_if_empty();
176
+		$this->_set_default_html_id_if_empty();
177
+		foreach ($this->_subsections as $subsection_name => $subsection) {
178
+			if ($subsection instanceof EE_Form_Section_Base) {
179
+				$subsection->_construct_finalize($this, $subsection_name);
180
+			} else {
181
+				throw new EE_Error(
182
+					sprintf(
183
+						esc_html__(
184
+							'Subsection "%s" is not an instanceof EE_Form_Section_Base on form "%s". It is a "%s"',
185
+							'event_espresso'
186
+						),
187
+						$subsection_name,
188
+						get_class($this),
189
+						$subsection ? get_class($subsection) : esc_html__('NULL', 'event_espresso')
190
+					)
191
+				);
192
+			}
193
+		}
194
+		/**
195
+		 * Action performed just after form has been given a name (and HTML ID etc) and is fully constructed.
196
+		 * If you have code that should modify the form and needs it and its subsections to have a name, HTML ID
197
+		 * (or other attributes derived from the name like the HTML label id, etc), this is where it should be done.
198
+		 * This might only happen just before displaying the form, or just before it receives form submission data.
199
+		 * If you need to modify the form or its subsections before _construct_finalize is called on it (and we've
200
+		 * ensured it has a name, HTML IDs, etc
201
+		 *
202
+		 * @param EE_Form_Section_Proper      $this
203
+		 * @param EE_Form_Section_Proper|null $parent_form_section
204
+		 * @param string                      $name
205
+		 */
206
+		do_action(
207
+			'AHEE__EE_Form_Section_Proper___construct_finalize__end',
208
+			$this,
209
+			$parent_form_section,
210
+			$name
211
+		);
212
+	}
213
+
214
+
215
+	/**
216
+	 * Gets the layout strategy for this form section
217
+	 *
218
+	 * @return EE_Form_Section_Layout_Base
219
+	 */
220
+	public function get_layout_strategy()
221
+	{
222
+		return $this->_layout_strategy;
223
+	}
224
+
225
+
226
+	/**
227
+	 * Gets the HTML for a single input for this form section according
228
+	 * to the layout strategy
229
+	 *
230
+	 * @param EE_Form_Input_Base $input
231
+	 * @return string
232
+	 */
233
+	public function get_html_for_input($input)
234
+	{
235
+		return $this->_layout_strategy->layout_input($input);
236
+	}
237
+
238
+
239
+	/**
240
+	 * was_submitted - checks if form inputs are present in request data
241
+	 * Basically an alias for form_data_present_in() (which is used by both
242
+	 * proper form sections and form inputs)
243
+	 *
244
+	 * @param null $form_data
245
+	 * @return boolean
246
+	 * @throws EE_Error
247
+	 */
248
+	public function was_submitted($form_data = null)
249
+	{
250
+		return $this->form_data_present_in($form_data);
251
+	}
252
+
253
+	/**
254
+	 * Gets the cached request data; but if there is none, or $req_data was set with
255
+	 * something different, refresh the cache, and then return it
256
+	 * @param null $req_data
257
+	 * @return array
258
+	 */
259
+	protected function getCachedRequest($req_data = null)
260
+	{
261
+		if (
262
+			$this->cached_request_data === null
263
+			|| (
264
+				$req_data !== null
265
+				&& $req_data !== $this->cached_request_data
266
+			)
267
+		) {
268
+			$req_data = apply_filters(
269
+				'FHEE__EE_Form_Section_Proper__receive_form_submission__req_data',
270
+				$req_data,
271
+				$this
272
+			);
273
+			if ($req_data === null) {
274
+				$req_data = array_merge($_GET, $_POST);
275
+			}
276
+			$req_data = apply_filters(
277
+				'FHEE__EE_Form_Section_Proper__receive_form_submission__request_data',
278
+				$req_data,
279
+				$this
280
+			);
281
+			$this->cached_request_data = (array) $req_data;
282
+		}
283
+		return $this->cached_request_data;
284
+	}
285
+
286
+
287
+	/**
288
+	 * After the form section is initially created, call this to sanitize the data in the submission
289
+	 * which relates to this form section, validate it, and set it as properties on the form.
290
+	 *
291
+	 * @param array|null $req_data should usually be $_POST (the default).
292
+	 *                             However, you CAN supply a different array.
293
+	 *                             Consider using set_defaults() instead however.
294
+	 *                             (If you rendered the form in the page using echo $form_x->get_html()
295
+	 *                             the inputs will have the correct name in the request data for this function
296
+	 *                             to find them and populate the form with them.
297
+	 *                             If you have a flat form (with only input subsections),
298
+	 *                             you can supply a flat array where keys
299
+	 *                             are the form input names and values are their values)
300
+	 * @param boolean    $validate whether or not to perform validation on this data. Default is,
301
+	 *                             of course, to validate that data, and set errors on the invalid values.
302
+	 *                             But if the data has already been validated
303
+	 *                             (eg you validated the data then stored it in the DB)
304
+	 *                             you may want to skip this step.
305
+	 * @throws InvalidArgumentException
306
+	 * @throws InvalidInterfaceException
307
+	 * @throws InvalidDataTypeException
308
+	 * @throws EE_Error
309
+	 */
310
+	public function receive_form_submission($req_data = null, $validate = true)
311
+	{
312
+		$req_data = $this->getCachedRequest($req_data);
313
+		$this->_normalize($req_data);
314
+		if ($validate) {
315
+			$this->_validate();
316
+			// if it's invalid, we're going to want to re-display so remember what they submitted
317
+			if (! $this->is_valid()) {
318
+				$this->store_submitted_form_data_in_session();
319
+			}
320
+		}
321
+		if ($this->submission_error_message() === '' && ! $this->is_valid()) {
322
+			$this->set_submission_error_message();
323
+		}
324
+		do_action(
325
+			'AHEE__EE_Form_Section_Proper__receive_form_submission__end',
326
+			$req_data,
327
+			$this,
328
+			$validate
329
+		);
330
+	}
331
+
332
+
333
+	/**
334
+	 * caches the originally submitted input values in the session
335
+	 * so that they can be used to repopulate the form if it failed validation
336
+	 *
337
+	 * @return boolean whether or not the data was successfully stored in the session
338
+	 * @throws InvalidArgumentException
339
+	 * @throws InvalidInterfaceException
340
+	 * @throws InvalidDataTypeException
341
+	 * @throws EE_Error
342
+	 */
343
+	protected function store_submitted_form_data_in_session()
344
+	{
345
+		return EE_Registry::instance()->SSN->set_session_data(
346
+			array(
347
+				EE_Form_Section_Proper::SUBMITTED_FORM_DATA_SSN_KEY => $this->submitted_values(true),
348
+			)
349
+		);
350
+	}
351
+
352
+
353
+	/**
354
+	 * retrieves the originally submitted input values in the session
355
+	 * so that they can be used to repopulate the form if it failed validation
356
+	 *
357
+	 * @return array
358
+	 * @throws InvalidArgumentException
359
+	 * @throws InvalidInterfaceException
360
+	 * @throws InvalidDataTypeException
361
+	 */
362
+	protected function get_submitted_form_data_from_session()
363
+	{
364
+		$session = EE_Registry::instance()->SSN;
365
+		if ($session instanceof EE_Session) {
366
+			return $session->get_session_data(
367
+				EE_Form_Section_Proper::SUBMITTED_FORM_DATA_SSN_KEY
368
+			);
369
+		}
370
+		return array();
371
+	}
372
+
373
+
374
+	/**
375
+	 * flushed the originally submitted input values from the session
376
+	 *
377
+	 * @return boolean whether or not the data was successfully removed from the session
378
+	 * @throws InvalidArgumentException
379
+	 * @throws InvalidInterfaceException
380
+	 * @throws InvalidDataTypeException
381
+	 */
382
+	public static function flush_submitted_form_data_from_session()
383
+	{
384
+		return EE_Registry::instance()->SSN->reset_data(
385
+			array(EE_Form_Section_Proper::SUBMITTED_FORM_DATA_SSN_KEY)
386
+		);
387
+	}
388
+
389
+
390
+	/**
391
+	 * Populates this form and its subsections with data from the session.
392
+	 * (Wrapper for EE_Form_Section_Proper::receive_form_submission, so it shows
393
+	 * validation errors when displaying too)
394
+	 * Returns true if the form was populated from the session, false otherwise
395
+	 *
396
+	 * @return boolean
397
+	 * @throws InvalidArgumentException
398
+	 * @throws InvalidInterfaceException
399
+	 * @throws InvalidDataTypeException
400
+	 * @throws EE_Error
401
+	 */
402
+	public function populate_from_session()
403
+	{
404
+		$form_data_in_session = $this->get_submitted_form_data_from_session();
405
+		if (empty($form_data_in_session)) {
406
+			return false;
407
+		}
408
+		$this->receive_form_submission($form_data_in_session);
409
+		add_action('shutdown', array('EE_Form_Section_Proper', 'flush_submitted_form_data_from_session'));
410
+		if ($this->form_data_present_in($form_data_in_session)) {
411
+			return true;
412
+		}
413
+		return false;
414
+	}
415
+
416
+
417
+	/**
418
+	 * Populates the default data for the form, given an array where keys are
419
+	 * the input names, and values are their values (preferably normalized to be their
420
+	 * proper PHP types, not all strings... although that should be ok too).
421
+	 * Proper subsections are sub-arrays, the key being the subsection's name, and
422
+	 * the value being an array formatted in teh same way
423
+	 *
424
+	 * @param array $default_data
425
+	 * @throws EE_Error
426
+	 */
427
+	public function populate_defaults($default_data)
428
+	{
429
+		foreach ($this->subsections(false) as $subsection_name => $subsection) {
430
+			if (isset($default_data[ $subsection_name ])) {
431
+				if ($subsection instanceof EE_Form_Input_Base) {
432
+					$subsection->set_default($default_data[ $subsection_name ]);
433
+				} elseif ($subsection instanceof EE_Form_Section_Proper) {
434
+					$subsection->populate_defaults($default_data[ $subsection_name ]);
435
+				}
436
+			}
437
+		}
438
+	}
439
+
440
+
441
+	/**
442
+	 * returns true if subsection exists
443
+	 *
444
+	 * @param string $name
445
+	 * @return boolean
446
+	 */
447
+	public function subsection_exists($name)
448
+	{
449
+		return isset($this->_subsections[ $name ]) ? true : false;
450
+	}
451
+
452
+
453
+	/**
454
+	 * Gets the subsection specified by its name
455
+	 *
456
+	 * @param string  $name
457
+	 * @param boolean $require_construction_to_be_finalized most client code should leave this as TRUE
458
+	 *                                                      so that the inputs will be properly configured.
459
+	 *                                                      However, some client code may be ok
460
+	 *                                                      with construction finalize being called later
461
+	 *                                                      (realizing that the subsections' html names
462
+	 *                                                      might not be set yet, etc.)
463
+	 * @return EE_Form_Section_Base
464
+	 * @throws EE_Error
465
+	 */
466
+	public function get_subsection($name, $require_construction_to_be_finalized = true)
467
+	{
468
+		if ($require_construction_to_be_finalized) {
469
+			$this->ensure_construct_finalized_called();
470
+		}
471
+		return $this->subsection_exists($name) ? $this->_subsections[ $name ] : null;
472
+	}
473
+
474
+
475
+	/**
476
+	 * Gets all the validatable subsections of this form section
477
+	 *
478
+	 * @return EE_Form_Section_Validatable[]
479
+	 * @throws EE_Error
480
+	 */
481
+	public function get_validatable_subsections()
482
+	{
483
+		$validatable_subsections = array();
484
+		foreach ($this->subsections() as $name => $obj) {
485
+			if ($obj instanceof EE_Form_Section_Validatable) {
486
+				$validatable_subsections[ $name ] = $obj;
487
+			}
488
+		}
489
+		return $validatable_subsections;
490
+	}
491
+
492
+
493
+	/**
494
+	 * Gets an input by the given name. If not found, or if its not an EE_FOrm_Input_Base child,
495
+	 * throw an EE_Error.
496
+	 *
497
+	 * @param string  $name
498
+	 * @param boolean $require_construction_to_be_finalized most client code should
499
+	 *                                                      leave this as TRUE so that the inputs will be properly
500
+	 *                                                      configured. However, some client code may be ok with
501
+	 *                                                      construction finalize being called later
502
+	 *                                                      (realizing that the subsections' html names might not be
503
+	 *                                                      set yet, etc.)
504
+	 * @return EE_Form_Input_Base
505
+	 * @throws EE_Error
506
+	 */
507
+	public function get_input($name, $require_construction_to_be_finalized = true)
508
+	{
509
+		$subsection = $this->get_subsection(
510
+			$name,
511
+			$require_construction_to_be_finalized
512
+		);
513
+		if (! $subsection instanceof EE_Form_Input_Base) {
514
+			throw new EE_Error(
515
+				sprintf(
516
+					esc_html__(
517
+						"Subsection '%s' is not an instanceof EE_Form_Input_Base on form '%s'. It is a '%s'",
518
+						'event_espresso'
519
+					),
520
+					$name,
521
+					get_class($this),
522
+					$subsection ? get_class($subsection) : esc_html__('NULL', 'event_espresso')
523
+				)
524
+			);
525
+		}
526
+		return $subsection;
527
+	}
528
+
529
+
530
+	/**
531
+	 * Like get_input(), gets the proper subsection of the form given the name,
532
+	 * otherwise throws an EE_Error
533
+	 *
534
+	 * @param string  $name
535
+	 * @param boolean $require_construction_to_be_finalized most client code should
536
+	 *                                                      leave this as TRUE so that the inputs will be properly
537
+	 *                                                      configured. However, some client code may be ok with
538
+	 *                                                      construction finalize being called later
539
+	 *                                                      (realizing that the subsections' html names might not be
540
+	 *                                                      set yet, etc.)
541
+	 * @return EE_Form_Section_Proper
542
+	 * @throws EE_Error
543
+	 */
544
+	public function get_proper_subsection($name, $require_construction_to_be_finalized = true)
545
+	{
546
+		$subsection = $this->get_subsection(
547
+			$name,
548
+			$require_construction_to_be_finalized
549
+		);
550
+		if (! $subsection instanceof EE_Form_Section_Proper) {
551
+			throw new EE_Error(
552
+				sprintf(
553
+					esc_html__(
554
+						"Subsection '%'s is not an instanceof EE_Form_Section_Proper on form '%s'",
555
+						'event_espresso'
556
+					),
557
+					$name,
558
+					get_class($this)
559
+				)
560
+			);
561
+		}
562
+		return $subsection;
563
+	}
564
+
565
+
566
+	/**
567
+	 * Gets the value of the specified input. Should be called after receive_form_submission()
568
+	 * or populate_defaults() on the form, where the normalized value on the input is set.
569
+	 *
570
+	 * @param string $name
571
+	 * @return mixed depending on the input's type and its normalization strategy
572
+	 * @throws EE_Error
573
+	 */
574
+	public function get_input_value($name)
575
+	{
576
+		$input = $this->get_input($name);
577
+		return $input->normalized_value();
578
+	}
579
+
580
+
581
+	/**
582
+	 * Checks if this form section itself is valid, and then checks its subsections
583
+	 *
584
+	 * @throws EE_Error
585
+	 * @return boolean
586
+	 */
587
+	public function is_valid()
588
+	{
589
+		if ($this->is_valid === null) {
590
+			if (! $this->has_received_submission()) {
591
+				throw new EE_Error(
592
+					sprintf(
593
+						esc_html__(
594
+							'You cannot check if a form is valid before receiving the form submission using receive_form_submission',
595
+							'event_espresso'
596
+						)
597
+					)
598
+				);
599
+			}
600
+			if (! parent::is_valid()) {
601
+				$this->is_valid = false;
602
+			} else {
603
+				// ok so no general errors to this entire form section.
604
+				// so let's check the subsections, but only set errors if that hasn't been done yet
605
+				$this->is_valid = true;
606
+				foreach ($this->get_validatable_subsections() as $subsection) {
607
+					if (! $subsection->is_valid()) {
608
+						$this->is_valid = false;
609
+					}
610
+				}
611
+			}
612
+		}
613
+		return $this->is_valid;
614
+	}
615
+
616
+
617
+	/**
618
+	 * gets the default name of this form section if none is specified
619
+	 *
620
+	 * @return void
621
+	 */
622
+	protected function _set_default_name_if_empty()
623
+	{
624
+		if (! $this->_name) {
625
+			$classname    = get_class($this);
626
+			$default_name = str_replace('EE_', '', $classname);
627
+			$this->_name  = $default_name;
628
+		}
629
+	}
630
+
631
+
632
+	/**
633
+	 * Returns the HTML for the form, except for the form opening and closing tags
634
+	 * (as the form section doesn't know where you necessarily want to send the information to),
635
+	 * and except for a submit button. Enqueues JS and CSS; if called early enough we will
636
+	 * try to enqueue them in the header, otherwise they'll be enqueued in the footer.
637
+	 * Not doing_it_wrong because theoretically this CAN be used properly,
638
+	 * provided its used during "wp_enqueue_scripts", or it doesn't need to enqueue
639
+	 * any CSS.
640
+	 *
641
+	 * @throws InvalidArgumentException
642
+	 * @throws InvalidInterfaceException
643
+	 * @throws InvalidDataTypeException
644
+	 * @throws EE_Error
645
+	 */
646
+	public function get_html_and_js()
647
+	{
648
+		$this->enqueue_js();
649
+		return $this->get_html();
650
+	}
651
+
652
+
653
+	/**
654
+	 * returns HTML for displaying this form section. recursively calls display_section() on all subsections
655
+	 *
656
+	 * @param bool $display_previously_submitted_data
657
+	 * @return string
658
+	 * @throws InvalidArgumentException
659
+	 * @throws InvalidInterfaceException
660
+	 * @throws InvalidDataTypeException
661
+	 * @throws EE_Error
662
+	 * @throws EE_Error
663
+	 * @throws EE_Error
664
+	 */
665
+	public function get_html($display_previously_submitted_data = true)
666
+	{
667
+		$this->ensure_construct_finalized_called();
668
+		if ($display_previously_submitted_data) {
669
+			$this->populate_from_session();
670
+		}
671
+		return $this->_form_html_filter
672
+			? $this->_form_html_filter->filterHtml($this->_layout_strategy->layout_form(), $this)
673
+			: $this->_layout_strategy->layout_form();
674
+	}
675
+
676
+
677
+	/**
678
+	 * enqueues JS and CSS for the form.
679
+	 * It is preferred to call this before wp_enqueue_scripts so the
680
+	 * scripts and styles can be put in the header, but if called later
681
+	 * they will be put in the footer (which is OK for JS, but in HTML4 CSS should
682
+	 * only be in the header; but in HTML5 its ok in the body.
683
+	 * See http://stackoverflow.com/questions/4957446/load-external-css-file-in-body-tag.
684
+	 * So if your form enqueues CSS, it's preferred to call this before wp_enqueue_scripts.)
685
+	 *
686
+	 * @return void
687
+	 * @throws EE_Error
688
+	 */
689
+	public function enqueue_js()
690
+	{
691
+		$this->_enqueue_and_localize_form_js();
692
+		foreach ($this->subsections() as $subsection) {
693
+			$subsection->enqueue_js();
694
+		}
695
+	}
696
+
697
+
698
+	/**
699
+	 * adds a filter so that jquery validate gets enqueued in EE_System::wp_enqueue_scripts().
700
+	 * This must be done BEFORE wp_enqueue_scripts() gets called, which is on
701
+	 * the wp_enqueue_scripts hook.
702
+	 * However, registering the form js and localizing it can happen when we
703
+	 * actually output the form (which is preferred, seeing how teh form's fields
704
+	 * could change until it's actually outputted)
705
+	 *
706
+	 * @param boolean $init_form_validation_automatically whether or not we want the form validation
707
+	 *                                                    to be triggered automatically or not
708
+	 * @return void
709
+	 */
710
+	public static function wp_enqueue_scripts($init_form_validation_automatically = true)
711
+	{
712
+		wp_register_script(
713
+			'ee_form_section_validation',
714
+			EE_GLOBAL_ASSETS_URL . 'scripts' . '/form_section_validation.js',
715
+			array('jquery-validate', 'jquery-ui-datepicker', 'jquery-validate-extra-methods'),
716
+			EVENT_ESPRESSO_VERSION,
717
+			true
718
+		);
719
+		wp_localize_script(
720
+			'ee_form_section_validation',
721
+			'ee_form_section_validation_init',
722
+			array('init' => $init_form_validation_automatically ? '1' : '0')
723
+		);
724
+	}
725
+
726
+
727
+	/**
728
+	 * gets the variables used by form_section_validation.js.
729
+	 * This needs to be called AFTER we've called $this->_enqueue_jquery_validate_script,
730
+	 * but before the wordpress hook wp_loaded
731
+	 *
732
+	 * @throws EE_Error
733
+	 */
734
+	public function _enqueue_and_localize_form_js()
735
+	{
736
+		$this->ensure_construct_finalized_called();
737
+		// actually, we don't want to localize just yet. There may be other forms on the page.
738
+		// so we need to add our form section data to a static variable accessible by all form sections
739
+		// and localize it just before the footer
740
+		$this->localize_validation_rules();
741
+		add_action('wp_footer', array('EE_Form_Section_Proper', 'localize_script_for_all_forms'), 2);
742
+		add_action('admin_footer', array('EE_Form_Section_Proper', 'localize_script_for_all_forms'));
743
+	}
744
+
745
+
746
+	/**
747
+	 * add our form section data to a static variable accessible by all form sections
748
+	 *
749
+	 * @param bool $return_for_subsection
750
+	 * @return void
751
+	 * @throws EE_Error
752
+	 */
753
+	public function localize_validation_rules($return_for_subsection = false)
754
+	{
755
+		// we only want to localize vars ONCE for the entire form,
756
+		// so if the form section doesn't have a parent, then it must be the top dog
757
+		if ($return_for_subsection || ! $this->parent_section()) {
758
+			EE_Form_Section_Proper::$_js_localization['form_data'][ $this->html_id() ] = array(
759
+				'form_section_id'  => $this->html_id(true),
760
+				'validation_rules' => $this->get_jquery_validation_rules(),
761
+				'other_data'       => $this->get_other_js_data(),
762
+				'errors'           => $this->subsection_validation_errors_by_html_name(),
763
+			);
764
+			EE_Form_Section_Proper::$_scripts_localized                                = true;
765
+		}
766
+	}
767
+
768
+
769
+	/**
770
+	 * Gets an array of extra data that will be useful for client-side javascript.
771
+	 * This is primarily data added by inputs and forms in addition to any
772
+	 * scripts they might enqueue
773
+	 *
774
+	 * @param array $form_other_js_data
775
+	 * @return array
776
+	 * @throws EE_Error
777
+	 */
778
+	public function get_other_js_data($form_other_js_data = array())
779
+	{
780
+		foreach ($this->subsections() as $subsection) {
781
+			$form_other_js_data = $subsection->get_other_js_data($form_other_js_data);
782
+		}
783
+		return $form_other_js_data;
784
+	}
785
+
786
+
787
+	/**
788
+	 * Gets a flat array of inputs for this form section and its subsections.
789
+	 * Keys are their form names, and values are the inputs themselves
790
+	 *
791
+	 * @return EE_Form_Input_Base
792
+	 * @throws EE_Error
793
+	 */
794
+	public function inputs_in_subsections()
795
+	{
796
+		$inputs = array();
797
+		foreach ($this->subsections() as $subsection) {
798
+			if ($subsection instanceof EE_Form_Input_Base) {
799
+				$inputs[ $subsection->html_name() ] = $subsection;
800
+			} elseif ($subsection instanceof EE_Form_Section_Proper) {
801
+				$inputs += $subsection->inputs_in_subsections();
802
+			}
803
+		}
804
+		return $inputs;
805
+	}
806
+
807
+
808
+	/**
809
+	 * Gets a flat array of all the validation errors.
810
+	 * Keys are html names (because those should be unique)
811
+	 * and values are a string of all their validation errors
812
+	 *
813
+	 * @return string[]
814
+	 * @throws EE_Error
815
+	 */
816
+	public function subsection_validation_errors_by_html_name()
817
+	{
818
+		$inputs = $this->inputs();
819
+		$errors = array();
820
+		foreach ($inputs as $form_input) {
821
+			if ($form_input instanceof EE_Form_Input_Base && $form_input->get_validation_errors()) {
822
+				$errors[ $form_input->html_name() ] = $form_input->get_validation_error_string();
823
+			}
824
+		}
825
+		return $errors;
826
+	}
827
+
828
+
829
+	/**
830
+	 * passes all the form data required by the JS to the JS, and enqueues the few required JS files.
831
+	 * Should be setup by each form during the _enqueues_and_localize_form_js
832
+	 *
833
+	 * @throws InvalidArgumentException
834
+	 * @throws InvalidInterfaceException
835
+	 * @throws InvalidDataTypeException
836
+	 */
837
+	public static function localize_script_for_all_forms()
838
+	{
839
+		// allow inputs and stuff to hook in their JS and stuff here
840
+		do_action('AHEE__EE_Form_Section_Proper__localize_script_for_all_forms__begin');
841
+		EE_Form_Section_Proper::$_js_localization['localized_error_messages'] = EE_Form_Section_Proper::_get_localized_error_messages();
842
+		$email_validation_level = isset(EE_Registry::instance()->CFG->registration->email_validation_level)
843
+			? EE_Registry::instance()->CFG->registration->email_validation_level
844
+			: 'wp_default';
845
+		EE_Form_Section_Proper::$_js_localization['email_validation_level']   = $email_validation_level;
846
+		wp_enqueue_script('ee_form_section_validation');
847
+		wp_localize_script(
848
+			'ee_form_section_validation',
849
+			'ee_form_section_vars',
850
+			EE_Form_Section_Proper::$_js_localization
851
+		);
852
+	}
853
+
854
+
855
+	/**
856
+	 * ensure_scripts_localized
857
+	 *
858
+	 * @throws EE_Error
859
+	 */
860
+	public function ensure_scripts_localized()
861
+	{
862
+		if (! EE_Form_Section_Proper::$_scripts_localized) {
863
+			$this->_enqueue_and_localize_form_js();
864
+		}
865
+	}
866
+
867
+
868
+	/**
869
+	 * Gets the hard-coded validation error messages to be used in the JS. The convention
870
+	 * is that the key here should be the same as the custom validation rule put in the JS file
871
+	 *
872
+	 * @return array keys are custom validation rules, and values are internationalized strings
873
+	 */
874
+	private static function _get_localized_error_messages()
875
+	{
876
+		return array(
877
+			'validUrl' => esc_html__('This is not a valid absolute URL. Eg, http://domain.com/monkey.jpg', 'event_espresso'),
878
+			'regex'    => esc_html__('Please check your input', 'event_espresso'),
879
+		);
880
+	}
881
+
882
+
883
+	/**
884
+	 * @return array
885
+	 */
886
+	public static function js_localization()
887
+	{
888
+		return self::$_js_localization;
889
+	}
890
+
891
+
892
+	/**
893
+	 * @return void
894
+	 */
895
+	public static function reset_js_localization()
896
+	{
897
+		self::$_js_localization = array();
898
+	}
899
+
900
+
901
+	/**
902
+	 * Gets the JS to put inside the jquery validation rules for subsection of this form section.
903
+	 * See parent function for more...
904
+	 *
905
+	 * @return array
906
+	 * @throws EE_Error
907
+	 */
908
+	public function get_jquery_validation_rules()
909
+	{
910
+		$jquery_validation_rules = array();
911
+		foreach ($this->get_validatable_subsections() as $subsection) {
912
+			$jquery_validation_rules = array_merge(
913
+				$jquery_validation_rules,
914
+				$subsection->get_jquery_validation_rules()
915
+			);
916
+		}
917
+		return $jquery_validation_rules;
918
+	}
919
+
920
+
921
+	/**
922
+	 * Sanitizes all the data and sets the sanitized value of each field
923
+	 *
924
+	 * @param array $req_data like $_POST
925
+	 * @return void
926
+	 * @throws EE_Error
927
+	 */
928
+	protected function _normalize($req_data)
929
+	{
930
+		$this->_received_submission = true;
931
+		$this->_validation_errors   = array();
932
+		foreach ($this->get_validatable_subsections() as $subsection) {
933
+			try {
934
+				$subsection->_normalize($req_data);
935
+			} catch (EE_Validation_Error $e) {
936
+				$subsection->add_validation_error($e);
937
+			}
938
+		}
939
+	}
940
+
941
+
942
+	/**
943
+	 * Performs validation on this form section and its subsections.
944
+	 * For each subsection,
945
+	 * calls _validate_{subsection_name} on THIS form (if the function exists)
946
+	 * and passes it the subsection, then calls _validate on that subsection.
947
+	 * If you need to perform validation on the form as a whole (considering multiple)
948
+	 * you would be best to override this _validate method,
949
+	 * calling parent::_validate() first.
950
+	 *
951
+	 * @throws EE_Error
952
+	 */
953
+	protected function _validate()
954
+	{
955
+		// reset the cache of whether this form is valid or not- we're re-validating it now
956
+		$this->is_valid = null;
957
+		foreach ($this->get_validatable_subsections() as $subsection_name => $subsection) {
958
+			if (method_exists($this, '_validate_' . $subsection_name)) {
959
+				call_user_func_array(array($this, '_validate_' . $subsection_name), array($subsection));
960
+			}
961
+			$subsection->_validate();
962
+		}
963
+	}
964
+
965
+
966
+	/**
967
+	 * Gets all the validated inputs for the form section
968
+	 *
969
+	 * @return array
970
+	 * @throws EE_Error
971
+	 */
972
+	public function valid_data()
973
+	{
974
+		$inputs = array();
975
+		foreach ($this->subsections() as $subsection_name => $subsection) {
976
+			if ($subsection instanceof EE_Form_Section_Proper) {
977
+				$inputs[ $subsection_name ] = $subsection->valid_data();
978
+			} elseif ($subsection instanceof EE_Form_Input_Base) {
979
+				$inputs[ $subsection_name ] = $subsection->normalized_value();
980
+			}
981
+		}
982
+		return $inputs;
983
+	}
984
+
985
+
986
+	/**
987
+	 * Gets all the inputs on this form section
988
+	 *
989
+	 * @return EE_Form_Input_Base[]
990
+	 * @throws EE_Error
991
+	 */
992
+	public function inputs()
993
+	{
994
+		$inputs = array();
995
+		foreach ($this->subsections() as $subsection_name => $subsection) {
996
+			if ($subsection instanceof EE_Form_Input_Base) {
997
+				$inputs[ $subsection_name ] = $subsection;
998
+			}
999
+		}
1000
+		return $inputs;
1001
+	}
1002
+
1003
+
1004
+	/**
1005
+	 * Gets all the subsections which are a proper form
1006
+	 *
1007
+	 * @return EE_Form_Section_Proper[]
1008
+	 * @throws EE_Error
1009
+	 */
1010
+	public function subforms()
1011
+	{
1012
+		$form_sections = array();
1013
+		foreach ($this->subsections() as $name => $obj) {
1014
+			if ($obj instanceof EE_Form_Section_Proper) {
1015
+				$form_sections[ $name ] = $obj;
1016
+			}
1017
+		}
1018
+		return $form_sections;
1019
+	}
1020
+
1021
+
1022
+	/**
1023
+	 * Gets all the subsections (inputs, proper subsections, or html-only sections).
1024
+	 * Consider using inputs() or subforms()
1025
+	 * if you only want form inputs or proper form sections.
1026
+	 *
1027
+	 * @param boolean $require_construction_to_be_finalized most client code should
1028
+	 *                                                      leave this as TRUE so that the inputs will be properly
1029
+	 *                                                      configured. However, some client code may be ok with
1030
+	 *                                                      construction finalize being called later
1031
+	 *                                                      (realizing that the subsections' html names might not be
1032
+	 *                                                      set yet, etc.)
1033
+	 * @return EE_Form_Section_Proper[]
1034
+	 * @throws EE_Error
1035
+	 */
1036
+	public function subsections($require_construction_to_be_finalized = true)
1037
+	{
1038
+		if ($require_construction_to_be_finalized) {
1039
+			$this->ensure_construct_finalized_called();
1040
+		}
1041
+		return $this->_subsections;
1042
+	}
1043
+
1044
+
1045
+	/**
1046
+	 * Returns whether this form has any subforms or inputs
1047
+	 * @return bool
1048
+	 */
1049
+	public function hasSubsections()
1050
+	{
1051
+		return ! empty($this->_subsections);
1052
+	}
1053
+
1054
+
1055
+	/**
1056
+	 * Returns a simple array where keys are input names, and values are their normalized
1057
+	 * values. (Similar to calling get_input_value on inputs)
1058
+	 *
1059
+	 * @param boolean $include_subform_inputs Whether to include inputs from subforms,
1060
+	 *                                        or just this forms' direct children inputs
1061
+	 * @param boolean $flatten                Whether to force the results into 1-dimensional array,
1062
+	 *                                        or allow multidimensional array
1063
+	 * @return array if $flatten is TRUE it will always be a 1-dimensional array
1064
+	 *                                        with array keys being input names
1065
+	 *                                        (regardless of whether they are from a subsection or not),
1066
+	 *                                        and if $flatten is FALSE it can be a multidimensional array
1067
+	 *                                        where keys are always subsection names and values are either
1068
+	 *                                        the input's normalized value, or an array like the top-level array
1069
+	 * @throws EE_Error
1070
+	 */
1071
+	public function input_values($include_subform_inputs = false, $flatten = false)
1072
+	{
1073
+		return $this->_input_values(false, $include_subform_inputs, $flatten);
1074
+	}
1075
+
1076
+
1077
+	/**
1078
+	 * Similar to EE_Form_Section_Proper::input_values(), except this returns the 'display_value'
1079
+	 * of each input. On some inputs (especially radio boxes or checkboxes), the value stored
1080
+	 * is not necessarily the value we want to display to users. This creates an array
1081
+	 * where keys are the input names, and values are their display values
1082
+	 *
1083
+	 * @param boolean $include_subform_inputs Whether to include inputs from subforms,
1084
+	 *                                        or just this forms' direct children inputs
1085
+	 * @param boolean $flatten                Whether to force the results into 1-dimensional array,
1086
+	 *                                        or allow multidimensional array
1087
+	 * @return array if $flatten is TRUE it will always be a 1-dimensional array
1088
+	 *                                        with array keys being input names
1089
+	 *                                        (regardless of whether they are from a subsection or not),
1090
+	 *                                        and if $flatten is FALSE it can be a multidimensional array
1091
+	 *                                        where keys are always subsection names and values are either
1092
+	 *                                        the input's normalized value, or an array like the top-level array
1093
+	 * @throws EE_Error
1094
+	 */
1095
+	public function input_pretty_values($include_subform_inputs = false, $flatten = false)
1096
+	{
1097
+		return $this->_input_values(true, $include_subform_inputs, $flatten);
1098
+	}
1099
+
1100
+
1101
+	/**
1102
+	 * Gets the input values from the form
1103
+	 *
1104
+	 * @param boolean $pretty                 Whether to retrieve the pretty value,
1105
+	 *                                        or just the normalized value
1106
+	 * @param boolean $include_subform_inputs Whether to include inputs from subforms,
1107
+	 *                                        or just this forms' direct children inputs
1108
+	 * @param boolean $flatten                Whether to force the results into 1-dimensional array,
1109
+	 *                                        or allow multidimensional array
1110
+	 * @return array if $flatten is TRUE it will always be a 1-dimensional array with array keys being
1111
+	 *                                        input names (regardless of whether they are from a subsection or not),
1112
+	 *                                        and if $flatten is FALSE it can be a multidimensional array
1113
+	 *                                        where keys are always subsection names and values are either
1114
+	 *                                        the input's normalized value, or an array like the top-level array
1115
+	 * @throws EE_Error
1116
+	 */
1117
+	public function _input_values($pretty = false, $include_subform_inputs = false, $flatten = false)
1118
+	{
1119
+		$input_values = array();
1120
+		foreach ($this->subsections() as $subsection_name => $subsection) {
1121
+			if ($subsection instanceof EE_Form_Input_Base) {
1122
+				$input_values[ $subsection_name ] = $pretty
1123
+					? $subsection->pretty_value()
1124
+					: $subsection->normalized_value();
1125
+			} elseif ($subsection instanceof EE_Form_Section_Proper && $include_subform_inputs) {
1126
+				$subform_input_values = $subsection->_input_values(
1127
+					$pretty,
1128
+					$include_subform_inputs,
1129
+					$flatten
1130
+				);
1131
+				if ($flatten) {
1132
+					$input_values = array_merge($input_values, $subform_input_values);
1133
+				} else {
1134
+					$input_values[ $subsection_name ] = $subform_input_values;
1135
+				}
1136
+			}
1137
+		}
1138
+		return $input_values;
1139
+	}
1140
+
1141
+
1142
+	/**
1143
+	 * Gets the originally submitted input values from the form
1144
+	 *
1145
+	 * @param boolean $include_subforms  Whether to include inputs from subforms,
1146
+	 *                                   or just this forms' direct children inputs
1147
+	 * @return array                     if $flatten is TRUE it will always be a 1-dimensional array
1148
+	 *                                   with array keys being input names
1149
+	 *                                   (regardless of whether they are from a subsection or not),
1150
+	 *                                   and if $flatten is FALSE it can be a multidimensional array
1151
+	 *                                   where keys are always subsection names and values are either
1152
+	 *                                   the input's normalized value, or an array like the top-level array
1153
+	 * @throws EE_Error
1154
+	 */
1155
+	public function submitted_values($include_subforms = false)
1156
+	{
1157
+		$submitted_values = array();
1158
+		foreach ($this->subsections() as $subsection) {
1159
+			if ($subsection instanceof EE_Form_Input_Base) {
1160
+				// is this input part of an array of inputs?
1161
+				if (strpos($subsection->html_name(), '[') !== false) {
1162
+					$full_input_name  = EEH_Array::convert_array_values_to_keys(
1163
+						explode(
1164
+							'[',
1165
+							str_replace(']', '', $subsection->html_name())
1166
+						),
1167
+						$subsection->raw_value()
1168
+					);
1169
+					$submitted_values = array_replace_recursive($submitted_values, $full_input_name);
1170
+				} else {
1171
+					$submitted_values[ $subsection->html_name() ] = $subsection->raw_value();
1172
+				}
1173
+			} elseif ($subsection instanceof EE_Form_Section_Proper && $include_subforms) {
1174
+				$subform_input_values = $subsection->submitted_values($include_subforms);
1175
+				$submitted_values     = array_replace_recursive($submitted_values, $subform_input_values);
1176
+			}
1177
+		}
1178
+		return $submitted_values;
1179
+	}
1180
+
1181
+
1182
+	/**
1183
+	 * Indicates whether or not this form has received a submission yet
1184
+	 * (ie, had receive_form_submission called on it yet)
1185
+	 *
1186
+	 * @return boolean
1187
+	 * @throws EE_Error
1188
+	 */
1189
+	public function has_received_submission()
1190
+	{
1191
+		$this->ensure_construct_finalized_called();
1192
+		return $this->_received_submission;
1193
+	}
1194
+
1195
+
1196
+	/**
1197
+	 * Equivalent to passing 'exclude' in the constructor's options array.
1198
+	 * Removes the listed inputs from the form
1199
+	 *
1200
+	 * @param array $inputs_to_exclude values are the input names
1201
+	 * @return void
1202
+	 */
1203
+	public function exclude(array $inputs_to_exclude = array())
1204
+	{
1205
+		foreach ($inputs_to_exclude as $input_to_exclude_name) {
1206
+			unset($this->_subsections[ $input_to_exclude_name ]);
1207
+		}
1208
+	}
1209
+
1210
+
1211
+	/**
1212
+	 * Changes these inputs' display strategy to be EE_Hidden_Display_Strategy.
1213
+	 * @param array $inputs_to_hide
1214
+	 * @throws EE_Error
1215
+	 */
1216
+	public function hide(array $inputs_to_hide = array())
1217
+	{
1218
+		foreach ($inputs_to_hide as $input_to_hide) {
1219
+			$input = $this->get_input($input_to_hide);
1220
+			$input->set_display_strategy(new EE_Hidden_Display_Strategy());
1221
+		}
1222
+	}
1223
+
1224
+
1225
+	/**
1226
+	 * add_subsections
1227
+	 * Adds the listed subsections to the form section.
1228
+	 * If $subsection_name_to_target is provided,
1229
+	 * then new subsections are added before or after that subsection,
1230
+	 * otherwise to the start or end of the entire subsections array.
1231
+	 *
1232
+	 * @param EE_Form_Section_Base[] $new_subsections           array of new form subsections
1233
+	 *                                                          where keys are their names
1234
+	 * @param string                 $subsection_name_to_target an existing for section that $new_subsections
1235
+	 *                                                          should be added before or after
1236
+	 *                                                          IF $subsection_name_to_target is null,
1237
+	 *                                                          then $new_subsections will be added to
1238
+	 *                                                          the beginning or end of the entire subsections array
1239
+	 * @param boolean                $add_before                whether to add $new_subsections, before or after
1240
+	 *                                                          $subsection_name_to_target,
1241
+	 *                                                          or if $subsection_name_to_target is null,
1242
+	 *                                                          before or after entire subsections array
1243
+	 * @return void
1244
+	 * @throws EE_Error
1245
+	 */
1246
+	public function add_subsections($new_subsections, $subsection_name_to_target = null, $add_before = true)
1247
+	{
1248
+		foreach ($new_subsections as $subsection_name => $subsection) {
1249
+			if (! $subsection instanceof EE_Form_Section_Base) {
1250
+				EE_Error::add_error(
1251
+					sprintf(
1252
+						esc_html__(
1253
+							"Trying to add a %s as a subsection (it was named '%s') to the form section '%s'. It was removed.",
1254
+							'event_espresso'
1255
+						),
1256
+						get_class($subsection),
1257
+						$subsection_name,
1258
+						$this->name()
1259
+					)
1260
+				);
1261
+				unset($new_subsections[ $subsection_name ]);
1262
+			}
1263
+		}
1264
+		$this->_subsections = EEH_Array::insert_into_array(
1265
+			$this->_subsections,
1266
+			$new_subsections,
1267
+			$subsection_name_to_target,
1268
+			$add_before
1269
+		);
1270
+		if ($this->_construction_finalized) {
1271
+			foreach ($this->_subsections as $name => $subsection) {
1272
+				$subsection->_construct_finalize($this, $name);
1273
+			}
1274
+		}
1275
+	}
1276
+
1277
+
1278
+	/**
1279
+	 * @param string $subsection_name
1280
+	 * @param bool   $recursive
1281
+	 * @return bool
1282
+	 */
1283
+	public function has_subsection($subsection_name, $recursive = false)
1284
+	{
1285
+		foreach ($this->_subsections as $name => $subsection) {
1286
+			if (
1287
+				$name === $subsection_name
1288
+				|| (
1289
+					$recursive
1290
+					&& $subsection instanceof EE_Form_Section_Proper
1291
+					&& $subsection->has_subsection($subsection_name, $recursive)
1292
+				)
1293
+			) {
1294
+				return true;
1295
+			}
1296
+		}
1297
+		return false;
1298
+	}
1299
+
1300
+
1301
+
1302
+	/**
1303
+	 * Just gets all validatable subsections to clean their sensitive data
1304
+	 *
1305
+	 * @throws EE_Error
1306
+	 */
1307
+	public function clean_sensitive_data()
1308
+	{
1309
+		foreach ($this->get_validatable_subsections() as $subsection) {
1310
+			$subsection->clean_sensitive_data();
1311
+		}
1312
+	}
1313
+
1314
+
1315
+	/**
1316
+	 * Sets the submission error message (aka validation error message for this form section and all sub-sections)
1317
+	 * @param string                           $form_submission_error_message
1318
+	 * @param EE_Form_Section_Validatable $form_section unused
1319
+	 * @throws EE_Error
1320
+	 */
1321
+	public function set_submission_error_message(
1322
+		$form_submission_error_message = ''
1323
+	) {
1324
+		$this->_form_submission_error_message = ! empty($form_submission_error_message)
1325
+			? $form_submission_error_message
1326
+			: $this->getAllValidationErrorsString();
1327
+	}
1328
+
1329
+
1330
+	/**
1331
+	 * Returns the cached error message. A default value is set for this during _validate(),
1332
+	 * (called during receive_form_submission) but it can be explicitly set using
1333
+	 * set_submission_error_message
1334
+	 *
1335
+	 * @return string
1336
+	 */
1337
+	public function submission_error_message()
1338
+	{
1339
+		return $this->_form_submission_error_message;
1340
+	}
1341
+
1342
+
1343
+	/**
1344
+	 * Sets a message to display if the data submitted to the form was valid.
1345
+	 * @param string $form_submission_success_message
1346
+	 */
1347
+	public function set_submission_success_message($form_submission_success_message = '')
1348
+	{
1349
+		$this->_form_submission_success_message = ! empty($form_submission_success_message)
1350
+			? $form_submission_success_message
1351
+			: esc_html__('Form submitted successfully', 'event_espresso');
1352
+	}
1353
+
1354
+
1355
+	/**
1356
+	 * Gets a message appropriate for display when the form is correctly submitted
1357
+	 * @return string
1358
+	 */
1359
+	public function submission_success_message()
1360
+	{
1361
+		return $this->_form_submission_success_message;
1362
+	}
1363
+
1364
+
1365
+	/**
1366
+	 * Returns the prefix that should be used on child of this form section for
1367
+	 * their html names. If this form section itself has a parent, prepends ITS
1368
+	 * prefix onto this form section's prefix. Used primarily by
1369
+	 * EE_Form_Input_Base::_set_default_html_name_if_empty
1370
+	 *
1371
+	 * @return string
1372
+	 * @throws EE_Error
1373
+	 */
1374
+	public function html_name_prefix()
1375
+	{
1376
+		if ($this->parent_section() instanceof EE_Form_Section_Proper) {
1377
+			return $this->parent_section()->html_name_prefix() . '[' . $this->name() . ']';
1378
+		}
1379
+		return $this->name();
1380
+	}
1381
+
1382
+
1383
+	/**
1384
+	 * Gets the name, but first checks _construct_finalize has been called. If not,
1385
+	 * calls it (assumes there is no parent and that we want the name to be whatever
1386
+	 * was set, which is probably nothing, or the classname)
1387
+	 *
1388
+	 * @return string
1389
+	 * @throws EE_Error
1390
+	 */
1391
+	public function name()
1392
+	{
1393
+		$this->ensure_construct_finalized_called();
1394
+		return parent::name();
1395
+	}
1396
+
1397
+
1398
+	/**
1399
+	 * @return EE_Form_Section_Proper
1400
+	 * @throws EE_Error
1401
+	 */
1402
+	public function parent_section()
1403
+	{
1404
+		$this->ensure_construct_finalized_called();
1405
+		return parent::parent_section();
1406
+	}
1407
+
1408
+
1409
+	/**
1410
+	 * make sure construction finalized was called, otherwise children might not be ready
1411
+	 *
1412
+	 * @return void
1413
+	 * @throws EE_Error
1414
+	 */
1415
+	public function ensure_construct_finalized_called()
1416
+	{
1417
+		if (! $this->_construction_finalized) {
1418
+			$this->_construct_finalize($this->_parent_section, $this->_name);
1419
+		}
1420
+	}
1421
+
1422
+
1423
+	/**
1424
+	 * Checks if any of this form section's inputs, or any of its children's inputs,
1425
+	 * are in teh form data. If any are found, returns true. Else false
1426
+	 *
1427
+	 * @param array $req_data
1428
+	 * @return boolean
1429
+	 * @throws EE_Error
1430
+	 */
1431
+	public function form_data_present_in($req_data = null)
1432
+	{
1433
+		$req_data = $this->getCachedRequest($req_data);
1434
+		foreach ($this->subsections() as $subsection) {
1435
+			if ($subsection instanceof EE_Form_Input_Base) {
1436
+				if ($subsection->form_data_present_in($req_data)) {
1437
+					return true;
1438
+				}
1439
+			} elseif ($subsection instanceof EE_Form_Section_Proper) {
1440
+				if ($subsection->form_data_present_in($req_data)) {
1441
+					return true;
1442
+				}
1443
+			}
1444
+		}
1445
+		return false;
1446
+	}
1447
+
1448
+
1449
+	/**
1450
+	 * Gets validation errors for this form section and subsections
1451
+	 * Similar to EE_Form_Section_Validatable::get_validation_errors() except this
1452
+	 * gets the validation errors for ALL subsection
1453
+	 *
1454
+	 * @return EE_Validation_Error[]
1455
+	 * @throws EE_Error
1456
+	 */
1457
+	public function get_validation_errors_accumulated()
1458
+	{
1459
+		$validation_errors = $this->get_validation_errors();
1460
+		foreach ($this->get_validatable_subsections() as $subsection) {
1461
+			if ($subsection instanceof EE_Form_Section_Proper) {
1462
+				$validation_errors_on_this_subsection = $subsection->get_validation_errors_accumulated();
1463
+			} else {
1464
+				$validation_errors_on_this_subsection = $subsection->get_validation_errors();
1465
+			}
1466
+			if ($validation_errors_on_this_subsection) {
1467
+				$validation_errors = array_merge($validation_errors, $validation_errors_on_this_subsection);
1468
+			}
1469
+		}
1470
+		return $validation_errors;
1471
+	}
1472
+
1473
+	/**
1474
+	 * Fetch validation errors from children and grandchildren and puts them in a single string.
1475
+	 * This traverses the form section tree to generate this, but you probably want to instead use
1476
+	 * get_form_submission_error_message() which is usually this message cached (or a custom validation error message)
1477
+	 *
1478
+	 * @return string
1479
+	 * @since 4.9.59.p
1480
+	 */
1481
+	protected function getAllValidationErrorsString()
1482
+	{
1483
+		$submission_error_messages = array();
1484
+		// bad, bad, bad registrant
1485
+		foreach ($this->get_validation_errors_accumulated() as $validation_error) {
1486
+			if ($validation_error instanceof EE_Validation_Error) {
1487
+				$form_section = $validation_error->get_form_section();
1488
+				if ($form_section instanceof EE_Form_Input_Base) {
1489
+					$label = $validation_error->get_form_section()->html_label_text();
1490
+				} elseif ($form_section instanceof EE_Form_Section_Validatable) {
1491
+					$label = $validation_error->get_form_section()->name();
1492
+				} else {
1493
+					$label = esc_html__('Unknown', 'event_espresso');
1494
+				}
1495
+				$submission_error_messages[] = sprintf(
1496
+					__('%s : %s', 'event_espresso'),
1497
+					$label,
1498
+					$validation_error->getMessage()
1499
+				);
1500
+			}
1501
+		}
1502
+		return implode('<br>', $submission_error_messages);
1503
+	}
1504
+
1505
+
1506
+	/**
1507
+	 * This isn't just the name of an input, it's a path pointing to an input. The
1508
+	 * path is similar to a folder path: slash (/) means to descend into a subsection,
1509
+	 * dot-dot-slash (../) means to ascend into the parent section.
1510
+	 * After a series of slashes and dot-dot-slashes, there should be the name of an input,
1511
+	 * which will be returned.
1512
+	 * Eg, if you want the related input to be conditional on a sibling input name 'foobar'
1513
+	 * just use 'foobar'. If you want it to be conditional on an aunt/uncle input name
1514
+	 * 'baz', use '../baz'. If you want it to be conditional on a cousin input,
1515
+	 * the child of 'baz_section' named 'baz_child', use '../baz_section/baz_child'.
1516
+	 * Etc
1517
+	 *
1518
+	 * @param string|false $form_section_path we accept false also because substr( '../', '../' ) = false
1519
+	 * @return EE_Form_Section_Base
1520
+	 * @throws EE_Error
1521
+	 */
1522
+	public function find_section_from_path($form_section_path)
1523
+	{
1524
+		// check if we can find the input from purely going straight up the tree
1525
+		$input = parent::find_section_from_path($form_section_path);
1526
+		if ($input instanceof EE_Form_Section_Base) {
1527
+			return $input;
1528
+		}
1529
+		$next_slash_pos = strpos($form_section_path, '/');
1530
+		if ($next_slash_pos !== false) {
1531
+			$child_section_name = substr($form_section_path, 0, $next_slash_pos);
1532
+			$subpath            = substr($form_section_path, $next_slash_pos + 1);
1533
+		} else {
1534
+			$child_section_name = $form_section_path;
1535
+			$subpath            = '';
1536
+		}
1537
+		$child_section = $this->get_subsection($child_section_name);
1538
+		if ($child_section instanceof EE_Form_Section_Base) {
1539
+			return $child_section->find_section_from_path($subpath);
1540
+		}
1541
+		return null;
1542
+	}
1543 1543
 }
Please login to merge, or discard this patch.
core/libraries/messages/EE_Messenger_Collection_Loader.lib.php 2 patches
Indentation   +123 added lines, -123 removed lines patch added patch discarded remove patch
@@ -16,127 +16,127 @@
 block discarded – undo
16 16
 
17 17
 
18 18
 
19
-    /**
20
-     * @type EE_Messenger_Collection $_messenger_collection
21
-     */
22
-    protected $_messenger_collection = null;
23
-
24
-
25
-
26
-    /**
27
-     * EE_Messenger_Collection_Loader constructor.
28
-     *
29
-     * @param EE_Messenger_Collection $messengers
30
-     */
31
-    public function __construct(EE_Messenger_Collection $messengers)
32
-    {
33
-        $this->set_messenger_collection($messengers);
34
-    }
35
-
36
-
37
-
38
-    /**
39
-     * @return EE_Messenger_Collection
40
-     */
41
-    public function messenger_collection()
42
-    {
43
-        return $this->_messenger_collection;
44
-    }
45
-
46
-
47
-
48
-    /**
49
-     * @param mixed $messengers
50
-     */
51
-    public function set_messenger_collection(EE_Messenger_Collection $messengers)
52
-    {
53
-        $this->_messenger_collection = $messengers;
54
-    }
55
-
56
-
57
-
58
-    /**
59
-     * load_messengers
60
-     * globs the supplied filepath and adds any found
61
-     *
62
-     * @param  string $folder
63
-     * @throws \EE_Error
64
-     */
65
-    public function load_messengers_from_folder($folder = '')
66
-    {
67
-        // make sure autoloaders are set (fail-safe)
68
-        EED_Messages::set_autoloaders();
69
-        $folder = ! empty($folder) ? $folder : EE_LIBRARIES . 'messages/messenger';
70
-        $folder .= $folder[ strlen($folder) - 1 ] != '/' ? '/' : '';
71
-        // get all the files in that folder that end in ".class.php
72
-        $filepaths = apply_filters(
73
-            'FHEE__EE_messages__get_installed__messenger_files',
74
-            glob($folder . '*.class.php')
75
-        );
76
-        if (empty($filepaths)) {
77
-            return;
78
-        }
79
-        foreach ((array) $filepaths as $file_path) {
80
-            // extract filename from path
81
-            $file_path = basename($file_path);
82
-            // now remove any file extensions
83
-            $messenger_class_name = substr($file_path, 0, strpos($file_path, '.'));
84
-
85
-            // first check to see if the class name represents an actual messenger class.
86
-            if (strpos(strtolower($messenger_class_name), 'messenger') === false) {
87
-                continue;
88
-            }
89
-
90
-            if (! class_exists($messenger_class_name)) {
91
-                throw new EE_Error(
92
-                    sprintf(
93
-                        __('The "%1$s" messenger class can\'t be loaded from %2$s.  Likely there is a typo in the class name or the file name.', 'event_espresso'),
94
-                        $messenger_class_name,
95
-                        $file_path
96
-                    )
97
-                );
98
-            }
99
-
100
-            $this->_load_messenger(new $messenger_class_name());
101
-        }
102
-    }
103
-
104
-
105
-    /**
106
-     * load_messengers
107
-     * globs the supplied filepath and adds any found
108
-     *
109
-     * @return array
110
-     */
111
-    public function load_active_messengers_from_db()
112
-    {
113
-        // make sure autoloaders are set (fail-safe)
114
-        EED_Messages::set_autoloaders();
115
-        $active_messengers = apply_filters(
116
-            'FHEE__EEH_MSG_Template__get_active_messengers_in_db',
117
-            get_option('ee_active_messengers', array())
118
-        );
119
-        foreach ((array) $active_messengers as $active_messenger_classname => $active_messenger) {
120
-            $this->_load_messenger($active_messenger);
121
-        }
122
-    }
123
-
124
-
125
-
126
-    /**
127
-     * load_messenger
128
-     *
129
-     * @param \EE_messenger $messenger
130
-     * @return bool
131
-     */
132
-    protected function _load_messenger(EE_messenger $messenger)
133
-    {
134
-        if ($this->messenger_collection()->has_by_name($messenger->name)) {
135
-            return true;
136
-        }
137
-        return $this->messenger_collection()->add(
138
-            $messenger,
139
-            $messenger->name
140
-        );
141
-    }
19
+	/**
20
+	 * @type EE_Messenger_Collection $_messenger_collection
21
+	 */
22
+	protected $_messenger_collection = null;
23
+
24
+
25
+
26
+	/**
27
+	 * EE_Messenger_Collection_Loader constructor.
28
+	 *
29
+	 * @param EE_Messenger_Collection $messengers
30
+	 */
31
+	public function __construct(EE_Messenger_Collection $messengers)
32
+	{
33
+		$this->set_messenger_collection($messengers);
34
+	}
35
+
36
+
37
+
38
+	/**
39
+	 * @return EE_Messenger_Collection
40
+	 */
41
+	public function messenger_collection()
42
+	{
43
+		return $this->_messenger_collection;
44
+	}
45
+
46
+
47
+
48
+	/**
49
+	 * @param mixed $messengers
50
+	 */
51
+	public function set_messenger_collection(EE_Messenger_Collection $messengers)
52
+	{
53
+		$this->_messenger_collection = $messengers;
54
+	}
55
+
56
+
57
+
58
+	/**
59
+	 * load_messengers
60
+	 * globs the supplied filepath and adds any found
61
+	 *
62
+	 * @param  string $folder
63
+	 * @throws \EE_Error
64
+	 */
65
+	public function load_messengers_from_folder($folder = '')
66
+	{
67
+		// make sure autoloaders are set (fail-safe)
68
+		EED_Messages::set_autoloaders();
69
+		$folder = ! empty($folder) ? $folder : EE_LIBRARIES . 'messages/messenger';
70
+		$folder .= $folder[ strlen($folder) - 1 ] != '/' ? '/' : '';
71
+		// get all the files in that folder that end in ".class.php
72
+		$filepaths = apply_filters(
73
+			'FHEE__EE_messages__get_installed__messenger_files',
74
+			glob($folder . '*.class.php')
75
+		);
76
+		if (empty($filepaths)) {
77
+			return;
78
+		}
79
+		foreach ((array) $filepaths as $file_path) {
80
+			// extract filename from path
81
+			$file_path = basename($file_path);
82
+			// now remove any file extensions
83
+			$messenger_class_name = substr($file_path, 0, strpos($file_path, '.'));
84
+
85
+			// first check to see if the class name represents an actual messenger class.
86
+			if (strpos(strtolower($messenger_class_name), 'messenger') === false) {
87
+				continue;
88
+			}
89
+
90
+			if (! class_exists($messenger_class_name)) {
91
+				throw new EE_Error(
92
+					sprintf(
93
+						__('The "%1$s" messenger class can\'t be loaded from %2$s.  Likely there is a typo in the class name or the file name.', 'event_espresso'),
94
+						$messenger_class_name,
95
+						$file_path
96
+					)
97
+				);
98
+			}
99
+
100
+			$this->_load_messenger(new $messenger_class_name());
101
+		}
102
+	}
103
+
104
+
105
+	/**
106
+	 * load_messengers
107
+	 * globs the supplied filepath and adds any found
108
+	 *
109
+	 * @return array
110
+	 */
111
+	public function load_active_messengers_from_db()
112
+	{
113
+		// make sure autoloaders are set (fail-safe)
114
+		EED_Messages::set_autoloaders();
115
+		$active_messengers = apply_filters(
116
+			'FHEE__EEH_MSG_Template__get_active_messengers_in_db',
117
+			get_option('ee_active_messengers', array())
118
+		);
119
+		foreach ((array) $active_messengers as $active_messenger_classname => $active_messenger) {
120
+			$this->_load_messenger($active_messenger);
121
+		}
122
+	}
123
+
124
+
125
+
126
+	/**
127
+	 * load_messenger
128
+	 *
129
+	 * @param \EE_messenger $messenger
130
+	 * @return bool
131
+	 */
132
+	protected function _load_messenger(EE_messenger $messenger)
133
+	{
134
+		if ($this->messenger_collection()->has_by_name($messenger->name)) {
135
+			return true;
136
+		}
137
+		return $this->messenger_collection()->add(
138
+			$messenger,
139
+			$messenger->name
140
+		);
141
+	}
142 142
 }
Please login to merge, or discard this patch.
Spacing   +4 added lines, -4 removed lines patch added patch discarded remove patch
@@ -66,12 +66,12 @@  discard block
 block discarded – undo
66 66
     {
67 67
         // make sure autoloaders are set (fail-safe)
68 68
         EED_Messages::set_autoloaders();
69
-        $folder = ! empty($folder) ? $folder : EE_LIBRARIES . 'messages/messenger';
70
-        $folder .= $folder[ strlen($folder) - 1 ] != '/' ? '/' : '';
69
+        $folder = ! empty($folder) ? $folder : EE_LIBRARIES.'messages/messenger';
70
+        $folder .= $folder[strlen($folder) - 1] != '/' ? '/' : '';
71 71
         // get all the files in that folder that end in ".class.php
72 72
         $filepaths = apply_filters(
73 73
             'FHEE__EE_messages__get_installed__messenger_files',
74
-            glob($folder . '*.class.php')
74
+            glob($folder.'*.class.php')
75 75
         );
76 76
         if (empty($filepaths)) {
77 77
             return;
@@ -87,7 +87,7 @@  discard block
 block discarded – undo
87 87
                 continue;
88 88
             }
89 89
 
90
-            if (! class_exists($messenger_class_name)) {
90
+            if ( ! class_exists($messenger_class_name)) {
91 91
                 throw new EE_Error(
92 92
                     sprintf(
93 93
                         __('The "%1$s" messenger class can\'t be loaded from %2$s.  Likely there is a typo in the class name or the file name.', 'event_espresso'),
Please login to merge, or discard this patch.
core/libraries/messages/EE_Message_Type_Collection_Loader.lib.php 2 patches
Spacing   +4 added lines, -4 removed lines patch added patch discarded remove patch
@@ -65,12 +65,12 @@  discard block
 block discarded – undo
65 65
     {
66 66
         // make sure autoloaders are set (fail-safe)
67 67
         EED_Messages::set_autoloaders();
68
-        $folder = ! empty($folder) ? $folder : EE_LIBRARIES . 'messages/message_type';
69
-        $folder .= $folder[ strlen($folder) - 1 ] != '/' ? '/' : '';
68
+        $folder = ! empty($folder) ? $folder : EE_LIBRARIES.'messages/message_type';
69
+        $folder .= $folder[strlen($folder) - 1] != '/' ? '/' : '';
70 70
         // get all the files in that folder that end in ".class.php
71 71
         $filepaths = apply_filters(
72 72
             'FHEE__EE_messages__get_installed__messagetype_files',
73
-            glob($folder . '*.class.php')
73
+            glob($folder.'*.class.php')
74 74
         );
75 75
         if (empty($filepaths)) {
76 76
             return;
@@ -86,7 +86,7 @@  discard block
 block discarded – undo
86 86
                 continue;
87 87
             }
88 88
 
89
-            if (! class_exists($message_type_class_name)) {
89
+            if ( ! class_exists($message_type_class_name)) {
90 90
                 throw new EE_Error(
91 91
                     sprintf(
92 92
                         __('The "%1$s" message type class can\'t be loaded from %2$s. Likely there is a typo in the class name or the file name.', 'event_espresso'),
Please login to merge, or discard this patch.
Indentation   +101 added lines, -101 removed lines patch added patch discarded remove patch
@@ -15,105 +15,105 @@
 block discarded – undo
15 15
 {
16 16
 
17 17
 
18
-    /**
19
-     * @type EE_Message_Type_Collection $_message_type_collection
20
-     */
21
-    protected $_message_type_collection = null;
22
-
23
-
24
-
25
-    /**
26
-     * EE_Message_Type_Collection_Loader constructor.
27
-     *
28
-     * @param EE_Message_Type_Collection $message_types
29
-     */
30
-    public function __construct(EE_Message_Type_Collection $message_types)
31
-    {
32
-        $this->set_message_type_collection($message_types);
33
-    }
34
-
35
-
36
-
37
-    /**
38
-     * @return EE_Message_Type_Collection
39
-     */
40
-    public function message_type_collection()
41
-    {
42
-        return $this->_message_type_collection;
43
-    }
44
-
45
-
46
-
47
-    /**
48
-     * @param mixed $message_types
49
-     */
50
-    public function set_message_type_collection(EE_Message_Type_Collection $message_types)
51
-    {
52
-        $this->_message_type_collection = $message_types;
53
-    }
54
-
55
-
56
-
57
-    /**
58
-     * load_message_types
59
-     * globs the supplied filepath and adds any found
60
-     *
61
-     * @param  string $folder
62
-     * @throws \EE_Error
63
-     */
64
-    public function load_message_types_from_folder($folder = '')
65
-    {
66
-        // make sure autoloaders are set (fail-safe)
67
-        EED_Messages::set_autoloaders();
68
-        $folder = ! empty($folder) ? $folder : EE_LIBRARIES . 'messages/message_type';
69
-        $folder .= $folder[ strlen($folder) - 1 ] != '/' ? '/' : '';
70
-        // get all the files in that folder that end in ".class.php
71
-        $filepaths = apply_filters(
72
-            'FHEE__EE_messages__get_installed__messagetype_files',
73
-            glob($folder . '*.class.php')
74
-        );
75
-        if (empty($filepaths)) {
76
-            return;
77
-        }
78
-        foreach ((array) $filepaths as $file_path) {
79
-            // extract filename from path
80
-            $file_path = basename($file_path);
81
-            // now remove any file extensions
82
-            $message_type_class_name = substr($file_path, 0, strpos($file_path, '.'));
83
-
84
-            // if this class name doesn't represent a message type class, then we just skip.
85
-            if (strpos(strtolower($message_type_class_name), 'message_type') === false) {
86
-                continue;
87
-            }
88
-
89
-            if (! class_exists($message_type_class_name)) {
90
-                throw new EE_Error(
91
-                    sprintf(
92
-                        __('The "%1$s" message type class can\'t be loaded from %2$s. Likely there is a typo in the class name or the file name.', 'event_espresso'),
93
-                        $message_type_class_name,
94
-                        $file_path
95
-                    )
96
-                );
97
-            }
98
-
99
-            $this->_load_message_type(new $message_type_class_name());
100
-        }
101
-    }
102
-
103
-
104
-    /**
105
-     * Loads the given message type into the message type collection if it doesn't already exist.
106
-     * @param EE_message_type $message_type
107
-     * @return bool
108
-     */
109
-    protected function _load_message_type(EE_message_type $message_type)
110
-    {
111
-        if ($this->message_type_collection()->has_by_name($message_type->name)) {
112
-            return true;
113
-        }
114
-        return $this->message_type_collection()->add(
115
-            $message_type,
116
-            $message_type->name
117
-        );
118
-    }
18
+	/**
19
+	 * @type EE_Message_Type_Collection $_message_type_collection
20
+	 */
21
+	protected $_message_type_collection = null;
22
+
23
+
24
+
25
+	/**
26
+	 * EE_Message_Type_Collection_Loader constructor.
27
+	 *
28
+	 * @param EE_Message_Type_Collection $message_types
29
+	 */
30
+	public function __construct(EE_Message_Type_Collection $message_types)
31
+	{
32
+		$this->set_message_type_collection($message_types);
33
+	}
34
+
35
+
36
+
37
+	/**
38
+	 * @return EE_Message_Type_Collection
39
+	 */
40
+	public function message_type_collection()
41
+	{
42
+		return $this->_message_type_collection;
43
+	}
44
+
45
+
46
+
47
+	/**
48
+	 * @param mixed $message_types
49
+	 */
50
+	public function set_message_type_collection(EE_Message_Type_Collection $message_types)
51
+	{
52
+		$this->_message_type_collection = $message_types;
53
+	}
54
+
55
+
56
+
57
+	/**
58
+	 * load_message_types
59
+	 * globs the supplied filepath and adds any found
60
+	 *
61
+	 * @param  string $folder
62
+	 * @throws \EE_Error
63
+	 */
64
+	public function load_message_types_from_folder($folder = '')
65
+	{
66
+		// make sure autoloaders are set (fail-safe)
67
+		EED_Messages::set_autoloaders();
68
+		$folder = ! empty($folder) ? $folder : EE_LIBRARIES . 'messages/message_type';
69
+		$folder .= $folder[ strlen($folder) - 1 ] != '/' ? '/' : '';
70
+		// get all the files in that folder that end in ".class.php
71
+		$filepaths = apply_filters(
72
+			'FHEE__EE_messages__get_installed__messagetype_files',
73
+			glob($folder . '*.class.php')
74
+		);
75
+		if (empty($filepaths)) {
76
+			return;
77
+		}
78
+		foreach ((array) $filepaths as $file_path) {
79
+			// extract filename from path
80
+			$file_path = basename($file_path);
81
+			// now remove any file extensions
82
+			$message_type_class_name = substr($file_path, 0, strpos($file_path, '.'));
83
+
84
+			// if this class name doesn't represent a message type class, then we just skip.
85
+			if (strpos(strtolower($message_type_class_name), 'message_type') === false) {
86
+				continue;
87
+			}
88
+
89
+			if (! class_exists($message_type_class_name)) {
90
+				throw new EE_Error(
91
+					sprintf(
92
+						__('The "%1$s" message type class can\'t be loaded from %2$s. Likely there is a typo in the class name or the file name.', 'event_espresso'),
93
+						$message_type_class_name,
94
+						$file_path
95
+					)
96
+				);
97
+			}
98
+
99
+			$this->_load_message_type(new $message_type_class_name());
100
+		}
101
+	}
102
+
103
+
104
+	/**
105
+	 * Loads the given message type into the message type collection if it doesn't already exist.
106
+	 * @param EE_message_type $message_type
107
+	 * @return bool
108
+	 */
109
+	protected function _load_message_type(EE_message_type $message_type)
110
+	{
111
+		if ($this->message_type_collection()->has_by_name($message_type->name)) {
112
+			return true;
113
+		}
114
+		return $this->message_type_collection()->add(
115
+			$message_type,
116
+			$message_type->name
117
+		);
118
+	}
119 119
 }
Please login to merge, or discard this patch.
core/libraries/iframe_display/Iframe.php 2 patches
Spacing   +22 added lines, -22 removed lines patch added patch discarded remove patch
@@ -83,7 +83,7 @@  discard block
 block discarded – undo
83 83
     public function __construct($title, $content)
84 84
     {
85 85
         global $wp_version;
86
-        if (! defined('EE_IFRAME_DIR_URL')) {
86
+        if ( ! defined('EE_IFRAME_DIR_URL')) {
87 87
             define('EE_IFRAME_DIR_URL', plugin_dir_url(__FILE__));
88 88
         }
89 89
         $this->setContent($content);
@@ -93,10 +93,10 @@  discard block
 block discarded – undo
93 93
                 'FHEE___EventEspresso_core_libraries_iframe_display_Iframe__construct__default_css',
94 94
                 array(
95 95
                     'site_theme'       => get_stylesheet_directory_uri()
96
-                                          . '/style.css?ver=' . EVENT_ESPRESSO_VERSION,
97
-                    'dashicons'        => includes_url('css/dashicons.min.css?ver=' . $wp_version),
96
+                                          . '/style.css?ver='.EVENT_ESPRESSO_VERSION,
97
+                    'dashicons'        => includes_url('css/dashicons.min.css?ver='.$wp_version),
98 98
                     'espresso_default' => EE_GLOBAL_ASSETS_URL
99
-                                          . 'css/espresso_default.css?ver=' . EVENT_ESPRESSO_VERSION,
99
+                                          . 'css/espresso_default.css?ver='.EVENT_ESPRESSO_VERSION,
100 100
                 ),
101 101
                 $this
102 102
             )
@@ -105,9 +105,9 @@  discard block
 block discarded – undo
105 105
             apply_filters(
106 106
                 'FHEE___EventEspresso_core_libraries_iframe_display_Iframe__construct__default_js',
107 107
                 array(
108
-                    'jquery'        => includes_url('js/jquery/jquery.js?ver=' . $wp_version),
108
+                    'jquery'        => includes_url('js/jquery/jquery.js?ver='.$wp_version),
109 109
                     'espresso_core' => EE_GLOBAL_ASSETS_URL
110
-                                       . 'scripts/espresso_core.js?ver=' . EVENT_ESPRESSO_VERSION,
110
+                                       . 'scripts/espresso_core.js?ver='.EVENT_ESPRESSO_VERSION,
111 111
                 ),
112 112
                 $this
113 113
             )
@@ -181,7 +181,7 @@  discard block
 block discarded – undo
181 181
             );
182 182
         }
183 183
         foreach ($stylesheets as $handle => $stylesheet) {
184
-            $this->css[ $handle ] = $stylesheet;
184
+            $this->css[$handle] = $stylesheet;
185 185
         }
186 186
     }
187 187
 
@@ -203,9 +203,9 @@  discard block
 block discarded – undo
203 203
         }
204 204
         foreach ($scripts as $handle => $script) {
205 205
             if ($add_to_header) {
206
-                $this->header_js[ $handle ] = $script;
206
+                $this->header_js[$handle] = $script;
207 207
             } else {
208
-                $this->footer_js[ $handle ] = $script;
208
+                $this->footer_js[$handle] = $script;
209 209
             }
210 210
         }
211 211
     }
@@ -228,9 +228,9 @@  discard block
 block discarded – undo
228 228
         }
229 229
         foreach ($script_attributes as $handle => $script_attribute) {
230 230
             if ($add_to_header) {
231
-                $this->header_js_attributes[ $handle ] = $script_attribute;
231
+                $this->header_js_attributes[$handle] = $script_attribute;
232 232
             } else {
233
-                $this->footer_js_attributes[ $handle ] = $script_attribute;
233
+                $this->footer_js_attributes[$handle] = $script_attribute;
234 234
             }
235 235
         }
236 236
     }
@@ -253,14 +253,14 @@  discard block
 block discarded – undo
253 253
         }
254 254
         foreach ($vars as $handle => $var) {
255 255
             if ($var_name === 'eei18n') {
256
-                EE_Registry::$i18n_js_strings[ $handle ] = $var;
256
+                EE_Registry::$i18n_js_strings[$handle] = $var;
257 257
             } elseif ($var_name === 'eeCAL' && $handle === 'espresso_calendar') {
258
-                $this->localized_vars[ $var_name ] = $var;
258
+                $this->localized_vars[$var_name] = $var;
259 259
             } else {
260
-                if (! isset($this->localized_vars[ $var_name ])) {
261
-                    $this->localized_vars[ $var_name ] = array();
260
+                if ( ! isset($this->localized_vars[$var_name])) {
261
+                    $this->localized_vars[$var_name] = array();
262 262
                 }
263
-                $this->localized_vars[ $var_name ][ $handle ] = $var;
263
+                $this->localized_vars[$var_name][$handle] = $var;
264 264
             }
265 265
         }
266 266
     }
@@ -290,7 +290,7 @@  discard block
 block discarded – undo
290 290
     public function getTemplate()
291 291
     {
292 292
         return EEH_Template::display_template(
293
-            __DIR__ . DIRECTORY_SEPARATOR . 'iframe_wrapper.template.php',
293
+            __DIR__.DIRECTORY_SEPARATOR.'iframe_wrapper.template.php',
294 294
             array(
295 295
                 'title'                => apply_filters(
296 296
                     'FHEE___EventEspresso_core_libraries_iframe_display_Iframe__getTemplate__title',
@@ -334,11 +334,11 @@  discard block
 block discarded – undo
334 334
                 ),
335 335
                 'eei18n'               => apply_filters(
336 336
                     'FHEE___EventEspresso_core_libraries_iframe_display_Iframe__getTemplate__eei18n_js_strings',
337
-                    EE_Registry::localize_i18n_js_strings() . $this->localizeJsonVars(),
337
+                    EE_Registry::localize_i18n_js_strings().$this->localizeJsonVars(),
338 338
                     $this
339 339
                 ),
340 340
                 'notices'              => EEH_Template::display_template(
341
-                    EE_TEMPLATES . 'espresso-ajax-notices.template.php',
341
+                    EE_TEMPLATES.'espresso-ajax-notices.template.php',
342 342
                     array(),
343 343
                     true
344 344
                 ),
@@ -358,9 +358,9 @@  discard block
 block discarded – undo
358 358
     {
359 359
         $JSON = '';
360 360
         foreach ((array) $this->localized_vars as $var_name => $vars) {
361
-            $this->localized_vars[ $var_name ] = $this->encodeJsonVars($vars);
361
+            $this->localized_vars[$var_name] = $this->encodeJsonVars($vars);
362 362
             $JSON .= "/* <![CDATA[ */ var {$var_name} = ";
363
-            $JSON .= wp_json_encode($this->localized_vars[ $var_name ]);
363
+            $JSON .= wp_json_encode($this->localized_vars[$var_name]);
364 364
             $JSON .= '; /* ]]> */';
365 365
         }
366 366
         return $JSON;
@@ -376,7 +376,7 @@  discard block
 block discarded – undo
376 376
         if (is_array($var)) {
377 377
             $localized_vars = array();
378 378
             foreach ((array) $var as $key => $value) {
379
-                $localized_vars[ $key ] = $this->encodeJsonVars($value);
379
+                $localized_vars[$key] = $this->encodeJsonVars($value);
380 380
             }
381 381
             return $localized_vars;
382 382
         }
Please login to merge, or discard this patch.
Indentation   +334 added lines, -334 removed lines patch added patch discarded remove patch
@@ -18,373 +18,373 @@
 block discarded – undo
18 18
 class Iframe
19 19
 {
20 20
 
21
-    /*
21
+	/*
22 22
     * HTML for notices and ajax gif
23 23
     * @var string $title
24 24
     */
25
-    protected $title = '';
25
+	protected $title = '';
26 26
 
27
-    /*
27
+	/*
28 28
     * HTML for the content being displayed
29 29
     * @var string $content
30 30
     */
31
-    protected $content = '';
31
+	protected $content = '';
32 32
 
33
-    /*
33
+	/*
34 34
     * whether or not to call wp_head() and wp_footer()
35 35
     * @var boolean $enqueue_wp_assets
36 36
     */
37
-    protected $enqueue_wp_assets = false;
37
+	protected $enqueue_wp_assets = false;
38 38
 
39
-    /*
39
+	/*
40 40
     * an array of CSS URLs
41 41
     * @var array $css
42 42
     */
43
-    protected $css = array();
43
+	protected $css = array();
44 44
 
45
-    /*
45
+	/*
46 46
     * an array of JS URLs to be set in the HTML header.
47 47
     * @var array $header_js
48 48
     */
49
-    protected $header_js = array();
49
+	protected $header_js = array();
50 50
 
51
-    /*
51
+	/*
52 52
     * an array of additional attributes to be added to <script> tags for header JS
53 53
     * @var array $footer_js
54 54
     */
55
-    protected $header_js_attributes = array();
55
+	protected $header_js_attributes = array();
56 56
 
57
-    /*
57
+	/*
58 58
     * an array of JS URLs to be displayed before the HTML </body> tag
59 59
     * @var array $footer_js
60 60
     */
61
-    protected $footer_js = array();
61
+	protected $footer_js = array();
62 62
 
63
-    /*
63
+	/*
64 64
     * an array of additional attributes to be added to <script> tags for footer JS
65 65
     * @var array $footer_js_attributes
66 66
     */
67
-    protected $footer_js_attributes = array();
67
+	protected $footer_js_attributes = array();
68 68
 
69
-    /*
69
+	/*
70 70
     * an array of JSON vars to be set in the HTML header.
71 71
     * @var array $localized_vars
72 72
     */
73
-    protected $localized_vars = array();
74
-
75
-
76
-    /**
77
-     * Iframe constructor
78
-     *
79
-     * @param string $title
80
-     * @param string $content
81
-     * @throws DomainException
82
-     */
83
-    public function __construct($title, $content)
84
-    {
85
-        global $wp_version;
86
-        if (! defined('EE_IFRAME_DIR_URL')) {
87
-            define('EE_IFRAME_DIR_URL', plugin_dir_url(__FILE__));
88
-        }
89
-        $this->setContent($content);
90
-        $this->setTitle($title);
91
-        $this->addStylesheets(
92
-            apply_filters(
93
-                'FHEE___EventEspresso_core_libraries_iframe_display_Iframe__construct__default_css',
94
-                array(
95
-                    'site_theme'       => get_stylesheet_directory_uri()
96
-                                          . '/style.css?ver=' . EVENT_ESPRESSO_VERSION,
97
-                    'dashicons'        => includes_url('css/dashicons.min.css?ver=' . $wp_version),
98
-                    'espresso_default' => EE_GLOBAL_ASSETS_URL
99
-                                          . 'css/espresso_default.css?ver=' . EVENT_ESPRESSO_VERSION,
100
-                ),
101
-                $this
102
-            )
103
-        );
104
-        $this->addScripts(
105
-            apply_filters(
106
-                'FHEE___EventEspresso_core_libraries_iframe_display_Iframe__construct__default_js',
107
-                array(
108
-                    'jquery'        => includes_url('js/jquery/jquery.js?ver=' . $wp_version),
109
-                    'espresso_core' => EE_GLOBAL_ASSETS_URL
110
-                                       . 'scripts/espresso_core.js?ver=' . EVENT_ESPRESSO_VERSION,
111
-                ),
112
-                $this
113
-            )
114
-        );
115
-        if (
116
-            apply_filters(
117
-                'FHEE___EventEspresso_core_libraries_iframe_display_Iframe__construct__load_default_theme_stylesheet',
118
-                false
119
-            )
120
-        ) {
121
-            $this->addStylesheets(
122
-                apply_filters(
123
-                    'FHEE___EventEspresso_core_libraries_iframe_display_Iframe__construct__default_theme_stylesheet',
124
-                    array('default_theme_stylesheet' => get_stylesheet_uri()),
125
-                    $this
126
-                )
127
-            );
128
-        }
129
-    }
130
-
131
-
132
-    /**
133
-     * @param string $title
134
-     * @throws DomainException
135
-     */
136
-    public function setTitle($title)
137
-    {
138
-        if (empty($title)) {
139
-            throw new DomainException(
140
-                esc_html__('You must provide a page title in order to create an iframe.', 'event_espresso')
141
-            );
142
-        }
143
-        $this->title = $title;
144
-    }
145
-
146
-
147
-    /**
148
-     * @param string $content
149
-     * @throws DomainException
150
-     */
151
-    public function setContent($content)
152
-    {
153
-        if (empty($content)) {
154
-            throw new DomainException(
155
-                esc_html__('You must provide content in order to create an iframe.', 'event_espresso')
156
-            );
157
-        }
158
-        $this->content = $content;
159
-    }
160
-
161
-
162
-    /**
163
-     * @param boolean $enqueue_wp_assets
164
-     */
165
-    public function setEnqueueWpAssets($enqueue_wp_assets)
166
-    {
167
-        $this->enqueue_wp_assets = filter_var($enqueue_wp_assets, FILTER_VALIDATE_BOOLEAN);
168
-    }
169
-
170
-
171
-    /**
172
-     * @param array $stylesheets
173
-     * @throws DomainException
174
-     */
175
-    public function addStylesheets(array $stylesheets)
176
-    {
177
-        if (empty($stylesheets)) {
178
-            throw new DomainException(
179
-                esc_html__(
180
-                    'A non-empty array of URLs, is required to add a CSS stylesheet to an iframe.',
181
-                    'event_espresso'
182
-                )
183
-            );
184
-        }
185
-        foreach ($stylesheets as $handle => $stylesheet) {
186
-            $this->css[ $handle ] = $stylesheet;
187
-        }
188
-    }
189
-
190
-
191
-    /**
192
-     * @param array $scripts
193
-     * @param bool  $add_to_header
194
-     * @throws DomainException
195
-     */
196
-    public function addScripts(array $scripts, $add_to_header = false)
197
-    {
198
-        if (empty($scripts)) {
199
-            throw new DomainException(
200
-                esc_html__(
201
-                    'A non-empty array of URLs, is required to add Javascript to an iframe.',
202
-                    'event_espresso'
203
-                )
204
-            );
205
-        }
206
-        foreach ($scripts as $handle => $script) {
207
-            if ($add_to_header) {
208
-                $this->header_js[ $handle ] = $script;
209
-            } else {
210
-                $this->footer_js[ $handle ] = $script;
211
-            }
212
-        }
213
-    }
214
-
215
-
216
-    /**
217
-     * @param array $script_attributes
218
-     * @param bool  $add_to_header
219
-     * @throws DomainException
220
-     */
221
-    public function addScriptAttributes(array $script_attributes, $add_to_header = false)
222
-    {
223
-        if (empty($script_attributes)) {
224
-            throw new DomainException(
225
-                esc_html__(
226
-                    'A non-empty array of strings, is required to add attributes to iframe Javascript.',
227
-                    'event_espresso'
228
-                )
229
-            );
230
-        }
231
-        foreach ($script_attributes as $handle => $script_attribute) {
232
-            if ($add_to_header) {
233
-                $this->header_js_attributes[ $handle ] = $script_attribute;
234
-            } else {
235
-                $this->footer_js_attributes[ $handle ] = $script_attribute;
236
-            }
237
-        }
238
-    }
239
-
240
-
241
-    /**
242
-     * @param array  $vars
243
-     * @param string $var_name
244
-     * @throws DomainException
245
-     */
246
-    public function addLocalizedVars(array $vars, $var_name = 'eei18n')
247
-    {
248
-        if (empty($vars)) {
249
-            throw new DomainException(
250
-                esc_html__(
251
-                    'A non-empty array of vars, is required to add localized Javascript vars to an iframe.',
252
-                    'event_espresso'
253
-                )
254
-            );
255
-        }
256
-        foreach ($vars as $handle => $var) {
257
-            if ($var_name === 'eei18n') {
258
-                EE_Registry::$i18n_js_strings[ $handle ] = $var;
259
-            } elseif ($var_name === 'eeCAL' && $handle === 'espresso_calendar') {
260
-                $this->localized_vars[ $var_name ] = $var;
261
-            } else {
262
-                if (! isset($this->localized_vars[ $var_name ])) {
263
-                    $this->localized_vars[ $var_name ] = array();
264
-                }
265
-                $this->localized_vars[ $var_name ][ $handle ] = $var;
266
-            }
267
-        }
268
-    }
269
-
270
-
271
-    /**
272
-     * @param string $utm_content
273
-     * @throws DomainException
274
-     */
275
-    public function display($utm_content = '')
276
-    {
277
-        $this->content .= EEH_Template::powered_by_event_espresso(
278
-            '',
279
-            '',
280
-            ! empty($utm_content) ? array('utm_content' => $utm_content) : array()
281
-        );
282
-        EE_System::do_not_cache();
283
-        echo $this->getTemplate();
284
-        exit;
285
-    }
286
-
287
-
288
-    /**
289
-     * @return string
290
-     * @throws DomainException
291
-     */
292
-    public function getTemplate()
293
-    {
294
-        return EEH_Template::display_template(
295
-            __DIR__ . DIRECTORY_SEPARATOR . 'iframe_wrapper.template.php',
296
-            array(
297
-                'title'                => apply_filters(
298
-                    'FHEE___EventEspresso_core_libraries_iframe_display_Iframe__getTemplate__title',
299
-                    $this->title,
300
-                    $this
301
-                ),
302
-                'content'              => apply_filters(
303
-                    'FHEE___EventEspresso_core_libraries_iframe_display_Iframe__getTemplate__content',
304
-                    $this->content,
305
-                    $this
306
-                ),
307
-                'enqueue_wp_assets'    => apply_filters(
308
-                    'FHEE___EventEspresso_core_libraries_iframe_display_Iframe__getTemplate__enqueue_wp_assets',
309
-                    $this->enqueue_wp_assets,
310
-                    $this
311
-                ),
312
-                'css'                  => (array) apply_filters(
313
-                    'FHEE___EventEspresso_core_libraries_iframe_display_Iframe__getTemplate__css_urls',
314
-                    $this->css,
315
-                    $this
316
-                ),
317
-                'header_js'            => (array) apply_filters(
318
-                    'FHEE___EventEspresso_core_libraries_iframe_display_Iframe__getTemplate__header_js_urls',
319
-                    $this->header_js,
320
-                    $this
321
-                ),
322
-                'header_js_attributes' => (array) apply_filters(
323
-                    'FHEE___EventEspresso_core_libraries_iframe_display_Iframe__getTemplate__header_js_attributes',
324
-                    $this->header_js_attributes,
325
-                    $this
326
-                ),
327
-                'footer_js'            => (array) apply_filters(
328
-                    'FHEE___EventEspresso_core_libraries_iframe_display_Iframe__getTemplate__footer_js_urls',
329
-                    $this->footer_js,
330
-                    $this
331
-                ),
332
-                'footer_js_attributes' => (array) apply_filters(
333
-                    'FHEE___EventEspresso_core_libraries_iframe_display_Iframe__getTemplate__footer_js_attributes',
334
-                    $this->footer_js_attributes,
335
-                    $this
336
-                ),
337
-                'eei18n'               => apply_filters(
338
-                    'FHEE___EventEspresso_core_libraries_iframe_display_Iframe__getTemplate__eei18n_js_strings',
339
-                    EE_Registry::localize_i18n_js_strings() . $this->localizeJsonVars(),
340
-                    $this
341
-                ),
342
-                'notices'              => EEH_Template::display_template(
343
-                    EE_TEMPLATES . 'espresso-ajax-notices.template.php',
344
-                    array(),
345
-                    true
346
-                ),
347
-            ),
348
-            true,
349
-            true
350
-        );
351
-    }
352
-
353
-
354
-    /**
355
-     * localizeJsonVars
356
-     *
357
-     * @return string
358
-     */
359
-    public function localizeJsonVars()
360
-    {
361
-        $JSON = '';
362
-        foreach ((array) $this->localized_vars as $var_name => $vars) {
363
-            $this->localized_vars[ $var_name ] = $this->encodeJsonVars($vars);
364
-            $JSON .= "/* <![CDATA[ */ var {$var_name} = ";
365
-            $JSON .= wp_json_encode($this->localized_vars[ $var_name ]);
366
-            $JSON .= '; /* ]]> */';
367
-        }
368
-        return $JSON;
369
-    }
370
-
371
-
372
-    /**
373
-     * @param bool|int|float|string|array $var
374
-     * @return array
375
-     */
376
-    public function encodeJsonVars($var)
377
-    {
378
-        if (is_array($var)) {
379
-            $localized_vars = array();
380
-            foreach ((array) $var as $key => $value) {
381
-                $localized_vars[ $key ] = $this->encodeJsonVars($value);
382
-            }
383
-            return $localized_vars;
384
-        }
385
-        if (is_scalar($var)) {
386
-            return html_entity_decode((string) $var, ENT_QUOTES, 'UTF-8');
387
-        }
388
-        return null;
389
-    }
73
+	protected $localized_vars = array();
74
+
75
+
76
+	/**
77
+	 * Iframe constructor
78
+	 *
79
+	 * @param string $title
80
+	 * @param string $content
81
+	 * @throws DomainException
82
+	 */
83
+	public function __construct($title, $content)
84
+	{
85
+		global $wp_version;
86
+		if (! defined('EE_IFRAME_DIR_URL')) {
87
+			define('EE_IFRAME_DIR_URL', plugin_dir_url(__FILE__));
88
+		}
89
+		$this->setContent($content);
90
+		$this->setTitle($title);
91
+		$this->addStylesheets(
92
+			apply_filters(
93
+				'FHEE___EventEspresso_core_libraries_iframe_display_Iframe__construct__default_css',
94
+				array(
95
+					'site_theme'       => get_stylesheet_directory_uri()
96
+										  . '/style.css?ver=' . EVENT_ESPRESSO_VERSION,
97
+					'dashicons'        => includes_url('css/dashicons.min.css?ver=' . $wp_version),
98
+					'espresso_default' => EE_GLOBAL_ASSETS_URL
99
+										  . 'css/espresso_default.css?ver=' . EVENT_ESPRESSO_VERSION,
100
+				),
101
+				$this
102
+			)
103
+		);
104
+		$this->addScripts(
105
+			apply_filters(
106
+				'FHEE___EventEspresso_core_libraries_iframe_display_Iframe__construct__default_js',
107
+				array(
108
+					'jquery'        => includes_url('js/jquery/jquery.js?ver=' . $wp_version),
109
+					'espresso_core' => EE_GLOBAL_ASSETS_URL
110
+									   . 'scripts/espresso_core.js?ver=' . EVENT_ESPRESSO_VERSION,
111
+				),
112
+				$this
113
+			)
114
+		);
115
+		if (
116
+			apply_filters(
117
+				'FHEE___EventEspresso_core_libraries_iframe_display_Iframe__construct__load_default_theme_stylesheet',
118
+				false
119
+			)
120
+		) {
121
+			$this->addStylesheets(
122
+				apply_filters(
123
+					'FHEE___EventEspresso_core_libraries_iframe_display_Iframe__construct__default_theme_stylesheet',
124
+					array('default_theme_stylesheet' => get_stylesheet_uri()),
125
+					$this
126
+				)
127
+			);
128
+		}
129
+	}
130
+
131
+
132
+	/**
133
+	 * @param string $title
134
+	 * @throws DomainException
135
+	 */
136
+	public function setTitle($title)
137
+	{
138
+		if (empty($title)) {
139
+			throw new DomainException(
140
+				esc_html__('You must provide a page title in order to create an iframe.', 'event_espresso')
141
+			);
142
+		}
143
+		$this->title = $title;
144
+	}
145
+
146
+
147
+	/**
148
+	 * @param string $content
149
+	 * @throws DomainException
150
+	 */
151
+	public function setContent($content)
152
+	{
153
+		if (empty($content)) {
154
+			throw new DomainException(
155
+				esc_html__('You must provide content in order to create an iframe.', 'event_espresso')
156
+			);
157
+		}
158
+		$this->content = $content;
159
+	}
160
+
161
+
162
+	/**
163
+	 * @param boolean $enqueue_wp_assets
164
+	 */
165
+	public function setEnqueueWpAssets($enqueue_wp_assets)
166
+	{
167
+		$this->enqueue_wp_assets = filter_var($enqueue_wp_assets, FILTER_VALIDATE_BOOLEAN);
168
+	}
169
+
170
+
171
+	/**
172
+	 * @param array $stylesheets
173
+	 * @throws DomainException
174
+	 */
175
+	public function addStylesheets(array $stylesheets)
176
+	{
177
+		if (empty($stylesheets)) {
178
+			throw new DomainException(
179
+				esc_html__(
180
+					'A non-empty array of URLs, is required to add a CSS stylesheet to an iframe.',
181
+					'event_espresso'
182
+				)
183
+			);
184
+		}
185
+		foreach ($stylesheets as $handle => $stylesheet) {
186
+			$this->css[ $handle ] = $stylesheet;
187
+		}
188
+	}
189
+
190
+
191
+	/**
192
+	 * @param array $scripts
193
+	 * @param bool  $add_to_header
194
+	 * @throws DomainException
195
+	 */
196
+	public function addScripts(array $scripts, $add_to_header = false)
197
+	{
198
+		if (empty($scripts)) {
199
+			throw new DomainException(
200
+				esc_html__(
201
+					'A non-empty array of URLs, is required to add Javascript to an iframe.',
202
+					'event_espresso'
203
+				)
204
+			);
205
+		}
206
+		foreach ($scripts as $handle => $script) {
207
+			if ($add_to_header) {
208
+				$this->header_js[ $handle ] = $script;
209
+			} else {
210
+				$this->footer_js[ $handle ] = $script;
211
+			}
212
+		}
213
+	}
214
+
215
+
216
+	/**
217
+	 * @param array $script_attributes
218
+	 * @param bool  $add_to_header
219
+	 * @throws DomainException
220
+	 */
221
+	public function addScriptAttributes(array $script_attributes, $add_to_header = false)
222
+	{
223
+		if (empty($script_attributes)) {
224
+			throw new DomainException(
225
+				esc_html__(
226
+					'A non-empty array of strings, is required to add attributes to iframe Javascript.',
227
+					'event_espresso'
228
+				)
229
+			);
230
+		}
231
+		foreach ($script_attributes as $handle => $script_attribute) {
232
+			if ($add_to_header) {
233
+				$this->header_js_attributes[ $handle ] = $script_attribute;
234
+			} else {
235
+				$this->footer_js_attributes[ $handle ] = $script_attribute;
236
+			}
237
+		}
238
+	}
239
+
240
+
241
+	/**
242
+	 * @param array  $vars
243
+	 * @param string $var_name
244
+	 * @throws DomainException
245
+	 */
246
+	public function addLocalizedVars(array $vars, $var_name = 'eei18n')
247
+	{
248
+		if (empty($vars)) {
249
+			throw new DomainException(
250
+				esc_html__(
251
+					'A non-empty array of vars, is required to add localized Javascript vars to an iframe.',
252
+					'event_espresso'
253
+				)
254
+			);
255
+		}
256
+		foreach ($vars as $handle => $var) {
257
+			if ($var_name === 'eei18n') {
258
+				EE_Registry::$i18n_js_strings[ $handle ] = $var;
259
+			} elseif ($var_name === 'eeCAL' && $handle === 'espresso_calendar') {
260
+				$this->localized_vars[ $var_name ] = $var;
261
+			} else {
262
+				if (! isset($this->localized_vars[ $var_name ])) {
263
+					$this->localized_vars[ $var_name ] = array();
264
+				}
265
+				$this->localized_vars[ $var_name ][ $handle ] = $var;
266
+			}
267
+		}
268
+	}
269
+
270
+
271
+	/**
272
+	 * @param string $utm_content
273
+	 * @throws DomainException
274
+	 */
275
+	public function display($utm_content = '')
276
+	{
277
+		$this->content .= EEH_Template::powered_by_event_espresso(
278
+			'',
279
+			'',
280
+			! empty($utm_content) ? array('utm_content' => $utm_content) : array()
281
+		);
282
+		EE_System::do_not_cache();
283
+		echo $this->getTemplate();
284
+		exit;
285
+	}
286
+
287
+
288
+	/**
289
+	 * @return string
290
+	 * @throws DomainException
291
+	 */
292
+	public function getTemplate()
293
+	{
294
+		return EEH_Template::display_template(
295
+			__DIR__ . DIRECTORY_SEPARATOR . 'iframe_wrapper.template.php',
296
+			array(
297
+				'title'                => apply_filters(
298
+					'FHEE___EventEspresso_core_libraries_iframe_display_Iframe__getTemplate__title',
299
+					$this->title,
300
+					$this
301
+				),
302
+				'content'              => apply_filters(
303
+					'FHEE___EventEspresso_core_libraries_iframe_display_Iframe__getTemplate__content',
304
+					$this->content,
305
+					$this
306
+				),
307
+				'enqueue_wp_assets'    => apply_filters(
308
+					'FHEE___EventEspresso_core_libraries_iframe_display_Iframe__getTemplate__enqueue_wp_assets',
309
+					$this->enqueue_wp_assets,
310
+					$this
311
+				),
312
+				'css'                  => (array) apply_filters(
313
+					'FHEE___EventEspresso_core_libraries_iframe_display_Iframe__getTemplate__css_urls',
314
+					$this->css,
315
+					$this
316
+				),
317
+				'header_js'            => (array) apply_filters(
318
+					'FHEE___EventEspresso_core_libraries_iframe_display_Iframe__getTemplate__header_js_urls',
319
+					$this->header_js,
320
+					$this
321
+				),
322
+				'header_js_attributes' => (array) apply_filters(
323
+					'FHEE___EventEspresso_core_libraries_iframe_display_Iframe__getTemplate__header_js_attributes',
324
+					$this->header_js_attributes,
325
+					$this
326
+				),
327
+				'footer_js'            => (array) apply_filters(
328
+					'FHEE___EventEspresso_core_libraries_iframe_display_Iframe__getTemplate__footer_js_urls',
329
+					$this->footer_js,
330
+					$this
331
+				),
332
+				'footer_js_attributes' => (array) apply_filters(
333
+					'FHEE___EventEspresso_core_libraries_iframe_display_Iframe__getTemplate__footer_js_attributes',
334
+					$this->footer_js_attributes,
335
+					$this
336
+				),
337
+				'eei18n'               => apply_filters(
338
+					'FHEE___EventEspresso_core_libraries_iframe_display_Iframe__getTemplate__eei18n_js_strings',
339
+					EE_Registry::localize_i18n_js_strings() . $this->localizeJsonVars(),
340
+					$this
341
+				),
342
+				'notices'              => EEH_Template::display_template(
343
+					EE_TEMPLATES . 'espresso-ajax-notices.template.php',
344
+					array(),
345
+					true
346
+				),
347
+			),
348
+			true,
349
+			true
350
+		);
351
+	}
352
+
353
+
354
+	/**
355
+	 * localizeJsonVars
356
+	 *
357
+	 * @return string
358
+	 */
359
+	public function localizeJsonVars()
360
+	{
361
+		$JSON = '';
362
+		foreach ((array) $this->localized_vars as $var_name => $vars) {
363
+			$this->localized_vars[ $var_name ] = $this->encodeJsonVars($vars);
364
+			$JSON .= "/* <![CDATA[ */ var {$var_name} = ";
365
+			$JSON .= wp_json_encode($this->localized_vars[ $var_name ]);
366
+			$JSON .= '; /* ]]> */';
367
+		}
368
+		return $JSON;
369
+	}
370
+
371
+
372
+	/**
373
+	 * @param bool|int|float|string|array $var
374
+	 * @return array
375
+	 */
376
+	public function encodeJsonVars($var)
377
+	{
378
+		if (is_array($var)) {
379
+			$localized_vars = array();
380
+			foreach ((array) $var as $key => $value) {
381
+				$localized_vars[ $key ] = $this->encodeJsonVars($value);
382
+			}
383
+			return $localized_vars;
384
+		}
385
+		if (is_scalar($var)) {
386
+			return html_entity_decode((string) $var, ENT_QUOTES, 'UTF-8');
387
+		}
388
+		return null;
389
+	}
390 390
 }
Please login to merge, or discard this patch.