Completed
Branch BUG/11288/fix-datepicker (04df7b)
by
unknown
65:36 queued 52:18
created

EEH_Template::format_currency()   C

Complexity

Conditions 10
Paths 44

Size

Total Lines 60
Code Lines 34

Duplication

Lines 11
Ratio 18.33 %

Importance

Changes 0
Metric Value
cc 10
eloc 34
nc 44
nop 5
dl 11
loc 60
rs 6.5333
c 0
b 0
f 0

How to fix   Long Method    Complexity   

Long Method

Small methods make your code easier to understand, in particular if combined with a good name. Besides, if your method is small, finding a good name is usually much easier.

For example, if you find yourself adding comments to a method's body, this is usually a good sign to extract the commented part to a new method, and use the comment as a starting point when coming up with a good name for this new method.

Commonly applied refactorings include:

1
<?php
2
if (! defined('EVENT_ESPRESSO_VERSION')) {
3
    exit('NO direct script access allowed');
4
}
5
/**
6
 * Event Espresso
7
 * Event Registration and Management Plugin for WordPress
8
 *
9
 * @package           Event Espresso
10
 * @author            Event Espresso
11
 * @copyright      (c)2009-2012 Event Espresso All Rights Reserved.
12
 * @license           http://eventespresso.com/support/terms-conditions/  ** see Plugin Licensing **
13
 * @link              http://www.eventespresso.com
14
 * @version           4.0
15
 */
16
17
18
if ( ! function_exists('espresso_get_template_part')) {
19
    /**
20
     * espresso_get_template_part
21
     * basically a copy of the WordPress get_template_part() function but uses EEH_Template::locate_template() instead, and doesn't add base versions of files
22
     * so not a very useful function at all except that it adds familiarity PLUS filtering based off of the entire template part name
23
     *
24
     * @param string $slug The slug name for the generic template.
25
     * @param string $name The name of the specialised template.
26
     * @return string        the html output for the formatted money value
27
     */
28
    function espresso_get_template_part($slug = null, $name = null)
29
    {
30
        EEH_Template::get_template_part($slug, $name);
31
    }
32
}
33
34
35
if ( ! function_exists('espresso_get_object_css_class')) {
36
    /**
37
     * espresso_get_object_css_class - attempts to generate a css class based on the type of EE object passed
38
     *
39
     * @param EE_Base_Class $object the EE object the css class is being generated for
40
     * @param  string       $prefix added to the beginning of the generated class
41
     * @param  string       $suffix added to the end of the generated class
42
     * @return string
43
     */
44
    function espresso_get_object_css_class($object = null, $prefix = '', $suffix = '')
45
    {
46
        return EEH_Template::get_object_css_class($object, $prefix, $suffix);
47
    }
48
}
49
50
51
/**
52
 * class EEH_Template
53
 * This is a helper utility class that provides different helpers related to template files.
54
 *
55
 * @package           Event Espresso
56
 * @subpackage        /helpers/EEH_Template.helper.php
57
 * @author            Darren Ethier, Brent Christensen
58
 */
59
class EEH_Template
60
{
61
62
    private static $_espresso_themes = array();
63
64
65
    /**
66
     *    is_espresso_theme - returns TRUE or FALSE on whether the currently active WP theme is an espresso theme
67
     *
68
     * @return boolean
69
     */
70
    public static function is_espresso_theme()
71
    {
72
        return wp_get_theme()->get('TextDomain') == 'event_espresso' ? true : false;
73
    }
74
75
    /**
76
     *    load_espresso_theme_functions - if current theme is an espresso theme, or uses ee theme template parts, then
77
     *    load it's functions.php file ( if not already loaded )
78
     *
79
     * @return void
80
     */
81
    public static function load_espresso_theme_functions()
82
    {
83
        if ( ! defined('EE_THEME_FUNCTIONS_LOADED')) {
84
            if (is_readable(EE_PUBLIC . EE_Config::get_current_theme() . DS . 'functions.php')) {
85
                require_once(EE_PUBLIC . EE_Config::get_current_theme() . DS . 'functions.php');
86
            }
87
        }
88
    }
89
90
91
    /**
92
     *    get_espresso_themes - returns an array of Espresso Child themes located in the /templates/ directory
93
     *
94
     * @return array
95
     */
96
    public static function get_espresso_themes()
97
    {
98
        if (empty(EEH_Template::$_espresso_themes)) {
99
            $espresso_themes = glob(EE_PUBLIC . '*', GLOB_ONLYDIR);
100
            if (empty($espresso_themes)) {
101
                return array();
102
            }
103
            if (($key = array_search('global_assets', $espresso_themes)) !== false) {
104
                unset($espresso_themes[$key]);
105
            }
106
            EEH_Template::$_espresso_themes = array();
107
            foreach ($espresso_themes as $espresso_theme) {
108
                EEH_Template::$_espresso_themes[basename($espresso_theme)] = $espresso_theme;
109
            }
110
        }
111
        return EEH_Template::$_espresso_themes;
112
    }
113
114
115
    /**
116
     * EEH_Template::get_template_part
117
     * basically a copy of the WordPress get_template_part() function but uses EEH_Template::locate_template() instead,
118
     * and doesn't add base versions of files so not a very useful function at all except that it adds familiarity PLUS
119
     * filtering based off of the entire template part name
120
     *
121
     * @param string $slug The slug name for the generic template.
122
     * @param string $name The name of the specialised template.
123
     * @param array  $template_args
124
     * @param bool   $return_string
125
     * @return string        the html output for the formatted money value
126
     */
127
    public static function get_template_part(
128
        $slug = null,
129
        $name = null,
130
        $template_args = array(),
131
        $return_string = false
132
    ) {
133
        do_action("get_template_part_{$slug}-{$name}", $slug, $name);
134
        $templates = array();
135
        $name      = (string)$name;
136
        if ($name != '') {
137
            $templates[] = "{$slug}-{$name}.php";
138
        }
139
        // allow template parts to be turned off via something like: add_filter( 'FHEE__content_espresso_events_tickets_template__display_datetimes', '__return_false' );
140
        if (apply_filters("FHEE__EEH_Template__get_template_part__display__{$slug}_{$name}", true)) {
141
            EEH_Template::locate_template($templates, $template_args, true, $return_string);
142
        }
143
    }
144
145
146
    /**
147
     *    locate_template
148
     *    locate a template file by looking in the following places, in the following order:
149
     *        <server path up to>/wp-content/themes/<current active WordPress theme>/
150
     *        <assumed full absolute server path>
151
     *        <server path up to>/wp-content/uploads/espresso/templates/<current EE theme>/
152
     *        <server path up to>/wp-content/uploads/espresso/templates/
153
     *        <server path up to>/wp-content/plugins/<EE4 folder>/public/<current EE theme>/
154
     *        <server path up to>/wp-content/plugins/<EE4 folder>/core/templates/<current EE theme>/
155
     *        <server path up to>/wp-content/plugins/<EE4 folder>/
156
     *    as soon as the template is found in one of these locations, it will be returned or loaded
157
     *        Example:
158
     *          You are using the WordPress Twenty Sixteen theme,
159
     *        and you want to customize the "some-event.template.php" template,
160
     *          which is located in the "/relative/path/to/" folder relative to the main EE plugin folder.
161
     *          Assuming WP is installed on your server in the "/home/public_html/" folder,
162
     *        EEH_Template::locate_template() will look at the following paths in order until the template is found:
163
     *        /home/public_html/wp-content/themes/twentysixteen/some-event.template.php
164
     *        /relative/path/to/some-event.template.php
165
     *        /home/public_html/wp-content/uploads/espresso/templates/Espresso_Arabica_2014/relative/path/to/some-event.template.php
166
     *        /home/public_html/wp-content/uploads/espresso/templates/relative/path/to/some-event.template.php
167
     *        /home/public_html/wp-content/plugins/event-espresso-core-reg/public/Espresso_Arabica_2014/relative/path/to/some-event.template.php
168
     *        /home/public_html/wp-content/plugins/event-espresso-core-reg/core/templates/Espresso_Arabica_2014/relative/path/to/some-event.template.php
169
     *        /home/public_html/wp-content/plugins/event-espresso-core-reg/relative/path/to/some-event.template.php
170
     *          Had you passed an absolute path to your template that was in some other location,
171
     *        ie: "/absolute/path/to/some-event.template.php"
172
     *          then the search would have been :
173
     *        /home/public_html/wp-content/themes/twentysixteen/some-event.template.php
174
     *        /absolute/path/to/some-event.template.php
175
     *          and stopped there upon finding it in the second location
176
     *
177
     * @param array|string $templates       array of template file names including extension (or just a single string)
178
     * @param  array       $template_args   an array of arguments to be extracted for use in the template
179
     * @param  boolean     $load            whether to pass the located template path on to the
180
     *                                      EEH_Template::display_template() method or simply return it
181
     * @param  boolean     $return_string   whether to send output immediately to screen, or capture and return as a
182
     *                                      string
183
     * @param boolean      $check_if_custom If TRUE, this flags this method to return boolean for whether this will
184
     *                                      generate a custom template or not. Used in places where you don't actually
185
     *                                      load the template, you just want to know if there's a custom version of it.
186
     * @return mixed
187
     */
188
    public static function locate_template(
189
        $templates = array(),
190
        $template_args = array(),
191
        $load = true,
192
        $return_string = true,
193
        $check_if_custom = false
194
    ) {
195
        // first use WP locate_template to check for template in the current theme folder
196
        $template_path = locate_template($templates);
197
198
        if ($check_if_custom && ! empty($template_path)) {
199
            return true;
200
        }
201
202
        // not in the theme
203
        if (empty($template_path)) {
204
            // not even a template to look for ?
205
            if (empty($templates)) {
206
                // get post_type
207
                $post_type = EE_Registry::instance()->REQ->get('post_type');
208
                // get array of EE Custom Post Types
209
                $EE_CPTs = EE_Register_CPTs::get_CPTs();
210
                // build template name based on request
211
                if (isset($EE_CPTs[$post_type])) {
212
                    $archive_or_single = is_archive() ? 'archive' : '';
213
                    $archive_or_single = is_single() ? 'single' : $archive_or_single;
214
                    $templates         = $archive_or_single . '-' . $post_type . '.php';
215
                }
216
            }
217
            // currently active EE template theme
218
            $current_theme = EE_Config::get_current_theme();
219
220
            // array of paths to folders that may contain templates
221
            $template_folder_paths = array(
222
                // first check the /wp-content/uploads/espresso/templates/(current EE theme)/  folder for an EE theme template file
223
                EVENT_ESPRESSO_TEMPLATE_DIR . $current_theme,
224
                // then in the root of the /wp-content/uploads/espresso/templates/ folder
225
                EVENT_ESPRESSO_TEMPLATE_DIR,
226
            );
227
228
            //add core plugin folders for checking only if we're not $check_if_custom
229
            if ( ! $check_if_custom) {
230
                $core_paths            = array(
231
                    // in the  /wp-content/plugins/(EE4 folder)/public/(current EE theme)/ folder within the plugin
232
                    EE_PUBLIC . $current_theme,
233
                    // in the  /wp-content/plugins/(EE4 folder)/core/templates/(current EE theme)/ folder within the plugin
234
                    EE_TEMPLATES . $current_theme,
235
                    // or maybe relative from the plugin root: /wp-content/plugins/(EE4 folder)/
236
                    EE_PLUGIN_DIR_PATH,
237
                );
238
                $template_folder_paths = array_merge($template_folder_paths, $core_paths);
239
            }
240
241
            // now filter that array
242
            $template_folder_paths = apply_filters('FHEE__EEH_Template__locate_template__template_folder_paths',
243
                $template_folder_paths);
244
            $templates             = is_array($templates) ? $templates : array($templates);
245
            $template_folder_paths = is_array($template_folder_paths) ? $template_folder_paths : array($template_folder_paths);
246
            // array to hold all possible template paths
247
            $full_template_paths = array();
248
249
            // loop through $templates
250
            foreach ($templates as $template) {
251
                // normalize directory separators
252
                $template                      = EEH_File::standardise_directory_separators($template);
253
                $file_name                     = basename($template);
254
                $template_path_minus_file_name = substr($template, 0, (strlen($file_name) * -1));
255
                // while looping through all template folder paths
256
                foreach ($template_folder_paths as $template_folder_path) {
257
                    // normalize directory separators
258
                    $template_folder_path = EEH_File::standardise_directory_separators($template_folder_path);
259
                    // determine if any common base path exists between the two paths
260
                    $common_base_path = EEH_Template::_find_common_base_path(
261
                        array($template_folder_path, $template_path_minus_file_name)
262
                    );
263
                    if ($common_base_path !== '') {
264
                        // both paths have a common base, so just tack the filename onto our search path
265
                        $resolved_path = EEH_File::end_with_directory_separator($template_folder_path) . $file_name;
266
                    } else {
267
                        // no common base path, so let's just concatenate
268
                        $resolved_path = EEH_File::end_with_directory_separator($template_folder_path) . $template;
269
                    }
270
                    // build up our template locations array by adding our resolved paths
271
                    $full_template_paths[] = $resolved_path;
272
                }
273
                // if $template is an absolute path, then we'll tack it onto the start of our array so that it gets searched first
274
                array_unshift($full_template_paths, $template);
275
                // path to the directory of the current theme: /wp-content/themes/(current WP theme)/
276
                array_unshift($full_template_paths, get_stylesheet_directory() . DS . $file_name);
277
            }
278
            // filter final array of full template paths
279
            $full_template_paths = apply_filters('FHEE__EEH_Template__locate_template__full_template_paths',
280
                $full_template_paths, $file_name);
281
            // now loop through our final array of template location paths and check each location
282
            foreach ((array)$full_template_paths as $full_template_path) {
283
                if (is_readable($full_template_path)) {
284
                    $template_path = str_replace(array('\\', '/'), DIRECTORY_SEPARATOR, $full_template_path);
285
                    break;
286
                }
287
            }
288
        }
289
290
        // hook that can be used to display the full template path that will be used
291
        do_action('AHEE__EEH_Template__locate_template__full_template_path', $template_path);
292
293
        // if we got it and you want to see it...
294
        if ($template_path && $load && ! $check_if_custom) {
295
            if ($return_string) {
296
                return EEH_Template::display_template($template_path, $template_args, true);
297
            } else {
298
                EEH_Template::display_template($template_path, $template_args, false);
299
            }
300
        }
301
        return $check_if_custom && ! empty($template_path) ? true : $template_path;
302
    }
303
304
305
    /**
306
     * _find_common_base_path
307
     * given two paths, this determines if there is a common base path between the two
308
     *
309
     * @param array $paths
310
     * @return string
311
     */
312
    protected static function _find_common_base_path($paths)
313
    {
314
        $last_offset      = 0;
315
        $common_base_path = '';
316
        while (($index = strpos($paths[0], DS, $last_offset)) !== false) {
317
            $dir_length = $index - $last_offset + 1;
318
            $directory  = substr($paths[0], $last_offset, $dir_length);
319
            foreach ($paths as $path) {
320
                if (substr($path, $last_offset, $dir_length) != $directory) {
321
                    return $common_base_path;
322
                }
323
            }
324
            $common_base_path .= $directory;
325
            $last_offset = $index + 1;
326
        }
327
        return substr($common_base_path, 0, -1);
328
    }
329
330
331
    /**
332
     * load and display a template
333
     *
334
     * @param bool|string $template_path server path to the file to be loaded, including file name and extension
335
     * @param  array      $template_args an array of arguments to be extracted for use in the template
336
     * @param  boolean    $return_string whether to send output immediately to screen, or capture and return as a string
337
     * @param bool        $throw_exceptions if set to true, will throw an exception if the template is either
338
     *                                      not found or is not readable
339
     * @return mixed string
340
     * @throws \DomainException
341
     */
342
	public static function display_template(
343
        $template_path    = false,
344
        $template_args    = array(),
345
        $return_string    = false,
346
        $throw_exceptions = false
347
    ) {
348
349
        /**
350
         * These two filters are intended for last minute changes to templates being loaded and/or template arg
351
         * modifications.  NOTE... modifying these things can cause breakage as most templates running through
352
         * the display_template method are templates we DON'T want modified (usually because of js
353
         * dependencies etc).  So unless you know what you are doing, do NOT filter templates or template args
354
         * using this.
355
         *
356
         * @since 4.6.0
357
         */
358
        $template_path = (string) apply_filters('FHEE__EEH_Template__display_template__template_path', $template_path);
359
        $template_args = (array) apply_filters('FHEE__EEH_Template__display_template__template_args', $template_args);
360
361
        // you gimme nuttin - YOU GET NUTTIN !!
362
        if ( ! $template_path || ! is_readable($template_path)) {
363
            return '';
364
        }
365
        // if $template_args are not in an array, then make it so
366
        if ( ! is_array($template_args) && ! is_object($template_args)) {
367
            $template_args = array($template_args);
368
        }
369
        extract( $template_args, EXTR_SKIP );
370
        // ignore whether template is accessible ?
371
        if ( $throw_exceptions && ! is_readable( $template_path ) ) {
372
            throw new \DomainException(
373
                    esc_html__(
374
                            'Invalid, unreadable, or missing file.',
375
                            'event_espresso'
376
                    )
377
            );
378
        }
379
380
381
        if ($return_string) {
382
            // because we want to return a string, we are going to capture the output
383
            ob_start();
384
            include($template_path);
385
            return ob_get_clean();
386
        } else {
387
            include($template_path);
388
        }
389
        return '';
390
    }
391
392
393
    /**
394
     * get_object_css_class - attempts to generate a css class based on the type of EE object passed
395
     *
396
     * @param EE_Base_Class $object the EE object the css class is being generated for
397
     * @param  string       $prefix added to the beginning of the generated class
398
     * @param  string       $suffix added to the end of the generated class
399
     * @return string
400
     */
401
    public static function get_object_css_class($object = null, $prefix = '', $suffix = '')
402
    {
403
        // in the beginning...
404
        $prefix = ! empty($prefix) ? rtrim($prefix, '-') . '-' : '';
405
        // da muddle
406
        $class = '';
407
        // the end
408
        $suffix = ! empty($suffix) ? '-' . ltrim($suffix, '-') : '';
409
        // is the passed object an EE object ?
410
        if ($object instanceof EE_Base_Class) {
411
            // grab the exact type of object
412
            $obj_class = get_class($object);
413
            // depending on the type of object...
414
            switch ($obj_class) {
415
                // no specifics just yet...
416
                default :
417
                    $class = strtolower(str_replace('_', '-', $obj_class));
418
                    $class .= method_exists($obj_class, 'name') ? '-' . sanitize_title($object->name()) : '';
419
420
            }
421
        }
422
        return $prefix . $class . $suffix;
423
    }
424
425
426
427
    /**
428
     * EEH_Template::format_currency
429
     * This helper takes a raw float value and formats it according to the default config country currency settings, or
430
     * the country currency settings from the supplied country ISO code
431
     *
432
     * @param  float   $amount       raw money value
433
     * @param  boolean $return_raw   whether to return the formatted float value only with no currency sign or code
434
     * @param  boolean $display_code whether to display the country code (USD). Default = TRUE
435
     * @param string   $CNT_ISO      2 letter ISO code for a country
436
     * @param string   $cur_code_span_class
437
     * @return string        the html output for the formatted money value
438
     * @throws \EE_Error
439
     */
440
    public static function format_currency(
441
        $amount = null,
442
        $return_raw = false,
443
        $display_code = true,
444
        $CNT_ISO = '',
445
        $cur_code_span_class = 'currency-code'
446
    ) {
447
        // ensure amount was received
448 View Code Duplication
        if ($amount === null) {
449
            $msg = __('In order to format currency, an amount needs to be passed.', 'event_espresso');
450
            EE_Error::add_error($msg, __FILE__, __FUNCTION__, __LINE__);
451
            return '';
452
        }
453
        //ensure amount is float
454
        $amount  = apply_filters('FHEE__EEH_Template__format_currency__raw_amount', (float)$amount);
455
        $CNT_ISO = apply_filters('FHEE__EEH_Template__format_currency__CNT_ISO', $CNT_ISO, $amount);
456
        // filter raw amount (allows 0.00 to be changed to "free" for example)
457
        $amount_formatted = apply_filters('FHEE__EEH_Template__format_currency__amount', $amount, $return_raw);
458
        // still a number or was amount converted to a string like "free" ?
459
        if (is_float($amount_formatted)) {
460
            // was a country ISO code passed ? if so generate currency config object for that country
461
            $mny = $CNT_ISO !== '' ? new EE_Currency_Config($CNT_ISO) : null;
462
            // verify results
463 View Code Duplication
            if ( ! $mny instanceof EE_Currency_Config) {
464
                // set default config country currency settings
465
                $mny = EE_Registry::instance()->CFG->currency instanceof EE_Currency_Config
466
                    ? EE_Registry::instance()->CFG->currency
467
                    : new EE_Currency_Config();
468
            }
469
            // format float
470
            $amount_formatted = number_format($amount, $mny->dec_plc, $mny->dec_mrk, $mny->thsnds);
471
            // add formatting ?
472
            if ( ! $return_raw) {
473
                // add currency sign
474
                if ($mny->sign_b4) {
475
                    if ($amount >= 0) {
476
                        $amount_formatted = $mny->sign . $amount_formatted;
477
                    } else {
478
                        $amount_formatted = '-' . $mny->sign . str_replace('-', '', $amount_formatted);
479
                    }
480
481
                } else {
482
                    $amount_formatted = $amount_formatted . $mny->sign;
483
                }
484
485
                // filter to allow global setting of display_code
486
                $display_code = apply_filters('FHEE__EEH_Template__format_currency__display_code', $display_code);
487
488
                // add currency code ?
489
                $amount_formatted = $display_code ? $amount_formatted . ' <span class="' . $cur_code_span_class . '">(' . $mny->code . ')</span>' : $amount_formatted;
490
            }
491
            // filter results
492
            $amount_formatted = apply_filters('FHEE__EEH_Template__format_currency__amount_formatted',
493
                $amount_formatted, $mny, $return_raw);
494
        }
495
        // clean up vars
496
        unset($mny);
497
        // return formatted currency amount
498
        return $amount_formatted;
499
    }
500
501
502
    /**
503
     * This function is used for outputting the localized label for a given status id in the schema requested (and
504
     * possibly plural).  The intended use of this function is only for cases where wanting a label outside of a
505
     * related status model or model object (i.e. in documentation etc.)
506
     *
507
     * @param  string  $status_id Status ID matching a registered status in the esp_status table.  If there is no
508
     *                            match, then 'Unknown' will be returned.
509
     * @param  boolean $plural    Whether to return plural or not
510
     * @param  string  $schema    'UPPER', 'lower', or 'Sentence'
511
     * @return string             The localized label for the status id.
512
     */
513
    public static function pretty_status($status_id, $plural = false, $schema = 'upper')
514
    {
515
        /** @type EEM_Status $EEM_Status */
516
        $EEM_Status = EE_Registry::instance()->load_model('Status');
517
        $status     = $EEM_Status->localized_status(array($status_id => __('unknown', 'event_espresso')), $plural,
518
            $schema);
519
        return $status[$status_id];
520
    }
521
522
523
    /**
524
     * This helper just returns a button or link for the given parameters
525
     *
526
     * @param  string $url   the url for the link, note that `esc_url` will be called on it
527
     * @param  string $label What is the label you want displayed for the button
528
     * @param  string $class what class is used for the button (defaults to 'button-primary')
529
     * @param string  $icon
530
     * @param string  $title
531
     * @return string the html output for the button
532
     */
533
    public static function get_button_or_link($url, $label, $class = 'button-primary', $icon = '', $title = '')
534
    {
535
        $icon_html = '';
536
        if ( ! empty($icon)) {
537
            $dashicons = preg_split("(ee-icon |dashicons )", $icon);
538
            $dashicons = array_filter($dashicons);
539
            $count     = count($dashicons);
540
            $icon_html .= $count > 1 ? '<span class="ee-composite-dashicon">' : '';
541
            foreach ($dashicons as $dashicon) {
542
                $type = strpos($dashicon, 'ee-icon') !== false ? 'ee-icon ' : 'dashicons ';
543
                $icon_html .= '<span class="' . $type . $dashicon . '"></span>';
544
            }
545
            $icon_html .= $count > 1 ? '</span>' : '';
546
        }
547
        $label  = ! empty($icon) ? $icon_html . $label : $label;
548
        $button = '<a id="' . sanitize_title_with_dashes($label) . '" href="' . esc_url($url) . '" class="' . $class . '" title="' . $title . '">' . $label . '</a>';
549
        return $button;
550
    }
551
552
553
    /**
554
     * This returns a generated link that will load the related help tab on admin pages.
555
     *
556
     * @param  string     $help_tab_id the id for the connected help tab
557
     * @param bool|string $page        The page identifier for the page the help tab is on
558
     * @param bool|string $action      The action (route) for the admin page the help tab is on.
559
     * @param bool|string $icon_style  (optional) include css class for the style you want to use for the help icon.
560
     * @param bool|string $help_text   (optional) send help text you want to use for the link if default not to be used
561
     * @return string              generated link
562
     */
563
    public static function get_help_tab_link(
564
        $help_tab_id,
565
        $page = false,
566
        $action = false,
567
        $icon_style = false,
568
        $help_text = false
569
    ) {
570
571 View Code Duplication
        if ( ! $page) {
572
            $page = isset($_REQUEST['page']) && ! empty($_REQUEST['page']) ? sanitize_key($_REQUEST['page']) : $page;
573
        }
574
575 View Code Duplication
        if ( ! $action) {
576
            $action = isset($_REQUEST['action']) && ! empty($_REQUEST['action']) ? sanitize_key($_REQUEST['action']) : $action;
577
        }
578
579
        $action = empty($action) ? 'default' : $action;
580
581
582
        $help_tab_lnk = $page . '-' . $action . '-' . $help_tab_id;
583
        $icon         = ! $icon_style ? ' dashicons-editor-help' : $icon_style;
584
        $help_text    = ! $help_text ? '' : $help_text;
585
        return '<a id="' . $help_tab_lnk . '" class="ee-clickable dashicons espresso-help-tab-lnk ee-icon-size-22' . $icon . '" title="' . esc_attr__('Click to open the \'Help\' tab for more information about this feature.',
586
                'event_espresso') . '" > ' . $help_text . ' </a>';
587
    }
588
589
590
    /**
591
     * This helper generates the html structure for the jquery joyride plugin with the given params.
592
     *
593
     * @link http://zurb.com/playground/jquery-joyride-feature-tour-plugin
594
     * @see  EE_Admin_Page->_stop_callback() for the construct expected for the $stops param.
595
     * @param EE_Help_Tour
596
     * @return string         html
597
     */
598
    public static function help_tour_stops_generator(EE_Help_Tour $tour)
599
    {
600
        $id    = $tour->get_slug();
601
        $stops = $tour->get_stops();
602
603
        $content = '<ol style="display:none" id="' . $id . '">';
604
605
        foreach ($stops as $stop) {
606
            $data_id    = ! empty($stop['id']) ? ' data-id="' . $stop['id'] . '"' : '';
607
            $data_class = empty($data_id) && ! empty($stop['class']) ? ' data-class="' . $stop['class'] . '"' : '';
608
609
            //if container is set to modal then let's make sure we set the options accordingly
610
            if (empty($data_id) && empty($data_class)) {
611
                $stop['options']['modal']  = true;
612
                $stop['options']['expose'] = true;
613
            }
614
615
            $custom_class  = ! empty($stop['custom_class']) ? ' class="' . $stop['custom_class'] . '"' : '';
616
            $button_text   = ! empty($stop['button_text']) ? ' data-button="' . $stop['button_text'] . '"' : '';
617
            $inner_content = isset($stop['content']) ? $stop['content'] : '';
618
619
            //options
620
            if (isset($stop['options']) && is_array($stop['options'])) {
621
                $options = ' data-options="';
622
                foreach ($stop['options'] as $option => $value) {
623
                    $options .= $option . ':' . $value . ';';
624
                }
625
                $options .= '"';
626
            } else {
627
                $options = '';
628
            }
629
630
            //let's put all together
631
            $content .= '<li' . $data_id . $data_class . $custom_class . $button_text . $options . '>' . $inner_content . '</li>';
632
        }
633
634
        $content .= '</ol>';
635
        return $content;
636
    }
637
638
639
    /**
640
     * This is a helper method to generate a status legend for a given status array.
641
     * Note this will only work if the incoming statuses have a key in the EEM_Status->localized_status() methods
642
     * status_array.
643
     *
644
     * @param  array  $status_array  array of statuses that will make up the legend. In format:
645
     *                               array(
646
     *                               'status_item' => 'status_name'
647
     *                               )
648
     * @param  string $active_status This is used to indicate what the active status is IF that is to be highlighted in
649
     *                               the legend.
650
     * @throws EE_Error
651
     * @return string               html structure for status.
652
     */
653
    public static function status_legend($status_array, $active_status = '')
654
    {
655
        if ( ! is_array($status_array)) {
656
            throw new EE_Error(esc_html__('The EEH_Template::status_legend helper required the incoming status_array argument to be an array!',
657
                'event_espresso'));
658
        }
659
660
        $setup_array = array();
661
        foreach ($status_array as $item => $status) {
662
            $setup_array[$item] = array(
663
                'class'  => 'ee-status-legend ee-status-legend-' . $status,
664
                'desc'   => EEH_Template::pretty_status($status, false, 'sentence'),
665
                'status' => $status,
666
            );
667
        }
668
669
        $content = '<div class="ee-list-table-legend-container">' . "\n";
670
        $content .= '<h4 class="status-legend-title">' . esc_html__('Status Legend', 'event_espresso') . '</h4>' . "\n";
671
        $content .= '<dl class="ee-list-table-legend">' . "\n\t";
672
        foreach ($setup_array as $item => $details) {
673
            $active_class = $active_status == $details['status'] ? ' class="ee-is-active-status"' : '';
674
            $content .= '<dt id="ee-legend-item-tooltip-' . $item . '"' . $active_class . '>' . "\n\t\t";
675
            $content .= '<span class="' . $details['class'] . '"></span>' . "\n\t\t";
676
            $content .= '<span class="ee-legend-description">' . $details['desc'] . '</span>' . "\n\t";
677
            $content .= '</dt>' . "\n";
678
        }
679
        $content .= '</dl>' . "\n";
680
        $content .= '</div>' . "\n";
681
        return $content;
682
    }
683
684
685
    /**
686
     * Gets HTML for laying out a deeply-nested array (and objects) in a format
687
     * that's nice for presenting in the wp admin
688
     *
689
     * @param mixed $data
690
     * @return string
691
     */
692
    public static function layout_array_as_table($data)
693
    {
694
        if (is_object($data) || $data instanceof __PHP_Incomplete_Class) {
695
            $data = (array)$data;
696
        }
697
        ob_start();
698
        if (is_array($data)) {
699
            if (EEH_Array::is_associative_array($data)) {
700
                ?>
701
                <table class="widefat">
702
                    <tbody>
703
                    <?php
704
                    foreach ($data as $data_key => $data_values) {
705
                        ?>
706
                        <tr>
707
                            <td>
708
                                <?php echo $data_key; ?>
709
                            </td>
710
                            <td>
711
                                <?php echo self::layout_array_as_table($data_values); ?>
712
                            </td>
713
                        </tr>
714
                        <?php
715
                    } ?>
716
                    </tbody>
717
                </table>
718
                <?php
719
            } else {
720
                ?>
721
                <ul>
722
                    <?php
723
                    foreach ($data as $datum) {
724
                        echo "<li>";
725
                        echo self::layout_array_as_table($datum);
726
                        echo "</li>";
727
                    } ?>
728
                </ul>
729
                <?php
730
            }
731
        } else {
732
            //simple value
733
            echo esc_html($data);
734
        }
735
        return ob_get_clean();
736
    }
737
738
739
    /**
740
     * wrapper for self::get_paging_html() that simply echos the generated paging html
741
     *
742
     * @since 4.4.0
743
     * @see   self:get_paging_html() for argument docs.
744
     * @param        $total_items
745
     * @param        $current
746
     * @param        $per_page
747
     * @param        $url
748
     * @param bool   $show_num_field
749
     * @param string $paged_arg_name
750
     * @param array  $items_label
751
     * @return string
752
     */
753
    public static function paging_html(
754
        $total_items,
755
        $current,
756
        $per_page,
757
        $url,
758
        $show_num_field = true,
759
        $paged_arg_name = 'paged',
760
        $items_label = array()
761
    ) {
762
        echo self::get_paging_html($total_items, $current, $per_page, $url, $show_num_field, $paged_arg_name,
763
            $items_label);
764
    }
765
766
767
    /**
768
     * A method for generating paging similar to WP_List_Table
769
     *
770
     * @since    4.4.0
771
     * @see      wp-admin/includes/class-wp-list-table.php WP_List_Table::pagination()
772
     * @param  integer $total_items     How many total items there are to page.
773
     * @param  integer $current         What the current page is.
774
     * @param  integer $per_page        How many items per page.
775
     * @param  string  $url             What the base url for page links is.
776
     * @param  boolean $show_num_field  Whether to show the input for changing page number.
777
     * @param  string  $paged_arg_name  The name of the key for the paged query argument.
778
     * @param  array   $items_label     An array of singular/plural values for the items label:
779
     *                                  array(
780
     *                                  'single' => 'item',
781
     *                                  'plural' => 'items'
782
     *                                  )
783
     * @return  string
784
     */
785
    public static function get_paging_html(
786
        $total_items,
787
        $current,
788
        $per_page,
789
        $url,
790
        $show_num_field = true,
791
        $paged_arg_name = 'paged',
792
        $items_label = array()
793
    ) {
794
        $page_links     = array();
795
        $disable_first  = $disable_last = '';
796
        $total_items    = (int)$total_items;
797
        $per_page       = (int)$per_page;
798
        $current        = (int)$current;
799
        $paged_arg_name = empty($paged_arg_name) ? 'paged' : sanitize_key($paged_arg_name);
800
801
        //filter items_label
802
        $items_label = apply_filters(
803
            'FHEE__EEH_Template__get_paging_html__items_label',
804
            $items_label
805
        );
806
807
        if (empty($items_label)
808
            || ! is_array($items_label)
809
            || ! isset($items_label['single'])
810
            || ! isset($items_label['plural'])
811
        ) {
812
            $items_label = array(
813
                'single' => __('1 item', 'event_espresso'),
814
                'plural' => __('%s items', 'event_espresso'),
815
            );
816
        } else {
817
            $items_label = array(
818
                'single' => '1 ' . esc_html($items_label['single']),
819
                'plural' => '%s ' . esc_html($items_label['plural']),
820
            );
821
        }
822
823
        $total_pages = ceil($total_items / $per_page);
824
825
        if ($total_pages <= 1) {
826
            return '';
827
        }
828
829
        $item_label = $total_items > 1 ? sprintf($items_label['plural'], $total_items) : $items_label['single'];
830
831
        $output = '<span class="displaying-num">' . $item_label . '</span>';
832
833
        if ($current === 1) {
834
            $disable_first = ' disabled';
835
        }
836
        if ($current == $total_pages) {
837
            $disable_last = ' disabled';
838
        }
839
840
        $page_links[] = sprintf("<a class='%s' title='%s' href='%s'>%s</a>",
841
            'first-page' . $disable_first,
842
            esc_attr__('Go to the first page'),
843
            esc_url(remove_query_arg($paged_arg_name, $url)),
844
            '&laquo;'
845
        );
846
847
        $page_links[] = sprintf(
848
            '<a class="%s" title="%s" href="%s">%s</a>',
849
            'prev-page' . $disable_first,
850
            esc_attr__('Go to the previous page'),
851
            esc_url(add_query_arg($paged_arg_name, max(1, $current - 1), $url)),
852
            '&lsaquo;'
853
        );
854
855
        if ( ! $show_num_field) {
856
            $html_current_page = $current;
857
        } else {
858
            $html_current_page = sprintf("<input class='current-page' title='%s' type='text' name=$paged_arg_name value='%s' size='%d' />",
859
                esc_attr__('Current page'),
860
                $current,
861
                strlen($total_pages)
862
            );
863
        }
864
865
        $html_total_pages = sprintf(
866
            '<span class="total-pages">%s</span>',
867
            number_format_i18n($total_pages)
868
        );
869
        $page_links[]     = sprintf(
870
            _x('%3$s%1$s of %2$s%4$s', 'paging'),
871
            $html_current_page,
872
            $html_total_pages,
873
            '<span class="paging-input">',
874
            '</span>'
875
        );
876
877
        $page_links[] = sprintf(
878
            '<a class="%s" title="%s" href="%s">%s</a>',
879
            'next-page' . $disable_last,
880
            esc_attr__('Go to the next page'),
881
            esc_url(add_query_arg($paged_arg_name, min($total_pages, $current + 1), $url)),
882
            '&rsaquo;'
883
        );
884
885
        $page_links[] = sprintf(
886
            '<a class="%s" title="%s" href="%s">%s</a>',
887
            'last-page' . $disable_last,
888
            esc_attr__('Go to the last page'),
889
            esc_url(add_query_arg($paged_arg_name, $total_pages, $url)),
890
            '&raquo;'
891
        );
892
893
        $output .= "\n" . '<span class="pagination-links">' . join("\n", $page_links) . '</span>';
894
        // set page class
895
        if ($total_pages) {
896
            $page_class = $total_pages < 2 ? ' one-page' : '';
897
        } else {
898
            $page_class = ' no-pages';
899
        }
900
901
        return '<div class="tablenav"><div class="tablenav-pages' . $page_class . '">' . $output . '</div></div>';
902
    }
903
904
905
    /**
906
     * @param string $wrap_class
907
     * @param string $wrap_id
908
     * @return string
909
     */
910
    public static function powered_by_event_espresso($wrap_class = '', $wrap_id = '', array $query_args = array())
911
    {
912
        $admin = is_admin() && ! (defined('DOING_AJAX') && DOING_AJAX);
913
        if (
914
            ! $admin &&
915
            ! apply_filters(
916
                'FHEE__EEH_Template__powered_by_event_espresso__show_reg_footer',
917
                EE_Registry::instance()->CFG->admin->show_reg_footer
918
            )
919
        ) {
920
            return '';
921
        }
922
        $tag        = $admin ? 'span' : 'div';
923
        $attributes = ! empty($wrap_id) ? " id=\"{$wrap_id}\"" : '';
924
        $wrap_class = $admin ? "{$wrap_class} float-left" : $wrap_class;
925
        $attributes .= ! empty($wrap_class)
926
            ? " class=\"{$wrap_class} powered-by-event-espresso-credit\""
927
            : ' class="powered-by-event-espresso-credit"';
928
        $query_args = array_merge(
929
            array(
930
                'ap_id'        => EE_Registry::instance()->CFG->admin->affiliate_id(),
931
                'utm_source'   => 'powered_by_event_espresso',
932
                'utm_medium'   => 'link',
933
                'utm_campaign' => 'powered_by',
934
            ),
935
            $query_args
936
        );
937
        $powered_by = apply_filters('FHEE__EEH_Template__powered_by_event_espresso_text',
938
            $admin ? 'Event Espresso - ' . EVENT_ESPRESSO_VERSION : 'Event Espresso');
939
        $url        = add_query_arg($query_args, 'https://eventespresso.com/');
940
        $url        = apply_filters('FHEE__EEH_Template__powered_by_event_espresso__url', $url);
941
        return (string)apply_filters(
942
            'FHEE__EEH_Template__powered_by_event_espresso__html',
943
            sprintf(
944
                esc_html_x(
945
                    '%3$s%1$sOnline event registration and ticketing powered by %2$s%3$s',
946
                    'Online event registration and ticketing powered by [link to eventespresso.com]',
947
                    'event_espresso'
948
                ),
949
                "<{$tag}{$attributes}>",
950
                "<a href=\"{$url}\" target=\"_blank\" rel=\"nofollow\">{$powered_by}</a></{$tag}>",
951
                $admin ? '' : '<br />'
952
            ),
953
            $wrap_class,
954
            $wrap_id
955
        );
956
    }
957
958
959
} //end EEH_Template class
960
961
962
963
964 View Code Duplication
if ( ! function_exists('espresso_pagination')) {
965
    /**
966
     *    espresso_pagination
967
     *
968
     * @access    public
969
     * @return    void
970
     */
971
    function espresso_pagination()
972
    {
973
        global $wp_query;
974
        $big        = 999999999; // need an unlikely integer
975
        $pagination = paginate_links(
976
            array(
977
                'base'         => str_replace($big, '%#%', esc_url(get_pagenum_link($big))),
978
                'format'       => '?paged=%#%',
979
                'current'      => max(1, get_query_var('paged')),
980
                'total'        => $wp_query->max_num_pages,
981
                'show_all'     => true,
982
                'end_size'     => 10,
983
                'mid_size'     => 6,
984
                'prev_next'    => true,
985
                'prev_text'    => __('&lsaquo; PREV', 'event_espresso'),
986
                'next_text'    => __('NEXT &rsaquo;', 'event_espresso'),
987
                'type'         => 'plain',
988
                'add_args'     => false,
989
                'add_fragment' => '',
990
            )
991
        );
992
        echo ! empty($pagination) ? '<div class="ee-pagination-dv ee-clear-float">' . $pagination . '</div>' : '';
993
    }
994
}