Completed
Push — develop ( aaa44e...ca5ce1 )
by Gennady
36:00 queued 16:04
created

Legacy_Context::push()   A

Complexity

Conditions 1
Paths 1

Size

Total Lines 4

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 4
CRAP Score 1

Importance

Changes 0
Metric Value
cc 1
nc 1
nop 1
dl 0
loc 4
ccs 4
cts 4
cp 1
crap 1
rs 10
c 0
b 0
f 0
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 691.

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
namespace GV\Mocks;
3
4
/**
5
 * This file contains mock code for deprecated functions.
6
 */
7
8
/**
9
 * @see \GravityView_View_Data::add_view
10
 * @internal
11
 * @since 2.0
12
 *
13
 * @return array|false The old array data, or false on error.
14
 */
15
function GravityView_View_Data_add_view( $view_id, $atts, $_this ) {
0 ignored issues
show
Coding Style introduced by
The function name GravityView_View_Data_add_view is in camel caps, but expected _gravity_view_view_data_add_view instead as per the coding standard.
Loading history...
16
	/** Handle array of IDs. */
17
	if ( is_array( $view_id ) ) {
18
		foreach ( $view_id as $id ) {
19
			call_user_func( __FUNCTION__, $id, $atts, $_this );
20
		}
21
22
		if ( ! $_this->views->count() ) {
23
			return array();
24
		}
25
26
		return array_combine(
27
			array_map( function( $view ) { return $view->ID; }, $_this->views->all() ),
28
			array_map( function( $view ) { return $view->as_data(); }, $_this->views->all() )
29
		);
30
	}
31
32
	/** View has been set already. */
33
	if ( $view = $_this->views->get( $view_id ) ) {
34
		do_action( 'gravityview_log_debug', sprintf( 'GravityView_View_Data[add_view] Returning; View #%s already exists.', $view_id ) );
35
		return $view->as_data();
36
	}
37
38
	$view = \GV\View::by_id( $view_id );
39
	if ( ! $view ) {
40
		do_action( 'gravityview_log_debug', sprintf( 'GravityView_View_Data[add_view] Returning; View #%s does not exist.', $view_id ) );
41
		return false;
42
	}
43
44
	/** Doesn't have a connected form. */
45
	if ( ! $view->form ) {
46
		do_action( 'gravityview_log_debug', sprintf( 'GravityView_View_Data[add_view] Returning; Post ID #%s does not have a connected form.', $view_id ) );
47
		return false;
48
	}
49
50
	/** Update the settings */
51
	if ( is_array( $atts ) ) {
52
		$view->settings->update( $atts );
53
	}
54
55
	$_this->views->add( $view );
56
57
	return $view->as_data();
0 ignored issues
show
Deprecated Code introduced by
The method GV\View::as_data() has been deprecated.

This method has been deprecated.

Loading history...
58
}
59
60
/**
61
 * @see \GravityView_frontend::get_view_entries
62
 * @internal
63
 * @since 2.0
64
 *
65
 * @return array The old associative array data as returned by
66
 *  \GravityView_frontend::get_view_entries(), the paging parameters
67
 *  and a total count of all entries.
68
 */
69
function GravityView_frontend_get_view_entries( $args, $form_id, $parameters, $count ) {
0 ignored issues
show
Coding Style introduced by
The function name GravityView_frontend_get_view_entries is in camel caps, but expected _gravity_view_frontend_get_view_entries instead as per the coding standard.
Loading history...
70 2
	$form = \GV\GF_Form::by_id( $form_id );
71
72
	/**
73
	 * Kick off all advanced filters.
74
	 *
75
	 * Parameters and criteria are pretty much the same thing here, just
76
	 *  different naming, where `$parameters` are the initial parameters
77
	 *  calculated for hte view, and `$criteria` are the filtered ones
78
	 *  retrieved via `GVCommon::calculate_get_entries_criteria`.
79
	 */
80 2
	$criteria = \GVCommon::calculate_get_entries_criteria( $parameters, $form->ID );
81
82 2
	do_action( 'gravityview_log_debug', '[gravityview_get_entries] Final Parameters', $criteria );
83
84
	/** ...and all the (now deprectated) filters that usually follow `gravityview_get_entries` */
85
86
	/**
87
	 * @deprecated
88
	 * Do not use this filter anymore.
89
	 */
90 2
	$entries = apply_filters_ref_array( 'gravityview_before_get_entries', array( null, $criteria, $parameters, &$count ) );
91
92 2
	if ( ! is_null( $entries ) ) {
93
		/**
94
		 * We've been given an entries result that we can return,
95
		 *  just set the paging and we're good to go.
96
		 */
97 2
		$paging = \GV\Utils::get( $parameters, 'paging' );
98
	} else {
99 2
		$entries = new \GV\Entry_Collection();
100 2
		if ( $view = \GV\View::by_id( \GV\Utils::get( $args, 'id' ) ) ) {
101 2
			$view->settings->update( $args );
102 2
			$entries = $view->get_entries( gravityview()->request );
103
		}
104
105 2
		$page = \GV\Utils::get( $parameters['paging'], 'current_page' ) ?
106 2
			: ( ( ( $parameters['paging']['offset'] - $view->settings->get( 'offset' ) ) / $parameters['paging']['page_size'] ) + 1 );
107
108
		/** Set paging, count and unwrap the entries. */
109
		$paging = array(
110 2
			'offset' => ( $page - 1 ) * $view->settings->get( 'page_size' ),
111 2
			'page_size' => $view->settings->get( 'page_size' ),
112
		);
113
		/**
114
		 * GF_Query does not subtract the offset, we have to subtract it ourselves.
115
		 */
116 2
		$count = $entries->total() - ( gravityview()->plugin->supports( \GV\Plugin::FEATURE_GFQUERY ) ? $view->settings->get( 'offset' ) : 0 );
117
		$entries = array_map( function( $e ) { return $e->as_entry(); }, $entries->all() );
118
	}
119
120
	/** Just one more filter, for compatibility's sake! */
121
122
	/**
123
	 * @deprecated
124
	 * Do not use this filter anymore.
125
	 */
126 2
	$entries = apply_filters_ref_array( 'gravityview_entries', array( $entries, $criteria, $parameters, &$count ) );
127
128 2
	return array( $entries, $paging, $count );
129
}
130
131
/**
132
 * The old function does a bit too much, not only does it retrieve
133
 *  the value for a field, but it also renders some output. We are
134
 *  stubbing the plain value part of it, the rendering will follow once
135
 *  our field renderers are ready.
136
 *
137
 * @see \GravityView_API::field_value
138
 * @deprecated Use \GV\Field_Template::render()
139
 * @internal
140
 * @since 2.0
141
 *
142
 * @return null|string The value of a field in an entry.
143
 */
144
function GravityView_API_field_value( $entry, $field_settings, $format ) {
0 ignored issues
show
Unused Code introduced by
The parameter $format 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...
Coding Style introduced by
The function name GravityView_API_field_value is in camel caps, but expected _gravity_view_a_p_i_field_value instead as per the coding standard.
Loading history...
145 3
	if ( empty( $entry['form_id'] ) || empty( $field_settings['id'] ) ) {
146 1
		gravityview()->log->error( 'No entry or field_settings[id] supplied', array( 'data' => array( func_get_args() ) ) );
147 1
		return null;
148
	}
149
150 3
	if ( ! empty( $entry['_multi'] ) && ! empty( $field_settings['form_id'] ) && ! empty( $entry['_multi'][ $field_settings['form_id'] ] ) ) {
151 2
		$entry = $entry['_multi'][ $field_settings['form_id'] ];
152
	}
153
154 3
	if ( empty( $entry['id'] ) || ! $entry = \GV\GF_Entry::by_id( $entry['id'] ) ) {
155
		gravityview()->log->error( 'Invalid \GV\GF_Entry supplied', array( 'data' => $entry ) );
156
		return null;
157
	}
158
159
	/**
160
	 * Determine the source backend.
161
	 *
162
	 * Fields with a numeric ID are Gravity Forms ones.
163
	 */
164 3
	$source = is_numeric( $field_settings['id'] ) ? \GV\Source::BACKEND_GRAVITYFORMS : \GV\Source::BACKEND_INTERNAL;;
165
166
	/** Initialize the future field. */
167
	switch ( $source ):
168
		/** The Gravity Forms backend. */
169 3
		case \GV\Source::BACKEND_GRAVITYFORMS:
170 3
			if ( ! $form = \GV\GF_Form::by_id( $entry['form_id'] ) ) {
171
				gravityview()->log->error( 'No form Gravity Form found for entry', array( 'data' => $entry ) );
172
				return null;
173
			}
174
175 3
			if ( ! $field = $form::get_field( $form, $field_settings['id'] ) ) {
176
				return null;
177
			}
178
179 3
			break;
180
181
		/** Our internal backend. */
182 3
		case \GV\Source::BACKEND_INTERNAL:
183 3
			if ( ! $field = \GV\Internal_Source::get_field( $field_settings['id'] ) ) {
184
				return null;
185
			}
186
187 3
			break;
188
189
		/** An unidentified backend. */
190
		default:
191
			gravityview()->log->error( 'Could not determine source for entry', array( 'data' => array( func_get_args() ) ) );
192
			return null;
193
	endswitch;
194
195
	/** Add the field settings. */
196 3
	$field->update_configuration( $field_settings );
197
198 3
	$renderer = new \GV\Field_Renderer();
199 3
	return $renderer->render( $field, gravityview()->views->get(), $source == \GV\Source::BACKEND_GRAVITYFORMS ? $form : null, $entry, gravityview()->request );
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...
Bug introduced by
The variable $form 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...
200
}
201
202
/**
203
 * Mock out the \GravityView_API::field_label method
204
 *
205
 * Uses the new \GV\Field::get_label methods
206
 *
207
 * @see \GravityView_API::field_label
208
 * @internal
209
 * @since 2.0
210
 *
211
 * @return string The label of a field in an entry.
212
 */
213
function GravityView_API_field_label( $form, $field_settings, $entry, $force_show_label = false ) {
0 ignored issues
show
Coding Style introduced by
The function name GravityView_API_field_label is in camel caps, but expected _gravity_view_a_p_i_field_label instead as per the coding standard.
Loading history...
214
215
	/** A bail condition. */
216
	$bail = function( $label, $field_settings, $entry, $force_show_label, $form ) {
217 2
		if ( ! empty( $field_settings['show_label'] ) || $force_show_label ) {
218
219 2
			$label = isset( $field_settings['label'] ) ? $field_settings['label'] : '';
220
221
			// Use Gravity Forms label by default, but if a custom label is defined in GV, use it.
222 2
			if ( ! empty( $field_settings['custom_label'] ) ) {
223 1
				$label = \GravityView_API::replace_variables( $field_settings['custom_label'], $form, $entry );
224
			}
225
226
			/**
227
			 * @filter `gravityview_render_after_label` Append content to a field label
228
			 * @param[in,out] string $appended_content Content you can add after a label. Empty by default.
229
			 * @param[in] array $field GravityView field array
230
			 */
231 2
			$label .= apply_filters( 'gravityview_render_after_label', '', $field_settings );
232
		}
233
234
		/**
235
		 * @filter `gravityview/template/field_label` Modify field label output
236
		 * @since 1.7
237
		 * @param[in,out] string $label Field label HTML
238
		 * @param[in] array $field GravityView field array
239
		 * @param[in] array $form Gravity Forms form array
240
		 * @param[in] array $entry Gravity Forms entry array
241
		 */
242 2
		$label = apply_filters( 'gravityview/template/field_label', $label, $field_settings, $form, $entry );
243
244 2
		return $label;
245 3
	};
246
247 3
	$label = '';
248
249 3
	if ( ! empty( $entry['_multi'] ) && ! empty( $field_settings['form_id'] ) && ! empty( $entry['_multi'][ $field_settings['form_id'] ] ) ) {
250 2
		$entry = $entry['_multi'][ $field_settings['form_id'] ];
251 2
		if ( $_form = \GV\GF_Form::by_id( $field_settings['form_id'] ) ) {
252 2
			$form = $_form->form;
0 ignored issues
show
Documentation introduced by
The property $form is declared private in GV\Form. Since you implemented __get(), maybe consider adding a @property or @property-read annotation. This makes it easier for IDEs to provide auto-completion.

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

<?php

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

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

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

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

}

Since the property has write access only, you can use the @property-write annotation instead.

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

See also the PhpDoc documentation for @property.

Loading history...
253
		}
254
	}
255
256 3
	if ( empty( $entry['form_id'] ) || empty( $field_settings['id'] ) ) {
257 2
		gravityview()->log->error( 'No entry or field_settings[id] supplied', array( 'data' => array( func_get_args() ) ) );
258 2
		return $bail( $label, $field_settings, $entry, $force_show_label, $form );
259
	}
260
261 3
	if ( empty( $entry['id'] ) || ! $gv_entry = \GV\GF_Entry::by_id( $entry['id'] ) ) {
262
		gravityview()->log->error( 'Invalid \GV\GF_Entry supplied', array( 'data' => $entry ) );
263
		return $bail( $label, $field_settings, $entry, $force_show_label, $form );
264
	}
265
266 3
	$entry = $gv_entry;
267
268
	/**
269
	 * Determine the source backend.
270
	 *
271
	 * Fields with a numeric ID are Gravity Forms ones.
272
	 */
273 3
	$source = is_numeric( $field_settings['id'] ) ? \GV\Source::BACKEND_GRAVITYFORMS : \GV\Source::BACKEND_INTERNAL;
274
275
	/** Initialize the future field. */
276
	switch ( $source ):
277
		/** The Gravity Forms backend. */
278 3
		case \GV\Source::BACKEND_GRAVITYFORMS:
279 3
			if ( ! $gf_form = \GV\GF_Form::by_id( $entry['form_id'] ) ) {
280
				gravityview()->log->error( 'No form Gravity Form found for entry', array( 'data' => $entry ) );
281
				return $bail( $label, $field_settings, $entry->as_entry(), $force_show_label, $form );
282
			}
283
284 3
			if ( ! $field = $gf_form::get_field( $gf_form, $field_settings['id'] ) ) {
285
				gravityview()->log->error( 'No field found for specified form and field ID #{field_id}', array( 'field_id' => $field_settings['id'], 'data' => $form ) );
286
				return $bail( $label, $field_settings, $entry->as_entry(), $force_show_label, $gf_form->form );
0 ignored issues
show
Documentation introduced by
The property $form is declared private in GV\Form. Since you implemented __get(), maybe consider adding a @property or @property-read annotation. This makes it easier for IDEs to provide auto-completion.

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

<?php

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

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

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

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

}

Since the property has write access only, you can use the @property-write annotation instead.

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

See also the PhpDoc documentation for @property.

Loading history...
287
			}
288 3
			if ( empty( $field_settings['show_label'] ) ) {
289
				/** The label never wins... */
290 1
				$field_settings['label'] = '';
291
			}
292
293 3
			break;
294
295
		/** Our internal backend. */
296 3
		case \GV\Source::BACKEND_INTERNAL:
297 3
			if ( ! $field = \GV\Internal_Source::get_field( $field_settings['id'] ) ) {
298
				return $bail( $label, $field_settings, $entry->as_entry(), $force_show_label, $form );
299
			}
300 3
			break;
301
302
		/** An unidentified backend. */
303
		default:
304
			gravityview()->log->error( 'Could not determine source for entry. Using empty field.', array( 'data' => array( func_get_args() ) ) );
305
			$field = new \GV\Field();
306
			break;
307
	endswitch;
308
309 3
	if( $force_show_label ) {
310 1
		$field_settings['show_label'] = '1';
311
	}
312
313
	/** Add the field settings. */
314 3
	$field->update_configuration( $field_settings );
315
316 3
	if ( ! empty( $field->show_label ) ) {
317
318 3
		$label = $field->get_label( null, isset( $gf_form ) ? $gf_form : null, $entry );
319
320
		/**
321
		 * @filter `gravityview_render_after_label` Append content to a field label
322
		 * @param[in,out] string $appended_content Content you can add after a label. Empty by default.
323
		 * @param[in] array $field GravityView field array
324
		 */
325 3
		$label .= apply_filters( 'gravityview_render_after_label', '', $field->as_configuration() );
326
327
	}
328
329
	/**
330
	 * @filter `gravityview/template/field_label` Modify field label output
331
	 * @since 1.7
332
	 * @param[in,out] string $label Field label HTML
333
	 * @param[in] array $field GravityView field array
334
	 * @param[in] array $form Gravity Forms form array
335
	 * @param[in] array $entry Gravity Forms entry array
336
	 */
337 3
	return apply_filters( 'gravityview/template/field_label', $label, $field->as_configuration(), isset( $gf_form ) ? $gf_form->form : $form, $entry->as_entry() );
0 ignored issues
show
Documentation introduced by
The property $form is declared private in GV\Form. Since you implemented __get(), maybe consider adding a @property or @property-read annotation. This makes it easier for IDEs to provide auto-completion.

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

<?php

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

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

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

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

}

Since the property has write access only, you can use the @property-write annotation instead.

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

See also the PhpDoc documentation for @property.

Loading history...
338
}
339
340
341
/**
342
 * A manager of legacy global states and contexts.
343
 *
344
 * Handles mocking of:
345
 * - \GravityView_View_Data
346
 * - \GravityView_View
347
 * - \GravityView_frontend
348
 *
349
 * Allows us to set a specific state globally using the old
350
 *  containers, then reset it. Useful for legacy code that keeps
351
 *  on depending on these variables.
352
 *
353
 * Some examples right now include template files, utility functions,
354
 *  some actions and filters that expect the old contexts to be set.
355
 */
356
final class Legacy_Context {
357
	private static $stack = array();
358
359
	/**
360
	 * Set the state depending on the provided configuration.
361
	 *
362
	 * Saves current global state and context.
363
	 *
364
	 * Configuration keys:
365
	 *
366
	 * - \GV\View	view:		sets \GravityView_View::atts, \GravityView_View::view_id,
367
	 *								 \GravityView_View::back_link_label
368
	 *								 \GravityView_frontend::context_view_id,
369
	 *								 \GravityView_View::form, \GravityView_View::form_id
370
	 * - \GV\Field	field:		sets \GravityView_View::_current_field, \GravityView_View::field_data,
371
	 * - \GV\Entry	entry:		sets \GravityView_View::_current_entry, \GravityView_frontend::single_entry,
372
	 *								 \GravityView_frontend::entry
373
	 * - \WP_Post	post:		sets \GravityView_View::post_id, \GravityView_frontend::post_id,
374
	 *								 \GravityView_frontend::is_gravityview_post_type,
375
	 *								 \GravityView_frontend::post_has_shortcode
376
	 * - array		paging:		sets \GravityView_View::paging
377
	 * - array		sorting:	sets \GravityView_View::sorting
378
	 * - array		template:	sets \GravityView_View::template_part_slug, \GravityView_View::template_part_name
379
	 *
380
	 * - boolean	in_the_loop sets $wp_actions['loop_start'] and $wp_query::in_the_loop
381
	 *
382
	 * also:
383
	 *
384
	 * - \GV\Request	request:	sets \GravityView_frontend::is_search, \GravityView_frontend::single_entry,
385
	 *									 \GravityView_View::context, \GravityView_frontend::entry
386
	 *
387
	 * - \GV\View_Collection	views:		sets \GravityView_View_Data::views
388
	 * - \GV\Field_Collection	fields:		sets \GravityView_View::fields
389
	 * - \GV\Entry_Collection	entries:	sets \GravityView_View::entries, \GravityView_View::total_entries
390
	 *
391
	 * and automagically:
392
	 *
393
	 * - \GravityView_View		data:		sets \GravityView_frontend::gv_output_data
394
	 *
395
	 * @param array $configuration The configuration.
396
	 *
397
	 * @return void
398
	 */
399 33
	public static function push( $configuration ) {
400 33
		array_push( self::$stack, self::freeze() );
401 33
		self::load( $configuration );
402 33
	}
403
404
	/**
405
	 * Restores last saved state and context.
406
	 *
407
	 * @return void
408
	 */
409 32
	public static function pop() {
410 32
		self::thaw( array_pop( self::$stack ) );
411 32
	}
412
413
	/**
414
	 * Serializes the current configuration as needed.
415
	 *
416
	 * @return array The configuration.
417
	 */
418 33
	public static function freeze() {
419 33
		global $wp_actions, $wp_query;
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...
420
421
		return array(
422 33
			'\GravityView_View::atts' => \GravityView_View::getInstance()->getAtts(),
423 33
			'\GravityView_View::view_id' => \GravityView_View::getInstance()->getViewId(),
424 33
			'\GravityView_View::back_link_label' => \GravityView_View::getInstance()->getBackLinkLabel( false ),
0 ignored issues
show
Deprecated Code introduced by
The method GravityView_View::getBackLinkLabel() has been deprecated with message: Use $template->get_back_label();

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

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

Loading history...
425 33
			'\GravityView_View_Data::views' => \GravityView_View_Data::getInstance()->views,
426 33
			'\GravityView_View::entries' => \GravityView_View::getInstance()->getEntries(),
427 33
			'\GravityView_View::form' => \GravityView_View::getInstance()->getForm(),
428 33
			'\GravityView_View::form_id' => \GravityView_View::getInstance()->getFormId(),
429 33
			'\GravityView_View::context' => \GravityView_View::getInstance()->getContext(),
430 33
			'\GravityView_View::total_entries' => \GravityView_View::getInstance()->getTotalEntries(),
431 33
			'\GravityView_View::post_id' => \GravityView_View::getInstance()->getPostId(),
432 33
			'\GravityView_View::hide_until_searched' => \GravityView_View::getInstance()->isHideUntilSearched(),
433 33
			'\GravityView_frontend::post_id' => \GravityView_frontend::getInstance()->getPostId(),
434 33
			'\GravityView_frontend::context_view_id' => \GravityView_frontend::getInstance()->get_context_view_id(),
435 33
			'\GravityView_frontend::is_gravityview_post_type' => \GravityView_frontend::getInstance()->isGravityviewPostType(),
436 33
			'\GravityView_frontend::post_has_shortcode' => \GravityView_frontend::getInstance()->isPostHasShortcode(),
437 33
			'\GravityView_frontend::gv_output_data' => \GravityView_frontend::getInstance()->getGvOutputData(),
438 33
			'\GravityView_View::paging' => \GravityView_View::getInstance()->getPaging(),
439 33
			'\GravityView_View::sorting' => \GravityView_View::getInstance()->getSorting(),
440 33
			'\GravityView_frontend::is_search' => \GravityView_frontend::getInstance()->isSearch(),
441 33
			'\GravityView_frontend::single_entry' => \GravityView_frontend::getInstance()->getSingleEntry(),
442 33
			'\GravityView_frontend::entry' => \GravityView_frontend::getInstance()->getEntry(),
443 33
			'\GravityView_View::_current_entry' => \GravityView_View::getInstance()->getCurrentEntry(),
444 33
			'\GravityView_View::fields' => \GravityView_View::getInstance()->getFields(),
445 33
			'wp_actions[loop_start]' => empty( $wp_actions['loop_start'] ) ? 0 : $wp_actions['loop_start'],
446 33
			'wp_query::in_the_loop' => $wp_query->in_the_loop,
447
		);
448
	}
449
450
	/**
451
	 * Unserializes a saved configuration. Modifies the global state.
452
	 *
453
	 * @param array $data Saved configuration from self::freeze()
454
	 */
455 70
	public static function thaw( $data ) {
456 70
		foreach ( (array)$data as $key => $value ) {
0 ignored issues
show
introduced by
No space after closing casting parenthesis is prohibited
Loading history...
457 70
			switch ( $key ):
458 70
				case '\GravityView_View::atts':
459 33
					\GravityView_View::getInstance()->setAtts( $value );
460 33
					break;
461 70
				case '\GravityView_View::view_id':
462 33
					\GravityView_View::getInstance()->setViewId( $value );
463 33
					break;
464 70
				case '\GravityView_View::back_link_label':
465 33
					\GravityView_View::getInstance()->setBackLinkLabel( $value );
466 33
					break;
467 70
				case '\GravityView_View_Data::views':
468 33
					\GravityView_View_Data::getInstance()->views = $value;
469 33
					break;
470 70
				case '\GravityView_View::entries':
471 33
					\GravityView_View::getInstance()->setEntries( $value );
472 33
					break;
473 70
				case '\GravityView_View::form':
474 33
					\GravityView_View::getInstance()->setForm( $value );
475 33
					break;
476 70
				case '\GravityView_View::form_id':
477 33
					\GravityView_View::getInstance()->setFormId( $value );
478 33
					break;
479 70
				case '\GravityView_View::context':
480 33
					\GravityView_View::getInstance()->setContext( $value );
481 33
					break;
482 70
				case '\GravityView_View::total_entries':
483 33
					\GravityView_View::getInstance()->setTotalEntries( $value );
484 33
					break;
485 70
				case '\GravityView_View::post_id':
486 33
					\GravityView_View::getInstance()->setPostId( $value );
487 33
					break;
488 70
				case '\GravityView_View::is_hide_until_searched':
489 33
					\GravityView_View::getInstance()->setHideUntilSearched( $value );
490 33
					break;
491 70
				case '\GravityView_frontend::post_id':
492 33
					\GravityView_frontend::getInstance()->setPostId( $value );
493 33
					break;
494 70
				case '\GravityView_frontend::context_view_id':
495 33
					$frontend = \GravityView_frontend::getInstance();
496 33
					$frontend->context_view_id = $value;
497 33
					break;
498 70
				case '\GravityView_frontend::is_gravityview_post_type':
499 33
					\GravityView_frontend::getInstance()->setIsGravityviewPostType( $value );
500 33
					break;
501 70
				case '\GravityView_frontend::post_has_shortcode':
502 33
					\GravityView_frontend::getInstance()->setPostHasShortcode( $value );
503 33
					break;
504 70
				case '\GravityView_frontend::gv_output_data':
505 33
					\GravityView_frontend::getInstance()->setGvOutputData( $value );
506 33
					break;
507 70
				case '\GravityView_View::paging':
508 32
					\GravityView_View::getInstance()->setPaging( $value );
509 32
					break;
510 70
				case '\GravityView_View::sorting':
511 32
					\GravityView_View::getInstance()->setSorting( $value );
512 32
					break;
513 70
				case '\GravityView_frontend::is_search':
514 33
					\GravityView_frontend::getInstance()->setIsSearch( $value );
515 33
					break;
516 70
				case '\GravityView_frontend::single_entry':
517 33
					\GravityView_frontend::getInstance()->setSingleEntry( $value );
518 33
					break;
519 70
				case '\GravityView_frontend::entry':
520 33
					\GravityView_frontend::getInstance()->setEntry( $value );
521 33
					break;
522 70
				case '\GravityView_View::_current_entry':
523 33
					\GravityView_View::getInstance()->setCurrentEntry( $value );
524 33
					break;
525 70
				case '\GravityView_View::fields':
526 32
					\GravityView_View::getInstance()->setFields( $value );
527 32
					break;
528 70
				case '\GravityView_View::_current_field':
529 63
					\GravityView_View::getInstance()->setCurrentField( $value );
530 63
					break;
531 32
				case 'wp_actions[loop_start]':
532 32
					global $wp_actions;
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...
533 32
					$wp_actions['loop_start'] = $value;
534 32
					break;
535 32
				case 'wp_query::in_the_loop':
536 32
					global $wp_query;
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...
537 32
					$wp_query->in_the_loop = $value;
538 70
					break;
539
			endswitch;
540
		}
541 70
	}
542
543
	/**
544
	 * Hydrates the legacy context globals as needed.
545
	 *
546
	 * @see self::push() for format.
547
	 *
548
	 * @return void
549
	 */
550 70
	public static function load( $configuration ) {
551 70
		foreach ( (array)$configuration as $key => $value ) {
0 ignored issues
show
introduced by
No space after closing casting parenthesis is prohibited
Loading history...
552 70
			switch ( $key ):
553 70
				case 'view':
554 33
					$views = new \GV\View_Collection();
555 33
					$views->add( $value );
556
557 33
					self::thaw( array(
558 33
						'\GravityView_View::atts' => $value->settings->as_atts(),
559 33
						'\GravityView_View::view_id' => $value->ID,
560 33
						'\GravityView_View::back_link_label' => $value->settings->get( 'back_link_label', null ),
561 33
						'\GravityView_View::form' => $value->form ? $value->form->form : null,
562 33
						'\GravityView_View::form_id' => $value->form ? $value->form->ID : null,
563 33
						'\GravityView_View::is_hide_until_searched' => $value->settings->get( 'hide_until_searched', null ) && ! gravityview()->request->is_search(),
564
565 33
						'\GravityView_View_Data::views' => $views,
566 33
						'\GravityView_frontend::gv_output_data' => \GravityView_View_Data::getInstance(),
567 33
						'\GravityView_frontend::context_view_id' => $value->ID,
568
					) );
569 33
					break;
570 70
				case 'post':
571 11
					$has_shortcode = false;
572 11
					foreach ( \GV\Shortcode::parse( $value->post_content ) as $shortcode ) {
573 3
						if ( $shortcode->name == 'gravityview' ) {
0 ignored issues
show
introduced by
Found "== '". Use Yoda Condition checks, you must
Loading history...
574 3
							$has_shortcode = true;
575 3
							break;
576
						}
577
					}
578 11
					self::thaw( array(
579 11
						'\GravityView_View::post_id' => $value->ID,
580 11
						'\GravityView_frontend::post_id' => $value->ID,
581 11
						'\GravityView_frontend::is_gravityview_post_type' => $value->post_type == 'gravityview',
582 11
						'\GravityView_frontend::post_has_shortcode' => $has_shortcode,
583
					) );
584 11
					break;
585 70
				case 'views':
586
					self::thaw( array(
587
						'\GravityView_View_Data::views' => $value,
588
						'\GravityView_frontend::gv_output_data' => \GravityView_View_Data::getInstance(),
589
					) );
590
					break;
591 70
				case 'entries':
592 33
					self::thaw( array(
593
						'\GravityView_View::entries' => array_map( function( $e ) { return $e->as_entry(); }, $value->all() ),
594 33
						'\GravityView_View::total_entries' => $value->total(),
595
					) );
596 33
					break;
597 70
				case 'entry':
598 28
					self::thaw( array(
599 28
						'\GravityView_frontend::single_entry' => $value->ID,
600 28
						'\GravityView_frontend::entry' => $value->as_entry(),
601 28
						'\GravityView_View::_current_entry' => $value->as_entry(),
602
					) );
603 28
					break;
604 70
				case 'fields':
605 3
					self::thaw( array(
606 3
						'\GravityView_View::fields' => $value->as_configuration(),
607
					) );
608 3
					break;
609 69
				case 'field':
610 63
					self::thaw( array(
611
						'\GravityView_View::_current_field' => array(
612 63
							'field_id' => $value->ID,
613 63
							'field' => $value->field,
614 63
							'field_settings' => $value->as_configuration(),
615 63
							'form' => \GravityView_View::getInstance()->getForm(),
616 63
							'field_type' => $value->type, /** {@since 1.6} */
617 63
							'entry' => \GravityView_View::getInstance()->getCurrentEntry(),
618
619
							// 'field_path' => $field_path, /** {@since 1.16} */
0 ignored issues
show
Unused Code Comprehensibility introduced by
44% of this comment could be valid code. Did you maybe forget this after debugging?

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

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

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

Loading history...
620
							// 'value' => $value,
0 ignored issues
show
Unused Code Comprehensibility introduced by
58% of this comment could be valid code. Did you maybe forget this after debugging?

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

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

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

Loading history...
621
							// 'display_value' => $display_value,
0 ignored issues
show
Unused Code Comprehensibility introduced by
58% of this comment could be valid code. Did you maybe forget this after debugging?

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

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

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

Loading history...
622
							// 'format' => $format,
0 ignored issues
show
Unused Code Comprehensibility introduced by
58% of this comment could be valid code. Did you maybe forget this after debugging?

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

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

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

Loading history...
623
						),
624
					) );
625 63
					break;
626 32
				case 'request':
627 32
					self::thaw( array(
628 32
						'\GravityView_View::context' => (
0 ignored issues
show
introduced by
Each line in an array declaration must end in a comma
Loading history...
629 32
							$value->is_entry() ? 'single' :
630 24
							( $value->is_edit_entry() ? 'edit' :
631 24
									( $value->is_view() ? 'directory': null )
632
								)
633
						),
634 32
						'\GravityView_frontend::is_search' => $value->is_search(),
635
					) );
636
637 32
					if ( ! $value->is_entry() ) {
638 24
						self::thaw( array(
639 24
							'\GravityView_frontend::single_entry' => 0,
640
							'\GravityView_frontend::entry' => 0
0 ignored issues
show
introduced by
Each line in an array declaration must end in a comma
Loading history...
641
						) );
642
					}
643 32
					break;
644 19
				case 'paging':
645 19
					self::thaw( array(
646 19
						'\GravityView_View::paging' => $value,
647
					) );
648 19
					break;
649 19
				case 'sorting':
650 19
					self::thaw( array(
651 19
						'\GravityView_View::sorting' => $value,
652
					) );
653 19
					break;
654 2
				case 'in_the_loop':
655 2
					self::thaw( array(
656 2
						'wp_query::in_the_loop' => $value,
657 2
						'wp_actions[loop_start]' => $value ? 1 : 0,
658
					) );
659 70
					break;
660
			endswitch;
661
		}
662
663 70
		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...
664 70
		$gravityview_view = \GravityView_View::getInstance();
665 70
	}
666
667
	/**
668
	 * Resets the global state completely.
669
	 *
670
	 * Use with utmost care, as filter and action callbacks
671
	 *  may be added again.
672
	 *
673
	 * Does not touch the context stack.
674
	 *
675
	 * @return void
676
	 */
677 75
	public static function reset() {
678 75
		\GravityView_View::$instance = null;
0 ignored issues
show
Bug introduced by
The property instance cannot be accessed from this context as it is declared private in class GravityView_View.

This check looks for access to properties that are not accessible from the current context.

If you need to make a property accessible to another context you can either raise its visibility level or provide an accessible getter in the defining class.

Loading history...
679 75
		\GravityView_frontend::$instance = null;
0 ignored issues
show
Bug introduced by
The property instance cannot be accessed from this context as it is declared private in class GravityView_frontend.

This check looks for access to properties that are not accessible from the current context.

If you need to make a property accessible to another context you can either raise its visibility level or provide an accessible getter in the defining class.

Loading history...
680 75
		\GravityView_View_Data::$instance = null;
0 ignored issues
show
Bug introduced by
The property instance cannot be accessed from this context as it is declared private in class GravityView_View_Data.

This check looks for access to properties that are not accessible from the current context.

If you need to make a property accessible to another context you can either raise its visibility level or provide an accessible getter in the defining class.

Loading history...
681
682 75
		global $wp_query, $wp_actions;
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...
683
684 75
		$wp_query->in_the_loop = false;
685 75
		$wp_actions['loop_start'] = 0;
686 75
	}
687
}
688
689
690
/** Add some global fix for field capability discrepancies. */
691
add_filter( 'gravityview/configuration/fields', function( $fields ) {
692 56
	if ( empty( $fields  ) ) {
0 ignored issues
show
Coding Style introduced by
Expected 1 spaces before closing bracket; 2 found
Loading history...
693
		return $fields;
694
	}
695
696
	/**
697
	 * Each view field is saved in a weird capability state by default.
698
	 *
699
	 * With loggedin set to false, but a capability of 'read' it introduces
700
	 *  some logical issues and is not robust. Fix this behavior throughout
701
	 *  core by making sure capability is '' if log in is not required.
702
	 *
703
	 * Perhaps in the UI a fix would be to unite the two fields (as our new
704
	 *  \GV\Field class already does) into one dropdown:
705
	 *
706
	 * Anyone, Logged In Only, ... etc. etc.
707
	 *
708
	 * The two "settings" should be as tightly coupled as possible to avoid
709
	 *  split logic scenarios. Uniting them into one field is the way to go.
710
	 */
711
712 56
	foreach ( $fields as $position => &$_fields ) {
713
714 56
		if ( empty( $_fields ) || ! is_array( $_fields ) ) {
715
			continue;
716
		}
717
718 56
		foreach ( $_fields as $uid => &$_field ) {
719 56
			if ( ! isset( $_field['only_loggedin'] ) ) {
720 45
				continue;
721
			}
722
			/** If we do not require login, we don't require a cap. */
723 56
			$_field['only_loggedin'] != '1' && ( $_field['only_loggedin_cap'] = '' );
724
		}
725
	}
726 56
	return $fields;
727
} );
728
729
730
/** Add a future fix to make sure field configurations include the form ID. */
731
add_filter( 'gravityview/view/configuration/fields', function( $fields, $view ) {
732 113
	if ( ! $view || empty( $fields ) ) {
733
		return $fields;
734
	}
735
736 113
	if ( ! $view->form || ! $view->form->ID ) {
737
		return $fields;
738
	}
739
740
	/**
741
	 * In order to instantiate the correct \GV\Field implementation
742
	 *  we need to provide a form_id inside the configuration.
743
	 *
744
	 * @todo Make sure this actually happens in the admin side
745
	 *  when saving the views.
746
	 */
747 113
	foreach ( $fields as $position => &$_fields ) {
748
749 113
		if ( empty( $_fields ) || ! is_array( $_fields ) ) {
750
			continue;
751
		}
752
753 113
		foreach ( $_fields as $uid => &$_field ) {
754 113
			if ( ! empty( $_field['id'] ) && is_numeric( $_field['id'] ) && empty( $_field['form_id'] ) ) {
755 113
				$_field['form_id'] = $view->form->ID;
756
			}
757
		}
758
	}
759
760 113
	return $fields;
761
}, 10, 2 );
762
763
764
/** Make sure the non-configured notice is not output twice. */
765
add_action( 'gravityview/template/after', function( $gravityview = null ) {
0 ignored issues
show
Unused Code introduced by
The parameter $gravityview 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...
766 29
	if ( class_exists( '\GravityView_frontend' ) ) {
767 29
		global $wp_filter;
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...
768
769 29
		if ( empty( $wp_filter['gravityview_after'] ) ) {
770
			return;
771
		}
772
773
		/** WordPress 4.6 and lower compatibility, when WP_Hook classes were still absent. */
774 29
		if ( is_array( $wp_filter['gravityview_after'] ) ) {
775
			if ( ! empty( $wp_filter['gravityview_after'][10] ) ) {
776
				foreach ( $wp_filter['gravityview_after'][10] as $function_key => $callback ) {
777
					if ( strpos( $function_key, 'context_not_configured_warning' ) ) {
778
						unset( $wp_filter['gravityview_after'][10][ $function_key ] );
779
					}
780
				}
781
			}
782
			return;
783
		}
784
785 29
		foreach ( $wp_filter['gravityview_after']->callbacks[10] as $function_key => $callback ) {
786 29
			if ( strpos( $function_key, 'context_not_configured_warning' ) ) {
787 29
				unset( $wp_filter['gravityview_after']->callbacks[10][ $function_key ] );
788
			}
789
		}
790
	}
791
} );
792