Completed
Push — master ( af77e8...7d9d07 )
by Zack
11s
created

GravityView_frontend::add_scripts_and_styles()   F

Complexity

Conditions 15
Paths 785

Size

Total Lines 102
Code Lines 43

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 29
CRAP Score 19.6792

Importance

Changes 0
Metric Value
cc 15
eloc 43
nc 785
nop 0
dl 0
loc 102
ccs 29
cts 40
cp 0.725
crap 19.6792
rs 2.4166
c 0
b 0
f 0

How to fix   Long Method    Complexity   

Long Method

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

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

Commonly applied refactorings include:

1
<?php
0 ignored issues
show
Coding Style Compatibility introduced by
For compatibility and reusability of your code, PSR1 recommends that a file should introduce either new symbols (like classes, functions, etc.) or have side-effects (like outputting something, or including other files), but not both at the same time. The first symbol is defined on line 15 and the first side effect is on line 1828.

The PSR-1: Basic Coding Standard recommends that a file should either introduce new symbols, that is classes, functions, constants or similar, or have side effects. Side effects are anything that executes logic, like for example printing output, changing ini settings or writing to a file.

The idea behind this recommendation is that merely auto-loading a class should not change the state of an application. It also promotes a cleaner style of programming and makes your code less prone to errors, because the logic is not spread out all over the place.

To learn more about the PSR-1, please see the PHP-FIG site on the PSR-1.

Loading history...
2
/**
3
 * GravityView Frontend functions
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
15
class GravityView_frontend {
0 ignored issues
show
Coding Style introduced by
Since you have declared the constructor as private, maybe you should also declare the class as final.
Loading history...
16
17
	/**
18
	 * Regex strings that are used to determine whether the current request is a GravityView search or not.
19
	 * @see GravityView_frontend::is_searching()
20
	 * @since 1.7.4.1
21
	 * @var array
22
	 */
23
	private static $search_parameters = array( 'gv_search', 'gv_start', 'gv_end', 'gv_id', 'gv_by', 'filter_*' );
24
25
	/**
26
	 * Is the currently viewed post a `gravityview` post type?
27
	 * @var boolean
28
	 */
29
	var $is_gravityview_post_type = false;
0 ignored issues
show
Coding Style introduced by
The visibility should be declared for property $is_gravityview_post_type.

The PSR-2 coding standard requires that all properties in a class have their visibility explicitly declared. If you declare a property using

class A {
    var $property;
}

the property is implicitly global.

To learn more about the PSR-2, please see the PHP-FIG site on the PSR-2.

Loading history...
30
31
	/**
32
	 * Does the current post have a `[gravityview]` shortcode?
33
	 * @var boolean
34
	 */
35
	var $post_has_shortcode = false;
0 ignored issues
show
Coding Style introduced by
The visibility should be declared for property $post_has_shortcode.

The PSR-2 coding standard requires that all properties in a class have their visibility explicitly declared. If you declare a property using

class A {
    var $property;
}

the property is implicitly global.

To learn more about the PSR-2, please see the PHP-FIG site on the PSR-2.

Loading history...
36
37
	/**
38
	 * The Post ID of the currently viewed post. Not necessarily GV
39
	 * @var int
40
	 */
41
	var $post_id = null;
0 ignored issues
show
Coding Style introduced by
The visibility should be declared for property $post_id.

The PSR-2 coding standard requires that all properties in a class have their visibility explicitly declared. If you declare a property using

class A {
    var $property;
}

the property is implicitly global.

To learn more about the PSR-2, please see the PHP-FIG site on the PSR-2.

Loading history...
42
43
	/**
44
	 * Are we currently viewing a single entry?
45
	 * If so, the int value of the entry ID. Otherwise, false.
46
	 * @var int|boolean
47
	 */
48
	var $single_entry = false;
0 ignored issues
show
Coding Style introduced by
The visibility should be declared for property $single_entry.

The PSR-2 coding standard requires that all properties in a class have their visibility explicitly declared. If you declare a property using

class A {
    var $property;
}

the property is implicitly global.

To learn more about the PSR-2, please see the PHP-FIG site on the PSR-2.

Loading history...
49
50
	/**
51
	 * If we are viewing a single entry, the entry data
52
	 * @var array|false
53
	 */
54
	var $entry = false;
0 ignored issues
show
Coding Style introduced by
The visibility should be declared for property $entry.

The PSR-2 coding standard requires that all properties in a class have their visibility explicitly declared. If you declare a property using

class A {
    var $property;
}

the property is implicitly global.

To learn more about the PSR-2, please see the PHP-FIG site on the PSR-2.

Loading history...
55
56
	/**
57
	 * When displaying the single entry we should always know to which View it belongs (the context is everything!)
58
	 * @var null
59
	 */
60
	var $context_view_id = null;
0 ignored issues
show
Coding Style introduced by
The visibility should be declared for property $context_view_id.

The PSR-2 coding standard requires that all properties in a class have their visibility explicitly declared. If you declare a property using

class A {
    var $property;
}

the property is implicitly global.

To learn more about the PSR-2, please see the PHP-FIG site on the PSR-2.

Loading history...
61
62
	/**
63
	 * The View is showing search results
64
	 * @since 1.5.4
65
	 * @var boolean
66
	 */
67
	var $is_search = false;
0 ignored issues
show
Coding Style introduced by
The visibility should be declared for property $is_search.

The PSR-2 coding standard requires that all properties in a class have their visibility explicitly declared. If you declare a property using

class A {
    var $property;
}

the property is implicitly global.

To learn more about the PSR-2, please see the PHP-FIG site on the PSR-2.

Loading history...
68
69
	/**
70
	 * The view data parsed from the $post
71
	 *
72
	 * @see  GravityView_View_Data::__construct()
73
	 * @var GravityView_View_Data
74
	 */
75
	var $gv_output_data = null;
0 ignored issues
show
Coding Style introduced by
The visibility should be declared for property $gv_output_data.

The PSR-2 coding standard requires that all properties in a class have their visibility explicitly declared. If you declare a property using

class A {
    var $property;
}

the property is implicitly global.

To learn more about the PSR-2, please see the PHP-FIG site on the PSR-2.

Loading history...
76
77
	/**
78
	 * @var GravityView_frontend
79
	 */
80
	static $instance;
0 ignored issues
show
Coding Style introduced by
The visibility should be declared for property $instance.

The PSR-2 coding standard requires that all properties in a class have their visibility explicitly declared. If you declare a property using

class A {
    var $property;
}

the property is implicitly global.

To learn more about the PSR-2, please see the PHP-FIG site on the PSR-2.

Loading history...
81
82
	/**
83
	 * Class constructor, enforce Singleton pattern
84
	 */
85
	private function __construct() {}
86
87 2
	private function initialize() {
88 2
		add_action( 'wp', array( $this, 'parse_content'), 11 );
0 ignored issues
show
introduced by
No space before closing parenthesis of array is bad style
Loading history...
89 2
		add_filter( 'parse_query', array( $this, 'parse_query_fix_frontpage' ), 10 );
90 2
		add_action( 'template_redirect', array( $this, 'set_entry_data'), 1 );
0 ignored issues
show
introduced by
No space before closing parenthesis of array is bad style
Loading history...
91
92
		// Enqueue scripts and styles after GravityView_Template::register_styles()
93 2
		add_action( 'wp_enqueue_scripts', array( $this, 'add_scripts_and_styles' ), 20 );
94
95
		// Enqueue and print styles in the footer. Added 1 priorty so stuff gets printed at 10 priority.
96 2
		add_action( 'wp_print_footer_scripts', array( $this, 'add_scripts_and_styles' ), 1 );
97
98 2
		add_filter( 'the_title', array( $this, 'single_entry_title' ), 1, 2 );
99 2
		add_filter( 'the_content', array( $this, 'insert_view_in_content' ) );
100 2
		add_filter( 'comments_open', array( $this, 'comments_open' ), 10, 2 );
101
102 2
		add_action( 'gravityview_after', array( $this, 'context_not_configured_warning' ) );
103 2
	}
104
105
	/**
106
	 * Get the one true instantiated self
107
	 * @return GravityView_frontend
108
	 */
109 2
	public static function getInstance() {
0 ignored issues
show
Coding Style introduced by
The function name getInstance is in camel caps, but expected get_instance instead as per the coding standard.
Loading history...
110
111 2
		if ( empty( self::$instance ) ) {
112 2
			self::$instance = new self;
113 2
			self::$instance->initialize();
114
		}
115
116 2
		return self::$instance;
117
	}
118
119
	/**
120
	 * @return GravityView_View_Data
121
	 */
122
	public function getGvOutputData() {
0 ignored issues
show
Coding Style introduced by
The function name getGvOutputData is in camel caps, but expected get_gv_output_data instead as per the coding standard.
Loading history...
123
		return $this->gv_output_data;
124
	}
125
126
	/**
127
	 * @param GravityView_View_Data $gv_output_data
128
	 */
129
	public function setGvOutputData( $gv_output_data ) {
0 ignored issues
show
Coding Style introduced by
The function name setGvOutputData is in camel caps, but expected set_gv_output_data instead as per the coding standard.
Loading history...
130
		$this->gv_output_data = $gv_output_data;
131
	}
132
133
	/**
134
	 * @return boolean
135
	 */
136
	public function isSearch() {
0 ignored issues
show
Coding Style introduced by
The function name isSearch is in camel caps, but expected is_search instead as per the coding standard.
Loading history...
137
		return $this->is_search;
138
	}
139
140
	/**
141
	 * @param boolean $is_search
142
	 */
143
	public function setIsSearch( $is_search ) {
0 ignored issues
show
Coding Style introduced by
The function name setIsSearch is in camel caps, but expected set_is_search instead as per the coding standard.
Loading history...
144
		$this->is_search = $is_search;
145
	}
146
147
	/**
148
	 * @return bool|int
149
	 */
150 1
	public function getSingleEntry() {
0 ignored issues
show
Coding Style introduced by
The function name getSingleEntry is in camel caps, but expected get_single_entry instead as per the coding standard.
Loading history...
151 1
		return $this->single_entry;
152
	}
153
154
	/**
155
	 * Sets the single entry ID and also the entry
156
	 * @param bool|int|string $single_entry
157
	 */
158
	public function setSingleEntry( $single_entry ) {
0 ignored issues
show
Coding Style introduced by
The function name setSingleEntry is in camel caps, but expected set_single_entry instead as per the coding standard.
Loading history...
159
160
		$this->single_entry = $single_entry;
161
162
	}
163
164
	/**
165
	 * @return array
166
	 */
167
	public function getEntry() {
0 ignored issues
show
Coding Style introduced by
The function name getEntry is in camel caps, but expected get_entry instead as per the coding standard.
Loading history...
168
		return $this->entry;
169
	}
170
171
	/**
172
	 * Set the current entry
173
	 * @param array|int $entry Entry array or entry slug or ID
174
	 */
175
	public function setEntry( $entry ) {
0 ignored issues
show
Coding Style introduced by
The function name setEntry is in camel caps, but expected set_entry instead as per the coding standard.
Loading history...
176
177
		if ( ! is_array( $entry ) ) {
178
			$entry = GVCommon::get_entry( $entry );
179
		}
180
181
		$this->entry = $entry;
182
	}
183
184
	/**
185
	 * @return int
186
	 */
187
	public function getPostId() {
0 ignored issues
show
Coding Style introduced by
The function name getPostId is in camel caps, but expected get_post_id instead as per the coding standard.
Loading history...
188
		return $this->post_id;
189
	}
190
191
	/**
192
	 * @param int $post_id
193
	 */
194
	public function setPostId( $post_id ) {
0 ignored issues
show
Coding Style introduced by
The function name setPostId is in camel caps, but expected set_post_id instead as per the coding standard.
Loading history...
195
		$this->post_id = $post_id;
196
	}
197
198
	/**
199
	 * @return boolean
200
	 */
201 2
	public function isPostHasShortcode() {
0 ignored issues
show
Coding Style introduced by
The function name isPostHasShortcode is in camel caps, but expected is_post_has_shortcode instead as per the coding standard.
Loading history...
202 2
		return $this->post_has_shortcode;
203
	}
204
205
	/**
206
	 * @param boolean $post_has_shortcode
207
	 */
208
	public function setPostHasShortcode( $post_has_shortcode ) {
0 ignored issues
show
Coding Style introduced by
The function name setPostHasShortcode is in camel caps, but expected set_post_has_shortcode instead as per the coding standard.
Loading history...
209
		$this->post_has_shortcode = $post_has_shortcode;
210
	}
211
212
	/**
213
	 * @return boolean
214
	 */
215 2
	public function isGravityviewPostType() {
0 ignored issues
show
Coding Style introduced by
The function name isGravityviewPostType is in camel caps, but expected is_gravityview_post_type instead as per the coding standard.
Loading history...
216 2
		return $this->is_gravityview_post_type;
217
	}
218
219
	/**
220
	 * @param boolean $is_gravityview_post_type
221
	 */
222
	public function setIsGravityviewPostType( $is_gravityview_post_type ) {
0 ignored issues
show
Coding Style introduced by
The function name setIsGravityviewPostType is in camel caps, but expected set_is_gravityview_post_type instead as per the coding standard.
Loading history...
223
		$this->is_gravityview_post_type = $is_gravityview_post_type;
224
	}
225
226
	/**
227
	 * Set the context view ID used when page contains multiple embedded views or displaying the single entry view
228
	 *
229
	 *
230
	 *
231
	 * @param null $view_id
232
	 */
233 2
	public function set_context_view_id( $view_id = null ) {
234 2
		$multiple_views = defined( 'GRAVITYVIEW_FUTURE_CORE_LOADED' ) ? gravityview()->views->count() > 1 : ( $this->getGvOutputData() && $this->getGvOutputData()->has_multiple_views() );
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...
Deprecated Code introduced by
The method GravityView_View_Data::has_multiple_views() has been deprecated.

This method has been deprecated.

Loading history...
235
236 2
		if ( ! empty( $view_id ) ) {
237
238 2
			$this->context_view_id = $view_id;
239
240 2
		} elseif ( isset( $_GET['gvid'] ) && $multiple_views ) {
241
			/**
242
			 * used on a has_multiple_views context
243
			 * @see GravityView_API::entry_link
244
			 */
245 1
			$this->context_view_id = $_GET['gvid'];
0 ignored issues
show
introduced by
Detected access of super global var $_GET, probably need manual inspection.
Loading history...
introduced by
Detected usage of a non-sanitized input variable: $_GET
Loading history...
246
247 2
		} elseif ( ! $multiple_views ) {
248 2
			if ( defined( 'GRAVITYVIEW_FUTURE_CORE_LOADED' ) ) {
249 2
				$view = gravityview()->views->last();
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...
250 2
				$this->context_view_id = $view ? $view->ID : null;
251
			} else {
252
				/** GravityView_View_Data::get_views is deprecated. */
253
				$array_keys = array_keys( $this->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...
254
				$this->context_view_id = array_pop( $array_keys );
255
				unset( $array_keys );
256
			}
257
		}
258
259 2
	}
260
261
	/**
262
	 * Returns the the view_id context when page contains multiple embedded views or displaying single entry view
263
	 *
264
	 * @since 1.5.4
265
	 *
266
	 * @return string
267
	 */
268
	public function get_context_view_id() {
269
		return $this->context_view_id;
270
	}
271
272
	/**
273
	 * Allow GravityView entry endpoints on the front page of a site
274
	 *
275
	 * @link  https://core.trac.wordpress.org/ticket/23867 Fixes this core issue
276
	 * @link https://wordpress.org/plugins/cpt-on-front-page/ Code is based on this
277
	 *
278
	 * @since 1.17.3
279
	 *
280
	 * @param WP_Query &$query (passed by reference)
281
	 *
282
	 * @return void
283
	 */
284 4
	public function parse_query_fix_frontpage( &$query ) {
285 4
		global $wp_rewrite;
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...
286
287 4
		$is_front_page = ( $query->is_home || $query->is_page );
288 4
		$show_on_front = ( 'page' === get_option('show_on_front') );
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...
289 4
		$front_page_id = get_option('page_on_front');
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...
290
291 4
		if (  $is_front_page && $show_on_front && $front_page_id ) {
292
293
			// Force to be an array, potentially a query string ( entry=16 )
294
			$_query = wp_parse_args( $query->query );
295
296
			// pagename can be set and empty depending on matched rewrite rules. Ignore an empty pagename.
297
			if ( isset( $_query['pagename'] ) && '' === $_query['pagename'] ) {
298
				unset( $_query['pagename'] );
299
			}
300
301
			// this is where will break from core wordpress
302
			$ignore = array( 'preview', 'page', 'paged', 'cpage' );
303
			$endpoints = rgobj( $wp_rewrite, 'endpoints' );
304
			foreach ( (array) $endpoints as $endpoint ) {
305
				$ignore[] = $endpoint[1];
306
			}
307
			unset( $endpoints );
308
309
			// Modify the query if:
310
			// - We're on the "Page on front" page (which we are), and:
311
			// - The query is empty OR
312
			// - The query includes keys that are associated with registered endpoints. `entry`, for example.
313
			if ( empty( $_query ) || ! array_diff( array_keys( $_query ), $ignore ) ) {
314
315
				$qv =& $query->query_vars;
316
317
				// Prevent redirect when on the single entry endpoint
318
				if( self::is_single_entry() ) {
319
					add_filter( 'redirect_canonical', '__return_false' );
320
				}
321
322
				$query->is_page = true;
323
				$query->is_home = false;
324
				$qv['page_id']  = $front_page_id;
325
326
				// Correct <!--nextpage--> for page_on_front
327
				if ( ! empty( $qv['paged'] ) ) {
328
					$qv['page'] = $qv['paged'];
329
					unset( $qv['paged'] );
330
				}
331
			}
332
333
			// reset the is_singular flag after our updated code above
334
			$query->is_singular = $query->is_single || $query->is_page || $query->is_attachment;
335
		}
336 4
	}
337
338
	/**
339
	 * Read the $post and process the View data inside
340
	 * @param  array  $wp Passed in the `wp` hook. Not used.
341
	 * @return void
342
	 */
343
	public function parse_content( $wp = array() ) {
0 ignored issues
show
Unused Code introduced by
The parameter $wp 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...
344
		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...
345
346
		// If in admin and NOT AJAX request, get outta here.
347
		if ( defined( 'GRAVITYVIEW_FUTURE_CORE_LOADED' ) && gravityview()->request->is_admin() ) {
348
			return;
349
			/** Deprecated in favor of gravityview()->request->is_admin(). */
350
		} else if ( GravityView_Plugin::is_admin() ) {
0 ignored issues
show
Deprecated Code introduced by
The method GravityView_Plugin::is_admin() has been deprecated.

This method has been deprecated.

Loading history...
351
			return;
352
		}
353
354
		// Calculate requested Views
355
		$this->setGvOutputData( GravityView_View_Data::getInstance( $post ) );
356
357
		// !important: we need to run this before getting single entry (to kick the advanced filter)
358
		$this->set_context_view_id();
359
360
		$this->setIsGravityviewPostType( get_post_type( $post ) === 'gravityview' );
361
362
		$post_id = $this->getPostId() ? $this->getPostId() : (isset( $post ) ? $post->ID : null );
363
		$this->setPostId( $post_id );
364
		$post_has_shortcode = ! empty( $post->post_content ) ? gravityview_has_shortcode_r( $post->post_content, 'gravityview' ) : false;
365
		$this->setPostHasShortcode( $this->isGravityviewPostType() ? null : ! empty( $post_has_shortcode ) );
366
367
		// check if the View is showing search results (only for multiple entries View)
368
		$this->setIsSearch( $this->is_searching() );
369
370
		unset( $entry, $post_id, $post_has_shortcode );
371
	}
372
373
	/**
374
	 * Set the entry
375
	 */
376
	function set_entry_data() {
0 ignored issues
show
Best Practice introduced by
It is generally recommended to explicitly declare the visibility for methods.

Adding explicit visibility (private, protected, or public) is generally recommend to communicate to other developers how, and from where this method is intended to be used.

Loading history...
377
		$entry_id = self::is_single_entry();
378
		$this->setSingleEntry( $entry_id );
379
		$this->setEntry( $entry_id );
380
	}
381
382
	/**
383
	 * Checks if the current View is presenting search results
384
	 *
385
	 * @since 1.5.4
386
	 *
387
	 * @return boolean True: Yes, it's a search; False: No, not a search.
388
	 */
389
	function is_searching() {
0 ignored issues
show
Best Practice introduced by
It is generally recommended to explicitly declare the visibility for methods.

Adding explicit visibility (private, protected, or public) is generally recommend to communicate to other developers how, and from where this method is intended to be used.

Loading history...
390
391
		// It's a single entry, not search
392
		if ( $this->getSingleEntry() ) {
393
			return false;
394
		}
395
396
		$search_method = GravityView_Widget_Search::getInstance()->get_search_method();
397
398
		if( 'post' === $search_method ) {
399
			$get = $_POST;
0 ignored issues
show
introduced by
Detected access of super global var $_POST, probably need manual inspection.
Loading history...
introduced by
Detected usage of a non-sanitized input variable: $_POST
Loading history...
400
		} else {
401
			$get = $_GET;
0 ignored issues
show
introduced by
Detected access of super global var $_GET, probably need manual inspection.
Loading history...
introduced by
Detected usage of a non-sanitized input variable: $_GET
Loading history...
402
		}
403
404
		// No $_GET parameters
405
		if ( empty( $get ) || ! is_array( $get ) ) {
406
			return false;
407
		}
408
409
		// Remove empty values
410
		$get = array_filter( $get );
411
412
		// If the $_GET parameters are empty, it's no search.
413
		if ( empty( $get ) ) {
414
			return false;
415
		}
416
417
		$search_keys = array_keys( $get );
418
419
		$search_match = implode( '|', self::$search_parameters );
420
421
		foreach ( $search_keys as $search_key ) {
422
423
			// Analyze the search key $_GET parameter and see if it matches known GV args
424
			if ( preg_match( '/(' . $search_match . ')/i', $search_key ) ) {
425
				return true;
426
			}
427
		}
428
429
		return false;
430
	}
431
432
	/**
433
	 * Filter the title for the single entry view
434
	 *
435
	 * @param  string $title   current title
436
	 * @param  int $passed_post_id Post ID
437
	 * @return string          (modified) title
438
	 */
439 1
	public function single_entry_title( $title, $passed_post_id = null ) {
440 1
		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
		// If this is the directory view, return.
443 1
		if ( ! $this->getSingleEntry() ) {
444
			return $title;
445
		}
446
447 1
		$entry = $this->getEntry();
448
449
		/**
450
		 * @filter `gravityview/single/title/out_loop` Apply the Single Entry Title filter outside the WordPress loop?
451
		 * @param boolean $in_the_loop Whether to apply the filter to the menu title and the meta tag <title> - outside the loop
452
		 * @param array $entry Current entry
453
		 */
454 1
		$apply_outside_loop = apply_filters( 'gravityview/single/title/out_loop' , in_the_loop(), $entry );
455
456 1
		if ( ! $apply_outside_loop ) {
457
			return $title;
458
		}
459
460
		// User reported WooCommerce doesn't pass two args.
461 1
		if ( empty( $passed_post_id ) )  {
462
			return $title;
463
		}
464
465
		// Don't modify the title for anything other than the current view/post.
466
		// This is true for embedded shortcodes and Views.
467 1
		if ( is_object( $post ) && (int) $post->ID !== (int) $passed_post_id ) {
468
			return $title;
469
		}
470
471 1
		$context_view_id = $this->get_context_view_id();
472
473 1
		$multiple_views = defined( 'GRAVITYVIEW_FUTURE_CORE_LOADED' ) ? gravityview()->views->count() > 1 : $this->getGvOutputData()->has_multiple_views();
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...
Deprecated Code introduced by
The method GravityView_View_Data::has_multiple_views() has been deprecated.

This method has been deprecated.

Loading history...
474
475 1
		if ( $multiple_views && ! empty( $context_view_id ) ) {
476 1
			if ( defined( 'GRAVITYVIEW_FUTURE_CORE_LOADED' ) ) {
477 1
				$view = gravityview()->views->get( $context_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...
478 1
				if ( ! $view ) {
479
					/** Emulate the weird behavior of \GravityView_View_Data::get_view adding a view which wasn't there to begin with. */
480
					gravityview()->views->add( \GV\View::by_id( $context_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...
481 1
					$view = gravityview()->views->get( $context_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...
482
				}
483
			} else {
484
				/** Deprecated. Use gravityview()->views->get() or gravityview()->request->get() */
485 1
				$view_meta = $this->getGvOutputData()->get_view( $context_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...
486
			}
487
		} else {
488 1
			if ( defined( 'GRAVITYVIEW_FUTURE_CORE_LOADED' ) ) {
489 1
				foreach ( gravityview()->views->all() as $_view ) {
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...
490 1
					if ( intval( $_view->form->ID ) === intval( $entry['form_id'] ) ) {
491 1
						$view = $_view;
492 1
						break;
493
					}
494
				}
495
496
				/** No matching form sources were found, happens when requesting an entry from a different form . */
497 1
				if ( ! isset( $view ) )
0 ignored issues
show
Coding Style Best Practice introduced by
It is generally a best practice to always use braces with control structures.

Adding braces to control structures avoids accidental mistakes as your code changes:

// Without braces (not recommended)
if (true)
    doSomething();

// Recommended
if (true) {
    doSomething();
}
Loading history...
498 1
					return $title;
499
			} else {
500
				/** Deprecated. Use gravityview()->views->all() or gravityview()->request->all() */
501
				foreach ( $this->getGvOutputData()->get_views() as $view_id => $view_data ) {
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...
502
					if ( intval( $view_data['form_id'] ) === intval( $entry['form_id'] ) ) {
503
						$view_meta = $view_data;
504
						break;
505
					}
506
				}
507
			}
508
		}
509
510 1
		if ( defined( 'GRAVITYVIEW_FUTURE_CORE_LOADED' ) ) {
511 1
			if ( $title = $view->settings->get( 'single_title' ) ) {
512 1
				$title = GravityView_API::replace_variables( $title, $view->form, $entry );
0 ignored issues
show
Bug introduced by
The variable $view 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...
513 1
				$title = do_shortcode( $title );
514
			}
515
		} else {
516
			/** Deprecated stuff in the future. See the branch above. */
517
			if ( ! empty( $view_meta['atts']['single_title'] ) ) {
518
519
				$title = $view_meta['atts']['single_title'];
520
521
				// We are allowing HTML in the fields, so no escaping the output
522
				$title = GravityView_API::replace_variables( $title, $view_meta['form'], $entry );
523
524
				$title = do_shortcode( $title );
525
			}
526
		}
527
0 ignored issues
show
Coding Style introduced by
Functions must not contain multiple empty lines in a row; found 2 empty lines
Loading history...
528
529 1
		return $title;
530
	}
531
532
533
	/**
534
	 * In case View post is called directly, insert the view in the post content
535
	 *
536
	 * @access public
537
	 * @static
538
	 * @param mixed $content
539
	 * @return string Add the View output into View CPT content
540
	 */
541 1
	public function insert_view_in_content( $content ) {
542
543
		// Plugins may run through the content in the header. WP SEO does this for its OpenGraph functionality.
544 1
		if ( ! did_action( 'loop_start' ) ) {
545
546
			do_action( 'gravityview_log_debug', '[insert_view_in_content] Not processing yet: loop_start hasn\'t run yet. Current action:', current_filter() );
547
548
			return $content;
549
		}
550
551
		//	We don't want this filter to run infinite loop on any post content fields
552 1
		remove_filter( 'the_content', array( $this, 'insert_view_in_content' ) );
553
554
		// Otherwise, this is called on the Views page when in Excerpt mode.
555 1
		if ( is_admin() ) {
556
			return $content;
557
		}
558
559
		// Only render in the loop. Fixes issues with the_content filter being applied in places like the sidebar
560 1
		if( ! in_the_loop() ) {
561
			return $content;
562
		}
563
564 1
		if ( $this->isGravityviewPostType() ) {
565
566
			/** @since 1.7.4 */
567 1
			if ( is_preview() && ! gravityview_get_form_id( $this->post_id ) ) {
568
				$content .= __( 'When using a preset template, you must save the View before a Preview is available.', 'gravityview' );
569
			} else {
570 1
				if ( defined( 'GRAVITYVIEW_FUTURE_CORE_LOADED' ) ) {
571 1
					foreach ( gravityview()->views->all() as $view ) {
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...
572 1
						$content .= $this->render_view( array( 'id' => $view->ID ) );
573
					}
574
				} else {
575
					/** The \GravityView_View_Data::get_views method is depreacted. */
576
					foreach ( $this->getGvOutputData()->get_views() as $view_id => $data ) {
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...
577
						$content .= $this->render_view( array( 'id' => $view_id ) );
578
					}
579
				}
580
			}
581
		}
582
583
		//	Add the filter back in
584 1
		add_filter( 'the_content', array( $this, 'insert_view_in_content' ) );
585
586 1
		return $content;
587
	}
588
589
	/**
590
	 * Disable comments on GravityView post types
591
	 * @param  boolean $open    existing status
592
	 * @param  int $post_id Post ID
593
	 * @return boolean
594
	 */
595
	public function comments_open( $open, $post_id ) {
596
597
		if ( $this->isGravityviewPostType() ) {
598
			$open = false;
599
		}
600
601
		/**
602
		 * @filter `gravityview/comments_open` Whether to set comments to open or closed.
603
		 * @since  1.5.4
604
		 * @param  boolean $open Open or closed status
605
		 * @param  int $post_id Post ID to set comment status for
606
		 */
607
		$open = apply_filters( 'gravityview/comments_open', $open, $post_id );
608
609
		return $open;
610
	}
611
612
	/**
613
	 * Display a warning when a View has not been configured
614
	 *
615
	 * @since 1.19.2
616
	 *
617
	 * @param int $view_id The ID of the View currently being displayed
618
	 *
619
	 * @return void
620
	 */
621
	public function context_not_configured_warning( $view_id = 0 ) {
622
623
		if ( ! class_exists( 'GravityView_View' ) ) {
624
			return;
625
		}
626
627
		$fields = GravityView_View::getInstance()->getContextFields();
628
629
		if ( ! empty( $fields ) ) {
630
			return;
631
		}
632
633
		$context = GravityView_View::getInstance()->getContext();
634
635
		switch( $context ) {
636
			case 'directory':
637
				$tab = __( 'Multiple Entries', 'gravityview' );
638
				break;
639
			case 'edit':
640
				$tab = __( 'Edit Entry', 'gravityview' );
641
				break;
642
			case 'single':
643
			default:
644
				$tab = __( 'Single Entry', 'gravityview' );
645
				break;
646
		}
647
0 ignored issues
show
Coding Style introduced by
Functions must not contain multiple empty lines in a row; found 2 empty lines
Loading history...
648
649
		$title = sprintf( esc_html_x('The %s layout has not been configured.', 'Displayed when a View is not configured. %s is replaced by the tab label', 'gravityview' ), $tab );
0 ignored issues
show
Coding Style introduced by
Expected 1 spaces after opening bracket; 0 found
Loading history...
650
		$edit_link = admin_url( sprintf( 'post.php?post=%d&action=edit#%s-view', $view_id, $context ) );
651
		$action_text = sprintf( esc_html__('Add fields to %s', 'gravityview' ), $tab );
0 ignored issues
show
Coding Style introduced by
Expected 1 spaces after opening bracket; 0 found
Loading history...
652
		$message = esc_html__( 'You can only see this message because you are able to edit this View.', 'gravityview' );
653
654
		$output = sprintf( '<h3>%s <strong><a href="%s">%s</a></strong></h3><p>%s</p>', $title, esc_url( $edit_link ), $action_text, $message );
655
656
		echo GVCommon::generate_notice( $output, 'gv-error error', 'edit_gravityview', $view_id );
0 ignored issues
show
introduced by
Expected a sanitizing function (see Codex for 'Data Validation'), but instead saw 'GVCommon'
Loading history...
657
	}
658
659
660
	/**
661
	 * Core function to render a View based on a set of arguments
662
	 *
663
	 * @access public
664
	 * @static
665
	 * @param array $passed_args {
666
	 *
667
	 *      Settings for rendering the View
668
	 *
669
	 *      @type int $id View id
670
	 *      @type int $page_size Number of entries to show per page
671
	 *      @type string $sort_field Form field id to sort
672
	 *      @type string $sort_direction Sorting direction ('ASC' or 'DESC')
673
	 *      @type string $start_date - Ymd
674
	 *      @type string $end_date - Ymd
675
	 *      @type string $class - assign a html class to the view
676
	 *      @type string $offset (optional) - This is the start point in the current data set (0 index based).
677
	 * }
678
	 *
679
	 * @return string|null HTML output of a View, NULL if View isn't found
680
	 */
681 1
	public function render_view( $passed_args ) {
682
683
		// validate attributes
684 1
		if ( empty( $passed_args['id'] ) ) {
685
			do_action( 'gravityview_log_error', '[render_view] Returning; no ID defined.', $passed_args );
686
			return null;
687
		}
688
689
		// Solve problem when loading content via admin-ajax.php
690
		// @hack
691 1
		if ( ! $this->getGvOutputData() ) {
692
693 1
			do_action( 'gravityview_log_error', '[render_view] gv_output_data not defined; parsing content.', $passed_args );
694
695 1
			$this->parse_content();
696
		}
697
698
		// Make 100% sure that we're dealing with a properly called situation
699 1
		if ( ! is_object( $this->getGvOutputData() ) || ! is_callable( array( $this->getGvOutputData(), 'get_view' ) ) ) {
700
701
			do_action( 'gravityview_log_error', '[render_view] gv_output_data not an object or get_view not callable.', $this->getGvOutputData() );
702
703
			return null;
704
		}
705
706 1
		$view_id = $passed_args['id'];
707
708 1
		if ( defined( 'GRAVITYVIEW_FUTURE_CORE_LOADED' ) ) {
709 1
			$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...
710 1
			if ( ! $view ) {
711
				/** Emulate the weird behavior of \GravityView_View_Data::get_view adding a view which wasn't there to begin with. */
712 1
				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...
713 1
				$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...
714
			}
715
716
			/** Update the view settings with the requested arguments. */
717 1
			$view->settings->update( $passed_args );
718
		} else {
719
			/** \GravityView_View_Data::get_view is deprecated. */
720
			$view_data = $this->getGvOutputData()->get_view( $view_id, $passed_args );
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...
721
722
			do_action( 'gravityview_log_debug', '[render_view] View Data: ', $view_data );
723
724
			do_action( 'gravityview_log_debug', '[render_view] Init View. Arguments: ', $passed_args );
725
726
			// The passed args were always winning, even if they were NULL.
727
			// This prevents that. Filters NULL, FALSE, and empty strings.
728
			$passed_args = array_filter( $passed_args, 'strlen' );
729
730
			//Override shortcode args over View template settings
731
			$atts = wp_parse_args( $passed_args, $view_data['atts'] );
732
733
			do_action( 'gravityview_log_debug', '[render_view] Arguments after merging with View settings: ', $atts );
734
		}
735
736
		// It's password protected and you need to log in.
737 1
		if ( post_password_required( $view_id ) ) {
738
739
			do_action( 'gravityview_log_error', sprintf( '[render_view] Returning: View %d is password protected.', $view_id ) );
740
741
			// If we're in an embed or on an archive page, show the password form
742
			if ( get_the_ID() !== $view_id ) {
743
				return get_the_password_form();
744
			}
745
746
			// Otherwise, just get outta here
747
			return null;
748
		}
749
750
		/**
751
		 * Don't render View if user isn't allowed to see it
752
		 * @since 1.15
753
		 * @since 1.17.2 Added check for if a user has no caps but is logged in (member of multisite, but not any site). Treat as if logged-out.
754
		 */
755 1
		if( is_user_logged_in() && ! ( empty( wp_get_current_user()->caps ) && empty( wp_get_current_user()->roles ) ) && false === GVCommon::has_cap( 'read_gravityview', $view_id ) ) {
756
757
			do_action( 'gravityview_log_debug', sprintf( '%s Returning: View %d is not visible by current user.', __METHOD__, $view_id ) );
758
759
			return null;
760
		}
761
762 1
		if( $this->isGravityviewPostType() ) {
763
764
			/**
765
			 * @filter `gravityview_direct_access` Should Views be directly accessible, or only visible using the shortcode?
766
			 * @see https://codex.wordpress.org/Function_Reference/register_post_type#public
767
			 * @see \GV\Entry::get_endpoint_name
768
			 * @since 1.15.2
769
			 * @param[in,out] boolean `true`: allow Views to be accessible directly. `false`: Only allow Views to be embedded via shortcode. Default: `true`
770
			 * @param int $view_id The ID of the View currently being requested. `0` for general setting
771
			 */
772 1
			$direct_access = apply_filters( 'gravityview_direct_access', true, $view_id );
773
774 1
			if ( defined( 'GRAVITYVIEW_FUTURE_CORE_LOADED' ) ) {
775 1
				$embed_only = $view->settings->get( 'embed_only' );
0 ignored issues
show
Bug introduced by
The variable $view 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...
776
			} else {
777
				/** Deprecated. View attributes moved to \GV\View::$settings. */
778
				$embed_only = ! empty( $atts['embed_only'] );
779
			}
780
781 1
			if( ! $direct_access || ( $embed_only && ! GVCommon::has_cap( 'read_private_gravityviews' ) ) ) {
782 1
				return __( 'You are not allowed to view this content.', 'gravityview' );
783
			}
784
		}
785
786 1
		ob_start();
787
788
		/**
789
		 * Set globals for templating
790
		 * @deprecated 1.6.2
791
		 */
792 1
		global $gravityview_view;
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...
793
794 1
		if ( defined( 'GRAVITYVIEW_FUTURE_CORE_LOADED' ) ) {
795 1
			$view_data = $view->as_data();
796 1
			$gravityview_view = new GravityView_View( $view_data );
797 1
			$post_id = intval( $view->settings->get( 'post_id' ) ? : get_the_ID() );
798 1
			$template_id = $view->template ? $view->template->ID : null;
799
		} else {
800
			/** These constructs are deprecated. Use the new gravityview() wrapper. */
801
			$gravityview_view = new GravityView_View( $view_data );
0 ignored issues
show
Bug introduced by
The variable $view_data 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...
802
			$post_id = ! empty( $atts['post_id'] ) ? intval( $atts['post_id'] ) : get_the_ID();
803
			$template_id = $view_data['template_id'];
804
		}
805
806 1
		$gravityview_view->setPostId( $post_id );
807
808 1
		if ( ! $this->getSingleEntry() ) {
809
810
			// user requested Directory View
811 1
			do_action( 'gravityview_log_debug', '[render_view] Executing Directory View' );
812
813
			//fetch template and slug
814 1
			$view_slug = apply_filters( 'gravityview_template_slug_'. $template_id, 'table', 'directory' );
815
816 1
			do_action( 'gravityview_log_debug', '[render_view] View template slug: ', $view_slug );
817
818
			/**
819
			 * Disable fetching initial entries for views that don't need it (DataTables)
820
			 */
821 1
			$get_entries = apply_filters( 'gravityview_get_view_entries_'.$view_slug, true );
822
823 1
			if ( defined( 'GRAVITYVIEW_FUTURE_CORE_LOADED' ) ) {
824 1
				$hide_until_searched = $view->settings->get( 'hide_until_searched' );
825
			} else {
826
				/** $atts is deprecated, use \GV\View:$settings */
827
				$hide_until_searched = ! empty( $atts['hide_until_searched'] );
828
			}
829
830
			/**
831
			 * Hide View data until search is performed
832
			 * @since 1.5.4
833
			 */
834 1
			if ( $hide_until_searched && ! $this->isSearch() ) {
835
				$gravityview_view->setHideUntilSearched( true );
836
				$get_entries = false;
837
			}
838
839 1
			if ( $get_entries ) {
840
841 1
				if ( defined( 'GRAVITYVIEW_FUTURE_CORE_LOADED' ) ) {
842 1
					$sort_columns = $view->settings->get( 'sort_columns' );
843
				} else {
844
					/** $atts is deprecated, use \GV\View:$settings */
845
					$sort_columns = ! empty( $atts['sort_columns'] );
846
				}
847
848 1
				if ( $sort_columns ) {
849
					// add filter to enable column sorting
850
					add_filter( 'gravityview/template/field_label', array( $this, 'add_columns_sort_links' ) , 100, 3 );
851
				}
852
853 1
				if ( defined( 'GRAVITYVIEW_FUTURE_CORE_LOADED' ) ) {
854 1
					$view_entries = self::get_view_entries( $view->settings->as_atts(), $view->form->ID );
855
				} else {
856
					/** $atts is deprecated, use \GV\View:$settings */
857
					/** $view_data is depreacted, use \GV\View properties */
858
					$view_entries = self::get_view_entries( $atts, $view_data['form_id'] );
0 ignored issues
show
Bug introduced by
The variable $atts 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...
859
				}
860
861 1
				do_action( 'gravityview_log_debug', sprintf( '[render_view] Get Entries. Found %s entries total, showing %d entries', $view_entries['count'], sizeof( $view_entries['entries'] ) ) );
862
863
			} else {
864
865
				$view_entries = array( 'count' => null, 'entries' => null, 'paging' => null );
866
867
				do_action( 'gravityview_log_debug', '[render_view] Not fetching entries because `gravityview_get_view_entries_'.$view_slug.'` is false' );
868
			}
869
870 1
			$gravityview_view->setPaging( $view_entries['paging'] );
871 1
			$gravityview_view->setContext( 'directory' );
872 1
			$sections = array( 'header', 'body', 'footer' );
873
874
		} else {
875
876
			// user requested Single Entry View
877 1
			do_action( 'gravityview_log_debug', '[render_view] Executing Single View' );
878
879
			/**
880
			 * @action `gravityview_render_entry_{View ID}` Before rendering a single entry for a specific View ID
881
			 * @since 1.17
882
			 */
883 1
			if ( defined( 'GRAVITYVIEW_FUTURE_CORE_LOADED' ) ) {
884 1
				do_action( 'gravityview_render_entry_' . $view->ID );
885
			} else {
886
				/** $view_data is depreacted, use \GV\View properties */
887
				do_action( 'gravityview_render_entry_'.$view_data['id'] );
888
			}
889
890 1
			$entry = $this->getEntry();
891
892
			// You are not permitted to view this entry.
893 1
			if ( empty( $entry ) || ! self::is_entry_approved( $entry, defined( 'GRAVITYVIEW_FUTURE_CORE_LOADED' ) ? $view->settings->as_atts() : $atts ) ) {
894
895
				do_action( 'gravityview_log_debug', '[render_view] Entry does not exist. This may be because of View filters limiting access.' );
896
897
				// Only display warning once when multiple Views are embedded
898
				if( $view_id !== (int) GravityView_frontend::get_context_view_id() ) {
899
					ob_end_clean();
900
					return null;
901
				}
902
903
				/**
904
				 * @filter `gravityview/render/entry/not_visible` Modify the message shown to users when the entry doesn't exist or they aren't allowed to view it.
905
				 * @since 1.6
906
				 * @param string $message Default: "You have attempted to view an entry that is not visible or may not exist."
907
				 */
908
				$message = apply_filters( 'gravityview/render/entry/not_visible', __( 'You have attempted to view an entry that is not visible or may not exist.', 'gravityview' ) );
909
910
				/**
911
				 * @since 1.6
912
				 */
913
				echo esc_attr( $message );
914
915
				ob_end_clean();
916
				return null;
917
			}
918
919
			// We're in single view, but the view being processed is not the same view the single entry belongs to.
920
			// important: do not remove this as it prevents fake attempts of displaying entries from other views/forms
921 1
			$multiple_views = defined( 'GRAVITYVIEW_FUTURE_CORE_LOADED' ) ? gravityview()->views->count() > 1 : $this->getGvOutputData()->has_multiple_views();
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...
Deprecated Code introduced by
The method GravityView_View_Data::has_multiple_views() has been deprecated.

This method has been deprecated.

Loading history...
922 1
			if ( $multiple_views && $view_id != $this->get_context_view_id() ) {
923
				do_action( 'gravityview_log_debug', '[render_view] In single entry view, but the entry does not belong to this View. Perhaps there are multiple views on the page. View ID: '. $view_id );
924
				ob_end_clean();
925
				return null;
926
			}
927
928
			//fetch template and slug
929 1
			$view_slug = apply_filters( 'gravityview_template_slug_' . $template_id, 'table', 'single' );
930 1
			do_action( 'gravityview_log_debug', '[render_view] View single template slug: ', $view_slug );
931
932
			//fetch entry detail
933 1
			$view_entries['count'] = 1;
0 ignored issues
show
Coding Style Comprehensibility introduced by
$view_entries was never initialized. Although not strictly required by PHP, it is generally a good practice to add $view_entries = array(); before regardless.

Adding an explicit array definition is generally preferable to implicit array definition as it guarantees a stable state of the code.

Let’s take a look at an example:

foreach ($collection as $item) {
    $myArray['foo'] = $item->getFoo();

    if ($item->hasBar()) {
        $myArray['bar'] = $item->getBar();
    }

    // do something with $myArray
}

As you can see in this example, the array $myArray is initialized the first time when the foreach loop is entered. You can also see that the value of the bar key is only written conditionally; thus, its value might result from a previous iteration.

This might or might not be intended. To make your intention clear, your code more readible and to avoid accidental bugs, we recommend to add an explicit initialization $myArray = array() either outside or inside the foreach loop.

Loading history...
934 1
			$view_entries['entries'][] = $entry;
935 1
			do_action( 'gravityview_log_debug', '[render_view] Get single entry: ', $view_entries['entries'] );
936
937 1
			if ( defined( 'GRAVITYVIEW_FUTURE_CORE_LOADED' ) ) {
938 1
				$back_link_label = $view->settings->get( 'back_link_label', null );
939
			} else {
940
				$back_link_label = isset( $atts['back_link_label'] ) ? $atts['back_link_label'] : null;
941
			}
942
943
			// set back link label
944 1
			$gravityview_view->setBackLinkLabel( $back_link_label );
945 1
			$gravityview_view->setContext( 'single' );
946 1
			$sections = array( 'single' );
947
948
		}
949
950
		// add template style
951 1
		self::add_style( $template_id );
952
953
		// Prepare to render view and set vars
954 1
		$gravityview_view->setEntries( $view_entries['entries'] );
955 1
		$gravityview_view->setTotalEntries( $view_entries['count'] );
956
957
		// If Edit
958 1
		if ( 'edit' === gravityview_get_context() ) {
959
960
			do_action( 'gravityview_log_debug', '[render_view] Edit Entry ' );
961
962
			do_action( 'gravityview_edit_entry', $this->getGvOutputData() );
963
964
			return ob_get_clean();
965
966
		} else {
967
			// finaly we'll render some html
968 1
			$sections = apply_filters( 'gravityview_render_view_sections', $sections, $template_id );
969
970 1
			do_action( 'gravityview_log_debug', '[render_view] Sections to render: ', $sections );
971 1
			foreach ( $sections as $section ) {
972 1
				do_action( 'gravityview_log_debug', '[render_view] Rendering '. $section . ' section.' );
973 1
				$gravityview_view->render( $view_slug, $section, false );
974
			}
975
		}
976
977
		//@todo: check why we need the IF statement vs. print the view id always.
978 1
		if ( $this->isGravityviewPostType() || $this->isPostHasShortcode() ) {
979
			// Print the View ID to enable proper cookie pagination
980 1
			echo '<input type="hidden" class="gravityview-view-id" value="' . esc_attr( $view_id ) . '">';
981
		}
982 1
		$output = ob_get_clean();
983
984 1
		return $output;
985
	}
986
987
	/**
988
	 * Process the start and end dates for a view - overrides values defined in shortcode (if needed)
989
	 *
990
	 * The `start_date` and `end_date` keys need to be in a format processable by GFFormsModel::get_date_range_where(),
991
	 * which uses \DateTime() format.
992
	 *
993
	 * You can set the `start_date` or `end_date` to any value allowed by {@link http://www.php.net//manual/en/function.strtotime.php strtotime()},
994
	 * including strings like "now" or "-1 year" or "-3 days".
995
	 *
996
	 * @see GFFormsModel::get_date_range_where
997
	 *
998
	 * @param  array      $args            View settings
999
	 * @param  array      $search_criteria Search being performed, if any
1000
	 * @return array                       Modified `$search_criteria` array
1001
	 */
1002 1
	public static function process_search_dates( $args, $search_criteria = array() ) {
1003
1004 1
		$return_search_criteria = $search_criteria;
1005
1006 1
		foreach ( array( 'start_date', 'end_date' ) as $key ) {
1007
0 ignored issues
show
Coding Style introduced by
Functions must not contain multiple empty lines in a row; found 2 empty lines
Loading history...
1008
1009
			// Is the start date or end date set in the view or shortcode?
1010
			// If so, we want to make sure that the search doesn't go outside the bounds defined.
1011 1
			if ( ! empty( $args[ $key ] ) ) {
1012
1013
				// Get a timestamp and see if it's a valid date format
1014 1
				$date = strtotime( $args[ $key ] );
1015
1016
				// The date was invalid
1017 1
				if ( empty( $date ) ) {
1018
					do_action( 'gravityview_log_error', __METHOD__ . ' Invalid ' . $key . ' date format: ' . $args[ $key ] );
1019
					continue;
1020
				}
1021
1022
				// The format that Gravity Forms expects for start_date and day-specific (not hour/second-specific) end_date
1023 1
				$datetime_format = 'Y-m-d H:i:s';
1024 1
				$search_is_outside_view_bounds = false;
1025
1026 1
				if( ! empty( $search_criteria[ $key ] ) ) {
1027
1028 1
					$search_date = strtotime( $search_criteria[ $key ] );
1029
1030
					// The search is for entries before the start date defined by the settings
1031
					switch ( $key ) {
1032 1
						case 'end_date':
1033
							/**
1034
							 * If the end date is formatted as 'Y-m-d', it should be formatted without hours and seconds
1035
							 * so that Gravity Forms can convert the day to 23:59:59 the previous day.
1036
							 *
1037
							 * If it's a relative date ("now" or "-1 day"), then it should use the precise date format
1038
							 *
1039
							 * @see GFFormsModel::get_date_range_where
1040
							 */
1041 1
							$datetime_format               = gravityview_is_valid_datetime( $args[ $key ] ) ? 'Y-m-d' : 'Y-m-d H:i:s';
1042 1
							$search_is_outside_view_bounds = ( $search_date > $date );
1043 1
							break;
1044 1
						case 'start_date':
1045 1
							$search_is_outside_view_bounds = ( $search_date < $date );
1046 1
							break;
1047
					}
1048
				}
1049
1050
				// If there is no search being performed, or if there is a search being performed that's outside the bounds
1051 1
				if ( empty( $search_criteria[ $key ] ) || $search_is_outside_view_bounds ) {
1052
1053
					// Then we override the search and re-set the start date
1054 1
					$return_search_criteria[ $key ] = date_i18n( $datetime_format , $date, true );
1055
				}
1056
			}
1057
		}
1058
1059 1
		if( isset( $return_search_criteria['start_date'] ) && isset( $return_search_criteria['end_date'] ) ) {
1060
			// The start date is AFTER the end date. This will result in no results, but let's not force the issue.
1061 1
			if ( strtotime( $return_search_criteria['start_date'] ) > strtotime( $return_search_criteria['end_date'] ) ) {
1062 1
				do_action( 'gravityview_log_error', __METHOD__ . ' Invalid search: the start date is after the end date.', $return_search_criteria );
1063
			}
1064
		}
1065
1066 1
		return $return_search_criteria;
1067
	}
1068
1069
1070
	/**
1071
	 * Process the approved only search criteria according to the View settings
1072
	 *
1073
	 * @param  array      $args            View settings
1074
	 * @param  array      $search_criteria Search being performed, if any
1075
	 * @return array                       Modified `$search_criteria` array
1076
	 */
1077
	public static function process_search_only_approved( $args, $search_criteria ) {
1078
1079
		/** @since 1.19 */
1080
		if( ! empty( $args['admin_show_all_statuses'] ) && GVCommon::has_cap('gravityview_moderate_entries') ) {
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...
1081
			do_action( 'gravityview_log_debug', __METHOD__ . ': User can moderate entries; showing all approval statuses' );
1082
			return $search_criteria;
1083
		}
1084
1085
		if ( ! empty( $args['show_only_approved'] ) ) {
1086
1087
			$search_criteria['field_filters'][] = array(
1088
				'key' => GravityView_Entry_Approval::meta_key,
1089
				'value' => GravityView_Entry_Approval_Status::APPROVED
0 ignored issues
show
introduced by
Each line in an array declaration must end in a comma
Loading history...
1090
			);
1091
1092
			$search_criteria['field_filters']['mode'] = 'all'; // force all the criterias to be met
1093
1094
			do_action( 'gravityview_log_debug', '[process_search_only_approved] Search Criteria if show only approved: ', $search_criteria );
1095
		}
1096
1097
		return $search_criteria;
1098
	}
1099
1100
1101
	/**
1102
	 * Check if a certain entry is approved.
1103
	 *
1104
	 * If we pass the View settings ($args) it will check the 'show_only_approved' setting before
1105
	 *   checking the entry approved field, returning true if show_only_approved = false.
1106
	 *
1107
	 * @since 1.7
1108
	 * @since 1.18 Converted check to use GravityView_Entry_Approval_Status::is_approved
1109
	 *
1110
	 * @uses GravityView_Entry_Approval_Status::is_approved
1111
	 *
1112
	 * @param array $entry  Entry object
1113
	 * @param array $args   View settings (optional)
1114
	 *
1115
	 * @return bool
1116
	 */
1117
	public static function is_entry_approved( $entry, $args = array() ) {
1118
1119
		if ( empty( $entry['id'] ) || ( array_key_exists( 'show_only_approved', $args ) && ! $args['show_only_approved'] ) ) {
1120
			// is implicitly approved if entry is null or View settings doesn't require to check for approval
1121
			return true;
1122
		}
1123
1124
		/** @since 1.19 */
1125
		if( ! empty( $args['admin_show_all_statuses'] ) && GVCommon::has_cap('gravityview_moderate_entries') ) {
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...
1126
			do_action( 'gravityview_log_debug', __METHOD__ . ': User can moderate entries, so entry is approved for viewing' );
1127
			return true;
1128
		}
1129
1130
		$is_approved = gform_get_meta( $entry['id'], GravityView_Entry_Approval::meta_key );
1131
1132
		return GravityView_Entry_Approval_Status::is_approved( $is_approved );
1133
	}
1134
1135
	/**
1136
	 * Parse search criteria for a entries search.
1137
	 *
1138
	 * array(
1139
	 * 	'search_field' => 1, // ID of the field
1140
	 *  'search_value' => '', // Value of the field to search
1141
	 *  'search_operator' => 'contains', // 'is', 'isnot', '>', '<', 'contains'
1142
	 *  'show_only_approved' => 0 or 1 // Boolean
1143
	 * )
1144
	 *
1145
	 * @param  array $args    Array of args
1146
	 * @param  int $form_id Gravity Forms form ID
1147
	 * @return array          Array of search parameters, formatted in Gravity Forms mode, using `status` key set to "active" by default, `field_filters` array with `key`, `value` and `operator` keys.
1148
	 */
1149
	public static function get_search_criteria( $args, $form_id ) {
1150
1151
		/**
1152
		 * @filter `gravityview_fe_search_criteria` Modify the search criteria
1153
		 * @see GravityView_Widget_Search::filter_entries Adds the default search criteria
1154
		 * @param array $search_criteria Empty `field_filters` key
1155
		 * @param int $form_id ID of the Gravity Forms form that is being searched
1156
		 */
1157
		$search_criteria = apply_filters( 'gravityview_fe_search_criteria', array( 'field_filters' => array() ), $form_id );
1158
1159
		$original_search_criteria = $search_criteria;
1160
1161
		do_action( 'gravityview_log_debug', '[get_search_criteria] Search Criteria after hook gravityview_fe_search_criteria: ', $search_criteria );
1162
1163
		// implicity search
1164
		if ( ! empty( $args['search_value'] ) ) {
1165
1166
			// Search operator options. Options: `is` or `contains`
1167
			$operator = ! empty( $args['search_operator'] ) && in_array( $args['search_operator'], array( 'is', 'isnot', '>', '<', 'contains' ) ) ? $args['search_operator'] : 'contains';
1168
1169
			$search_criteria['field_filters'][] = array(
1170
				'key' => rgget( 'search_field', $args ), // The field ID to search
1171
				'value' => _wp_specialchars( $args['search_value'] ), // The value to search. Encode ampersands but not quotes.
1172
				'operator' => $operator,
1173
			);
1174
		}
1175
1176
		if( $search_criteria !== $original_search_criteria ) {
1177
			do_action( 'gravityview_log_debug', '[get_search_criteria] Search Criteria after implicity search: ', $search_criteria );
1178
		}
1179
1180
		// Handle setting date range
1181
		$search_criteria = self::process_search_dates( $args, $search_criteria );
1182
1183
		if( $search_criteria !== $original_search_criteria ) {
1184
			do_action( 'gravityview_log_debug', '[get_search_criteria] Search Criteria after date params: ', $search_criteria );
1185
		}
1186
1187
		// remove not approved entries
1188
		$search_criteria = self::process_search_only_approved( $args, $search_criteria );
1189
1190
		/**
1191
		 * @filter `gravityview_status` Modify entry status requirements to be included in search results.
1192
		 * @param string $status Default: `active`. Accepts all Gravity Forms entry statuses, including `spam` and `trash`
1193
		 */
1194
		$search_criteria['status'] = apply_filters( 'gravityview_status', 'active', $args );
1195
1196
		return $search_criteria;
1197
	}
1198
1199
1200
1201
	/**
1202
	 * Core function to calculate View multi entries (directory) based on a set of arguments ($args):
1203
	 *   $id - View id
1204
	 *   $page_size - Page
1205
	 *   $sort_field - form field id to sort
1206
	 *   $sort_direction - ASC / DESC
1207
	 *   $start_date - Ymd
1208
	 *   $end_date - Ymd
1209
	 *   $class - assign a html class to the view
1210
	 *   $offset (optional) - This is the start point in the current data set (0 index based).
1211
	 *
1212
	 *
1213
	 *
1214
	 * @uses  gravityview_get_entries()
1215
	 * @access public
1216
	 * @param array $args\n
0 ignored issues
show
Bug introduced by
There is no parameter named $args\n. 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...
1217
	 *   - $id - View id
1218
	 *   - $page_size - Page
1219
	 *   - $sort_field - form field id to sort
1220
	 *   - $sort_direction - ASC / DESC
1221
	 *   - $start_date - Ymd
1222
	 *   - $end_date - Ymd
1223
	 *   - $class - assign a html class to the view
1224
	 *   - $offset (optional) - This is the start point in the current data set (0 index based).
1225
	 * @param int $form_id Gravity Forms Form ID
1226
	 * @return array Associative array with `count`, `entries`, and `paging` keys. `count` has the total entries count, `entries` is an array with Gravity Forms full entry data, `paging` is an array with `offset` and `page_size` keys
1227
	 */
1228 1
	public static function get_view_entries( $args, $form_id ) {
1229
1230 1
		do_action( 'gravityview_log_debug', '[get_view_entries] init' );
1231
		// start filters and sorting
1232
1233 1
		$parameters = self::get_view_entries_parameters( $args, $form_id );
1234
0 ignored issues
show
Coding Style introduced by
Functions must not contain multiple empty lines in a row; found 2 empty lines
Loading history...
1235
1236 1
		$count = 0; // Must be defined so that gravityview_get_entries can use by reference
1237
1238
		//fetch entries
1239 1
		if ( defined( 'GRAVITYVIEW_FUTURE_CORE_LOADED' ) ) {
1240 1
			$form = \GV\GF_Form::by_id( $form_id );
1241
1242 1
			$entries = $form->entries
0 ignored issues
show
Documentation introduced by
The property entries does not exist on object<GV\GF_Form>. 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...
1243 1
				->filter( \GV\GF_Entry_Filter::from_search_criteria( $parameters['search_criteria'] ) )
1244 1
				->offset( $args['offset'] )
1245 1
				->limit( $parameters['paging']['page_size'] )
1246 1
				->page( ( ( $parameters['paging']['offset'] - $args['offset'] ) / $parameters['paging']['page_size'] ) + 1 );
1247
1248 1
			if ( ! empty( $parameters['sorting'] ) ) {
1249 1
				$field = new \GV\Field();
1250 1
				$field->ID = $parameters['sorting']['key'];
1251 1
				$direction = strtolower( $parameters['sorting']['direction'] ) == 'asc' ? \GV\Entry_Sort::ASC : \GV\Entry_Sort::DESC;
1252 1
				$entries = $entries->sort( new \GV\Entry_Sort( $field, $direction ) );
1253
			}
1254
1255 1
			$parameters['paging'] = array(
1256 1
				'offset' => ( $entries->current_page - 1 ) * $entries->limit,
1257 1
				'page_size' => $entries->limit,
1258
			);
1259 1
			$count = $entries->total();
1260
			$entries = array_map( function( $e ) { return $e->as_entry(); }, $entries->all() );
1261
		} else {
1262
			/** Deprecated, use $form->entries instead. */
1263
			$entries = gravityview_get_entries( $form_id, $parameters, $count );
1264
1265
			/** Adjust count by defined offset. */
1266
			$count = max( 0, ( $count - rgar( $args, 'offset', 0 ) ) );
1267
		}
1268
1269 1
		do_action( 'gravityview_log_debug', sprintf( '%s: Get Entries. Found: %s entries', __METHOD__, $count ), $entries );
1270
1271
		/**
1272
		 * @filter `gravityview_view_entries` Filter the entries output to the View
1273
		 * @deprecated since 1.5.2
1274
		 * @param array $args View settings associative array
1275
		 * @var array
1276
		 */
1277 1
		$entries = apply_filters( 'gravityview_view_entries', $entries, $args );
1278
1279
		$return = array(
1280 1
			'count' => $count,
1281 1
			'entries' => $entries,
1282 1
			'paging' => rgar( $parameters, 'paging' ),
1283
		);
1284
		
1285
		/**
1286
		 * @filter `gravityview/view/entries` Filter the entries output to the View
1287
		 * @param array $criteria associative array containing count, entries & paging
1288
		 * @param array $args View settings associative array
1289
		 * @since 1.5.2
1290
		 */
1291 1
		return apply_filters( 'gravityview/view/entries', $return, $args );
1292
	}
1293
1294
	/**
1295
	 * Get an array of search parameters formatted as Gravity Forms requires
1296
	 *
1297
	 * Results are filtered by `gravityview_get_entries` and `gravityview_get_entries_{View ID}` filters
1298
	 *
1299
	 * @uses GravityView_frontend::get_search_criteria
1300
	 * @uses GravityView_frontend::get_search_criteria_paging
1301
	 *
1302
	 * @since 1.20
1303
	 *
1304
	 * @see \GV\View_Settings::defaults For $args options
1305
	 *
1306
	 * @param array $args Array of View settings, as structured in \GV\View_Settings::defaults
1307
	 * @param int $form_id Gravity Forms form ID to search
1308
	 *
1309
	 * @return array With `search_criteria`, `sorting`, `paging`, `cache` keys
1310
	 */
1311
	public static function get_view_entries_parameters( $args = array(), $form_id = 0 ) {
1312
0 ignored issues
show
Coding Style introduced by
Functions must not contain multiple empty lines in a row; found 2 empty lines
Loading history...
1313
1314
		if ( ! is_array( $args ) || ! is_numeric( $form_id ) ) {
1315
1316
			do_action( 'gravityview_log_error', __METHOD__ . ': Passed args are not an array or the form ID is not numeric' );
1317
1318
			return array();
1319
		}
1320
1321
		$form_id = intval( $form_id );
1322
1323
		/**
1324
		 * Process search parameters
1325
		 * @var array
1326
		 */
1327
		$search_criteria = self::get_search_criteria( $args, $form_id );
1328
1329
		$paging = self::get_search_criteria_paging( $args );
1330
1331
		$parameters = array(
1332
			'search_criteria' => $search_criteria,
1333
			'sorting' => self::updateViewSorting( $args, $form_id ),
1334
			'paging' => $paging,
1335
			'cache' => isset( $args['cache'] ) ? $args['cache'] : true,
1336
		);
1337
1338
		/**
1339
		 * @filter `gravityview_get_entries` Filter get entries criteria
1340
		 * @param array $parameters Array with `search_criteria`, `sorting` and `paging` keys.
1341
		 * @param array $args View configuration args. {
1342
		 *      @type int $id View id
1343
		 *      @type int $page_size Number of entries to show per page
1344
		 *      @type string $sort_field Form field id to sort
1345
		 *      @type string $sort_direction Sorting direction ('ASC' or 'DESC')
1346
		 *      @type string $start_date - Ymd
1347
		 *      @type string $end_date - Ymd
1348
		 *      @type string $class - assign a html class to the view
1349
		 *      @type string $offset (optional) - This is the start point in the current data set (0 index based).
1350
		 * }
1351
		 * @param int $form_id ID of Gravity Forms form
1352
		 */
1353
		$parameters = apply_filters( 'gravityview_get_entries', $parameters, $args, $form_id );
1354
1355
		/**
1356
		 * @filter `gravityview_get_entries_{View ID}` Filter get entries criteria
1357
		 * @param array $parameters Array with `search_criteria`, `sorting` and `paging` keys.
1358
		 * @param array $args View configuration args.
1359
		 */
1360
		$parameters = apply_filters( 'gravityview_get_entries_'.$args['id'], $parameters, $args, $form_id );
1361
1362
		do_action( 'gravityview_log_debug', __METHOD__ . ': $parameters passed to gravityview_get_entries(): ', $parameters );
1363
1364
		return $parameters;
1365
	}
1366
1367
	/**
1368
	 * Get the paging array for the View
1369
	 *
1370
	 * @since 1.19.5
1371
	 *
1372
	 * @param $args
1373
	 * @param int $form_id
0 ignored issues
show
Bug introduced by
There is no parameter named $form_id. 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...
1374
	 */
1375
	public static function get_search_criteria_paging( $args ) {
1376
1377
		/**
1378
		 * @filter `gravityview_default_page_size` The default number of entries displayed in a View
1379
		 * @since 1.1.6
1380
		 * @param int $default_page_size Default: 25
1381
		 */
1382
		$default_page_size = apply_filters( 'gravityview_default_page_size', 25 );
1383
1384
		// Paging & offset
1385
		$page_size = ! empty( $args['page_size'] ) ? intval( $args['page_size'] ) : $default_page_size;
1386
1387
		if ( -1 === $page_size ) {
1388
			$page_size = PHP_INT_MAX;
1389
		}
1390
1391
		$curr_page = empty( $_GET['pagenum'] ) ? 1 : intval( $_GET['pagenum'] );
0 ignored issues
show
introduced by
Detected access of super global var $_GET, probably need manual inspection.
Loading history...
1392
		$offset = ( $curr_page - 1 ) * $page_size;
1393
1394
		if ( ! empty( $args['offset'] ) ) {
1395
			$offset += intval( $args['offset'] );
1396
		}
1397
1398
		$paging = array(
1399
			'offset' => $offset,
1400
			'page_size' => $page_size,
1401
		);
1402
1403
		do_action( 'gravityview_log_debug', __METHOD__ . ': Paging: ', $paging );
1404
1405
		return $paging;
1406
	}
1407
1408
	/**
1409
	 * Updates the View sorting criteria
1410
	 *
1411
	 * @since 1.7
1412
	 *
1413
	 * @param array $args View settings. Required to have `sort_field` and `sort_direction` keys
1414
	 * @param int $form_id The ID of the form used to sort
1415
	 * @return array $sorting Array with `key`, `direction` and `is_numeric` keys
1416
	 */
1417
	public static function updateViewSorting( $args, $form_id ) {
0 ignored issues
show
Coding Style introduced by
The function name updateViewSorting is in camel caps, but expected update_view_sorting instead as per the coding standard.
Loading history...
1418
		$sorting = array();
1419
		$sort_field_id = isset( $_GET['sort'] ) ? $_GET['sort'] : rgar( $args, 'sort_field' );
0 ignored issues
show
introduced by
Detected access of super global var $_GET, probably need manual inspection.
Loading history...
introduced by
Detected usage of a non-sanitized input variable: $_GET
Loading history...
1420
		$sort_direction = isset( $_GET['dir'] ) ? $_GET['dir'] : rgar( $args, 'sort_direction' );
0 ignored issues
show
introduced by
Detected access of super global var $_GET, probably need manual inspection.
Loading history...
introduced by
Detected usage of a non-sanitized input variable: $_GET
Loading history...
1421
1422
		$sort_field_id = self::_override_sorting_id_by_field_type( $sort_field_id, $form_id );
1423
1424
		if ( ! empty( $sort_field_id ) ) {
1425
			$sorting = array(
1426
				'key' => $sort_field_id,
1427
				'direction' => strtolower( $sort_direction ),
1428
				'is_numeric' => GVCommon::is_field_numeric( $form_id, $sort_field_id )
1429
			);
1430
		}
1431
1432
		GravityView_View::getInstance()->setSorting( $sorting );
1433
1434
		do_action( 'gravityview_log_debug', '[updateViewSorting] Sort Criteria : ', $sorting );
1435
1436
		return $sorting;
1437
1438
	}
1439
1440
	/**
1441
	 * Override sorting per field
1442
	 *
1443
	 * Currently only modifies sorting ID when sorting by the full name. Sorts by first name.
1444
	 * Use the `gravityview/sorting/full-name` filter to override.
1445
	 *
1446
	 * @todo Filter from GravityView_Field
1447
	 * @since 1.7.4
1448
	 *
1449
	 * @param int|string $sort_field_id Field used for sorting (`id` or `1.2`)
1450
	 * @param int $form_id GF Form ID
1451
	 *
1452
	 * @return string Possibly modified sorting ID
1453
	 */
1454
	private static function _override_sorting_id_by_field_type( $sort_field_id, $form_id ) {
1455
1456
		$form = gravityview_get_form( $form_id );
1457
1458
		$sort_field = GFFormsModel::get_field( $form, $sort_field_id );
1459
1460
		if( ! $sort_field ) {
1461
			return $sort_field_id;
1462
		}
1463
1464
		switch ( $sort_field['type'] ) {
1465
1466
			case 'address':
1467
				// Sorting by full address
1468
				if ( floatval( $sort_field_id ) === floor( $sort_field_id ) ) {
1469
1470
					/**
1471
					 * Override how to sort when sorting address
1472
					 *
1473
					 * @since 1.8
1474
					 *
1475
					 * @param string $address_part `street`, `street2`, `city`, `state`, `zip`, or `country` (default: `city`)
1476
					 * @param string $sort_field_id Field used for sorting
1477
					 * @param int $form_id GF Form ID
1478
					 */
1479
					$address_part = apply_filters( 'gravityview/sorting/address', 'city', $sort_field_id, $form_id );
1480
1481
					switch( strtolower( $address_part ) ){
1482
						case 'street':
1483
							$sort_field_id .= '.1';
1484
							break;
1485
						case 'street2':
1486
							$sort_field_id .= '.2';
1487
							break;
1488
						default:
1489
						case 'city':
0 ignored issues
show
Unused Code introduced by
case 'city': $sort_f..._id .= '.3'; break; does not seem to be reachable.

This check looks for unreachable code. It uses sophisticated control flow analysis techniques to find statements which will never be executed.

Unreachable code is most often the result of return, die or exit statements that have been added for debug purposes.

function fx() {
    try {
        doSomething();
        return true;
    }
    catch (\Exception $e) {
        return false;
    }

    return false;
}

In the above example, the last return false will never be executed, because a return statement has already been met in every possible execution path.

Loading history...
1490
							$sort_field_id .= '.3';
1491
							break;
1492
						case 'state':
1493
							$sort_field_id .= '.4';
1494
							break;
1495
						case 'zip':
1496
							$sort_field_id .= '.5';
1497
							break;
1498
						case 'country':
1499
							$sort_field_id .= '.6';
1500
							break;
1501
					}
1502
1503
				}
1504
				break;
1505
			case 'name':
1506
				// Sorting by full name, not first, last, etc.
1507
				if ( floatval( $sort_field_id ) === floor( $sort_field_id ) ) {
1508
					/**
1509
					 * @filter `gravityview/sorting/full-name` Override how to sort when sorting full name.
1510
					 * @since 1.7.4
1511
					 * @param[in,out] string $name_part Sort by `first` or `last` (default: `first`)
1512
					 * @param[in] string $sort_field_id Field used for sorting
1513
					 * @param[in] int $form_id GF Form ID
1514
					 */
1515
					$name_part = apply_filters( 'gravityview/sorting/full-name', 'first', $sort_field_id, $form_id );
1516
1517
					if ( 'last' === strtolower( $name_part ) ) {
1518
						$sort_field_id .= '.6';
1519
					} else {
1520
						$sort_field_id .= '.3';
1521
					}
1522
				}
1523
				break;
1524
			case 'list':
1525
				$sort_field_id = false;
1526
				break;
1527
			case 'time':
1528
1529
				/**
1530
				 * @filter `gravityview/sorting/time` Override how to sort when sorting time
1531
				 * @see GravityView_Field_Time
1532
				 * @since 1.14
1533
				 * @param[in,out] string $name_part Field used for sorting
1534
				 * @param[in] int $form_id GF Form ID
1535
				 */
1536
				$sort_field_id = apply_filters( 'gravityview/sorting/time', $sort_field_id, $form_id );
1537
				break;
1538
		}
1539
1540
		return $sort_field_id;
1541
	}
1542
1543
	/**
1544
	 * Verify if user requested a single entry view
1545
	 * @return boolean|string false if not, single entry slug if true
1546
	 */
1547 2
	public static function is_single_entry() {
1548
1549 2
		if ( defined( 'GRAVITYVIEW_FUTURE_CORE_LOADED' ) ) {
1550 2
			$var_name = \GV\Entry::get_endpoint_name();
1551
		} else {
1552
			/** Deprecated. Use \GV\Entry::get_endpoint_name instead. */
1553
			$var_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...
1554
		}
1555
1556 2
		$single_entry = get_query_var( $var_name );
1557
1558
		/**
1559
		 * Modify the entry that is being displayed.
1560
		 *
1561
		 * @internal Should only be used by things like the oEmbed functionality.
1562
		 * @since 1.6
1563
		 */
1564 2
		$single_entry = apply_filters( 'gravityview/is_single_entry', $single_entry );
1565
1566 2
		if ( empty( $single_entry ) ){
1567
			return false;
1568
		} else {
1569 2
			return $single_entry;
1570
		}
1571
	}
1572
1573
1574
	/**
1575
	 * Register styles and scripts
1576
	 *
1577
	 * @access public
1578
	 * @return void
1579
	 */
1580 1
	public function add_scripts_and_styles() {
1581 1
		global $post, $posts;
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...
1582
		// enqueue template specific styles
1583 1
		if ( $this->getGvOutputData() ) {
1584
1585 1
			if ( defined( 'GRAVITYVIEW_FUTURE_CORE_LOADED' ) ) {
1586 1
				$views = 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...
1587
			} else {
1588
				/** \GravityView_View_Data::get_view is no more... */
1589
				$views = $this->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...
1590
			}
1591
1592 1
			foreach ( $views as $view_id => $data ) {
1593 1
				if ( defined( 'GRAVITYVIEW_FUTURE_CORE_LOADED' ) ) {
1594 1
					$view = $data;
1595 1
					$view_id = $view->ID;
1596 1
					$template_id = $view->template ? $view->template->ID : null;
1597 1
					$data = $view->as_data();
1598
				} else {
1599
					$template_id = $data['template_id'];
1600
				}
1601
1602
				/**
1603
				 * Don't enqueue the scripts or styles if it's not going to be displayed.
1604
				 * @since 1.15
1605
				 */
1606 1
				if( is_user_logged_in() && false === GVCommon::has_cap( 'read_gravityview', $view_id ) ) {
1607
					continue;
1608
				}
1609
1610
				// By default, no thickbox
1611 1
				$js_dependencies = array( 'jquery', 'gravityview-jquery-cookie' );
1612 1
				$css_dependencies = array();
1613
1614 1
				if ( defined( 'GRAVITYVIEW_FUTURE_CORE_LOADED' ) ) {
1615 1
					$lightbox = $view->settings->get( 'lightbox' );
0 ignored issues
show
Bug introduced by
The variable $view 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...
1616
				} else {
1617
					/** View data attributes are now stored in \GV\View::$settings */
1618
					$lightbox = ! empty( $data['atts']['lightbox'] );
1619
				}
1620
1621
				// If the thickbox is enqueued, add dependencies
1622 1
				if ( $lightbox ) {
1623
1624
					/**
1625
					 * @filter `gravity_view_lightbox_script` Override the lightbox script to enqueue. Default: `thickbox`
1626
					 * @param string $script_slug If you want to use a different lightbox script, return the name of it here.
1627
					 */
1628 1
					$js_dependencies[] = apply_filters( 'gravity_view_lightbox_script', 'thickbox' );
1629
1630
					/**
1631
					 * @filter `gravity_view_lightbox_style` Modify the lightbox CSS slug. Default: `thickbox`
1632
					 * @param string $script_slug If you want to use a different lightbox script, return the name of its CSS file here.
1633
					 */
1634 1
					$css_dependencies[] = apply_filters( 'gravity_view_lightbox_style', 'thickbox' );
1635
				}
1636
1637
				/**
1638
				 * If the form has checkbox fields, enqueue dashicons
1639
				 * @see https://github.com/katzwebservices/GravityView/issues/536
1640
				 * @since 1.15
1641
				 */
1642 1
				if( gravityview_view_has_single_checkbox_or_radio( $data['form'], $data['fields'] ) ) {
1643
					$css_dependencies[] = 'dashicons';
1644
				}
1645
1646 1
				wp_register_script( 'gravityview-jquery-cookie', plugins_url( 'assets/lib/jquery.cookie/jquery.cookie.min.js', GRAVITYVIEW_FILE ), array( 'jquery' ), GravityView_Plugin::version, true );
1647
1648 1
				$script_debug = ( defined( 'SCRIPT_DEBUG' ) && SCRIPT_DEBUG ) ? '' : '.min';
1649
1650 1
				wp_register_script( 'gravityview-fe-view', plugins_url( 'assets/js/fe-views' . $script_debug . '.js', GRAVITYVIEW_FILE ), apply_filters( 'gravityview_js_dependencies', $js_dependencies ) , GravityView_Plugin::version, true );
1651
1652 1
				wp_enqueue_script( 'gravityview-fe-view' );
1653
1654 1
				if ( ! empty( $data['atts']['sort_columns'] ) ) {
1655
					wp_enqueue_style( 'gravityview_font', plugins_url( 'assets/css/font.css', GRAVITYVIEW_FILE ), $css_dependencies, GravityView_Plugin::version, 'all' );
1656
				}
1657
1658 1
				$this->enqueue_default_style( $css_dependencies );
1659
1660 1
				self::add_style( $template_id );
1661
			}
1662
1663 1
			if ( 'wp_print_footer_scripts' === current_filter() ) {
1664
1665
				$js_localization = array(
1666
					'cookiepath' => COOKIEPATH,
1667
					'clear' => _x( 'Clear', 'Clear all data from the form', 'gravityview' ),
1668
					'reset' => _x( 'Reset', 'Reset the search form to the state that existed on page load', 'gravityview' ),
1669
				);
1670
1671
				/**
1672
				 * @filter `gravityview_js_localization` Modify the array passed to wp_localize_script()
1673
				 * @param array $js_localization The data padded to the Javascript file
1674
				 * @param array $views Array of View data arrays with View settings
1675
				 */
1676
				$js_localization = apply_filters( 'gravityview_js_localization', $js_localization, $views );
1677
1678
				wp_localize_script( 'gravityview-fe-view', 'gvGlobals', $js_localization );
1679
			}
1680
		}
1681 1
	}
1682
1683
	/**
1684
	 * Handle enqueuing the `gravityview_default_style` stylesheet
1685
	 *
1686
	 * @since 1.17
1687
	 *
1688
	 * @param array $css_dependencies Dependencies for the `gravityview_default_style` stylesheet
1689
	 *
1690
	 * @return void
1691
	 */
1692
	private function enqueue_default_style( $css_dependencies = array() ) {
1693
1694
		/**
1695
		 * @filter `gravityview_use_legacy_search_css` Should GravityView use the legacy Search Bar stylesheet (from before Version 1.17)?
1696
		 * @since 1.17
1697
		 * @param bool $use_legacy_search_style If true, loads `gv-legacy-search(-rtl).css`. If false, loads `gv-default-styles(-rtl).css`. `-rtl` is added on RTL websites. Default: `false`
1698
		 */
1699
		$use_legacy_search_style = apply_filters( 'gravityview_use_legacy_search_style', false );
1700
1701
		$rtl = is_rtl() ? '-rtl' : '';
1702
1703
		$css_file_base = $use_legacy_search_style ? 'gv-legacy-search' : 'gv-default-styles';
1704
1705
		$path = gravityview_css_url( $css_file_base . $rtl . '.css' );
1706
1707
		wp_enqueue_style( 'gravityview_default_style', $path, $css_dependencies, GravityView_Plugin::version, 'all' );
1708
	}
1709
1710
	/**
1711
	 * Add template extra style if exists
1712
	 * @param string $template_id
1713
	 */
1714
	public static function add_style( $template_id ) {
1715
1716
		if ( ! empty( $template_id ) && wp_style_is( 'gravityview_style_' . $template_id, 'registered' ) ) {
1717
			do_action( 'gravityview_log_debug', sprintf( '[add_style] Adding extra template style for %s', $template_id ) );
1718
			wp_enqueue_style( 'gravityview_style_' . $template_id );
1719
		} elseif ( empty( $template_id ) ) {
1720
			do_action( 'gravityview_log_error', '[add_style] Cannot add template style; template_id is empty' );
1721
		} else {
1722
			do_action( 'gravityview_log_error', sprintf( '[add_style] Cannot add template style; %s is not registered', 'gravityview_style_'.$template_id ) );
1723
		}
1724
1725
	}
1726
1727
1728
	/**
1729
	 * Inject the sorting links on the table columns
1730
	 *
1731
	 * Callback function for hook 'gravityview/template/field_label'
1732
	 * @see GravityView_API::field_label() (in includes/class-api.php)
1733
	 *
1734
	 * @since 1.7
1735
	 *
1736
	 * @param string $label Field label
1737
	 * @param array $field Field settings
1738
	 *
1739
	 * @return string Field Label
1740
	 */
1741
	public function add_columns_sort_links( $label = '', $field, $form ) {
1742
1743
		/**
1744
		 * Not a table-based template; don't add sort icons
1745
		 * @since 1.12
1746
		 */
1747
		if( ! preg_match( '/table/ism', GravityView_View::getInstance()->getTemplatePartSlug() ) ) {
1748
			return $label;
1749
		}
1750
1751
		if ( ! $this->is_field_sortable( $field['id'], $form ) ) {
1752
			return $label;
1753
		}
1754
1755
		$sorting = GravityView_View::getInstance()->getSorting();
1756
1757
		$class = 'gv-sort';
1758
1759
		$sort_field_id = self::_override_sorting_id_by_field_type( $field['id'], $form['id'] );
1760
1761
		$sort_args = array(
1762
			'sort' => $field['id'],
1763
			'dir' => 'asc',
1764
		);
1765
1766
		if ( ! empty( $sorting['key'] ) && (string) $sort_field_id === (string) $sorting['key'] ) {
1767
			//toggle sorting direction.
1768
			if ( 'asc' === $sorting['direction'] ) {
1769
				$sort_args['dir'] = 'desc';
1770
				$class .= ' gv-icon-sort-desc';
1771
			} else {
1772
				$sort_args['dir'] = 'asc';
1773
				$class .= ' gv-icon-sort-asc';
1774
			}
1775
		} else {
1776
			$class .= ' gv-icon-caret-up-down';
1777
		}
1778
1779
		$url = add_query_arg( $sort_args, remove_query_arg( array('pagenum') ) );
0 ignored issues
show
introduced by
No space after opening parenthesis of array is bad style
Loading history...
introduced by
No space before closing parenthesis of array is bad style
Loading history...
1780
1781
		return '<a href="'. esc_url_raw( $url ) .'" class="'. $class .'" ></a>&nbsp;'. $label;
1782
1783
	}
1784
1785
	/**
1786
	 * Checks if field (column) is sortable
1787
	 *
1788
	 * @param string $field Field settings
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...
1789
	 * @param array $form Gravity Forms form array
1790
	 *
1791
	 * @since 1.7
1792
	 *
1793
	 * @return bool True: Yes, field is sortable; False: not sortable
1794
	 */
1795
	public function is_field_sortable( $field_id = '', $form = array() ) {
1796
1797
		$field_type = $field_id;
1798
1799
		if( is_numeric( $field_id ) ) {
1800
			$field = GFFormsModel::get_field( $form, $field_id );
1801
			$field_type = $field->type;
1802
		}
1803
1804
		$not_sortable = array(
1805
			'edit_link',
1806
			'delete_link',
1807
		);
1808
1809
		/**
1810
		 * @filter `gravityview/sortable/field_blacklist` Modify what fields should never be sortable.
1811
		 * @since 1.7
1812
		 * @param[in,out] array $not_sortable Array of field types that aren't sortable
1813
		 * @param string $field_type Field type to check whether the field is sortable
1814
		 * @param array $form Gravity Forms form
1815
		 */
1816
		$not_sortable = apply_filters( 'gravityview/sortable/field_blacklist', $not_sortable, $field_type, $form );
1817
1818
		if ( in_array( $field_type, $not_sortable ) ) {
1819
			return false;
1820
		}
1821
1822
		return apply_filters( "gravityview/sortable/formfield_{$form['id']}_{$field_id}", apply_filters( "gravityview/sortable/field_{$field_id}", true, $form ) );
1823
1824
	}
1825
1826
}
1827
1828
GravityView_frontend::getInstance();
1829
1830
1831
1832