Completed
Push — master ( d02afe...589d3f )
by Zack
11s
created

GravityView_API   D

Complexity

Total Complexity 92

Size/Duplication

Total Lines 729
Duplicated Lines 0 %

Coupling/Cohesion

Components 1
Dependencies 8

Test Coverage

Coverage 44.02%

Importance

Changes 0
Metric Value
dl 0
loc 729
ccs 92
cts 209
cp 0.4402
rs 4.4444
c 0
b 0
f 0
wmc 92
lcom 1
cbo 8

13 Methods

Rating   Name   Duplication   Size   Complexity  
C field_label() 0 65 8
A replace_variables() 0 3 1
A field_width() 0 17 4
C field_class() 0 39 7
B field_html_attr_id() 0 16 5
C field_value() 0 139 12
B entry_link_html() 0 26 5
C no_results() 0 24 7
D directory_link() 0 95 18
A get_custom_entry_slug() 0 20 2
B get_entry_slug() 0 37 4
A entry_create_custom_slug() 0 18 2
F entry_link() 0 87 17

How to fix   Complexity   

Complex Class

Complex classes like GravityView_API often do a lot of different things. To break such a class down, we need to identify a cohesive component within that class. A common approach to find such a component is to look for fields/methods that share the same prefixes, or suffixes. You can also have a look at the cohesion graph to spot any un-connected, or weakly-connected components.

Once you have determined the fields that belong together, you can apply the Extract Class refactoring. If the component makes sense as a sub-class, Extract Subclass is also a candidate, and is often faster.

While breaking up the class, it is a good idea to analyze how other classes use GravityView_API, and based on these observations, apply Extract Interface, too.

1
<?php
2
/**
3
 * GravityView template tags API
4
 *
5
 * @package   GravityView
6
 * @license   GPL2+
7
 * @author    Katz Web Services, Inc.
8
 * @link      http://gravityview.co
9
 * @copyright Copyright 2014, Katz Web Services, Inc.
10
 *
11
 * @since 1.0.0
12
 */
13
14
class GravityView_API {
15
16
	/**
17
	 * Fetch Field Label
18
	 *
19
	 * @access public
20
	 * @static
21
	 * @param array $field GravityView field array
22
	 * @param array $entry Gravity Forms entry array
23
	 * @param boolean $force_show_label Whether to always show the label, regardless of field settings
24
	 * @return string
25
	 */
26
	public static function field_label( $field, $entry = array(), $force_show_label = false ) {
27
		$gravityview_view = GravityView_View::getInstance();
28
29
		$form = $gravityview_view->getForm();
30
31
		$label = '';
32
33
		if( !empty( $field['show_label'] ) || $force_show_label ) {
0 ignored issues
show
introduced by
Expected 1 space after "!"; 0 found
Loading history...
34
35
			$label = $field['label'];
36
37
			// Support Gravity Forms 1.9+
38
			if( class_exists( 'GF_Field' ) ) {
39
40
				$field_object = RGFormsModel::get_field( $form, $field['id'] );
41
42
				if( $field_object ) {
43
44
					$input = GFFormsModel::get_input( $field_object, $field['id'] );
45
46
					// This is a complex field, with labels on a per-input basis
47
					if( $input ) {
48
49
						// Does the input have a custom label on a per-input basis? Otherwise, default label.
50
						$label = ! empty( $input['customLabel'] ) ? $input['customLabel'] : $input['label'];
51
52
					} else {
53
54
						// This is a field with one label
55
						$label = $field_object->get_field_label( true, $field['label'] );
56
57
					}
58
59
				}
60
61
			}
62
63
			// Use Gravity Forms label by default, but if a custom label is defined in GV, use it.
64
			if ( !empty( $field['custom_label'] ) ) {
0 ignored issues
show
introduced by
Expected 1 space after "!"; 0 found
Loading history...
65
66
				$label = self::replace_variables( $field['custom_label'], $form, $entry );
67
68
			}
69
70
			/**
71
			 * @filter `gravityview_render_after_label` Append content to a field label
72
			 * @param[in,out] string $appended_content Content you can add after a label. Empty by default.
73
			 * @param[in] array $field GravityView field array
74
			 */
75
			$label .= apply_filters( 'gravityview_render_after_label', '', $field );
76
77
		} // End $field['show_label']
0 ignored issues
show
Unused Code Comprehensibility introduced by
58% of this comment could be valid code. Did you maybe forget this after debugging?

Sometimes obsolete code just ends up commented out instead of removed. In this case it is better to remove the code once you have checked you do not need it.

The code might also have been commented out for debugging purposes. In this case it is vital that someone uncomments it again or your project may behave in very unexpected ways in production.

This check looks for comments that seem to be mostly valid code and reports them.

Loading history...
78
79
		/**
80
		 * @filter `gravityview/template/field_label` Modify field label output
81
		 * @since 1.7
82
		 * @param[in,out] string $label Field label HTML
83
		 * @param[in] array $field GravityView field array
84
		 * @param[in] array $form Gravity Forms form array
85
		 * @param[in] array $entry Gravity Forms entry array
86
		 */
87
		$label = apply_filters( 'gravityview/template/field_label', $label, $field, $form, $entry );
88
89
		return $label;
90
	}
91
92
	/**
93
	 * Alias for GravityView_Merge_Tags::replace_variables()
94
	 *
95
	 * @see GravityView_Merge_Tags::replace_variables() Moved in 1.8.4
96
	 *
97
	 * @param  string      $text       Text to replace variables in
98
	 * @param  array      $form        GF Form array
99
	 * @param  array      $entry        GF Entry array
100
	 * @return string                  Text with variables maybe replaced
101
	 */
102 1
	public static function replace_variables( $text, $form = array(), $entry = array() ) {
103 1
		return GravityView_Merge_Tags::replace_variables( $text, $form, $entry );
104
	}
105
106
	/**
107
	 * Get column width from the field setting
108
	 *
109
	 * @since 1.9
110
	 *
111
	 * @param array $field Array of settings for the field
112
	 * @param string $format Format for width. "%" (default) will return
113
	 *
114
	 * @return string|null If not empty, string in $format format. Otherwise, null.
115
	 */
116 1
	public static function field_width( $field, $format = '%d%%' ) {
117
118 1
		$width = NULL;
0 ignored issues
show
Coding Style introduced by
TRUE, FALSE and NULL must be lowercase; expected null, but found NULL.
Loading history...
119
120 1
		if( !empty( $field['width'] ) ) {
0 ignored issues
show
introduced by
Expected 1 space after "!"; 0 found
Loading history...
121 1
			$width = absint( $field['width'] );
122
123
			// If using percentages, limit to 100%
124 1
			if( '%d%%' === $format && $width > 100 ) {
125 1
				$width = 100;
126
			}
127
128 1
			$width = sprintf( $format, $width );
129
		}
130
131 1
		return $width;
132
	}
133
134
	/**
135
	 * Fetch Field class
136
	 *
137
	 * @access public
138
	 * @static
139
	 * @param mixed $field
140
	 * @return string
141
	 */
142 1
	public static function field_class( $field, $form = NULL, $entry = NULL ) {
0 ignored issues
show
Coding Style introduced by
TRUE, FALSE and NULL must be lowercase; expected null, but found NULL.
Loading history...
143 1
		$gravityview_view = GravityView_View::getInstance();
144
145 1
		$classes = array();
146
147 1
		if( !empty( $field['custom_class'] ) ) {
0 ignored issues
show
introduced by
Expected 1 space after "!"; 0 found
Loading history...
148
149 1
            $custom_class = $field['custom_class'];
150
151 1
            if( !empty( $entry ) ) {
0 ignored issues
show
introduced by
Expected 1 space after "!"; 0 found
Loading history...
152
153
                // We want the merge tag to be formatted as a class. The merge tag may be
154
                // replaced by a multiple-word value that should be output as a single class.
155
                // "Office Manager" will be formatted as `.OfficeManager`, not `.Office` and `.Manager`
0 ignored issues
show
Unused Code Comprehensibility introduced by
38% of this comment could be valid code. Did you maybe forget this after debugging?

Sometimes obsolete code just ends up commented out instead of removed. In this case it is better to remove the code once you have checked you do not need it.

The code might also have been commented out for debugging purposes. In this case it is vital that someone uncomments it again or your project may behave in very unexpected ways in production.

This check looks for comments that seem to be mostly valid code and reports them.

Loading history...
156 1
                add_filter('gform_merge_tag_filter', 'sanitize_html_class');
0 ignored issues
show
Coding Style introduced by
Expected 1 spaces after opening bracket; 0 found
Loading history...
Coding Style introduced by
Expected 1 spaces before closing bracket; 0 found
Loading history...
157
158 1
                $custom_class = self::replace_variables( $custom_class, $form, $entry);
0 ignored issues
show
Coding Style introduced by
Expected 1 spaces before closing bracket; 0 found
Loading history...
159
160
                // And then we want life to return to normal
161 1
                remove_filter('gform_merge_tag_filter', 'sanitize_html_class');
0 ignored issues
show
Coding Style introduced by
Expected 1 spaces after opening bracket; 0 found
Loading history...
Coding Style introduced by
Expected 1 spaces before closing bracket; 0 found
Loading history...
162
            }
163
164
			// And now we want the spaces to be handled nicely.
165 1
			$classes[] = gravityview_sanitize_html_class( $custom_class );
166
167
		}
168
169 1
		if(!empty($field['id'])) {
0 ignored issues
show
introduced by
No space after opening parenthesis is prohibited
Loading history...
introduced by
Expected 1 space before "!"; 0 found
Loading history...
introduced by
Expected 1 space after "!"; 0 found
Loading history...
introduced by
No space before closing parenthesis is prohibited
Loading history...
Coding Style introduced by
Expected 1 spaces after opening bracket; 0 found
Loading history...
Coding Style introduced by
Expected 1 spaces before closing bracket; 0 found
Loading history...
170 1
			if( !empty( $form ) && !empty( $form['id'] ) ) {
0 ignored issues
show
introduced by
Expected 1 space after "!"; 0 found
Loading history...
171 1
				$form_id = '-'.$form['id'];
172
			} else {
173
				$form_id = $gravityview_view->getFormId() ? '-'. $gravityview_view->getFormId() : '';
174
			}
175
176 1
			$classes[] = 'gv-field'.$form_id.'-'.$field['id'];
177
		}
178
179 1
		return esc_attr(implode(' ', $classes));
0 ignored issues
show
Coding Style introduced by
Expected 1 spaces after opening bracket; 0 found
Loading history...
Coding Style introduced by
Expected 1 spaces before closing bracket; 0 found
Loading history...
180
	}
181
182
	/**
183
	 * Fetch Field HTML ID
184
	 *
185
	 * @since 1.11
186
	 *
187
	 * @access public
188
	 * @static
189
	 * @param array $field GravityView field array passed to gravityview_field_output()
190
	 * @param array $form Gravity Forms form array, if set.
191
	 * @param array $entry Gravity Forms entry array
192
	 * @return string Sanitized unique HTML `id` attribute for the field
193
	 */
194
	public static function field_html_attr_id( $field, $form = array(), $entry = array() ) {
0 ignored issues
show
Unused Code introduced by
The parameter $entry is not used and could be removed.

This check looks from parameters that have been defined for a function or method, but which are not used in the method body.

Loading history...
195
		$gravityview_view = GravityView_View::getInstance();
196
		$id = $field['id'];
197
198
		if ( ! empty( $id ) ) {
199
			if ( ! empty( $form ) && ! empty( $form['id'] ) ) {
200
				$form_id = '-' . $form['id'];
201
			} else {
202
				$form_id = $gravityview_view->getFormId() ? '-' . $gravityview_view->getFormId() : '';
203
			}
204
205
			$id = 'gv-field' . $form_id . '-' . $field['id'];
206
		}
207
208
		return esc_attr( $id );
209
	}
210
211
212
	/**
213
	 * Given an entry and a form field id, calculate the entry value for that field.
214
	 *
215
	 * @access public
216
	 * @param array $entry
217
	 * @param array $field
0 ignored issues
show
Bug introduced by
There is no parameter named $field. Was it maybe removed?

This check looks for PHPDoc comments describing methods or function parameters that do not exist on the corresponding method or function.

Consider the following example. The parameter $italy is not defined by the method finale(...).

/**
 * @param array $germany
 * @param array $island
 * @param array $italy
 */
function finale($germany, $island) {
    return "2:1";
}

The most likely cause is that the parameter was removed, but the annotation was not.

Loading history...
218
	 * @return null|string
219
	 */
220
	public static function field_value( $entry, $field_settings, $format = 'html' ) {
221
222
		if( empty( $entry['form_id'] ) || empty( $field_settings['id'] ) ) {
223
			return NULL;
0 ignored issues
show
Coding Style introduced by
TRUE, FALSE and NULL must be lowercase; expected null, but found NULL.
Loading history...
224
		}
225
226
		$gravityview_view = GravityView_View::getInstance();
227
228
		$field_id = $field_settings['id'];
229
		$form = $gravityview_view->getForm();
230
		$field = gravityview_get_field( $form, $field_id );
231
232
		if( $field && is_numeric( $field_id ) ) {
233
			// Used as file name of field template in GV.
234
			// Don't use RGFormsModel::get_input_type( $field ); we don't care if it's a radio input; we want to know it's a 'quiz' field
235
			$field_type = $field->type;
236
			$value = RGFormsModel::get_lead_field_value( $entry, $field );
237
		} else {
238
			$field = GravityView_Fields::get_associated_field( $field_id );
239
			$field_type = $field_id; // Used as file name of field template in GV
240
		}
241
242
		// If a Gravity Forms Field is found, get the field display
243
		if( $field ) {
244
245
			// Prevent any PHP warnings that may be generated
246
			ob_start();
247
248
			$display_value = GFCommon::get_lead_field_display( $field, $value, $entry["currency"], false, $format );
0 ignored issues
show
Bug introduced by
The variable $value does not seem to be defined for all execution paths leading up to this point.

If you define a variable conditionally, it can happen that it is not defined for all execution paths.

Let’s take a look at an example:

function myFunction($a) {
    switch ($a) {
        case 'foo':
            $x = 1;
            break;

        case 'bar':
            $x = 2;
            break;
    }

    // $x is potentially undefined here.
    echo $x;
}

In the above example, the variable $x is defined if you pass “foo” or “bar” as argument for $a. However, since the switch statement has no default case statement, if you pass any other value, the variable $x would be undefined.

Available Fixes

  1. Check for existence of the variable explicitly:

    function myFunction($a) {
        switch ($a) {
            case 'foo':
                $x = 1;
                break;
    
            case 'bar':
                $x = 2;
                break;
        }
    
        if (isset($x)) { // Make sure it's always set.
            echo $x;
        }
    }
    
  2. Define a default value for the variable:

    function myFunction($a) {
        $x = ''; // Set a default which gets overridden for certain paths.
        switch ($a) {
            case 'foo':
                $x = 1;
                break;
    
            case 'bar':
                $x = 2;
                break;
        }
    
        echo $x;
    }
    
  3. Add a value for the missing path:

    function myFunction($a) {
        switch ($a) {
            case 'foo':
                $x = 1;
                break;
    
            case 'bar':
                $x = 2;
                break;
    
            // We add support for the missing case.
            default:
                $x = '';
                break;
        }
    
        echo $x;
    }
    
Loading history...
Coding Style Comprehensibility introduced by
The string literal currency does not require double quotes, as per coding-style, please use single quotes.

PHP provides two ways to mark string literals. Either with single quotes 'literal' or with double quotes "literal". The difference between these is that string literals in double quotes may contain variables with are evaluated at run-time as well as escape sequences.

String literals in single quotes on the other hand are evaluated very literally and the only two characters that needs escaping in the literal are the single quote itself (\') and the backslash (\\). Every other character is displayed as is.

Double quoted string literals may contain other variables or more complex escape sequences.

<?php

$singleQuoted = 'Value';
$doubleQuoted = "\tSingle is $singleQuoted";

print $doubleQuoted;

will print an indented: Single is Value

If your string literal does not contain variables or escape sequences, it should be defined using single quotes to make that fact clear.

For more information on PHP string literals and available escape sequences see the PHP core documentation.

Loading history...
249
250
			if ( $errors = ob_get_clean() ) {
251
				do_action( 'gravityview_log_error', 'GravityView_API[field_value] Errors when calling GFCommon::get_lead_field_display()', $errors );
252
			}
253
254
			$display_value = apply_filters( "gform_entry_field_value", $display_value, $field, $entry, $form );
0 ignored issues
show
Coding Style Comprehensibility introduced by
The string literal gform_entry_field_value does not require double quotes, as per coding-style, please use single quotes.

PHP provides two ways to mark string literals. Either with single quotes 'literal' or with double quotes "literal". The difference between these is that string literals in double quotes may contain variables with are evaluated at run-time as well as escape sequences.

String literals in single quotes on the other hand are evaluated very literally and the only two characters that needs escaping in the literal are the single quote itself (\') and the backslash (\\). Every other character is displayed as is.

Double quoted string literals may contain other variables or more complex escape sequences.

<?php

$singleQuoted = 'Value';
$doubleQuoted = "\tSingle is $singleQuoted";

print $doubleQuoted;

will print an indented: Single is Value

If your string literal does not contain variables or escape sequences, it should be defined using single quotes to make that fact clear.

For more information on PHP string literals and available escape sequences see the PHP core documentation.

Loading history...
255
256
			// prevent the use of merge_tags for non-admin fields
257
			if( !empty( $field->adminOnly ) ) {
0 ignored issues
show
introduced by
Expected 1 space after "!"; 0 found
Loading history...
258
				$display_value = self::replace_variables( $display_value, $form, $entry );
259
			}
260
		} else {
261
			$value = $display_value = rgar( $entry, $field_id );
262
			$display_value = $value;
263
		}
264
265
		// Check whether the field exists in /includes/fields/{$field_type}.php
266
		// This can be overridden by user template files.
267
		$field_path = $gravityview_view->locate_template("fields/{$field_type}.php");
0 ignored issues
show
Coding Style introduced by
Expected 1 spaces after opening bracket; 0 found
Loading history...
Coding Style introduced by
Expected 1 spaces before closing bracket; 0 found
Loading history...
268
269
		// Set the field data to be available in the templates
270
		$gravityview_view->setCurrentField( array(
271
			'form' => $form,
272
			'field_id' => $field_id,
273
			'field' => $field,
274
			'field_settings' => $field_settings,
275
			'value' => $value,
276
			'display_value' => $display_value,
277
			'format' => $format,
278
			'entry' => $entry,
279
			'field_type' => $field_type, /** {@since 1.6} */
280
		    'field_path' => $field_path, /** {@since 1.16} */
281
		));
282
283
		if( ! empty( $field_path ) ) {
284
285
			do_action( 'gravityview_log_debug', sprintf('[field_value] Rendering %s', $field_path ) );
0 ignored issues
show
Coding Style introduced by
Expected 1 spaces after opening bracket; 0 found
Loading history...
286
287
			ob_start();
288
289
			load_template( $field_path, false );
290
291
			$output = ob_get_clean();
292
293
		} else {
294
295
			// Backup; the field template doesn't exist.
296
			$output = $display_value;
297
298
		}
299
300
		// Get the field settings again so that the field template can override the settings
301
		$field_settings = $gravityview_view->getCurrentField('field_settings');
0 ignored issues
show
Coding Style introduced by
Expected 1 spaces after opening bracket; 0 found
Loading history...
Coding Style introduced by
Expected 1 spaces before closing bracket; 0 found
Loading history...
302
303
		/**
304
		 * @filter `gravityview_field_entry_value_{$field_type}_pre_link` Modify the field value output for a field type before Show As Link setting is applied. Example: `gravityview_field_entry_value_number_pre_link`
305
		 * @since 1.16
306
		 * @param string $output HTML value output
307
		 * @param array  $entry The GF entry array
308
		 * @param array  $field_settings Settings for the particular GV field
309
		 * @param array  $field Field array, as fetched from GravityView_View::getCurrentField()
310
		 */
311
		$output = apply_filters( 'gravityview_field_entry_value_' . $field_type . '_pre_link', $output, $entry, $field_settings, $gravityview_view->getCurrentField() );
312
313
		/**
314
		 * @filter `gravityview_field_entry_value_pre_link` Modify the field value output for a field before Show As Link setting is applied. Example: `gravityview_field_entry_value_pre_link`
315
		 * @since 1.21.4
316
		 * @used-by GV_Inline_Edit
317
		 * @param string $output HTML value output
318
		 * @param array  $entry The GF entry array
319
		 * @param array  $field_settings Settings for the particular GV field
320
		 * @param array  $field Field array, as fetched from GravityView_View::getCurrentField()
321
		 */
322
		$output = apply_filters( 'gravityview_field_entry_value_pre_link', $output, $entry, $field_settings, $gravityview_view->getCurrentField() );
323
324
		/**
325
		 * Link to the single entry by wrapping the output in an anchor tag
326
		 *
327
		 * Fields can override this by modifying the field data variable inside the field. See /templates/fields/post_image.php for an example.
328
		 *
329
		 */
330
		if( !empty( $field_settings['show_as_link'] ) && ! gv_empty( $output, false, false ) ) {
0 ignored issues
show
introduced by
Expected 1 space after "!"; 0 found
Loading history...
331
332
			$link_atts = empty( $field_settings['new_window'] ) ? array() : array( 'target' => '_blank' );
333
334
			$output = self::entry_link_html( $entry, $output, $link_atts, $field_settings );
335
336
		}
337
338
		/**
339
		 * @filter `gravityview_field_entry_value_{$field_type}` Modify the field value output for a field type. Example: `gravityview_field_entry_value_number`
340
		 * @since 1.6
341
		 * @param string $output HTML value output
342
		 * @param array  $entry The GF entry array
343
		 * @param  array $field_settings Settings for the particular GV field
344
		 * @param array $field Current field being displayed
345
		 */
346
		$output = apply_filters( 'gravityview_field_entry_value_'.$field_type, $output, $entry, $field_settings, $gravityview_view->getCurrentField() );
347
348
		/**
349
		 * @filter `gravityview_field_entry_value` Modify the field value output for all field types
350
		 * @param string $output HTML value output
351
		 * @param array  $entry The GF entry array
352
		 * @param  array $field_settings Settings for the particular GV field
353
		 * @param array $field_data  {@since 1.6}
354
		 */
355
		$output = apply_filters( 'gravityview_field_entry_value', $output, $entry, $field_settings, $gravityview_view->getCurrentField() );
356
357
		return $output;
358
	}
359
360
	/**
361
	 * Generate an anchor tag that links to an entry.
362
	 *
363
	 * @since 1.6
364
	 * @see GVCommon::get_link_html()
365
	 *
366
	 * @param string $anchor_text The text or HTML inside the link
367
	 * @param array $entry Gravity Forms entry array
368
	 * @param array|string $passed_tag_atts Attributes to be added to the anchor tag, such as `title` or `rel`.
369
	 * @param array $field_settings Array of field settings. Optional, but passed to the `gravityview_field_entry_link` filter
370
	 *
371
	 * @return string|null Returns HTML for an anchor link. Null if $entry isn't defined or is missing an ID.
372
	 */
373 1
	public static function entry_link_html( $entry = array(), $anchor_text = '', $passed_tag_atts = array(), $field_settings = array() ) {
374
375 1
		if ( empty( $entry ) || ! is_array( $entry ) || ! isset( $entry['id'] ) ) {
376 1
			do_action( 'gravityview_log_debug', 'GravityView_API[entry_link_tag] Entry not defined; returning null', $entry );
377 1
			return NULL;
0 ignored issues
show
Coding Style introduced by
TRUE, FALSE and NULL must be lowercase; expected null, but found NULL.
Loading history...
378
		}
379
380 1
		$href = self::entry_link( $entry );
381
382 1
		if( '' === $href ) {
383
			return NULL;
0 ignored issues
show
Coding Style introduced by
TRUE, FALSE and NULL must be lowercase; expected null, but found NULL.
Loading history...
384
		}
385
386 1
		$link = gravityview_get_link( $href, $anchor_text, $passed_tag_atts );
387
388
		/**
389
		 * @filter `gravityview_field_entry_link` Modify the link HTML
390
		 * @param string $link HTML output of the link
391
		 * @param string $href URL of the link
392
		 * @param array  $entry The GF entry array
393
		 * @param  array $field_settings Settings for the particular GV field
394
		 */
395 1
		$output = apply_filters( 'gravityview_field_entry_link', $link, $href, $entry, $field_settings );
396
397 1
		return $output;
398
	}
399
400
	/**
401
	 * Get the "No Results" text depending on whether there were results.
402
	 * @param  boolean     $wpautop Apply wpautop() to the output?
403
	 * @return string               HTML of "no results" text
404
	 */
405 1
	public static function no_results($wpautop = true) {
406 1
		$gravityview_view = GravityView_View::getInstance();
407
408 1
		$is_search = false;
409
410 1
		if( $gravityview_view && ( $gravityview_view->curr_start || $gravityview_view->curr_end || $gravityview_view->curr_search ) ) {
0 ignored issues
show
Documentation introduced by
The property curr_start does not exist on object<GravityView_View>. Since you implemented __get, maybe consider adding a @property annotation.

Since your code implements the magic getter _get, this function will be called for any read access on an undefined variable. You can add the @property annotation to your class or interface to document the existence of this variable.

<?php

/**
 * @property int $x
 * @property int $y
 * @property string $text
 */
class MyLabel
{
    private $properties;

    private $allowedProperties = array('x', 'y', 'text');

    public function __get($name)
    {
        if (isset($properties[$name]) && in_array($name, $this->allowedProperties)) {
            return $properties[$name];
        } else {
            return null;
        }
    }

    public function __set($name, $value)
    {
        if (in_array($name, $this->allowedProperties)) {
            $properties[$name] = $value;
        } else {
            throw new \LogicException("Property $name is not defined.");
        }
    }

}

If the property has read access only, you can use the @property-read annotation instead.

Of course, you may also just have mistyped another name, in which case you should fix the error.

See also the PhpDoc documentation for @property.

Loading history...
Documentation introduced by
The property curr_end does not exist on object<GravityView_View>. Since you implemented __get, maybe consider adding a @property annotation.

Since your code implements the magic getter _get, this function will be called for any read access on an undefined variable. You can add the @property annotation to your class or interface to document the existence of this variable.

<?php

/**
 * @property int $x
 * @property int $y
 * @property string $text
 */
class MyLabel
{
    private $properties;

    private $allowedProperties = array('x', 'y', 'text');

    public function __get($name)
    {
        if (isset($properties[$name]) && in_array($name, $this->allowedProperties)) {
            return $properties[$name];
        } else {
            return null;
        }
    }

    public function __set($name, $value)
    {
        if (in_array($name, $this->allowedProperties)) {
            $properties[$name] = $value;
        } else {
            throw new \LogicException("Property $name is not defined.");
        }
    }

}

If the property has read access only, you can use the @property-read annotation instead.

Of course, you may also just have mistyped another name, in which case you should fix the error.

See also the PhpDoc documentation for @property.

Loading history...
Documentation introduced by
The property curr_search does not exist on object<GravityView_View>. Since you implemented __get, maybe consider adding a @property annotation.

Since your code implements the magic getter _get, this function will be called for any read access on an undefined variable. You can add the @property annotation to your class or interface to document the existence of this variable.

<?php

/**
 * @property int $x
 * @property int $y
 * @property string $text
 */
class MyLabel
{
    private $properties;

    private $allowedProperties = array('x', 'y', 'text');

    public function __get($name)
    {
        if (isset($properties[$name]) && in_array($name, $this->allowedProperties)) {
            return $properties[$name];
        } else {
            return null;
        }
    }

    public function __set($name, $value)
    {
        if (in_array($name, $this->allowedProperties)) {
            $properties[$name] = $value;
        } else {
            throw new \LogicException("Property $name is not defined.");
        }
    }

}

If the property has read access only, you can use the @property-read annotation instead.

Of course, you may also just have mistyped another name, in which case you should fix the error.

See also the PhpDoc documentation for @property.

Loading history...
411 1
			$is_search = true;
412
		}
413
414 1
		if($is_search) {
0 ignored issues
show
introduced by
No space after opening parenthesis is prohibited
Loading history...
introduced by
No space before closing parenthesis is prohibited
Loading history...
415 1
			$output = __('This search returned no results.', 'gravityview');
0 ignored issues
show
Coding Style introduced by
Expected 1 spaces after opening bracket; 0 found
Loading history...
Coding Style introduced by
Expected 1 spaces before closing bracket; 0 found
Loading history...
416
		} else {
417 1
			$output = __('No entries match your request.', 'gravityview');
0 ignored issues
show
Coding Style introduced by
Expected 1 spaces after opening bracket; 0 found
Loading history...
Coding Style introduced by
Expected 1 spaces before closing bracket; 0 found
Loading history...
418
		}
419
420
		/**
421
		 * @filter `gravitview_no_entries_text` Modify the text displayed when there are no entries.
422
		 * @param string $output The existing "No Entries" text
423
		 * @param boolean $is_search Is the current page a search result, or just a multiple entries screen?
424
		 */
425 1
		$output = apply_filters( 'gravitview_no_entries_text', $output, $is_search);
0 ignored issues
show
Coding Style introduced by
Expected 1 spaces before closing bracket; 0 found
Loading history...
426
427 1
		return $wpautop ? wpautop($output) : $output;
0 ignored issues
show
Coding Style introduced by
Expected 1 spaces after opening bracket; 0 found
Loading history...
Coding Style introduced by
Expected 1 spaces before closing bracket; 0 found
Loading history...
428
	}
429
430
	/**
431
	 * Generate a URL to the Directory context
432
	 *
433
	 * Uses `wp_cache_get` and `wp_cache_get` (since 1.3) to speed up repeated requests to get permalink, which improves load time. Since we may be doing this hundreds of times per request, it adds up!
434
	 *
435
	 * @param int $post_id Post ID
436
	 * @param boolean $add_query_args Add pagination and sorting arguments
437
	 * @return string      Permalink to multiple entries view
438
	 */
439 4
	public static function directory_link( $post_id = NULL, $add_query_args = true ) {
0 ignored issues
show
Coding Style introduced by
TRUE, FALSE and NULL must be lowercase; expected null, but found NULL.
Loading history...
440 4
		global $post;
0 ignored issues
show
Compatibility Best Practice introduced by
Use of global functionality is not recommended; it makes your code harder to test, and less reusable.

Instead of relying on global state, we recommend one of these alternatives:

1. Pass all data via parameters

function myFunction($a, $b) {
    // Do something
}

2. Create a class that maintains your state

class MyClass {
    private $a;
    private $b;

    public function __construct($a, $b) {
        $this->a = $a;
        $this->b = $b;
    }

    public function myFunction() {
        // Do something
    }
}
Loading history...
441
442 4
		$gravityview_view = GravityView_View::getInstance();
443
444 4
		if( empty( $post_id ) ) {
445
446 4
			$post_id = false;
447
448
			// DataTables passes the Post ID
449 4
			if( defined('DOING_AJAX') && DOING_AJAX ) {
0 ignored issues
show
Coding Style introduced by
Expected 1 spaces after opening bracket; 0 found
Loading history...
Coding Style introduced by
Expected 1 spaces before closing bracket; 0 found
Loading history...
450
451
				$post_id = isset( $_POST['post_id'] ) ? (int)$_POST['post_id'] : false;
0 ignored issues
show
introduced by
Detected access of super global var $_POST, probably need manual inspection.
Loading history...
introduced by
No space after closing casting parenthesis is prohibited
Loading history...
452
453
			} else {
454
455
				// The Post ID has been passed via the shortcode
456 4
				if( !empty( $gravityview_view ) && $gravityview_view->getPostId() ) {
0 ignored issues
show
Bug Best Practice introduced by
The expression $gravityview_view->getPostId() of type integer|null is loosely compared to true; this is ambiguous if the integer can be zero. You might want to explicitly use !== null instead.

In PHP, under loose comparison (like ==, or !=, or switch conditions), values of different types might be equal.

For integer values, zero is a special case, in particular the following results might be unexpected:

0   == false // true
0   == null  // true
123 == false // false
123 == null  // false

// It is often better to use strict comparison
0 === false // false
0 === null  // false
Loading history...
introduced by
Expected 1 space after "!"; 0 found
Loading history...
457
458 1
					$post_id = $gravityview_view->getPostId();
459
460
				} else {
461
462
					// This is a GravityView post type
463 3
					if( GravityView_frontend::getInstance()->isGravityviewPostType() ) {
464
465
						$post_id = isset( $gravityview_view ) ? $gravityview_view->getViewId() : $post->ID;
466
467
					} else {
468
469
						// This is an embedded GravityView; use the embedded post's ID as the base.
470 3
						if( GravityView_frontend::getInstance()->isPostHasShortcode() && is_a( $post, 'WP_Post' ) ) {
471
472
							$post_id = $post->ID;
473
474 3
						} elseif( $gravityview_view->getViewId() ) {
475
476
							// The GravityView has been embedded in a widget or in a template, and
477
							// is not in the current content. Thus, we defer to the View's own ID.
478 3
							$post_id = $gravityview_view->getViewId();
479
480
						}
481
482
					}
483
484
				}
485
			}
486
		}
487
488
		// No post ID, get outta here.
489 4
		if( empty( $post_id ) ) {
490
			return NULL;
0 ignored issues
show
Coding Style introduced by
TRUE, FALSE and NULL must be lowercase; expected null, but found NULL.
Loading history...
491
		}
492
493
		// If we've saved the permalink in memory, use it
494
		// @since 1.3
495 4
		$link = wp_cache_get( 'gv_directory_link_'.$post_id );
496
497 4
		if( empty( $link ) ) {
498
499 4
			$link = get_permalink( $post_id );
500
501
			// If not yet saved, cache the permalink.
502
			// @since 1.3
503 4
			wp_cache_set( 'gv_directory_link_'.$post_id, $link );
504
505
		}
506
507
		// Deal with returning to proper pagination for embedded views
508 4
		if( $link && $add_query_args ) {
509
510 4
			$args = array();
511
512 4
			if( $pagenum = rgget('pagenum') ) {
0 ignored issues
show
Coding Style introduced by
Expected 1 spaces after opening bracket; 0 found
Loading history...
Coding Style introduced by
Expected 1 spaces before closing bracket; 0 found
Loading history...
513 1
				$args['pagenum'] = intval( $pagenum );
514
			}
515
516 4
			if( $sort = rgget('sort') ) {
0 ignored issues
show
Coding Style introduced by
Expected 1 spaces after opening bracket; 0 found
Loading history...
Coding Style introduced by
Expected 1 spaces before closing bracket; 0 found
Loading history...
517
				$args['sort'] = $sort;
518
				$args['dir'] = rgget('dir');
0 ignored issues
show
Coding Style introduced by
Expected 1 spaces after opening bracket; 0 found
Loading history...
Coding Style introduced by
Expected 1 spaces before closing bracket; 0 found
Loading history...
519
			}
520
521 4
			$link = add_query_arg( $args, $link );
522
		}
523
524
		/**
525
		 * @filter `gravityview_directory_link` Modify the URL to the View "directory" context
526
		 * @since 1.19.4
527
		 * @param string $link URL to the View's "directory" context (Multiple Entries screen)
528
		 * @param int $post_id ID of the post to link to. If the View is embedded, it is the post or page ID
529
		 */
530 4
		$link = apply_filters( 'gravityview_directory_link', $link, $post_id );
531
532 4
		return $link;
533
	}
534
535
	/**
536
	 * Calculate an *unique* hash for an entry based on the entry ID
537
	 *
538
	 * This allows you to be more discrete as to the number of the entry - if you don't want users to know that you have made a certain number of sales, for example, or that their entry in the giveaway is entry #3.
539
	 *
540
	 * The hashed value MUST be unique, otherwise multiple entries will share the same URL, which leads to obvious problems.
541
	 *
542
	 * @param  int|string $id Entry ID to generate the hash for.
543
	 * @param  array  $entry        Entry data passed to provide additional information when generating the hash. Optional - don't rely on it being available.
544
	 * @return string               Hashed unique value for entry
545
	 */
546
	private static function get_custom_entry_slug( $id, $entry = array() ) {
547
548
		// Generate an unique hash to use as the default value
549
		$slug = substr( wp_hash( $id, 'gravityview'.$id ), 0, 8 );
550
551
		/**
552
		 * @filter `gravityview_entry_slug` Modify the unique hash ID generated, if you want to improve usability or change the format. This will allow for custom URLs, such as `{entryid}-{first-name}` or even, if unique, `{first-name}-{last-name}`
553
		 * @param string $hash Existing hash generated by GravityView
554
		 * @param  string $id The entry ID
555
		 * @param  array $entry Entry data array. May be empty.
556
		 */
557
		$slug = apply_filters( 'gravityview_entry_slug', $slug, $id, $entry );
558
559
		// Make sure we have something - use the original ID as backup.
560
		if( empty( $slug ) ) {
561
			$slug = $id;
562
		}
563
564
		return sanitize_title( $slug );
565
	}
566
567
	/**
568
	 * Get the entry slug for the entry. By default, it is the entry ID.
569
	 *
570
	 *
571
	 * @see gravityview_get_entry()
572
	 * @uses GravityView_API::get_custom_entry_slug() If using custom slug, gets the custom slug value
573
	 * @since 1.4
574
	 * @param  int|string $id_or_string ID of the entry, or custom slug string
575
	 * @param  array  $entry        Gravity Forms Entry array, optional. Used only to provide data to customize the `gravityview_entry_slug` filter
576
	 * @return string               Unique slug ID, passed through `sanitize_title()`
577
	 */
578 3
	public static function get_entry_slug( $id_or_string, $entry = array() ) {
579
580
		/**
581
		 * Default: use the entry ID as the unique identifier
582
		 */
583 3
		$slug = $id_or_string;
584
585
		/**
586
		 * @filter `gravityview_custom_entry_slug` Whether to enable and use custom entry slugs.
587
		 * @param boolean True: Allow for slugs based on entry values. False: always use entry IDs (default)
588
		 */
589 3
		$custom = apply_filters('gravityview_custom_entry_slug', false );
0 ignored issues
show
Coding Style introduced by
Expected 1 spaces after opening bracket; 0 found
Loading history...
590
591
		// If we're using custom slug...
592 3
		if ( $custom ) {
593
594
			// Get the entry hash
595
			$hash = self::get_custom_entry_slug( $id_or_string, $entry );
596
597
			// See if the entry already has a hash set
598
			$value = gform_get_meta( $id_or_string, 'gravityview_unique_id' );
599
600
			// If it does have a hash set, and the hash is expected, use it.
601
			// This check allows users to change the hash structure using the
602
			// gravityview_entry_hash filter and have the old hashes expire.
603
			if( empty( $value ) || $value !== $hash ) {
604
				do_action( 'gravityview_log_debug', __METHOD__ . ' - Setting hash for entry "'.$id_or_string.'": ' . $hash );
605
				gform_update_meta( $id_or_string, 'gravityview_unique_id', $hash, rgar( $entry, 'form_id' ) );
606
			}
607
608
			$slug = $hash;
609
610
			unset( $value, $hash );
611
		}
612
613 3
		return sanitize_title( $slug );
614
	}
615
616
    /**
617
     * If using the entry custom slug feature, make sure the new entries have the custom slug created and saved as meta
618
     *
619
     * Triggered by add_action( 'gform_entry_created', array( 'GravityView_API', 'entry_create_custom_slug' ), 10, 2 );
620
     *
621
     * @param $entry array Gravity Forms entry object
622
     * @param $form array Gravity Forms form object
623
     */
624
    public static function entry_create_custom_slug( $entry, $form ) {
0 ignored issues
show
Unused Code introduced by
The parameter $form is not used and could be removed.

This check looks from parameters that have been defined for a function or method, but which are not used in the method body.

Loading history...
625
        /**
626
         * @filter `gravityview_custom_entry_slug` On entry creation, check if we are using the custom entry slug feature and update the meta
627
         * @param boolean $custom Should we process the custom entry slug?
628
         */
629
        $custom = apply_filters( 'gravityview_custom_entry_slug', false );
630
        if( $custom ) {
631
            // create the gravityview_unique_id and save it
632
633
            // Get the entry hash
634
            $hash = self::get_custom_entry_slug( $entry['id'], $entry );
635
636
	        do_action( 'gravityview_log_debug', __METHOD__ . ' - Setting hash for entry "'.$entry['id'].'": ' . $hash );
637
638
            gform_update_meta( $entry['id'], 'gravityview_unique_id', $hash, rgar( $entry, 'form_id' ) );
639
640
        }
641
    }
642
643
644
645
646
	/**
647
	 * return href for single entry
648
	 * @param  array|int $entry   Entry array or entry ID
649
	 * @param  int|null $post_id If wanting to define the parent post, pass a post ID
650
	 * @param boolean $add_directory_args True: Add args to help return to directory; False: only include args required to get to entry {@since 1.7.3}
651
	 * @return string          Link to the entry with the directory parent slug
652
	 */
653 1
	public static function entry_link( $entry, $post_id = NULL, $add_directory_args = true ) {
0 ignored issues
show
Coding Style introduced by
TRUE, FALSE and NULL must be lowercase; expected null, but found NULL.
Loading history...
654
655 1
		if( ! empty( $entry ) && ! is_array( $entry ) ) {
656
			$entry = GVCommon::get_entry( $entry );
657 1
		} else if( empty( $entry ) ) {
658
			$entry = GravityView_frontend::getInstance()->getEntry();
659
		}
660
661
		// Second parameter used to be passed as $field; this makes sure it's not an array
662 1
		if( !is_numeric( $post_id ) ) {
0 ignored issues
show
introduced by
Expected 1 space after "!"; 0 found
Loading history...
663
			$post_id = NULL;
0 ignored issues
show
Coding Style introduced by
TRUE, FALSE and NULL must be lowercase; expected null, but found NULL.
Loading history...
664
		}
665
666
		// Get the permalink to the View
667 1
		$directory_link = self::directory_link( $post_id, false );
668
669
		// No post ID? Get outta here.
670 1
		if( empty( $directory_link ) ) {
671
			return '';
672
		}
673
674 1
		if ( defined( 'GRAVITYVIEW_FUTURE_CORE_LOADED' ) ) {
675 1
			$query_arg_name = \GV\Entry::get_endpoint_name();
676
		} else {
677
			/** Deprecated. Use \GV\Entry::get_endpoint_name instead. */
678
			$query_arg_name = GravityView_Post_Types::get_entry_var_name();
0 ignored issues
show
Deprecated Code introduced by
The method GravityView_Post_Types::get_entry_var_name() has been deprecated.

This method has been deprecated.

Loading history...
679
		}
680
681 1
		$entry_slug = self::get_entry_slug( $entry['id'], $entry );
682
683 1
		if( get_option('permalink_structure') && !is_preview() ) {
0 ignored issues
show
Coding Style introduced by
Expected 1 spaces after opening bracket; 0 found
Loading history...
Coding Style introduced by
Expected 1 spaces before closing bracket; 0 found
Loading history...
introduced by
Expected 1 space after "!"; 0 found
Loading history...
684
685
			$args = array();
686
687
			/**
688
			 * Make sure the $directory_link doesn't contain any query otherwise it will break when adding the entry slug.
689
			 * @since 1.16.5
690
			 */
691
			$link_parts = explode( '?', $directory_link );
692
693
			$query = !empty( $link_parts[1] ) ? '?'.$link_parts[1] : '';
0 ignored issues
show
introduced by
Expected 1 space after "!"; 0 found
Loading history...
694
695
			$directory_link = trailingslashit( $link_parts[0] ) . $query_arg_name . '/'. $entry_slug .'/' . $query;
696
697
		} else {
698
699 1
			$args = array( $query_arg_name => $entry_slug );
700
		}
701
702
		/**
703
		 * @since 1.7.3
704
		 */
705 1
		if( $add_directory_args ) {
706
707 1
			if( !empty( $_GET['pagenum'] ) ) {
0 ignored issues
show
introduced by
Expected 1 space after "!"; 0 found
Loading history...
708
				$args['pagenum'] = intval( $_GET['pagenum'] );
0 ignored issues
show
introduced by
Detected access of super global var $_GET, probably need manual inspection.
Loading history...
709
			}
710
711
			/**
712
			 * @since 1.7
713
			 */
714 1
			if( $sort = rgget('sort') ) {
0 ignored issues
show
Coding Style introduced by
Expected 1 spaces after opening bracket; 0 found
Loading history...
Coding Style introduced by
Expected 1 spaces before closing bracket; 0 found
Loading history...
715
				$args['sort'] = $sort;
716
				$args['dir'] = rgget('dir');
0 ignored issues
show
Coding Style introduced by
Expected 1 spaces after opening bracket; 0 found
Loading history...
Coding Style introduced by
Expected 1 spaces before closing bracket; 0 found
Loading history...
717
			}
718
719
		}
720
721
		/**
722
		 * Check if we have multiple views embedded in the same page and in that case make sure the single entry link
723
		 * has the view id so that Advanced Filters can be applied correctly when rendering the single view
724
		 * @see GravityView_frontend::get_context_view_id()
725
		 */
726 1
		if ( defined( 'GRAVITYVIEW_FUTURE_CORE_LOADED' ) ) {
727 1
			if ( gravityview()->views->count() > 1 ) {
0 ignored issues
show
Documentation introduced by
The property views does not exist on object<GV\Core>. Since you implemented __get, maybe consider adding a @property annotation.

Since your code implements the magic getter _get, this function will be called for any read access on an undefined variable. You can add the @property annotation to your class or interface to document the existence of this variable.

<?php

/**
 * @property int $x
 * @property int $y
 * @property string $text
 */
class MyLabel
{
    private $properties;

    private $allowedProperties = array('x', 'y', 'text');

    public function __get($name)
    {
        if (isset($properties[$name]) && in_array($name, $this->allowedProperties)) {
            return $properties[$name];
        } else {
            return null;
        }
    }

    public function __set($name, $value)
    {
        if (in_array($name, $this->allowedProperties)) {
            $properties[$name] = $value;
        } else {
            throw new \LogicException("Property $name is not defined.");
        }
    }

}

If the property has read access only, you can use the @property-read annotation instead.

Of course, you may also just have mistyped another name, in which case you should fix the error.

See also the PhpDoc documentation for @property.

Loading history...
728 1
				$args['gvid'] = gravityview_get_view_id();
729
			}
730
		} else {
731
			/** Deprecated, do not use has_multiple_views(), please. */
732
			if ( class_exists( 'GravityView_View_Data' ) && GravityView_View_Data::getInstance()->has_multiple_views() ) {
0 ignored issues
show
Deprecated Code introduced by
The method GravityView_View_Data::has_multiple_views() has been deprecated.

This method has been deprecated.

Loading history...
733
				$args['gvid'] = gravityview_get_view_id();
734
			}
735
		}
736
737 1
		return add_query_arg( $args, $directory_link );
738
739
	}
740
741
742
}
743
744
745
// inside loop functions
746
747
function gv_label( $field, $entry = NULL ) {
0 ignored issues
show
Coding Style introduced by
TRUE, FALSE and NULL must be lowercase; expected null, but found NULL.
Loading history...
748
	return GravityView_API::field_label( $field, $entry );
749
}
750
751
function gv_class( $field, $form = NULL, $entry = array() ) {
0 ignored issues
show
Coding Style introduced by
TRUE, FALSE and NULL must be lowercase; expected null, but found NULL.
Loading history...
752
	return GravityView_API::field_class( $field, $form, $entry  );
0 ignored issues
show
Coding Style introduced by
Expected 1 spaces before closing bracket; 2 found
Loading history...
753
}
754
755
/**
756
 * Generate a CSS class to be added to the wrapper <div> of a View
757
 *
758
 * @since 1.5.4
759
 * @since 1.16 Added $echo param
760
 *
761
 * @param string $passed_css_class Default: `gv-container gv-container-{view id}`. If View is hidden until search, adds ` hidden`
762
 * @param boolean $echo Whether to echo the output. Default: true
763
 *
764
 * @return string CSS class, sanitized by gravityview_sanitize_html_class()
765
 */
766
function gv_container_class( $passed_css_class = '', $echo = true ) {
767
768 1
	$passed_css_class = trim( $passed_css_class );
769
770 1
	$view_id = GravityView_View::getInstance()->getViewId();
771
772 1
	$default_css_class = ! empty( $view_id ) ? sprintf( 'gv-container gv-container-%d', $view_id ) : 'gv-container';
773
774 1
	if( GravityView_View::getInstance()->isHideUntilSearched() ) {
775 1
		$default_css_class .= ' hidden';
776
	}
777
778 1
	if( 0 === GravityView_View::getInstance()->getTotalEntries() ) {
779 1
		$default_css_class .= ' gv-container-no-results';
780
	}
781
782 1
	$css_class = trim( $passed_css_class . ' '. $default_css_class );
783
784
	/**
785
	 * @filter `gravityview/render/container/class` Modify the CSS class to be added to the wrapper <div> of a View
786
	 * @since 1.5.4
787
	 * @param[in,out] string $css_class Default: `gv-container gv-container-{view id}`. If View is hidden until search, adds ` hidden`. If the View has no results, adds `gv-container-no-results`
788
	 */
789 1
	$css_class = apply_filters( 'gravityview/render/container/class', $css_class );
790
791 1
	$css_class = gravityview_sanitize_html_class( $css_class );
792
793 1
	if( $echo ) {
794 1
		echo $css_class;
0 ignored issues
show
introduced by
Expected next thing to be a escaping function, not '$css_class'
Loading history...
795
	}
796
797 1
	return $css_class;
798
}
799
800
function gv_value( $entry, $field ) {
801
802
	$value = GravityView_API::field_value( $entry, $field );
803
804
	if( $value === '' ) {
805
		/**
806
		 * @filter `gravityview_empty_value` What to display when a field is empty
807
		 * @param string $value (empty string)
808
		 */
809
		$value = apply_filters( 'gravityview_empty_value', '' );
810
	}
811
812
	return $value;
813
}
814
815
function gv_directory_link( $post = NULL, $add_pagination = true ) {
0 ignored issues
show
introduced by
Overridding WordPress globals is prohibited
Loading history...
Coding Style introduced by
TRUE, FALSE and NULL must be lowercase; expected null, but found NULL.
Loading history...
816
	return GravityView_API::directory_link( $post, $add_pagination );
817
}
818
819
function gv_entry_link( $entry, $post_id = NULL ) {
0 ignored issues
show
Coding Style introduced by
TRUE, FALSE and NULL must be lowercase; expected null, but found NULL.
Loading history...
820
	return GravityView_API::entry_link( $entry, $post_id );
821
}
822
823
function gv_no_results($wpautop = true) {
824
	return GravityView_API::no_results( $wpautop );
825
}
826
827
/**
828
 * Generate HTML for the back link from single entry view
829
 * @since 1.0.1
830
 * @return string|null      If no GV post exists, null. Otherwise, HTML string of back link.
831
 */
832
function gravityview_back_link() {
833
834
	$href = gv_directory_link();
835
836
	/**
837
	 * @filter `gravityview_go_back_url` Modify the back link URL
838
	 * @since 1.17.5
839
	 * @see gv_directory_link() Generated the original back link
840
	 * @param string $href Existing label URL
841
	 */
842
	$href = apply_filters( 'gravityview_go_back_url', $href );
843
844
	if( empty( $href ) ) { return NULL; }
0 ignored issues
show
Coding Style introduced by
TRUE, FALSE and NULL must be lowercase; expected null, but found NULL.
Loading history...
845
846
	// calculate link label
847
	$gravityview_view = GravityView_View::getInstance();
848
849
	$label = $gravityview_view->getBackLinkLabel() ? $gravityview_view->getBackLinkLabel() : __( '&larr; Go back', 'gravityview' );
850
851
	/**
852
	 * @filter `gravityview_go_back_label` Modify the back link text
853
	 * @since 1.0.9
854
	 * @param string $label Existing label text
855
	 */
856
	$label = apply_filters( 'gravityview_go_back_label', $label );
857
858
	$link = gravityview_get_link( $href, esc_html( $label ), array(
859
		'data-viewid' => $gravityview_view->getViewId()
860
	));
861
862
	return $link;
863
}
864
865
/**
866
 * Handle getting values for complex Gravity Forms fields
867
 *
868
 * If the field is complex, like a product, the field ID, for example, 11, won't exist. Instead,
869
 * it will be 11.1, 11.2, and 11.3. This handles being passed 11 and 11.2 with the same function.
870
 *
871
 * @since 1.0.4
872
 * @param  array      $entry    GF entry array
873
 * @param  string      $field_id [description]
874
 * @param  string 	$display_value The value generated by Gravity Forms
875
 * @return string                Value
876
 */
877
function gravityview_get_field_value( $entry, $field_id, $display_value ) {
878
879
	if( floatval( $field_id ) === floor( floatval( $field_id ) ) ) {
880
881
		// For the complete field value as generated by Gravity Forms
882
		return $display_value;
883
884
	} else {
885
886
		// For one part of the address (City, ZIP, etc.)
887
		return isset( $entry[ $field_id ] ) ? $entry[ $field_id ] : '';
888
889
	}
890
891
}
892
893
/**
894
 * Take a passed CSV of terms and generate a linked list of terms
895
 *
896
 * Gravity Forms passes categories as "Name:ID" so we handle that using the ID, which
897
 * is more accurate than checking the name, which is more likely to change.
898
 *
899
 * @param  string      $value    Existing value
900
 * @param  string      $taxonomy Type of term (`post_tag` or `category`)
901
 * @return string                CSV of linked terms
902
 */
903
function gravityview_convert_value_to_term_list( $value, $taxonomy = 'post_tag' ) {
904
905
	$output = array();
906
907
	$terms = explode( ', ', $value );
908
909
	foreach ($terms as $term_name ) {
0 ignored issues
show
introduced by
No space after opening parenthesis is prohibited
Loading history...
910
911
		// If we're processing a category,
912
		if( $taxonomy === 'category' ) {
0 ignored issues
show
introduced by
Found "=== '". Use Yoda Condition checks, you must
Loading history...
913
914
			// Use rgexplode to prevent errors if : doesn't exist
915
			list( $term_name, $term_id ) = rgexplode( ':', $value, 2 );
916
917
			// The explode was succesful; we have the category ID
918
			if( !empty( $term_id )) {
0 ignored issues
show
introduced by
Expected 1 space after "!"; 0 found
Loading history...
introduced by
No space before closing parenthesis is prohibited
Loading history...
919
				$term = get_term_by( 'id', $term_id, $taxonomy );
920
			} else {
921
			// We have to fall back to the name
922
				$term = get_term_by( 'name', $term_name, $taxonomy );
923
			}
924
925
		} else {
926
			// Use the name of the tag to get the full term information
927
			$term = get_term_by( 'name', $term_name, $taxonomy );
928
		}
929
930
		// There's still a tag/category here.
931
		if( $term ) {
932
933
			$term_link = get_term_link( $term, $taxonomy );
934
935
			// If there was an error, continue to the next term.
936
			if ( is_wp_error( $term_link ) ) {
937
			    continue;
938
			}
939
940
			$output[] = gravityview_get_link( $term_link, esc_html( $term->name ) );
941
		}
942
	}
943
944
	return implode(', ', $output );
0 ignored issues
show
Coding Style introduced by
Expected 1 spaces after opening bracket; 0 found
Loading history...
945
}
946
947
/**
948
 * Get the links for post_tags and post_category output based on post ID
949
 * @param  int      $post_id  The ID of the post
950
 * @param  boolean     $link     Add links or no?
951
 * @param  string      $taxonomy Taxonomy of term to fetch.
952
 * @return string                String with terms
953
 */
954
function gravityview_get_the_term_list( $post_id, $link = true, $taxonomy = 'post_tag' ) {
955
956
	$output = get_the_term_list( $post_id, $taxonomy, NULL, ', ' );
0 ignored issues
show
Coding Style introduced by
TRUE, FALSE and NULL must be lowercase; expected null, but found NULL.
Loading history...
957
958
	if( empty( $link ) ) {
959
		return strip_tags( $output);
0 ignored issues
show
Coding Style introduced by
Expected 1 spaces before closing bracket; 0 found
Loading history...
960
	}
961
962
	return $output;
963
964
}
965
966
967
/**
968
 * Get all views processed so far for the current page load
969
 *
970
 * @see  GravityView_View_Data::add_view()
971
 * @return array Array of View data, each View data with `id`, `view_id`, `form_id`, `template_id`, `atts`, `fields`, `widgets`, `form` keys.
972
 */
973
function gravityview_get_current_views() {
974
975 1
	$fe = GravityView_frontend::getInstance();
976
977
	// Solve problem when loading content via admin-ajax.php
978 1
	if( ! $fe->getGvOutputData() ) {
979
980 1
		do_action( 'gravityview_log_debug', '[gravityview_get_current_views] gv_output_data not defined; parsing content.' );
981
982 1
		$fe->parse_content();
983
	}
984
985
	// Make 100% sure that we're dealing with a properly called situation
986 1
	if( !is_a( $fe->getGvOutputData(), 'GravityView_View_Data' ) ) {
0 ignored issues
show
introduced by
Expected 1 space after "!"; 0 found
Loading history...
987
988
		do_action( 'gravityview_log_debug', '[gravityview_get_current_views] gv_output_data not an object or get_view not callable.', $fe->getGvOutputData() );
989
990
		return array();
991
	}
992
993 1
	if ( defined( 'GRAVITYVIEW_FUTURE_CORE_LOADED' ) ) {
994 1
		if ( ! gravityview()->views->count() ) {
0 ignored issues
show
Documentation introduced by
The property views does not exist on object<GV\Core>. Since you implemented __get, maybe consider adding a @property annotation.

Since your code implements the magic getter _get, this function will be called for any read access on an undefined variable. You can add the @property annotation to your class or interface to document the existence of this variable.

<?php

/**
 * @property int $x
 * @property int $y
 * @property string $text
 */
class MyLabel
{
    private $properties;

    private $allowedProperties = array('x', 'y', 'text');

    public function __get($name)
    {
        if (isset($properties[$name]) && in_array($name, $this->allowedProperties)) {
            return $properties[$name];
        } else {
            return null;
        }
    }

    public function __set($name, $value)
    {
        if (in_array($name, $this->allowedProperties)) {
            $properties[$name] = $value;
        } else {
            throw new \LogicException("Property $name is not defined.");
        }
    }

}

If the property has read access only, you can use the @property-read annotation instead.

Of course, you may also just have mistyped another name, in which case you should fix the error.

See also the PhpDoc documentation for @property.

Loading history...
995
			return array();
996
		}
997 1
		return array_combine(
998
			array_map( function ( $view ) { return $view->ID; }, gravityview()->views->all() ),
0 ignored issues
show
Documentation introduced by
The property views does not exist on object<GV\Core>. Since you implemented __get, maybe consider adding a @property annotation.

Since your code implements the magic getter _get, this function will be called for any read access on an undefined variable. You can add the @property annotation to your class or interface to document the existence of this variable.

<?php

/**
 * @property int $x
 * @property int $y
 * @property string $text
 */
class MyLabel
{
    private $properties;

    private $allowedProperties = array('x', 'y', 'text');

    public function __get($name)
    {
        if (isset($properties[$name]) && in_array($name, $this->allowedProperties)) {
            return $properties[$name];
        } else {
            return null;
        }
    }

    public function __set($name, $value)
    {
        if (in_array($name, $this->allowedProperties)) {
            $properties[$name] = $value;
        } else {
            throw new \LogicException("Property $name is not defined.");
        }
    }

}

If the property has read access only, you can use the @property-read annotation instead.

Of course, you may also just have mistyped another name, in which case you should fix the error.

See also the PhpDoc documentation for @property.

Loading history...
999
			array_map( function ( $view ) { return $view->as_data(); }, gravityview()->views->all() )
0 ignored issues
show
Documentation introduced by
The property views does not exist on object<GV\Core>. Since you implemented __get, maybe consider adding a @property annotation.

Since your code implements the magic getter _get, this function will be called for any read access on an undefined variable. You can add the @property annotation to your class or interface to document the existence of this variable.

<?php

/**
 * @property int $x
 * @property int $y
 * @property string $text
 */
class MyLabel
{
    private $properties;

    private $allowedProperties = array('x', 'y', 'text');

    public function __get($name)
    {
        if (isset($properties[$name]) && in_array($name, $this->allowedProperties)) {
            return $properties[$name];
        } else {
            return null;
        }
    }

    public function __set($name, $value)
    {
        if (in_array($name, $this->allowedProperties)) {
            $properties[$name] = $value;
        } else {
            throw new \LogicException("Property $name is not defined.");
        }
    }

}

If the property has read access only, you can use the @property-read annotation instead.

Of course, you may also just have mistyped another name, in which case you should fix the error.

See also the PhpDoc documentation for @property.

Loading history...
1000
		);
1001
	}
1002
	/** \GravityView_View_Data::get_views is deprecated. */
1003
	return $fe->getGvOutputData()->get_views();
0 ignored issues
show
Deprecated Code introduced by
The method GravityView_View_Data::get_views() has been deprecated.

This method has been deprecated.

Loading history...
1004
}
1005
1006
/**
1007
 * Get data for a specific view
1008
 *
1009
 * @see  GravityView_View_Data::get_view()
1010
 * @return array View data with `id`, `view_id`, `form_id`, `template_id`, `atts`, `fields`, `widgets`, `form` keys.
1011
 */
1012
function gravityview_get_current_view_data( $view_id = 0 ) {
1013
1014
	$fe = GravityView_frontend::getInstance();
1015
1016
	// If not set, grab the current view ID
1017
	if ( empty( $view_id ) ) {
1018
		$view_id = $fe->get_context_view_id();
1019
	}
1020
1021
	if ( defined( 'GRAVITYVIEW_FUTURE_CORE_LOADED' ) ) {
1022
		$view = gravityview()->views->get( $view_id );
0 ignored issues
show
Documentation introduced by
The property views does not exist on object<GV\Core>. Since you implemented __get, maybe consider adding a @property annotation.

Since your code implements the magic getter _get, this function will be called for any read access on an undefined variable. You can add the @property annotation to your class or interface to document the existence of this variable.

<?php

/**
 * @property int $x
 * @property int $y
 * @property string $text
 */
class MyLabel
{
    private $properties;

    private $allowedProperties = array('x', 'y', 'text');

    public function __get($name)
    {
        if (isset($properties[$name]) && in_array($name, $this->allowedProperties)) {
            return $properties[$name];
        } else {
            return null;
        }
    }

    public function __set($name, $value)
    {
        if (in_array($name, $this->allowedProperties)) {
            $properties[$name] = $value;
        } else {
            throw new \LogicException("Property $name is not defined.");
        }
    }

}

If the property has read access only, you can use the @property-read annotation instead.

Of course, you may also just have mistyped another name, in which case you should fix the error.

See also the PhpDoc documentation for @property.

Loading history...
1023
		if ( ! $view ) {
1024
			/** Emulate the weird behavior of \GravityView_View_Data::get_view adding a view which wasn't there to begin with. */
1025
			gravityview()->views->add( \GV\View::by_id( $view_id ) );
0 ignored issues
show
Documentation introduced by
The property views does not exist on object<GV\Core>. Since you implemented __get, maybe consider adding a @property annotation.

Since your code implements the magic getter _get, this function will be called for any read access on an undefined variable. You can add the @property annotation to your class or interface to document the existence of this variable.

<?php

/**
 * @property int $x
 * @property int $y
 * @property string $text
 */
class MyLabel
{
    private $properties;

    private $allowedProperties = array('x', 'y', 'text');

    public function __get($name)
    {
        if (isset($properties[$name]) && in_array($name, $this->allowedProperties)) {
            return $properties[$name];
        } else {
            return null;
        }
    }

    public function __set($name, $value)
    {
        if (in_array($name, $this->allowedProperties)) {
            $properties[$name] = $value;
        } else {
            throw new \LogicException("Property $name is not defined.");
        }
    }

}

If the property has read access only, you can use the @property-read annotation instead.

Of course, you may also just have mistyped another name, in which case you should fix the error.

See also the PhpDoc documentation for @property.

Loading history...
1026
			$view = gravityview()->views->get( $view_id );
0 ignored issues
show
Documentation introduced by
The property views does not exist on object<GV\Core>. Since you implemented __get, maybe consider adding a @property annotation.

Since your code implements the magic getter _get, this function will be called for any read access on an undefined variable. You can add the @property annotation to your class or interface to document the existence of this variable.

<?php

/**
 * @property int $x
 * @property int $y
 * @property string $text
 */
class MyLabel
{
    private $properties;

    private $allowedProperties = array('x', 'y', 'text');

    public function __get($name)
    {
        if (isset($properties[$name]) && in_array($name, $this->allowedProperties)) {
            return $properties[$name];
        } else {
            return null;
        }
    }

    public function __set($name, $value)
    {
        if (in_array($name, $this->allowedProperties)) {
            $properties[$name] = $value;
        } else {
            throw new \LogicException("Property $name is not defined.");
        }
    }

}

If the property has read access only, you can use the @property-read annotation instead.

Of course, you may also just have mistyped another name, in which case you should fix the error.

See also the PhpDoc documentation for @property.

Loading history...
1027
		}
1028
		return $view ? $view->as_data() : array();
1029
	} else {
1030
		if ( ! $fe->getGvOutputData() ) { return array(); }
1031
1032
		return $fe->getGvOutputData()->get_view( $view_id );
0 ignored issues
show
Deprecated Code introduced by
The method GravityView_View_Data::get_view() has been deprecated.

This method has been deprecated.

Loading history...
1033
	}
1034
}
1035
1036
// Templates' hooks
1037
function gravityview_before() {
1038
	/**
1039
	 * @action `gravityview_before` Display content before a View. Used to render widget areas. Rendered outside the View container `<div>`
1040
	 * @param int $view_id The ID of the View being displayed
1041
	 */
1042
	do_action( 'gravityview_before', gravityview_get_view_id() );
1043
}
1044
1045
function gravityview_header() {
1046
	/**
1047
	 * @action `gravityview_header` Prepend content to the View container `<div>`
1048
	 * @param int $view_id The ID of the View being displayed
1049
	 */
1050
	do_action( 'gravityview_header', gravityview_get_view_id() );
1051
}
1052
1053
function gravityview_footer() {
1054
	/**
1055
	 * @action `gravityview_after` Display content after a View. Used to render footer widget areas. Rendered outside the View container `<div>`
1056
	 * @param int $view_id The ID of the View being displayed
1057
	 */
1058
	do_action( 'gravityview_footer', gravityview_get_view_id() );
1059
}
1060
1061
function gravityview_after() {
1062
	/**
1063
	 * @action `gravityview_after` Append content to the View container `<div>`
1064
	 * @param int $view_id The ID of the View being displayed
1065
	 */
1066
	do_action( 'gravityview_after', gravityview_get_view_id() );
1067
}
1068
1069
/**
1070
 * Get the current View ID being rendered
1071
 *
1072
 * @global GravityView_View $gravityview_view
1073
 * @return string View context "directory" or "single"
1074
 */
1075
function gravityview_get_view_id() {
1076
	return GravityView_View::getInstance()->getViewId();
1077
}
1078
1079
/**
1080
 * @global GravityView_View $gravityview_view
1081
 * @return string View context "directory", "single", or "edit"
1082
 */
1083
function gravityview_get_context() {
1084
1085
	$context = '';
1086
1087
	/**
1088
	 * @filter `gravityview_is_edit_entry` Whether we're currently on the Edit Entry screen \n
1089
	 * The Edit Entry functionality overrides this value.
1090
	 * @param boolean $is_edit_entry
1091
	 */
1092
	$is_edit_entry = apply_filters( 'gravityview_is_edit_entry', false );
1093
1094
	if( $is_edit_entry ) {
1095
		$context = 'edit';
1096
	} else if( class_exists( 'GravityView_frontend' ) && $single = GravityView_frontend::is_single_entry() ) {
1097
		$context = 'single';
1098
	} else if( class_exists( 'GravityView_View' ) ) {
1099
		$context = GravityView_View::getInstance()->getContext();
1100
	}
1101
1102
	return $context;
1103
}
1104
1105
1106
/**
1107
 * Return an array of files prepared for output. Wrapper for GravityView_Field_FileUpload::get_files_array()
1108
 *
1109
 * Processes files by file type and generates unique output for each.
1110
 *
1111
 * Returns array for each file, with the following keys:
1112
 *
1113
 * `file_path` => The file path of the file, with a line break
1114
 * `html` => The file output HTML formatted
1115
 *
1116
 * @see GravityView_Field_FileUpload::get_files_array()
1117
 *
1118
 * @since  1.2
1119
 * @param  string $value    Field value passed by Gravity Forms. String of file URL, or serialized string of file URL array
1120
 * @param  string $gv_class Field class to add to the output HTML
1121
 * @return array           Array of file output, with `file_path` and `html` keys (see comments above)
1122
 */
1123
function gravityview_get_files_array( $value, $gv_class = '' ) {
1124
	/** @define "GRAVITYVIEW_DIR" "../" */
1125
1126
	if( !class_exists( 'GravityView_Field' ) ) {
0 ignored issues
show
introduced by
Expected 1 space after "!"; 0 found
Loading history...
1127
		include_once( GRAVITYVIEW_DIR .'includes/fields/class-gravityview-field.php' );
1128
	}
1129
1130
	if( !class_exists( 'GravityView_Field_FileUpload' ) ) {
0 ignored issues
show
introduced by
Expected 1 space after "!"; 0 found
Loading history...
1131
		include_once( GRAVITYVIEW_DIR .'includes/fields/fileupload.php' );
1132
	}
1133
1134
	return GravityView_Field_FileUpload::get_files_array( $value, $gv_class );
1135
}
1136
1137
/**
1138
 * Generate a mapping link from an address
1139
 *
1140
 * The address should be plain text with new line (`\n`) or `<br />` line breaks separating sections
1141
 *
1142
 * @todo use GF's field get_export_value() instead
1143
 *
1144
 * @see https://gravityview.co/support/documentation/201608159 Read how to modify the link
1145
 * @param  string $address Address
1146
 * @return string          URL of link to map of address
1147
 */
1148
function gravityview_get_map_link( $address ) {
1149
1150
	$address_qs = str_replace( array( '<br />', "\n" ), ' ', $address ); // Replace \n with spaces
1151
	$address_qs = urlencode( $address_qs );
1152
1153
	$url = "https://maps.google.com/maps?q={$address_qs}";
1154
1155
	$link_text = esc_html__( 'Map It', 'gravityview' );
1156
1157
	$link = gravityview_get_link( $url, $link_text, 'class=map-it-link' );
1158
1159
	/**
1160
	 * @filter `gravityview_map_link` Modify the map link generated. You can use a different mapping service, for example.
1161
	 * @param[in,out]  string $link Map link
1162
	 * @param[in] string $address Address to generate link for
1163
	 * @param[in] string $url URL generated by the function
1164
	 */
1165
	$link = apply_filters( 'gravityview_map_link', $link, $address, $url );
1166
1167
	return $link;
1168
}
1169
1170
1171
/**
1172
 * Output field based on a certain html markup
1173
 *
1174
 *   markup - string to be used on a sprintf statement.
1175
 *      Use:
1176
 *         {{label}} - field label
1177
 *         {{value}} - entry field value
1178
 *         {{class}} - field class
1179
 *
1180
 *   wpautop - true will filter the value using wpautop function
1181
 *
1182
 * @since  1.1.5
1183
 * @param  array $passed_args Associative array with field data. `field` and `form` are required.
1184
 * @return string Field output. If empty value and hide empty is true, return empty.
1185
 */
1186
function gravityview_field_output( $passed_args ) {
1187
	$defaults = array(
1188
		'entry' => null,
1189
		'field' => null,
1190
		'form' => null,
1191
		'hide_empty' => true,
1192
		'markup' => '<div id="{{ field_id }}" class="{{ class }}">{{label}}{{value}}</div>',
1193
		'label_markup' => '',
1194
		'wpautop' => false,
1195
		'zone_id' => null,
1196
	);
1197
1198
	$args = wp_parse_args( $passed_args, $defaults );
1199
1200
	/**
1201
	 * @filter `gravityview/field_output/args` Modify the args before generation begins
1202
	 * @since 1.7
1203
	 * @param array $args Associative array; `field` and `form` is required.
1204
	 * @param array $passed_args Original associative array with field data. `field` and `form` are required.
1205
	 */
1206
	$args = apply_filters( 'gravityview/field_output/args', $args, $passed_args );
1207
1208
	// Required fields.
1209
	if ( empty( $args['field'] ) || empty( $args['form'] ) ) {
1210
		do_action( 'gravityview_log_error', '[gravityview_field_output] Field or form are empty.', $args );
1211
		return '';
1212
	}
1213
1214
	$entry = empty( $args['entry'] ) ? array() : $args['entry'];
1215
1216
	/**
1217
	 * Create the content variables for replacing.
1218
	 * @since 1.11
1219
	 */
1220
	$context = array(
1221
		'value' => '',
1222
		'width' => '',
1223
		'width:style' => '',
1224
		'label' => '',
1225
		'label_value' => '',
1226
		'class' => '',
1227
		'field_id' => '',
1228
	);
1229
1230
	$context['value'] = gv_value( $entry, $args['field'] );
1231
1232
	// If the value is empty and we're hiding empty, return empty.
1233
	if ( $context['value'] === '' && ! empty( $args['hide_empty'] ) ) {
1234
		return '';
1235
	}
1236
1237
	if ( $context['value'] !== '' && ! empty( $args['wpautop'] ) ) {
1238
		$context['value'] = wpautop( $context['value'] );
1239
	}
1240
1241
	// Get width setting, if exists
1242
	$context['width'] = GravityView_API::field_width( $args['field'] );
1243
1244
	// If replacing with CSS inline formatting, let's do it.
1245
	$context['width:style'] = GravityView_API::field_width( $args['field'], 'width:' . $context['width'] . '%;' );
1246
1247
	// Grab the Class using `gv_class`
1248
	$context['class'] = gv_class( $args['field'], $args['form'], $entry );
1249
	$context['field_id'] = GravityView_API::field_html_attr_id( $args['field'], $args['form'], $entry );
1250
1251
	// Get field label if needed
1252
	if ( ! empty( $args['label_markup'] ) && ! empty( $args['field']['show_label'] ) ) {
1253
		$context['label'] = str_replace( array( '{{label}}', '{{ label }}' ), '<span class="gv-field-label">{{ label_value }}</span>', $args['label_markup'] );
1254
	}
1255
1256
	// Default Label value
1257
	$context['label_value'] = gv_label( $args['field'], $entry );
1258
1259
	if ( empty( $context['label'] ) && ! empty( $context['label_value'] ) ){
1260
		$context['label'] = '<span class="gv-field-label">{{ label_value }}</span>';
1261
	}
1262
1263
	/**
1264
	 * @filter `gravityview/field_output/pre_html` Allow Pre filtering of the HTML
1265
	 * @since 1.11
1266
	 * @param string $markup The HTML for the markup
1267
	 * @param array $args All args for the field output
1268
	 */
1269
	$html = apply_filters( 'gravityview/field_output/pre_html', $args['markup'], $args );
1270
1271
	/**
1272
	 * @filter `gravityview/field_output/open_tag` Modify the opening tags for the template content placeholders
1273
	 * @since 1.11
1274
	 * @param string $open_tag Open tag for template content placeholders. Default: `{{`
1275
	 */
1276
	$open_tag = apply_filters( 'gravityview/field_output/open_tag', '{{', $args );
1277
1278
	/**
1279
	 * @filter `gravityview/field_output/close_tag` Modify the closing tags for the template content placeholders
1280
	 * @since 1.11
1281
	 * @param string $close_tag Close tag for template content placeholders. Default: `}}`
1282
	 */
1283
	$close_tag = apply_filters( 'gravityview/field_output/close_tag', '}}', $args );
1284
1285
	/**
1286
	 * Loop through each of the tags to replace and replace both `{{tag}}` and `{{ tag }}` with the values
1287
	 * @since 1.11
1288
	 */
1289
	foreach ( $context as $tag => $value ) {
1290
1291
		// If the tag doesn't exist just skip it
1292
		if ( false === strpos( $html, $open_tag . $tag . $close_tag ) && false === strpos( $html, $open_tag . ' ' . $tag . ' ' . $close_tag ) ){
1293
			continue;
1294
		}
1295
1296
		// Array to search
1297
		$search = array(
1298
			$open_tag . $tag . $close_tag,
1299
			$open_tag . ' ' . $tag . ' ' . $close_tag,
1300
		);
1301
1302
		/**
1303
		 * `gravityview/field_output/context/{$tag}` Allow users to filter content on context
1304
		 * @since 1.11
1305
		 * @param string $value The content to be shown instead of the {{tag}} placeholder
1306
		 * @param array $args Arguments passed to the function
1307
		 */
1308
		$value = apply_filters( 'gravityview/field_output/context/' . $tag, $value, $args );
1309
1310
		// Finally do the replace
1311
		$html = str_replace( $search, $value, $html );
1312
	}
1313
1314
	/**
1315
	 * @todo  Depricate `gravityview_field_output`
1316
	 */
1317
	$html = apply_filters( 'gravityview_field_output', $html, $args );
1318
1319
	/**
1320
	 * @filter `gravityview/field_output/html` Modify field HTML output
1321
	 * @param string $html Existing HTML output
1322
	 * @param array $args Arguments passed to the function
1323
	 */
1324
	$html = apply_filters( 'gravityview/field_output/html', $html, $args );
1325
1326
	// Just free up a tiny amount of memory
1327
	unset( $value, $args, $passed_args, $entry, $context, $search, $open_tag, $tag, $close_tag );
1328
1329
	return $html;
1330
}
1331