Completed
Push — master ( ff34a2...c00646 )
by Zack
46:25 queued 35:42
created

class-api.php ➔ gravityview_get_view_id()   A

Complexity

Conditions 2
Paths 2

Size

Total Lines 8
Code Lines 4

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 2
CRAP Score 2.1481

Importance

Changes 0
Metric Value
cc 2
eloc 4
nc 2
nop 0
dl 0
loc 8
ccs 2
cts 3
cp 0.6667
crap 2.1481
rs 9.4285
c 0
b 0
f 0
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
	 * @deprecated Use \GV\Field::get_label()
20
	 *
21
	 * @access public
22
	 * @static
23
	 * @param array $field GravityView field array
24
	 * @param array $entry Gravity Forms entry array
25
	 * @param boolean $force_show_label Whether to always show the label, regardless of field settings
26
	 * @return string
27
	 */
28 3
	public static function field_label( $field, $entry = array(), $force_show_label = false ) {
29
30 3
		$gravityview_view = GravityView_View::getInstance();
31
32 3
		$form = $gravityview_view->getForm();
33
34 3
		if ( defined( 'DOING_GRAVITYVIEW_TESTS' ) && ! empty( $GLOBALS['GravityView_API_field_label_override'] ) ) {
0 ignored issues
show
Unused Code introduced by
This if statement is empty and can be removed.

This check looks for the bodies of if statements that have no statements or where all statements have been commented out. This may be the result of changes for debugging or the code may simply be obsolete.

These if bodies can be removed. If you have an empty if but statements in the else branch, consider inverting the condition.

if (rand(1, 6) > 3) {
//print "Check failed";
} else {
    print "Check succeeded";
}

could be turned into

if (rand(1, 6) <= 3) {
    print "Check succeeded";
}

This is much more concise to read.

Loading history...
35
			/** Allow to fall through for back compatibility testing purposes. */
36
		} else {
37 3
			return \GV\Mocks\GravityView_API_field_label( $form, $field, $entry, $force_show_label );
38
		}
39
40 1
		$label = '';
41
42 1
		if( !empty( $field['show_label'] ) || $force_show_label ) {
0 ignored issues
show
introduced by
Expected 1 space after "!"; 0 found
Loading history...
43
44 1
			$label = $field['label'];
45
46
			// Support Gravity Forms 1.9+
47 1
			if( class_exists( 'GF_Field' ) ) {
48
49 1
				$field_object = RGFormsModel::get_field( $form, $field['id'] );
50
51 1
				if( $field_object ) {
52
53 1
					$input = GFFormsModel::get_input( $field_object, $field['id'] );
54
55
					// This is a complex field, with labels on a per-input basis
56 1
					if( $input ) {
57
58
						// Does the input have a custom label on a per-input basis? Otherwise, default label.
59 1
						$label = ! empty( $input['customLabel'] ) ? $input['customLabel'] : $input['label'];
60
61
					} else {
62
63
						// This is a field with one label
64 1
						$label = $field_object->get_field_label( true, $field['label'] );
65
66
					}
67
68
				}
69
70
			}
71
72
			// Use Gravity Forms label by default, but if a custom label is defined in GV, use it.
73 1
			if ( !empty( $field['custom_label'] ) ) {
0 ignored issues
show
introduced by
Expected 1 space after "!"; 0 found
Loading history...
74
75 1
				$label = self::replace_variables( $field['custom_label'], $form, $entry );
76
77
			}
78
79
			/**
80
			 * @filter `gravityview_render_after_label` Append content to a field label
81
			 * @param[in,out] string $appended_content Content you can add after a label. Empty by default.
82
			 * @param[in] array $field GravityView field array
83
			 */
84 1
			$label .= apply_filters( 'gravityview_render_after_label', '', $field );
85
86
		} // 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...
87
88
		/**
89
		 * @filter `gravityview/template/field_label` Modify field label output
90
		 * @since 1.7
91
		 * @param[in,out] string $label Field label HTML
92
		 * @param[in] array $field GravityView field array
93
		 * @param[in] array $form Gravity Forms form array
94
		 * @param[in] array $entry Gravity Forms entry array
95
		 *
96
		 * @deprecated Use the context-aware version `gravityview/template/field/label`
97
		 */
98 1
		$label = apply_filters( 'gravityview/template/field_label', $label, $field, $form, $entry );
99
100 1
		return $label;
101
	}
102
103
	/**
104
	 * Alias for GravityView_Merge_Tags::replace_variables()
105
	 *
106
	 * @see GravityView_Merge_Tags::replace_variables() Moved in 1.8.4
107
	 * @since 1.22.4 - Added $nl2br, $format, $aux_data args
108
	 *
109
	 * @param  string     $text         Text to replace variables in
110
	 * @param  array      $form         GF Form array
111
	 * @param  array      $entry        GF Entry array
112
	 * @param  bool       $url_encode   Pass return value through `url_encode()`
113
	 * @param  bool       $esc_html     Pass return value through `esc_html()`
114
	 * @param  bool       $nl2br        Convert newlines to <br> HTML tags
115
	 * @param  string     $format       The format requested for the location the merge is being used. Possible values: html, text or url.
116
	 * @param  array      $aux_data     Additional data to be used to replace merge tags {@see https://www.gravityhelp.com/documentation/article/gform_merge_tag_data/}
117
	 * @return string                   Text with variables maybe replaced
118
	 */
119 21
	public static function replace_variables( $text, $form = array(), $entry = array(), $url_encode = false, $esc_html = true, $nl2br = true, $format = 'html', $aux_data = array() ) {
120 21
		return GravityView_Merge_Tags::replace_variables( $text, $form, $entry, $url_encode, $esc_html, $nl2br, $format, $aux_data );
121
	}
122
123
	/**
124
	 * Get column width from the field setting
125
	 *
126
	 * @since 1.9
127
	 *
128
	 * @param array $field Array of settings for the field
129
	 * @param string $format Format for width. "%" (default) will return
130
	 *
131
	 * @return string|null If not empty, string in $format format. Otherwise, null.
132
	 */
133 19
	public static function field_width( $field, $format = '%d%%' ) {
134
135 19
		$width = NULL;
0 ignored issues
show
Coding Style introduced by
TRUE, FALSE and NULL must be lowercase; expected null, but found NULL.
Loading history...
136
137 19
		if( !empty( $field['width'] ) ) {
0 ignored issues
show
introduced by
Expected 1 space after "!"; 0 found
Loading history...
138 1
			$width = absint( $field['width'] );
139
140
			// If using percentages, limit to 100%
141 1
			if( '%d%%' === $format && $width > 100 ) {
142 1
				$width = 100;
143
			}
144
145 1
			$width = sprintf( $format, $width );
146
		}
147
148 19
		return $width;
149
	}
150
151
	/**
152
	 * Fetch Field class
153
	 *
154
	 * @access public
155
	 * @static
156
	 * @param mixed $field
157
	 * @return string
158
	 */
159 20
	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...
160 20
		$classes = array();
161
162 20
		if( !empty( $field['custom_class'] ) ) {
0 ignored issues
show
introduced by
Expected 1 space after "!"; 0 found
Loading history...
163
164 2
            $custom_class = $field['custom_class'];
165
166 2
            if( !empty( $entry ) ) {
0 ignored issues
show
introduced by
Expected 1 space after "!"; 0 found
Loading history...
167
168
                // We want the merge tag to be formatted as a class. The merge tag may be
169
                // replaced by a multiple-word value that should be output as a single class.
170
                // "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...
171 2
                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...
172
173 2
                $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...
174
175
                // And then we want life to return to normal
176 2
                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...
177
            }
178
179
			// And now we want the spaces to be handled nicely.
180 2
			$classes[] = gravityview_sanitize_html_class( $custom_class );
181
182
		}
183
184 20
		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...
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
No space before closing parenthesis is prohibited
Loading history...
185 20
			if( !empty( $form ) && !empty( $form['id'] ) ) {
0 ignored issues
show
introduced by
Expected 1 space after "!"; 0 found
Loading history...
186 20
				$form_id = '-'.$form['id'];
187
			} else {
188
				// @deprecated path. Form should always be given.
189
				gravityview()->log->warning( 'GravityView_View::getInstance() legacy API called' );
190
				$gravityview_view = GravityView_View::getInstance();
191
				$form_id = $gravityview_view->getFormId() ? '-'. $gravityview_view->getFormId() : '';
192
			}
193
194 20
			$classes[] = 'gv-field'.$form_id.'-'.$field['id'];
195
		}
196
197 20
		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...
198
	}
199
200
	/**
201
	 * Fetch Field HTML ID
202
	 *
203
	 * @since 1.11
204
	 *
205
	 * @access public
206
	 * @static
207
	 * @param array $field GravityView field array passed to gravityview_field_output()
208
	 * @param array $form Gravity Forms form array, if set.
209
	 * @param array $entry Gravity Forms entry array
210
	 * @return string Sanitized unique HTML `id` attribute for the field
211
	 */
212 18
	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...
213 18
		$id = $field['id'];
214
215 18
		if ( ! empty( $id ) ) {
216 18
			if ( ! empty( $form ) && ! empty( $form['id'] ) ) {
217 18
				$form_id = '-' . $form['id'];
218
			} else {
219
				// @deprecated path. Form should always be given.
220
				gravityview()->log->warning( 'GravityView_View::getInstance() legacy API called' );
221
				$gravityview_view = GravityView_View::getInstance();
222
				$form_id = $gravityview_view->getFormId() ? '-' . $gravityview_view->getFormId() : '';
223
			}
224
225 18
			$id = 'gv-field' . $form_id . '-' . $field['id'];
226
		}
227
228 18
		return esc_attr( $id );
229
	}
230
231
232
	/**
233
	 * Given an entry and a form field id, calculate the entry value for that field.
234
	 *
235
	 * @deprecated Use \GV\Field_Template::render() or the more low-level \GV\Field::get_value()
236
	 *
237
	 * @access public
238
	 * @param array $entry
239
	 * @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...
240
	 * @return null|string
241
	 */
242 3
	public static function field_value( $entry, $field_settings, $format = 'html' ) {
243 3
		gravityview()->log->notice( '\GravityView_API::field_value is deprecated. Use \GV\Field_Template::render() or \GV\Field::get_value()' );
244 3
		return \GV\Mocks\GravityView_API_field_value( $entry, $field_settings, $format );
0 ignored issues
show
Deprecated Code introduced by
The function GV\Mocks\GravityView_API_field_value() has been deprecated with message: Use \GV\Field_Template::render()

This function has been deprecated. The supplier of the file has supplied an explanatory message.

The explanatory message should give you some clue as to whether and when the function will be removed from the class and what other function to use instead.

Loading history...
245
	}
246
247
	/**
248
	 * Generate an anchor tag that links to an entry.
249
	 *
250
	 * @since 1.6
251
	 * @see GVCommon::get_link_html()
252
	 *
253
	 * @param string $anchor_text The text or HTML inside the link
254
	 * @param array $entry Gravity Forms entry array
255
	 * @param array|string $passed_tag_atts Attributes to be added to the anchor tag, such as `title` or `rel`.
256
	 * @param array $field_settings Array of field settings. Optional, but passed to the `gravityview_field_entry_link` filter
257
	 *
258
	 * @since 2.0
259
	 * @param int $base_id The post or the view that this entry is linked from.
260
	 *
261
	 * @return string|null Returns HTML for an anchor link. Null if $entry isn't defined or is missing an ID.
262
	 */
263 3
	public static function entry_link_html( $entry = array(), $anchor_text = '', $passed_tag_atts = array(), $field_settings = array(), $base_id = null ) {
264
265 3
		if ( empty( $entry ) || ! is_array( $entry ) || ! isset( $entry['id'] ) ) {
266 1
			gravityview()->log->debug( 'Entry not defined; returning null', array( 'data' => $entry ) );
267 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...
268
		}
269
270 3
		$href = self::entry_link( $entry, $base_id );
271
272 3
		if( '' === $href ) {
273
			return NULL;
0 ignored issues
show
Coding Style introduced by
TRUE, FALSE and NULL must be lowercase; expected null, but found NULL.
Loading history...
274
		}
275
276 3
		$link = gravityview_get_link( $href, $anchor_text, $passed_tag_atts );
277
278
		/**
279
		 * @filter `gravityview_field_entry_link` Modify the link HTML
280
		 * @param string $link HTML output of the link
281
		 * @param string $href URL of the link
282
		 * @param array  $entry The GF entry array
283
		 * @param  array $field_settings Settings for the particular GV field
284
		 */
285 3
		$output = apply_filters( 'gravityview_field_entry_link', $link, $href, $entry, $field_settings );
286
287 3
		return $output;
288
	}
289
290
	/**
291
	 * Get the "No Results" text depending on whether there were results.
292
	 * @param  boolean     $wpautop Apply wpautop() to the output?
293
	 *
294
	 * @since 2.0
295
	 * @param \GV\Template_Context $context The context
296
	 *
297
	 * @return string               HTML of "no results" text
298
	 */
299 7
	public static function no_results( $wpautop = true, $context = null ) {
300 7
		$is_search = false;
301
302 7
		if ( $context instanceof \GV\Template_Context ) {
303 5
			if ( $context->request->is_search() ) {
304 5
				$search = true;
305
			}
306
		} else {
307 2
			$gravityview_view = GravityView_View::getInstance();
308
309 2
			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...
310 1
				$is_search = true;
311
			}
312
		}
313
314 7
		if ( $is_search ) {
315 1
			$output = __( 'This search returned no results.', 'gravityview' );
316
		} else {
317 7
			$output = __( 'No entries match your request.', 'gravityview' );
318
		}
319
320
		/**
321
		 * @filter `gravitview_no_entries_text` Modify the text displayed when there are no entries.
322
		 * @param string $output The existing "No Entries" text
323
		 * @param boolean $is_search Is the current page a search result, or just a multiple entries screen?
324
		 * @return string The modified text.
325
		 * @deprecated Use `gravityview/template/text/no_entries`
326
		 */
327 7
		$output = apply_filters( 'gravitview_no_entries_text', $output, $is_search );
328
329
		/**
330
		 * @filter `gravityview/template/text/no_entries` Modify the text displayed when there are no entries.
331
		 * @since 2.0
332
		 * @param string $output The existing "No Entries" text
333
		 * @param boolean $is_search Is the current page a search result, or just a multiple entries screen?
334
		 * @param \GV\Template_Context $context The context.
335
		 * @return string The modified text.
336
		 */
337 7
		$output = apply_filters( 'gravityview/template/text/no_entries', $output, $is_search, $context );
338
339 7
		return $wpautop ? wpautop( $output ) : $output;
340
	}
341
342
	/**
343
	 * Generate a URL to the Directory context
344
	 *
345
	 * 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!
346
	 *
347
	 * @param int $post_id Post ID
348
	 * @param boolean $add_query_args Add pagination and sorting arguments
349
	 *
350
	 * @since 2.0
351
	 * @param \GV\Template_Context $context The context this is being used in.
352
	 *
353
	 * @return string      Permalink to multiple entries view
354
	 */
355 21
	public static function directory_link( $post_id = NULL, $add_query_args = true, $context = null ) {
0 ignored issues
show
Coding Style introduced by
TRUE, FALSE and NULL must be lowercase; expected null, but found NULL.
Loading history...
356 21
		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...
357
358 21
		if ( empty( $post_id ) ) {
359
			// DataTables passes the Post ID
360 13
			if ( defined( 'DOING_AJAX' ) && DOING_AJAX ) {
361
				$post_id = \GV\Utils::_POST( 'post_id', false );
362
			} else {
363 13
				if ( $context instanceof \GV\Template_Context ) {
364
					// Shortcodes, embeds
365 10
					if ( is_a( $post, 'WP_Post' ) ) {
366 1
						$post_id = $post->ID;
367
368
					// Actual views
369
					} else {
370 10
						$post_id = $context->view ? $context->view->ID : false;
0 ignored issues
show
Documentation introduced by
The property ID does not exist on object<GV\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...
371
					}
372
				} else {
373
					/** @deprecated path of execution */
374 3
					$gravityview_view = GravityView_View::getInstance();
375
376
					// The Post ID has been passed via the shortcode
377 3
					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...
378 1
						$post_id = $gravityview_view->getPostId();
379
					} else {
380
						// This is a GravityView post type
381 2
						if ( GravityView_frontend::getInstance()->isGravityviewPostType() ) {
382
							$post_id = isset( $gravityview_view ) ? $gravityview_view->getViewId() : $post->ID;
383
						} else {
384
							// This is an embedded GravityView; use the embedded post's ID as the base.
385 2
							if ( GravityView_frontend::getInstance()->isPostHasShortcode() && is_a( $post, 'WP_Post' ) ) {
386
								$post_id = $post->ID;
387 2
							} elseif ( $gravityview_view->getViewId() ) {
388
								// The GravityView has been embedded in a widget or in a template, and
389
								// is not in the current content. Thus, we defer to the View's own ID.
390 1
								$post_id = $gravityview_view->getViewId();
391
							}
392
						}
393
					}
394
				}
395
			}
396
		}
397
398
		// No post ID, get outta here.
399 21
		if ( empty( $post_id ) ) {
400 1
			return null;
401
		}
402
403
		// If we've saved the permalink in memory, use it
404
		// @since 1.3
405 20
		$link = wp_cache_get( 'gv_directory_link_'.$post_id );
406
407 20
		if ( (int) $post_id === (int) get_option( 'page_on_front' ) ) {
408
			$link = home_url();
409
		}
410
411 20
		if ( empty( $link ) ) {
412 20
			$link = get_permalink( $post_id );
413
414
			// If not yet saved, cache the permalink.
415
			// @since 1.3
416 20
			wp_cache_set( 'gv_directory_link_'.$post_id, $link );
417
		}
418
419
		// Deal with returning to proper pagination for embedded views
420 20
		if ( $link && $add_query_args ) {
421
422 16
			$args = array();
423
424 16
			if( $pagenum = \GV\Utils::_GET( 'pagenum' ) ) {
425 1
				$args['pagenum'] = intval( $pagenum );
426
			}
427
428 16
			if( $sort = \GV\Utils::_GET( 'sort' ) ) {
429
				$args['sort'] = $sort;
430
				$args['dir'] = \GV\Utils::_GET( 'dir' );
431
			}
432
433 16
			$link = add_query_arg( $args, $link );
434
		}
435
436
		/**
437
		 * @filter `gravityview_directory_link` Modify the URL to the View "directory" context
438
		 * @since 1.19.4
439
		 * @param string $link URL to the View's "directory" context (Multiple Entries screen)
440
		 * @param int $post_id ID of the post to link to. If the View is embedded, it is the post or page ID
441
		 */
442 20
		$link = apply_filters( 'gravityview_directory_link', $link, $post_id );
443
444
		/**
445
		 * @filter `gravityview/view/links/directory` Modify the URL to the View "directory" context
446
		 * @since 2.0
447
		 * @param string $link URL to the View's "directory" context (Multiple Entries screen)
448
		 * @param \GV\Template_Context $context 
449
		 */
450 20
		return apply_filters( 'gravityview/view/links/directory', $link, $context );
451
	}
452
453
	/**
454
	 * Calculate an *unique* hash for an entry based on the entry ID
455
	 *
456
	 * 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.
457
	 *
458
	 * The hashed value MUST be unique, otherwise multiple entries will share the same URL, which leads to obvious problems.
459
	 *
460
	 * @param  int|string $id Entry ID to generate the hash for.
461
	 * @param  array  $entry        Entry data passed to provide additional information when generating the hash. Optional - don't rely on it being available.
462
	 * @return string               Hashed unique value for entry
463
	 */
464 2
	private static function get_custom_entry_slug( $id, $entry = array() ) {
465
466
		// Generate an unique hash to use as the default value
467 2
		$slug = substr( wp_hash( $id, 'gravityview'.$id ), 0, 8 );
468
469
		/**
470
		 * @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}`
471
		 * @param string $hash Existing hash generated by GravityView
472
		 * @param  string $id The entry ID
473
		 * @param  array $entry Entry data array. May be empty.
474
		 */
475 2
		$slug = apply_filters( 'gravityview_entry_slug', $slug, $id, $entry );
476
477
		// Make sure we have something - use the original ID as backup.
478 2
		if( empty( $slug ) ) {
479
			$slug = $id;
480
		}
481
482 2
		return sanitize_title( $slug );
483
	}
484
485
	/**
486
	 * Get the entry slug for the entry. By default, it is the entry ID.
487
	 *
488
	 *
489
	 * @see gravityview_get_entry()
490
	 * @uses GravityView_API::get_custom_entry_slug() If using custom slug, gets the custom slug value
491
	 * @since 1.4
492
	 * @param  int|string $id_or_string ID of the entry, or custom slug string
493
	 * @param  array  $entry        Gravity Forms Entry array, optional. Used only to provide data to customize the `gravityview_entry_slug` filter
494
	 * @return string               Unique slug ID, passed through `sanitize_title()`
495
	 */
496 61
	public static function get_entry_slug( $id_or_string, $entry = array() ) {
497
498
		/**
499
		 * Default: use the entry ID as the unique identifier
500
		 */
501 61
		$slug = $id_or_string;
502
503
		/**
504
		 * @filter `gravityview_custom_entry_slug` Whether to enable and use custom entry slugs.
505
		 * @param boolean True: Allow for slugs based on entry values. False: always use entry IDs (default)
506
		 */
507 61
		$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...
508
509
		// If we're using custom slug...
510 61
		if ( $custom ) {
511
512
			// Get the entry hash
513 2
			$hash = self::get_custom_entry_slug( $id_or_string, $entry );
514
515
			// See if the entry already has a hash set
516 2
			$value = gform_get_meta( $id_or_string, 'gravityview_unique_id' );
517
518
			// If it does have a hash set, and the hash is expected, use it.
519
			// This check allows users to change the hash structure using the
520
			// gravityview_entry_hash filter and have the old hashes expire.
521 2
			if( empty( $value ) || $value !== $hash ) {
522 2
				gravityview()->log->debug( 'Setting hash for entry {entry}: {hash}', array( 'entry' => $id_or_string, 'hash' => $hash ) );
523 2
				gform_update_meta( $id_or_string, 'gravityview_unique_id', $hash, \GV\Utils::get( $entry, 'form_id' ) );
524
			}
525
526 2
			$slug = $hash;
527
528 2
			unset( $value, $hash );
529
		}
530
531 61
		return sanitize_title( $slug );
532
	}
533
534
    /**
535
     * If using the entry custom slug feature, make sure the new entries have the custom slug created and saved as meta
536
     *
537
     * Triggered by add_action( 'gform_entry_created', array( 'GravityView_API', 'entry_create_custom_slug' ), 10, 2 );
538
     *
539
     * @param $entry array Gravity Forms entry object
540
     * @param $form array Gravity Forms form object
541
     */
542
    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...
543
        /**
544
         * @filter `gravityview_custom_entry_slug` On entry creation, check if we are using the custom entry slug feature and update the meta
545
         * @param boolean $custom Should we process the custom entry slug?
546
         */
547
        $custom = apply_filters( 'gravityview_custom_entry_slug', false );
548
        if( $custom ) {
549
            // create the gravityview_unique_id and save it
550
551
            // Get the entry hash
552
            $hash = self::get_custom_entry_slug( $entry['id'], $entry );
553
554
	        gravityview()->log->debug( 'Setting hash for entry {entry_id}: {hash}', array( 'entry_id' => $entry['id'], 'hash' => $hash ) );
555
556
            gform_update_meta( $entry['id'], 'gravityview_unique_id', $hash, \GV\Utils::get( $entry, 'form_id' ) );
557
558
        }
559
    }
560
561
562
563
564
	/**
565
	 * return href for single entry
566
	 * @param  array|int $entry   Entry array or entry ID
567
	 * @param  int|null $post_id If wanting to define the parent post, pass a post ID
568
	 * @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}
569
	 * @return string          Link to the entry with the directory parent slug, or empty string if embedded post or View doesn't exist
570
	 */
571 6
	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...
572
573 6
		if ( ! empty( $entry ) && ! is_array( $entry ) ) {
574
			$entry = GVCommon::get_entry( $entry );
575 6
		} else if( empty( $entry ) ) {
576
			// @deprecated path
577
			$entry = GravityView_frontend::getInstance()->getEntry();
578
		}
579
580
		// Second parameter used to be passed as $field; this makes sure it's not an array
581 6
		if ( ! is_numeric( $post_id ) ) {
582 1
			$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...
583
		}
584
585
		// Get the permalink to the View
586 6
		$directory_link = self::directory_link( $post_id, false );
587
588
		// No post ID? Get outta here.
589 6
		if ( empty( $directory_link ) ) {
590 1
			return '';
591
		}
592
593 5
		$query_arg_name = \GV\Entry::get_endpoint_name();
594
595 5
		$entry_slug = self::get_entry_slug( $entry['id'], $entry );
596
597 5
		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...
598
599
			$args = array();
600
601
			/**
602
			 * Make sure the $directory_link doesn't contain any query otherwise it will break when adding the entry slug.
603
			 * @since 1.16.5
604
			 */
605
			$link_parts = explode( '?', $directory_link );
606
607
			$query = !empty( $link_parts[1] ) ? '?'.$link_parts[1] : '';
0 ignored issues
show
introduced by
Expected 1 space after "!"; 0 found
Loading history...
608
609
			$directory_link = trailingslashit( $link_parts[0] ) . $query_arg_name . '/'. $entry_slug .'/' . $query;
610
611
		} else {
612
613 5
			$args = array( $query_arg_name => $entry_slug );
614
		}
615
616
		/**
617
		 * @since 1.7.3
618
		 */
619 5
		if ( $add_directory_args ) {
620
621 5
			if ( ! empty( $_GET['pagenum'] ) ) {
622
				$args['pagenum'] = intval( $_GET['pagenum'] );
0 ignored issues
show
introduced by
Detected access of super global var $_GET, probably need manual inspection.
Loading history...
623
			}
624
625
			/**
626
			 * @since 1.7
627
			 */
628 5
			if ( $sort = \GV\Utils::_GET( 'sort' ) ) {
629
				$args['sort'] = $sort;
630
				$args['dir'] = \GV\Utils::_GET( 'dir' );
631
			}
632
633
		}
634
635 5
		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...
636
			$args['gvid'] = gravityview_get_view_id();
637
		}
638
639 5
		return add_query_arg( $args, $directory_link );
640
641
	}
642
643
644
}
645
646
647
// inside loop functions
648
649
/**
650
 * @deprecated Use \GV\Field::get_label()
651
 */
652
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...
653 2
	return GravityView_API::field_label( $field, $entry );
0 ignored issues
show
Deprecated Code introduced by
The method GravityView_API::field_label() has been deprecated with message: Use \GV\Field::get_label()

This method has been deprecated. The supplier of the class has supplied an explanatory message.

The explanatory message should give you some clue as to whether and when the method will be removed from the class and what other method or class to use instead.

Loading history...
654
}
655
656
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...
657 19
	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...
658
}
659
660
/**
661
 * Generate a CSS class to be added to the wrapper <div> of a View
662
 *
663
 * @since 1.5.4
664
 * @since 1.16 Added $echo parameter.
665
 * @since 2.0 Added $context parameter.
666
 *
667
 * @param string $passed_css_class Default: `gv-container gv-container-{view id}`. If View is hidden until search, adds ` hidden`
668
 * @param boolean $echo Whether to echo the output. Default: true
669
 * @param \GV\Template_Context $context The template context.
670
 *
671
 * @return string CSS class, sanitized by gravityview_sanitize_html_class()
672
 */
673
function gv_container_class( $passed_css_class = '', $echo = true, $context = null ) {
674 22
	if ( $context instanceof \GV\Template_Context ) {
675 19
		$hide_until_searched = false;
676 19
		$total_entries = 0;
677 19
		$view_id = 0;
678 19
		if ( $context->view ) {
679 19
			$view_id = $context->view->ID;
0 ignored issues
show
Bug introduced by
The property ID does not seem to exist in GV\View.

An attempt at access to an undefined property has been detected. This may either be a typographical error or the property has been renamed but there are still references to its old name.

If you really want to allow access to undefined properties, you can define magic methods to allow access. See the php core documentation on Overloading.

Loading history...
680 19
			$hide_until_searched = $context->view->settings->get( 'hide_until_searched' );
681
		}
682 19
		if ( $context->entries ) {
683 10
			$total_entries = $context->entries->total();
684 10
		} else if ( $context->entry ) {
685 19
			$total_entries = 1;
686
		}
687
	} else {
688
		/** @deprecated legacy execution path */
689 3
		$view_id = GravityView_View::getInstance()->getViewId();
690 3
		$hide_until_searched = GravityView_View::getInstance()->isHideUntilSearched();
691 3
		$total_entries = GravityView_View::getInstance()->getTotalEntries();
692
	}
693
694 22
	$passed_css_class = trim( $passed_css_class );
695
696 22
	$default_css_class = ! empty( $view_id ) ? sprintf( 'gv-container gv-container-%d', $view_id ) : 'gv-container';
697
698 22
	if ( $hide_until_searched ) {
699 3
		$default_css_class .= ' hidden';
700
	}
701
702 22
	if ( 0 === $total_entries ) {
703 5
		$default_css_class .= ' gv-container-no-results';
704
	}
705
706 22
	$css_class = trim( $passed_css_class . ' '. $default_css_class );
707
708
	/**
709
	 * @filter `gravityview/render/container/class` Modify the CSS class to be added to the wrapper <div> of a View
710
	 * @since 1.5.4
711
	 * @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`
712
	 * @since 2.0
713
	 * @param \GV\Template_Context $context The context.
714
	 */
715 22
	$css_class = apply_filters( 'gravityview/render/container/class', $css_class, $context );
716
717 22
	$css_class = gravityview_sanitize_html_class( $css_class );
718
719 22
	if ( $echo ) {
720 22
		echo $css_class;
0 ignored issues
show
introduced by
Expected next thing to be a escaping function, not '$css_class'
Loading history...
721
	}
722
723 22
	return $css_class;
724
}
725
726
/**
727
 * @deprecated Use \GV\Field_Template::render()
728
 */
729
function gv_value( $entry, $field ) {
730
731 2
	$value = GravityView_API::field_value( $entry, $field );
0 ignored issues
show
Deprecated Code introduced by
The method GravityView_API::field_value() has been deprecated with message: Use \GV\Field_Template::render() or the more low-level \GV\Field::get_value()

This method has been deprecated. The supplier of the class has supplied an explanatory message.

The explanatory message should give you some clue as to whether and when the method will be removed from the class and what other method or class to use instead.

Loading history...
732
733 2
	if( $value === '' ) {
734
		/**
735
		 * @filter `gravityview_empty_value` What to display when a field is empty
736
		 * @param string $value (empty string)
737
		 */
738 1
		$value = apply_filters( 'gravityview_empty_value', '' );
739
	}
740
741 2
	return $value;
742
}
743
744
function gv_directory_link( $post = NULL, $add_pagination = true, $context = null ) {
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...
745 11
	return GravityView_API::directory_link( $post, $add_pagination, $context );
746
}
747
748
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...
749 2
	return GravityView_API::entry_link( $entry, $post_id );
750
}
751
752
function gv_no_results( $wpautop = true, $context = null ) {
753 6
	return GravityView_API::no_results( $wpautop, $context );
754
}
755
756
/**
757
 * Generate HTML for the back link from single entry view
758
 * @since 1.0.1
759
 * @since 2.0
760
 * @param \GV\Template_Context $context The context this link is being displayed from.
761
 * @return string|null      If no GV post exists, null. Otherwise, HTML string of back link.
762
 */
763
function gravityview_back_link( $context = null ) {
764
765 10
	$href = gv_directory_link( null, true, $context );
766
767
	/**
768
	 * @filter `gravityview_go_back_url` Modify the back link URL
769
	 * @since 1.17.5
770
	 * @see gv_directory_link() Generated the original back link
771
	 * @param string $href Existing label URL
772
	 * @deprecated Use `gravityview/template/links/back/url`
773
	 */
774 10
	$href = apply_filters( 'gravityview_go_back_url', $href );
775
776
	/**
777
	 * @filter `gravityview/template/links/back/url` Modify the back link URL
778
	 * @since 2.0
779
	 * @see gv_directory_link() Generated the original back link
780
	 * @param string $href Existing label URL
781
	 * @param \GV\Template_Context The context.
782
	 */
783 10
	$href = apply_filters( 'gravityview/template/links/back/url', $href, $context );
784
785 10
	if ( empty( $href ) ) {
786 3
		return NULL;
0 ignored issues
show
Coding Style introduced by
TRUE, FALSE and NULL must be lowercase; expected null, but found NULL.
Loading history...
787
	}
788
789 8
	if ( $context instanceof \GV\Template_Context ) {
790 8
		$view_id = $context->view->ID;
0 ignored issues
show
Bug introduced by
The property ID does not seem to exist in GV\View.

An attempt at access to an undefined property has been detected. This may either be a typographical error or the property has been renamed but there are still references to its old name.

If you really want to allow access to undefined properties, you can define magic methods to allow access. See the php core documentation on Overloading.

Loading history...
791 8
		$view_label = $context->template->get_back_label();
0 ignored issues
show
Bug introduced by
It seems like you code against a specific sub-type and not the parent class GV\Template as the method get_back_label() does only exist in the following sub-classes of GV\Template: GV\Entry_Legacy_Template, GV\Entry_List_Template, GV\Entry_Table_Template, GV\Entry_Template. Maybe you want to instanceof check for one of these explicitly?

Let’s take a look at an example:

abstract class User
{
    /** @return string */
    abstract public function getPassword();
}

class MyUser extends User
{
    public function getPassword()
    {
        // return something
    }

    public function getDisplayName()
    {
        // return some name.
    }
}

class AuthSystem
{
    public function authenticate(User $user)
    {
        $this->logger->info(sprintf('Authenticating %s.', $user->getDisplayName()));
        // do something.
    }
}

In the above example, the authenticate() method works fine as long as you just pass instances of MyUser. However, if you now also want to pass a different sub-classes of User which does not have a getDisplayName() method, the code will break.

Available Fixes

  1. Change the type-hint for the parameter:

    class AuthSystem
    {
        public function authenticate(MyUser $user) { /* ... */ }
    }
    
  2. Add an additional type-check:

    class AuthSystem
    {
        public function authenticate(User $user)
        {
            if ($user instanceof MyUser) {
                $this->logger->info(/** ... */);
            }
    
            // or alternatively
            if ( ! $user instanceof MyUser) {
                throw new \LogicException(
                    '$user must be an instance of MyUser, '
                   .'other instances are not supported.'
                );
            }
    
        }
    }
    
Note: PHP Analyzer uses reverse abstract interpretation to narrow down the types inside the if block in such a case.
  1. Add the method to the parent class:

    abstract class User
    {
        /** @return string */
        abstract public function getPassword();
    
        /** @return string */
        abstract public function getDisplayName();
    }
    
Loading history...
792
	} else {
793
		/** @deprecated legacy path */
794
		$gravityview_view = GravityView_View::getInstance();
795
		$view_id = $gravityview_view->getViewId();
796
		$view_label = $gravityview_view->getBackLinkLabel() ? $gravityview_view->getBackLinkLabel() : false;
0 ignored issues
show
Deprecated Code introduced by
The method GravityView_View::getBackLinkLabel() has been deprecated with message: Use $template->get_back_label();

This method has been deprecated. The supplier of the class has supplied an explanatory message.

The explanatory message should give you some clue as to whether and when the method will be removed from the class and what other method or class to use instead.

Loading history...
797
	}
798
799
	/** Default */
800 8
	$label = $view_label ? $view_label : __( '&larr; Go back', 'gravityview' );
801
802
	/**
803
	 * @filter `gravityview_go_back_label` Modify the back link text
804
	 * @since 1.0.9
805
	 * @param string $label Existing label text
806
	 * @deprecated Use `gravityview/template/links/back/label`
807
	 */
808 8
	$label = apply_filters( 'gravityview_go_back_label', $label );
809
810
	/**
811
	 * @filter `gravityview_go_back_label` Modify the back link text
812
	 * @since 2.0
813
	 * @see gv_directory_link() Generated the original back link
814
	 * @param string $label Existing label text
815
	 * @param \GV\Template_Context The context.
816
	 */
817 8
	$label = apply_filters( 'gravityview/template/links/back/label', $label, $context );
818
819 8
	$link = gravityview_get_link( $href, esc_html( $label ), array(
820 8
		'data-viewid' => $view_id,
821
	) );
822
823 8
	return $link;
824
}
825
826
/**
827
 * Handle getting values for complex Gravity Forms fields
828
 *
829
 * If the field is complex, like a product, the field ID, for example, 11, won't exist. Instead,
830
 * it will be 11.1, 11.2, and 11.3. This handles being passed 11 and 11.2 with the same function.
831
 *
832
 * @since 1.0.4
833
 * @param  array      $entry    GF entry array
834
 * @param  string      $field_id [description]
835
 * @param  string 	$display_value The value generated by Gravity Forms
836
 * @return string                Value
837
 */
838
function gravityview_get_field_value( $entry, $field_id, $display_value ) {
839
840 6
	if( floatval( $field_id ) === floor( floatval( $field_id ) ) ) {
841
842
		// For the complete field value as generated by Gravity Forms
843 3
		return $display_value;
844
845
	} else {
846
847
		// For one part of the address (City, ZIP, etc.)
848 6
		return isset( $entry[ $field_id ] ) ? $entry[ $field_id ] : '';
849
850
	}
851
852
}
853
854
/**
855
 * Take a passed CSV of terms and generate a linked list of terms
856
 *
857
 * Gravity Forms passes categories as "Name:ID" so we handle that using the ID, which
858
 * is more accurate than checking the name, which is more likely to change.
859
 *
860
 * @param  string      $value    Existing value
861
 * @param  string      $taxonomy Type of term (`post_tag` or `category`)
862
 * @return string                CSV of linked terms
863
 */
864
function gravityview_convert_value_to_term_list( $value, $taxonomy = 'post_tag' ) {
865
866 1
	$output = array();
867
868 1
	if ( is_array( $value ) ) {
869 1
		$terms = array_filter( array_values( $value ), 'strlen' );
870
	} else {
871 1
		$terms = explode( ', ', $value );
872
	}
873
874 1
	foreach ($terms as $term_name ) {
0 ignored issues
show
introduced by
No space after opening parenthesis is prohibited
Loading history...
875
876
		// If we're processing a category,
877 1
		if( $taxonomy === 'category' ) {
0 ignored issues
show
introduced by
Found "=== '". Use Yoda Condition checks, you must
Loading history...
878
879
			// Use rgexplode to prevent errors if : doesn't exist
880 1
			list( $term_name, $term_id ) = rgexplode( ':', $term_name, 2 );
881
882
			// The explode was succesful; we have the category ID
883 1
			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...
884 1
				$term = get_term_by( 'id', $term_id, $taxonomy );
885
			} else {
886
			// We have to fall back to the name
887 1
				$term = get_term_by( 'name', $term_name, $taxonomy );
888
			}
889
890
		} else {
891
			// Use the name of the tag to get the full term information
892 1
			$term = get_term_by( 'name', $term_name, $taxonomy );
893
		}
894
895
		// There's still a tag/category here.
896 1
		if( $term ) {
897
898 1
			$term_link = get_term_link( $term, $taxonomy );
899
900
			// If there was an error, continue to the next term.
901 1
			if ( is_wp_error( $term_link ) ) {
902
			    continue;
903
			}
904
905 1
			$output[] = gravityview_get_link( $term_link, esc_html( $term->name ) );
906
		}
907
	}
908
909 1
	return implode(', ', $output );
0 ignored issues
show
Coding Style introduced by
Expected 1 spaces after opening bracket; 0 found
Loading history...
910
}
911
912
/**
913
 * Get the links for post_tags and post_category output based on post ID
914
 * @param  int      $post_id  The ID of the post
915
 * @param  boolean     $link     Add links or no?
916
 * @param  string      $taxonomy Taxonomy of term to fetch.
917
 * @return string                String with terms
918
 */
919
function gravityview_get_the_term_list( $post_id, $link = true, $taxonomy = 'post_tag' ) {
920
921 1
	$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...
922
923 1
	if( empty( $link ) ) {
924 1
		return strip_tags( $output);
0 ignored issues
show
Coding Style introduced by
Expected 1 spaces before closing bracket; 0 found
Loading history...
925
	}
926
927 1
	return $output;
928
929
}
930
931
932
/**
933
 * Get all views processed so far for the current page load
934
 *
935
 * @see  GravityView_View_Data::add_view()
936
 * @return array Array of View data, each View data with `id`, `view_id`, `form_id`, `template_id`, `atts`, `fields`, `widgets`, `form` keys.
937
 */
938
function gravityview_get_current_views() {
939
940 1
	$fe = GravityView_frontend::getInstance();
941
942
	// Solve problem when loading content via admin-ajax.php
943 1
	if( ! $fe->getGvOutputData() ) {
944
945 1
		gravityview()->log->debug( 'gv_output_data not defined; parsing content.' );
946
947 1
		$fe->parse_content();
948
	}
949
950
	// Make 100% sure that we're dealing with a properly called situation
951 1
	if( !is_a( $fe->getGvOutputData(), 'GravityView_View_Data' ) ) {
0 ignored issues
show
introduced by
Expected 1 space after "!"; 0 found
Loading history...
952
953
		gravityview()->log->debug( 'gv_output_data not an object or get_view not callable.', array( 'data' => $fe->getGvOutputData() ) );
954
955
		return array();
956
	}
957
958 1
	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...
959
}
960
961
/**
962
 * Get data for a specific view
963
 *
964
 * @see  GravityView_View_Data::get_view()
965
 * @return array View data with `id`, `view_id`, `form_id`, `template_id`, `atts`, `fields`, `widgets`, `form` keys.
966
 */
967
function gravityview_get_current_view_data( $view_id = 0 ) {
968
969
	$fe = GravityView_frontend::getInstance();
970
971
	// If not set, grab the current view ID
972
	if ( empty( $view_id ) ) {
973
		$view_id = $fe->get_context_view_id();
974
	}
975
976
	if ( ! $fe->getGvOutputData() ) { return array(); }
977
978
	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...
979
}
980
981
// Templates' hooks
982
function gravityview_before() {
983
	/**
984
	 * @action `gravityview/template/before` Append content to the view.
985
	 * @param object $gravityview The $gravityview object available in templates.
986
	 */
987 21
	if ( count( $args = func_get_args() ) ) {
988 19
		$gravityview = reset( $args );
989 19
		if ( $gravityview instanceof \GV\Template_Context ) {
990
			/**
991
			 * @action `gravityview/template/before` Prepend content to the view.
992
			 * @param \GV\Template_Context $gravityview The $gravityview object available in templates.
993
			 */
994 19
			do_action( 'gravityview/template/before', $gravityview );
995
996
			/**
997
			 * @deprecated Use `gravityview/template/before`
998
			 */
999 19
			return do_action( 'gravityview_before', $gravityview->view->ID );
0 ignored issues
show
Documentation introduced by
The property ID does not exist on object<GV\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...
1000
		}
1001
	}
1002
1003
	/**
1004
	 * @action `gravityview_before` Prepend content to the View container `<div>`
1005
	 * @deprecated Use `gravityview/template/before`.
1006
	 * @param int $view_id The ID of the View being displayed
1007
	 */
1008 2
	do_action( 'gravityview_before', gravityview_get_view_id() );
1009 2
}
1010
1011
function gravityview_header() {
1012
	/**
1013
	 * @action `gravityview/template/header` Append content to the view.
1014
	 * @param object $gravityview The $gravityview object available in templates.
1015
	 */
1016 17
	if ( count( $args = func_get_args() ) ) {
1017 15
		$gravityview = reset( $args );
1018 15
		if ( $gravityview instanceof \GV\Template_Context ) {
1019
			/**
1020
			 * @action `gravityview/template/header` Prepend content to the view container <div>.
1021
			 * @param \GV\Template_Context $gravityview The $gravityview object available in templates.
1022
			 */
1023 15
			do_action( 'gravityview/template/header', $gravityview );
1024
1025
			/**
1026
			 * @deprecated Use `gravityview/template/header`
1027
			 */
1028 15
			return do_action( 'gravityview_header', $gravityview->view->ID );
0 ignored issues
show
Documentation introduced by
The property ID does not exist on object<GV\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...
1029
		}
1030
	}
1031
1032
	/**
1033
	 * @action `gravityview_header` Prepend content to the View container `<div>`
1034
	 * @deprecated Use `gravityview/template/header`.
1035
	 * @param int $view_id The ID of the View being displayed
1036
	 */
1037 2
	do_action( 'gravityview_header', gravityview_get_view_id() );
1038 2
}
1039
1040
function gravityview_footer() {
1041
	/**
1042
	 * @action `gravityview/template/footer` Append content to the view.
1043
	 * @param object $gravityview The $gravityview object available in templates.
1044
	 */
1045 17
	if ( count( $args = func_get_args() ) ) {
1046 15
		$gravityview = reset( $args );
1047 15
		if ( $gravityview instanceof \GV\Template_Context ) {
1048
			/**
1049
			 * @action `gravityview/template/footer` Prepend outside of the view container <div>.
1050
			 * @param \GV\Template_Context $gravityview The $gravityview object available in templates.
1051
			 */
1052 15
			do_action( 'gravityview/template/footer', $gravityview );
1053
1054
			/**
1055
			 * @deprecated Use `gravityview/template/footer`
1056
			 */
1057 15
			return do_action( 'gravityview_footer', $gravityview->view->ID );
0 ignored issues
show
Documentation introduced by
The property ID does not exist on object<GV\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...
1058
		}
1059
	}
1060
1061
	/**
1062
	 * @action `gravityview_after` Display content after a View. Used to render footer widget areas. Rendered outside the View container `<div>`
1063
	 * @deprecated Use `gravityview/template/footer`.
1064
	 * @param int $view_id The ID of the View being displayed
1065
	 */
1066 2
	do_action( 'gravityview_footer', gravityview_get_view_id() );
1067 2
}
1068
1069
function gravityview_after() {
1070 21
	if ( count( $args = func_get_args() ) ) {
1071 19
		$gravityview = reset( $args );
1072 19
		if ( $gravityview instanceof \GV\Template_Context ) {
1073
			/**
1074
			 * @action `gravityview/template/after` Append content to the view.
1075
			 * @param \GV\Template_Context $gravityview The $gravityview object available in templates.
1076
			 */
1077 19
			do_action( 'gravityview/template/after', $gravityview );
1078
1079
			/**
1080
			 * @deprecated Use `gravityview/template/after`
1081
			 */
1082 19
			return do_action( 'gravityview_after', $gravityview->view->ID );
0 ignored issues
show
Documentation introduced by
The property ID does not exist on object<GV\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...
1083
		}
1084
	}
1085
1086
	/**
1087
	 * @action `gravityview_after` Append content to the View container `<div>`
1088
	 * @deprecated Use `gravityview/template/after`
1089
	 * @param int $view_id The ID of the View being displayed
1090
	 */
1091 2
	do_action( 'gravityview_after', gravityview_get_view_id() );
1092 2
}
1093
1094
/**
1095
 * Get the current View ID being rendered
1096
 *
1097
 * @global GravityView_View $gravityview_view
1098
 *
1099
 * @return int View ID, if exists. `0` if `GravityView_View` doesn't exist, like in the admin, or no View is set.
1100
 */
1101
function gravityview_get_view_id() {
1102
1103 2
	if ( ! class_exists( 'GravityView_View' ) ) {
1104
		return 0;
1105
	}
1106
1107 2
	return GravityView_View::getInstance()->getViewId();
1108
}
1109
1110
/**
1111
 * @global GravityView_View $gravityview_view
1112
 * @return string View context "directory", "single", or "edit"
1113
 */
1114
function gravityview_get_context() {
1115
1116 4
	$context = '';
1117
1118
	/**
1119
	 * @filter `gravityview_is_edit_entry` Whether we're currently on the Edit Entry screen \n
1120
	 * The Edit Entry functionality overrides this value.
1121
	 * @param boolean $is_edit_entry
1122
	 */
1123 4
	$is_edit_entry = apply_filters( 'gravityview_is_edit_entry', false );
1124
1125 4
	if( $is_edit_entry ) {
1126
		$context = 'edit';
1127 4
	} else if( class_exists( 'GravityView_frontend' ) && $single = GravityView_frontend::is_single_entry() ) {
1128
		$context = 'single';
1129 4
	} else if( class_exists( 'GravityView_View' ) ) {
1130 4
		$context = GravityView_View::getInstance()->getContext();
1131
	}
1132
1133 4
	return $context;
1134
}
1135
1136
1137
/**
1138
 * Return an array of files prepared for output. Wrapper for GravityView_Field_FileUpload::get_files_array()
1139
 *
1140
 * Processes files by file type and generates unique output for each.
1141
 *
1142
 * Returns array for each file, with the following keys:
1143
 *
1144
 * `file_path` => The file path of the file, with a line break
1145
 * `html` => The file output HTML formatted
1146
 *
1147
 * @see GravityView_Field_FileUpload::get_files_array()
1148
 *
1149
 * @since  1.2
1150
 * @param  string $value    Field value passed by Gravity Forms. String of file URL, or serialized string of file URL array
1151
 * @param  string $gv_class Field class to add to the output HTML
1152
 * @since  2.0
1153
 * @param  \GV\Template_Context $context The context
1154
 * @return array           Array of file output, with `file_path` and `html` keys (see comments above)
1155
 */
1156
function gravityview_get_files_array( $value, $gv_class = '', $context = null ) {
1157
	/** @define "GRAVITYVIEW_DIR" "../" */
1158
1159 1
	if( !class_exists( 'GravityView_Field' ) ) {
0 ignored issues
show
introduced by
Expected 1 space after "!"; 0 found
Loading history...
1160
		include_once( GRAVITYVIEW_DIR .'includes/fields/class-gravityview-field.php' );
1161
	}
1162
1163 1
	if( !class_exists( 'GravityView_Field_FileUpload' ) ) {
0 ignored issues
show
introduced by
Expected 1 space after "!"; 0 found
Loading history...
1164
		include_once( GRAVITYVIEW_DIR .'includes/fields/class-gravityview-field-fileupload.php' );
1165
	}
1166
1167 1
	return GravityView_Field_FileUpload::get_files_array( $value, $gv_class, $context );
1168
}
1169
1170
/**
1171
 * Generate a mapping link from an address
1172
 *
1173
 * The address should be plain text with new line (`\n`) or `<br />` line breaks separating sections
1174
 *
1175
 * @todo use GF's field get_export_value() instead
1176
 *
1177
 * @see https://gravityview.co/support/documentation/201608159 Read how to modify the link
1178
 * @param  string $address Address
1179
 * @return string          URL of link to map of address
1180
 */
1181
function gravityview_get_map_link( $address ) {
1182
1183
	$address_qs = str_replace( array( '<br />', "\n" ), ' ', $address ); // Replace \n with spaces
1184
	$address_qs = urlencode( $address_qs );
1185
1186
	$url = "https://maps.google.com/maps?q={$address_qs}";
1187
1188
	$link_text = esc_html__( 'Map It', 'gravityview' );
1189
1190
	$link = gravityview_get_link( $url, $link_text, 'class=map-it-link' );
1191
1192
	/**
1193
	 * @filter `gravityview_map_link` Modify the map link generated. You can use a different mapping service, for example.
1194
	 * @param[in,out]  string $link Map link
1195
	 * @param[in] string $address Address to generate link for
1196
	 * @param[in] string $url URL generated by the function
1197
	 */
1198
	$link = apply_filters( 'gravityview_map_link', $link, $address, $url );
1199
1200
	return $link;
1201
}
1202
1203
1204
/**
1205
 * Output field based on a certain html markup
1206
 *
1207
 *   markup - string to be used on a sprintf statement.
1208
 *      Use:
1209
 *         {{label}} - field label
1210
 *         {{value}} - entry field value
1211
 *         {{class}} - field class
1212
 *
1213
 *   wpautop - true will filter the value using wpautop function
1214
 *
1215
 * @since  1.1.5
1216
 * @param  array $passed_args Associative array with field data. `field` and `form` are required.
1217
 * @since  2.0
1218
 * @param  \GV\Template_Context The template context.
1219
 * @return string Field output. If empty value and hide empty is true, return empty.
1220
 */
1221
function gravityview_field_output( $passed_args, $context = null ) {
1222
	$defaults = array(
1223 18
		'entry' => null,
1224
		'field' => null,
1225
		'form' => null,
1226
		'hide_empty' => true,
1227
		'markup' => '<div id="{{ field_id }}" class="{{ class }}">{{ label }}{{ value }}</div>',
1228
		'label_markup' => '',
1229
		'wpautop' => false,
1230
		'zone_id' => null,
1231
	);
1232
1233 18
	$args = wp_parse_args( $passed_args, $defaults );
1234
1235
	/**
1236
	 * @filter `gravityview/field_output/args` Modify the args before generation begins
1237
	 * @since 1.7
1238
	 * @param array $args Associative array; `field` and `form` is required.
1239
	 * @param array $passed_args Original associative array with field data. `field` and `form` are required.
1240
	 * @since 2.0
1241
	 * @param \GV\Template_Context $context The context.
1242
	 * @deprecated
1243
	 */
1244 18
	$args = apply_filters( 'gravityview/field_output/args', $args, $passed_args, $context );
1245
1246
	/**
1247
	 * @filter `gravityview/template/field_output/context` Modify the context before generation begins.
1248
	 * @since 2.0
1249
	 * @param[in,out] \GV\Template_Context $context The context.
1250
	 * @param array $args The sanitized arguments, these should not be trusted any longer.
1251
	 * @param array $passed_args The passed arguments, these should not be trusted any longer.
1252
	 */
1253 18
	$context = apply_filters( 'gravityview/template/field_output/context', $context, $args, $passed_args );
1254
1255 18
	if ( $context instanceof \GV\Template_Context ) {
1256 16
		if ( ! $context->field || ! $context->view || ! $context->view->form ) {
1257
			gravityview()->log->error( 'Field or form are empty.', array( 'data' => array( $context->field, $context->view->form ) ) );
1258 16
			return '';
1259
		}
1260
	} else {
1261
		// @deprecated path
1262
		// Required fields.
1263 2
		if ( empty( $args['field'] ) || empty( $args['form'] ) ) {
1264
			gravityview()->log->error( 'Field or form are empty.', array( 'data' => $args ) );
1265
			return '';
1266
		}
1267
	}
1268
1269 18
	if ( $context instanceof \GV\Template_Context ) {
1270 16
		$entry = $args['entry'] ? : ( $context->entry ? $context->entry->as_entry() : array() );
1271 16
		$field = $args['field'] ? : ( $context->field ? $context->field->as_configuration() : array() );
1272 16
		$form = $args['form'] ? : ( $context->view->form ? $context->view->form->form : array() );
0 ignored issues
show
Documentation introduced by
The property $form is declared private in GV\Form. Since you implemented __get(), maybe consider adding a @property or @property-read annotation. This makes it easier for IDEs to provide auto-completion.

Since your code implements the magic setter _set, this function will be called for any write 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.");
        }
    }

}

Since the property has write access only, you can use the @property-write 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...
1273
	} else {
1274
		// @deprecated path
1275 2
		$entry = empty( $args['entry'] ) ? array() : $args['entry'];
1276 2
		$field = $args['field'];
1277 2
		$form = $args['form'];
1278
	}
1279
1280
	/**
1281
	 * Create the content variables for replacing.
1282
	 * @since 1.11
1283
	 */
1284
	$placeholders = array(
1285 18
		'value' => '',
1286
		'width' => '',
1287
		'width:style' => '',
1288
		'label' => '',
1289
		'label_value' => '',
1290
		'class' => '',
1291
		'field_id' => '',
1292
	);
1293
1294 18
	if ( $context instanceof \GV\Template_Context ) {
1295 16
		$placeholders['value'] = \GV\Utils::get( $args, 'value', '' );
1296
	} else {
1297
		// @deprecated path
1298 2
		$placeholders['value'] = gv_value( $entry, $field );
0 ignored issues
show
Deprecated Code introduced by
The function gv_value() has been deprecated with message: Use \GV\Field_Template::render()

This function has been deprecated. The supplier of the file has supplied an explanatory message.

The explanatory message should give you some clue as to whether and when the function will be removed from the class and what other function to use instead.

Loading history...
1299
	}
1300
1301
	// If the value is empty and we're hiding empty, return empty.
1302 18
	if ( $placeholders['value'] === '' && ! empty( $args['hide_empty'] ) ) {
1303 5
		return '';
1304
	}
1305
1306 18
	if ( $placeholders['value'] !== '' && ! empty( $args['wpautop'] ) ) {
1307 5
		$placeholders['value'] = wpautop( $placeholders['value'] );
1308
	}
1309
1310
	// Get width setting, if exists
1311 18
	$placeholders['width'] = GravityView_API::field_width( $field );
1312
1313
	// If replacing with CSS inline formatting, let's do it.
1314 18
	$placeholders['width:style'] = GravityView_API::field_width( $field, 'width:' . $placeholders['width'] . '%;' );
1315
1316
	// Grab the Class using `gv_class`
1317 18
	$placeholders['class'] = gv_class( $field, $form, $entry );
1318 18
	$placeholders['field_id'] = GravityView_API::field_html_attr_id( $field, $form, $entry );
1319
0 ignored issues
show
Coding Style introduced by
Functions must not contain multiple empty lines in a row; found 2 empty lines
Loading history...
1320
1321
	// Get field label if needed
1322 18
	if ( ! empty( $args['label_markup'] ) && ! empty( $args['field']['show_label'] ) ) {
1323 1
		$placeholders['label'] = str_replace( array( '{{label}}', '{{ label }}' ), '<span class="gv-field-label">{{ label_value }}</span>', $args['label_markup'] );
1324
	}
1325
1326 18
	if ( $context instanceof \GV\Template_Context ) {
1327 16
		$placeholders['label_value'] = \GV\Utils::get( $args, 'label' );
1328
	} else {
1329
		// Default Label value
1330 2
		$placeholders['label_value'] = gv_label( $field, $entry );
0 ignored issues
show
Deprecated Code introduced by
The function gv_label() has been deprecated with message: Use \GV\Field::get_label()

This function has been deprecated. The supplier of the file has supplied an explanatory message.

The explanatory message should give you some clue as to whether and when the function will be removed from the class and what other function to use instead.

Loading history...
1331
	}
1332
1333 18
	if ( empty( $placeholders['label'] ) && ! empty( $placeholders['label_value'] ) ){
1334 17
		$placeholders['label'] = '<span class="gv-field-label">{{ label_value }}</span>';
1335
	}
1336
1337
	/**
1338
	 * @filter `gravityview/field_output/pre_html` Allow Pre filtering of the HTML
1339
	 * @since 1.11
1340
	 * @param string $markup The HTML for the markup
1341
	 * @param array $args All args for the field output
1342
	 * @since 2.0
1343
	 * @param \GV\Template_Context $context The context.
1344
	 */
1345 18
	$html = apply_filters( 'gravityview/field_output/pre_html', $args['markup'], $args, $context );
1346
1347
	/**
1348
	 * @filter `gravityview/field_output/open_tag` Modify the opening tags for the template content placeholders
1349
	 * @since 1.11
1350
	 * @param string $open_tag Open tag for template content placeholders. Default: `{{`
1351
	 * @since 2.0
1352
	 * @param \GV\Template_Context $context The context.
1353
	 */
1354 18
	$open_tag = apply_filters( 'gravityview/field_output/open_tag', '{{', $args, $context );
1355
1356
	/**
1357
	 * @filter `gravityview/field_output/close_tag` Modify the closing tags for the template content placeholders
1358
	 * @since 1.11
1359
	 * @param string $close_tag Close tag for template content placeholders. Default: `}}`
1360
	 * @since 2.0
1361
	 * @param \GV\Template_Context $context The context.
1362
	 */
1363 18
	$close_tag = apply_filters( 'gravityview/field_output/close_tag', '}}', $args, $context );
1364
1365
	/**
1366
	 * Loop through each of the tags to replace and replace both `{{tag}}` and `{{ tag }}` with the values
1367
	 * @since 1.11
1368
	 */
1369 18
	foreach ( $placeholders as $tag => $value ) {
1370
1371
		// If the tag doesn't exist just skip it
1372 18
		if ( false === strpos( $html, $open_tag . $tag . $close_tag ) && false === strpos( $html, $open_tag . ' ' . $tag . ' ' . $close_tag ) ){
1373 18
			continue;
1374
		}
1375
1376
		// Array to search
1377
		$search = array(
1378 18
			$open_tag . $tag . $close_tag,
1379 18
			$open_tag . ' ' . $tag . ' ' . $close_tag,
1380
		);
1381
1382
		/**
1383
		 * `gravityview/field_output/context/{$tag}` Allow users to filter content on context
1384
		 * @since 1.11
1385
		 * @param string $value The content to be shown instead of the {{tag}} placeholder
1386
		 * @param array $args Arguments passed to the function
1387
		 * @since 2.0
1388
		 * @param \GV\Template_Context $context The context.
1389
		 */
1390 18
		$value = apply_filters( 'gravityview/field_output/context/' . $tag, $value, $args, $context );
1391
1392
		// Finally do the replace
1393 18
		$html = str_replace( $search, $value, $html );
1394
	}
1395
1396
	/**
1397
	 * @filter `gravityview_field_output` Modify field HTML output
1398
	 * @param string $html Existing HTML output
1399
	 * @param array $args Arguments passed to the function
1400
	 * @since 2.0
1401
	 * @param \GV\Template_Context $context The context.
1402
	 */
1403 18
	$html = apply_filters( 'gravityview_field_output', $html, $args, $context );
1404
1405
	/**
1406
	 * @filter `gravityview/field_output/html` Modify field HTML output
1407
	 * @param string $html Existing HTML output
1408
	 * @param array $args Arguments passed to the function
1409
	 * @since 2.0
1410
	 * @param \GV\Template_Context $context The context.
1411
	 */
1412 18
	$html = apply_filters( 'gravityview/field_output/html', $html, $args, $context );
1413
1414 18
	return $html;
1415
}
1416