Completed
Push — master ( 8a7f17...ef3c16 )
by Zack
26:51 queued 23:00
created

Legacy_Context::reset()   A

Complexity

Conditions 1
Paths 1

Size

Total Lines 10
Code Lines 7

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 8
CRAP Score 1

Importance

Changes 0
Metric Value
cc 1
eloc 7
nc 1
nop 0
dl 0
loc 10
ccs 8
cts 8
cp 1
crap 1
rs 9.4285
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 685.

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 1
	$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 1
	$criteria = \GVCommon::calculate_get_entries_criteria( $parameters, $form->ID );
81
82 1
	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 1
	$entries = apply_filters( 'gravityview_before_get_entries', null, $criteria, $parameters, $count );
91 1
	if ( ! is_null( $entries ) ) {
92
		/**
93
		 * We've been given an entries result that we can return,
94
		 *  just set the paging and we're good to go.
95
		 */
96 1
		$paging = \GV\Utils::get( $parameters, 'paging' );
97
	} else {
98 1
		$entries = new \GV\Entry_Collection();
99 1
		if ( $view = \GV\View::by_id( \GV\Utils::get( $args, 'id' ) ) ) {
100 1
			$view->settings->update( $args );
101 1
			$entries = $view->get_entries( gravityview()->request );
102
		}
103
104 1
		$page = \GV\Utils::get( $parameters['paging'], 'current_page' ) ?
105 1
			: ( ( ( $parameters['paging']['offset'] - $view->settings->get( 'offset' ) ) / $parameters['paging']['page_size'] ) + 1 );
106
107
		/** Set paging, count and unwrap the entries. */
108
		$paging = array(
109 1
			'offset' => ( $page - 1 ) * $view->settings->get( 'page_size' ),
110 1
			'page_size' => $view->settings->get( 'page_size' ),
111
		);
112
		/**
113
		 * GF_Query does not subtract the offset, we have to subtract it ourselves.
114
		 */
115 1
		$count = $entries->total() - ( gravityview()->plugin->supports( \GV\Plugin::FEATURE_GFQUERY ) ? $view->settings->get( 'offset' ) : 0 );
116
		$entries = array_map( function( $e ) { return $e->as_entry(); }, $entries->all() );
117
	}
118
119
	/** Just one more filter, for compatibility's sake! */
120
121
	/**
122
	 * @deprecated
123
	 * Do not use this filter anymore.
124
	 */
125 1
	$entries = apply_filters_ref_array( 'gravityview_entries', array( $entries, $criteria, $parameters, &$count ) );
126
127 1
	return array( $entries, $paging, $count );
128
}
129
130
/**
131
 * The old function does a bit too much, not only does it retrieve
132
 *  the value for a field, but it also renders some output. We are
133
 *  stubbing the plain value part of it, the rendering will follow once
134
 *  our field renderers are ready.
135
 *
136
 * @see \GravityView_API::field_value
137
 * @deprecated Use \GV\Field_Template::render()
138
 * @internal
139
 * @since 2.0
140
 *
141
 * @return null|string The value of a field in an entry.
142
 */
143
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...
144 3
	if ( empty( $entry['form_id'] ) || empty( $field_settings['id'] ) ) {
145 1
		gravityview()->log->error( 'No entry or field_settings[id] supplied', array( 'data' => array( func_get_args() ) ) );
146 1
		return null;
147
	}
148
149 3
	if ( ! empty( $entry['_multi'] ) && ! empty( $field_settings['form_id'] ) && ! empty( $entry['_multi'][ $field_settings['form_id'] ] ) ) {
150 2
		$entry = $entry['_multi'][ $field_settings['form_id'] ];
151
	}
152
153 3
	if ( empty( $entry['id'] ) || ! $entry = \GV\GF_Entry::by_id( $entry['id'] ) ) {
154
		gravityview()->log->error( 'Invalid \GV\GF_Entry supplied', array( 'data' => $entry ) );
155
		return null;
156
	}
157
158
	/**
159
	 * Determine the source backend.
160
	 *
161
	 * Fields with a numeric ID are Gravity Forms ones.
162
	 */
163 3
	$source = is_numeric( $field_settings['id'] ) ? \GV\Source::BACKEND_GRAVITYFORMS : \GV\Source::BACKEND_INTERNAL;;
164
165
	/** Initialize the future field. */
166
	switch ( $source ):
167
		/** The Gravity Forms backend. */
168 3
		case \GV\Source::BACKEND_GRAVITYFORMS:
169 3
			if ( ! $form = \GV\GF_Form::by_id( $entry['form_id'] ) ) {
170
				gravityview()->log->error( 'No form Gravity Form found for entry', array( 'data' => $entry ) );
171
				return null;
172
			}
173
174 3
			if ( ! $field = $form::get_field( $form, $field_settings['id'] ) ) {
175
				return null;
176
			}
177
178 3
			break;
179
180
		/** Our internal backend. */
181 3
		case \GV\Source::BACKEND_INTERNAL:
182 3
			if ( ! $field = \GV\Internal_Source::get_field( $field_settings['id'] ) ) {
183
				return null;
184
			}
185
186 3
			break;
187
188
		/** An unidentified backend. */
189
		default:
190
			gravityview()->log->error( 'Could not determine source for entry', array( 'data' => array( func_get_args() ) ) );
191
			return null;
192
	endswitch;
193
194
	/** Add the field settings. */
195 3
	$field->update_configuration( $field_settings );
196
197 3
	$renderer = new \GV\Field_Renderer();
198 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...
199
}
200
201
/**
202
 * Mock out the \GravityView_API::field_label method
203
 *
204
 * Uses the new \GV\Field::get_label methods
205
 *
206
 * @see \GravityView_API::field_label
207
 * @internal
208
 * @since 2.0
209
 *
210
 * @return string The label of a field in an entry.
211
 */
212
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...
213
214
	/** A bail condition. */
215
	$bail = function( $label, $field_settings, $entry, $force_show_label, $form ) {
216 2
		if ( ! empty( $field_settings['show_label'] ) || $force_show_label ) {
217
218 2
			$label = isset( $field_settings['label'] ) ? $field_settings['label'] : '';
219
220
			// Use Gravity Forms label by default, but if a custom label is defined in GV, use it.
221 2
			if ( ! empty( $field_settings['custom_label'] ) ) {
222 1
				$label = \GravityView_API::replace_variables( $field_settings['custom_label'], $form, $entry );
223
			}
224
225
			/**
226
			 * @filter `gravityview_render_after_label` Append content to a field label
227
			 * @param[in,out] string $appended_content Content you can add after a label. Empty by default.
228
			 * @param[in] array $field GravityView field array
229
			 */
230 2
			$label .= apply_filters( 'gravityview_render_after_label', '', $field_settings );
231
		}
232
233
		/**
234
		 * @filter `gravityview/template/field_label` Modify field label output
235
		 * @since 1.7
236
		 * @param[in,out] string $label Field label HTML
237
		 * @param[in] array $field GravityView field array
238
		 * @param[in] array $form Gravity Forms form array
239
		 * @param[in] array $entry Gravity Forms entry array
240
		 */
241 2
		$label = apply_filters( 'gravityview/template/field_label', $label, $field_settings, $form, $entry );
242
243 2
		return $label;
244 3
	};
245
246 3
	$label = '';
247
248 3
	if ( ! empty( $entry['_multi'] ) && ! empty( $field_settings['form_id'] ) && ! empty( $entry['_multi'][ $field_settings['form_id'] ] ) ) {
249 2
		$entry = $entry['_multi'][ $field_settings['form_id'] ];
250 2
		if ( $_form = \GV\GF_Form::by_id( $field_settings['form_id'] ) ) {
251 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...
252
		}
253
	}
254
255 3
	if ( empty( $entry['form_id'] ) || empty( $field_settings['id'] ) ) {
256 2
		gravityview()->log->error( 'No entry or field_settings[id] supplied', array( 'data' => array( func_get_args() ) ) );
257 2
		return $bail( $label, $field_settings, $entry, $force_show_label, $form );
258
	}
259
260 3
	if ( empty( $entry['id'] ) || ! $gv_entry = \GV\GF_Entry::by_id( $entry['id'] ) ) {
261
		gravityview()->log->error( 'Invalid \GV\GF_Entry supplied', array( 'data' => $entry ) );
262
		return $bail( $label, $field_settings, $entry, $force_show_label, $form );
263
	}
264
265 3
	$entry = $gv_entry;
266
267
	/**
268
	 * Determine the source backend.
269
	 *
270
	 * Fields with a numeric ID are Gravity Forms ones.
271
	 */
272 3
	$source = is_numeric( $field_settings['id'] ) ? \GV\Source::BACKEND_GRAVITYFORMS : \GV\Source::BACKEND_INTERNAL;
273
274
	/** Initialize the future field. */
275
	switch ( $source ):
276
		/** The Gravity Forms backend. */
277 3
		case \GV\Source::BACKEND_GRAVITYFORMS:
278 3
			if ( ! $gf_form = \GV\GF_Form::by_id( $entry['form_id'] ) ) {
279
				gravityview()->log->error( 'No form Gravity Form found for entry', array( 'data' => $entry ) );
280
				return $bail( $label, $field_settings, $entry->as_entry(), $force_show_label, $form );
281
			}
282
283 3
			if ( ! $field = $gf_form::get_field( $gf_form, $field_settings['id'] ) ) {
284
				gravityview()->log->error( 'No field found for specified form and field ID #{field_id}', array( 'field_id' => $field_settings['id'], 'data' => $form ) );
285
				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...
286
			}
287 3
			if ( empty( $field_settings['show_label'] ) ) {
288
				/** The label never wins... */
289 1
				$field_settings['label'] = '';
290
			}
291
292 3
			break;
293
294
		/** Our internal backend. */
295 3
		case \GV\Source::BACKEND_INTERNAL:
296 3
			if ( ! $field = \GV\Internal_Source::get_field( $field_settings['id'] ) ) {
297
				return $bail( $label, $field_settings, $entry->as_entry(), $force_show_label, $form );
298
			}
299 3
			break;
300
301
		/** An unidentified backend. */
302
		default:
303
			gravityview()->log->error( 'Could not determine source for entry. Using empty field.', array( 'data' => array( func_get_args() ) ) );
304
			$field = new \GV\Field();
305
			break;
306
	endswitch;
307
308 3
	if( $force_show_label ) {
309 1
		$field_settings['show_label'] = '1';
310
	}
311
312
	/** Add the field settings. */
313 3
	$field->update_configuration( $field_settings );
314
315 3
	if ( ! empty( $field->show_label ) ) {
316
317 3
		$label = $field->get_label( null, isset( $gf_form ) ? $gf_form : null, $entry );
318
319
		/**
320
		 * @filter `gravityview_render_after_label` Append content to a field label
321
		 * @param[in,out] string $appended_content Content you can add after a label. Empty by default.
322
		 * @param[in] array $field GravityView field array
323
		 */
324 3
		$label .= apply_filters( 'gravityview_render_after_label', '', $field->as_configuration() );
325
326
	}
327
328
	/**
329
	 * @filter `gravityview/template/field_label` Modify field label output
330
	 * @since 1.7
331
	 * @param[in,out] string $label Field label HTML
332
	 * @param[in] array $field GravityView field array
333
	 * @param[in] array $form Gravity Forms form array
334
	 * @param[in] array $entry Gravity Forms entry array
335
	 */
336 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...
337
}
338
339
340
/**
341
 * A manager of legacy global states and contexts.
342
 *
343
 * Handles mocking of:
344
 * - \GravityView_View_Data
345
 * - \GravityView_View
346
 * - \GravityView_frontend
347
 *
348
 * Allows us to set a specific state globally using the old
349
 *  containers, then reset it. Useful for legacy code that keeps
350
 *  on depending on these variables.
351
 *
352
 * Some examples right now include template files, utility functions,
353
 *  some actions and filters that expect the old contexts to be set.
354
 */
355
final class Legacy_Context {
356
	private static $stack = array();
357
358
	/**
359
	 * Set the state depending on the provided configuration.
360
	 *
361
	 * Saves current global state and context.
362
	 *
363
	 * Configuration keys:
364
	 *
365
	 * - \GV\View	view:		sets \GravityView_View::atts, \GravityView_View::view_id,
366
	 *								 \GravityView_View::back_link_label
367
	 *								 \GravityView_frontend::context_view_id,
368
	 *								 \GravityView_View::form, \GravityView_View::form_id
369
	 * - \GV\Field	field:		sets \GravityView_View::_current_field, \GravityView_View::field_data,
370
	 * - \GV\Entry	entry:		sets \GravityView_View::_current_entry, \GravityView_frontend::single_entry,
371
	 *								 \GravityView_frontend::entry
372
	 * - \WP_Post	post:		sets \GravityView_View::post_id, \GravityView_frontend::post_id,
373
	 *								 \GravityView_frontend::is_gravityview_post_type,
374
	 *								 \GravityView_frontend::post_has_shortcode
375
	 * - array		paging:		sets \GravityView_View::paging
376
	 * - array		sorting:	sets \GravityView_View::sorting
377
	 * - array		template:	sets \GravityView_View::template_part_slug, \GravityView_View::template_part_name
378
	 *
379
	 * - boolean	in_the_loop sets $wp_actions['loop_start'] and $wp_query::in_the_loop
380
	 *
381
	 * also:
382
	 *
383
	 * - \GV\Request	request:	sets \GravityView_frontend::is_search, \GravityView_frontend::single_entry,
384
	 *									 \GravityView_View::context, \GravityView_frontend::entry
385
	 *
386
	 * - \GV\View_Collection	views:		sets \GravityView_View_Data::views
387
	 * - \GV\Field_Collection	fields:		sets \GravityView_View::fields
388
	 * - \GV\Entry_Collection	entries:	sets \GravityView_View::entries, \GravityView_View::total_entries
389
	 *
390
	 * and automagically:
391
	 *
392
	 * - \GravityView_View		data:		sets \GravityView_frontend::gv_output_data
393
	 *
394
	 * @param array $configuration The configuration.
395
	 *
396
	 * @return void
397
	 */
398 24
	public static function push( $configuration ) {
399 24
		array_push( self::$stack, self::freeze() );
400 24
		self::load( $configuration );
401 24
	}
402
403
	/**
404
	 * Restores last saved state and context.
405
	 *
406
	 * @return void
407
	 */
408 24
	public static function pop() {
409 24
		self::thaw( array_pop( self::$stack ) );
410 24
	}
411
412
	/**
413
	 * Serializes the current configuration as needed.
414
	 *
415
	 * @return array The configuration.
416
	 */
417 24
	public static function freeze() {
418 24
		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...
419
420
		return array(
421 24
			'\GravityView_View::atts' => \GravityView_View::getInstance()->getAtts(),
422 24
			'\GravityView_View::view_id' => \GravityView_View::getInstance()->getViewId(),
423 24
			'\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...
424 24
			'\GravityView_View_Data::views' => \GravityView_View_Data::getInstance()->views,
425 24
			'\GravityView_View::entries' => \GravityView_View::getInstance()->getEntries(),
426 24
			'\GravityView_View::form' => \GravityView_View::getInstance()->getForm(),
427 24
			'\GravityView_View::form_id' => \GravityView_View::getInstance()->getFormId(),
428 24
			'\GravityView_View::context' => \GravityView_View::getInstance()->getContext(),
429 24
			'\GravityView_View::total_entries' => \GravityView_View::getInstance()->getTotalEntries(),
430 24
			'\GravityView_View::post_id' => \GravityView_View::getInstance()->getPostId(),
431 24
			'\GravityView_frontend::post_id' => \GravityView_frontend::getInstance()->getPostId(),
432 24
			'\GravityView_frontend::context_view_id' => \GravityView_frontend::getInstance()->get_context_view_id(),
433 24
			'\GravityView_frontend::is_gravityview_post_type' => \GravityView_frontend::getInstance()->isGravityviewPostType(),
434 24
			'\GravityView_frontend::post_has_shortcode' => \GravityView_frontend::getInstance()->isPostHasShortcode(),
435 24
			'\GravityView_frontend::gv_output_data' => \GravityView_frontend::getInstance()->getGvOutputData(),
436 24
			'\GravityView_View::paging' => \GravityView_View::getInstance()->getPaging(),
437 24
			'\GravityView_View::sorting' => \GravityView_View::getInstance()->getSorting(),
438 24
			'\GravityView_frontend::is_search' => \GravityView_frontend::getInstance()->isSearch(),
439 24
			'\GravityView_frontend::single_entry' => \GravityView_frontend::getInstance()->getSingleEntry(),
440 24
			'\GravityView_frontend::entry' => \GravityView_frontend::getInstance()->getEntry(),
441 24
			'\GravityView_View::_current_entry' => \GravityView_View::getInstance()->getCurrentEntry(),
442 24
			'\GravityView_View::fields' => \GravityView_View::getInstance()->getFields(),
443 24
			'wp_actions[loop_start]' => empty( $wp_actions['loop_start'] ) ? 0 : $wp_actions['loop_start'],
444 24
			'wp_query::in_the_loop' => $wp_query->in_the_loop,
445
		);
446
	}
447
448
	/**
449
	 * Unserializes a saved configuration. Modifies the global state.
450
	 *
451
	 * @param array $data Saved configuration from self::freeze()
452
	 */
453 57
	public static function thaw( $data ) {
454 57
		foreach ( (array)$data as $key => $value ) {
0 ignored issues
show
introduced by
No space after closing casting parenthesis is prohibited
Loading history...
455 57
			switch ( $key ):
456 57
				case '\GravityView_View::atts':
457 24
					\GravityView_View::getInstance()->setAtts( $value );
458 24
					break;
459 57
				case '\GravityView_View::view_id':
460 24
					\GravityView_View::getInstance()->setViewId( $value );
461 24
					break;
462 57
				case '\GravityView_View::back_link_label':
463 24
					\GravityView_View::getInstance()->setBackLinkLabel( $value );
464 24
					break;
465 57
				case '\GravityView_View_Data::views':
466 24
					\GravityView_View_Data::getInstance()->views = $value;
467 24
					break;
468 57
				case '\GravityView_View::entries':
469 24
					\GravityView_View::getInstance()->setEntries( $value );
470 24
					break;
471 57
				case '\GravityView_View::form':
472 24
					\GravityView_View::getInstance()->setForm( $value );
473 24
					break;
474 57
				case '\GravityView_View::form_id':
475 24
					\GravityView_View::getInstance()->setFormId( $value );
476 24
					break;
477 57
				case '\GravityView_View::context':
478 24
					\GravityView_View::getInstance()->setContext( $value );
479 24
					break;
480 57
				case '\GravityView_View::total_entries':
481 24
					\GravityView_View::getInstance()->setTotalEntries( $value );
482 24
					break;
483 57
				case '\GravityView_View::post_id':
484 24
					\GravityView_View::getInstance()->setPostId( $value );
485 24
					break;
486 57
				case '\GravityView_frontend::post_id':
487 24
					\GravityView_frontend::getInstance()->setPostId( $value );
488 24
					break;
489 57
				case '\GravityView_frontend::context_view_id':
490 24
					$frontend = \GravityView_frontend::getInstance();
491 24
					$frontend->context_view_id = $value;
492 24
					break;
493 57
				case '\GravityView_frontend::is_gravityview_post_type':
494 24
					\GravityView_frontend::getInstance()->setIsGravityviewPostType( $value );
495 24
					break;
496 57
				case '\GravityView_frontend::post_has_shortcode':
497 24
					\GravityView_frontend::getInstance()->setPostHasShortcode( $value );
498 24
					break;
499 57
				case '\GravityView_frontend::gv_output_data':
500 24
					\GravityView_frontend::getInstance()->setGvOutputData( $value );
501 24
					break;
502 57
				case '\GravityView_View::paging':
503 24
					\GravityView_View::getInstance()->setPaging( $value );
504 24
					break;
505 57
				case '\GravityView_View::sorting':
506 24
					\GravityView_View::getInstance()->setSorting( $value );
507 24
					break;
508 57
				case '\GravityView_frontend::is_search':
509 24
					\GravityView_frontend::getInstance()->setIsSearch( $value );
510 24
					break;
511 57
				case '\GravityView_frontend::single_entry':
512 24
					\GravityView_frontend::getInstance()->setSingleEntry( $value );
513 24
					break;
514 57
				case '\GravityView_frontend::entry':
515 24
					\GravityView_frontend::getInstance()->setEntry( $value );
516 24
					break;
517 57
				case '\GravityView_View::_current_entry':
518 24
					\GravityView_View::getInstance()->setCurrentEntry( $value );
519 24
					break;
520 57
				case '\GravityView_View::fields':
521 24
					\GravityView_View::getInstance()->setFields( $value );
522 24
					break;
523 57
				case '\GravityView_View::_current_field':
524 51
					\GravityView_View::getInstance()->setCurrentField( $value );
525 51
					break;
526 24
				case 'wp_actions[loop_start]':
527 24
					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...
528 24
					$wp_actions['loop_start'] = $value;
529 24
					break;
530 24
				case 'wp_query::in_the_loop':
531 24
					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...
532 24
					$wp_query->in_the_loop = $value;
533 57
					break;
534
			endswitch;
535
		}
536 57
	}
537
538
	/**
539
	 * Hydrates the legacy context globals as needed.
540
	 *
541
	 * @see self::push() for format.
542
	 *
543
	 * @return void
544
	 */
545 57
	public static function load( $configuration ) {
546 57
		foreach ( (array)$configuration as $key => $value ) {
0 ignored issues
show
introduced by
No space after closing casting parenthesis is prohibited
Loading history...
547 57
			switch ( $key ):
548 57
				case 'view':
549 24
					$views = new \GV\View_Collection();
550 24
					$views->add( $value );
551
552 24
					self::thaw( array(
553 24
						'\GravityView_View::atts' => $value->settings->as_atts(),
554 24
						'\GravityView_View::view_id' => $value->ID,
555 24
						'\GravityView_View::back_link_label' => $value->settings->get( 'back_link_label', null ),
556 24
						'\GravityView_View::form' => $value->form ? $value->form->form : null,
557 24
						'\GravityView_View::form_id' => $value->form ? $value->form->ID : null,
558
559 24
						'\GravityView_View_Data::views' => $views,
560 24
						'\GravityView_frontend::gv_output_data' => \GravityView_View_Data::getInstance(),
561 24
						'\GravityView_frontend::context_view_id' => $value->ID,
562
					) );
563 24
					break;
564 57
				case 'post':
565 4
					$has_shortcode = false;
566 4
					foreach ( \GV\Shortcode::parse( $value->post_content ) as $shortcode ) {
567 1
						if ( $shortcode->name == 'gravityview' ) {
0 ignored issues
show
introduced by
Found "== '". Use Yoda Condition checks, you must
Loading history...
568 1
							$has_shortcode = true;
569 1
							break;
570
						}
571
					}
572 4
					self::thaw( array(
573 4
						'\GravityView_View::post_id' => $value->ID,
574 4
						'\GravityView_frontend::post_id' => $value->ID,
575 4
						'\GravityView_frontend::is_gravityview_post_type' => $value->post_type == 'gravityview',
576 4
						'\GravityView_frontend::post_has_shortcode' => $has_shortcode,
577
					) );
578 4
					break;
579 57
				case 'views':
580
					self::thaw( array(
581
						'\GravityView_View_Data::views' => $value,
582
						'\GravityView_frontend::gv_output_data' => \GravityView_View_Data::getInstance(),
583
					) );
584
					break;
585 57
				case 'entries':
586 24
					self::thaw( array(
587
						'\GravityView_View::entries' => array_map( function( $e ) { return $e->as_entry(); }, $value->all() ),
588 24
						'\GravityView_View::total_entries' => $value->total(),
589
					) );
590 24
					break;
591 57
				case 'entry':
592 20
					self::thaw( array(
593 20
						'\GravityView_frontend::single_entry' => $value->ID,
594 20
						'\GravityView_frontend::entry' => $value->ID,
595 20
						'\GravityView_View::_current_entry' => $value->as_entry(),
596
					) );
597 20
					break;
598 57
				case 'fields':
599 3
					self::thaw( array(
600 3
						'\GravityView_View::fields' => $value->as_configuration(),
601
					) );
602 3
					break;
603 56
				case 'field':
604 51
					self::thaw( array(
605
						'\GravityView_View::_current_field' => array(
606 51
							'field_id' => $value->ID,
607 51
							'field' => $value->field,
608 51
							'field_settings' => $value->as_configuration(),
609 51
							'form' => \GravityView_View::getInstance()->getForm(),
610 51
							'field_type' => $value->type, /** {@since 1.6} */
611 51
							'entry' => \GravityView_View::getInstance()->getCurrentEntry(),
612
613
							// '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...
614
							// '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...
615
							// '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...
616
							// '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...
617
						),
618
					) );
619 51
					break;
620 23
				case 'request':
621 23
					self::thaw( array(
622 23
						'\GravityView_View::context' => (
0 ignored issues
show
introduced by
Each line in an array declaration must end in a comma
Loading history...
623 23
							$value->is_entry() ? 'single' :
624 16
								( $value->is_edit_entry() ? 'edit' :
625 16
									( $value->is_view() ? 'directory': null )
626
								)
627
						),
628 23
						'\GravityView_frontend::is_search' => $value->is_search(),
629
					) );
630
631 23
					if ( ! $value->is_entry() ) {
632 16
						self::thaw( array(
633 16
							'\GravityView_frontend::single_entry' => 0,
634
							'\GravityView_frontend::entry' => 0
0 ignored issues
show
introduced by
Each line in an array declaration must end in a comma
Loading history...
635
						) );
636
					}
637 23
					break;
638 14
				case 'paging':
639 14
					self::thaw( array(
640 14
						'\GravityView_View::paging' => $value,
641
					) );
642 14
					break;
643 14
				case 'sorting':
644 14
					self::thaw( array(
645 14
						'\GravityView_View::sorting' => $value,
646
					) );
647 14
					break;
648 2
				case 'in_the_loop':
649 2
					self::thaw( array(
650 2
						'wp_query::in_the_loop' => $value,
651 2
						'wp_actions[loop_start]' => $value ? 1 : 0,
652
					) );
653 57
					break;
654
			endswitch;
655
		}
656
657 57
		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...
658 57
		$gravityview_view = \GravityView_View::getInstance();
659 57
	}
660
661
	/**
662
	 * Resets the global state completely.
663
	 *
664
	 * Use with utmost care, as filter and action callbacks
665
	 *  may be added again.
666
	 *
667
	 * Does not touch the context stack.
668
	 *
669
	 * @return void
670
	 */
671 63
	public static function reset() {
672 63
		\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...
673 63
		\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...
674 63
		\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...
675
676 63
		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...
677
678 63
		$wp_query->in_the_loop = false;
679 63
		$wp_actions['loop_start'] = 0;
680 63
	}
681
}
682
683
684
/** Add some global fix for field capability discrepancies. */
685
add_filter( 'gravityview/configuration/fields', function( $fields ) {
686 15
	if ( empty( $fields  ) ) {
0 ignored issues
show
Coding Style introduced by
Expected 1 spaces before closing bracket; 2 found
Loading history...
687
		return $fields;
688
	}
689
690
	/**
691
	 * Each view field is saved in a weird capability state by default.
692
	 *
693
	 * With loggedin set to false, but a capability of 'read' it introduces
694
	 *  some logical issues and is not robust. Fix this behavior throughout
695
	 *  core by making sure capability is '' if log in is not required.
696
	 *
697
	 * Perhaps in the UI a fix would be to unite the two fields (as our new
698
	 *  \GV\Field class already does) into one dropdown:
699
	 *
700
	 * Anyone, Logged In Only, ... etc. etc.
701
	 *
702
	 * The two "settings" should be as tightly coupled as possible to avoid
703
	 *  split logic scenarios. Uniting them into one field is the way to go.
704
	 */
705
706 15
	foreach ( $fields as $position => &$_fields ) {
707
708 15
		if ( empty( $_fields ) || ! is_array( $_fields ) ) {
709
			continue;
710
		}
711
712 15
		foreach ( $_fields as $uid => &$_field ) {
713 15
			if ( ! isset( $_field['only_loggedin'] ) ) {
714 12
				continue;
715
			}
716
			/** If we do not require login, we don't require a cap. */
717 15
			$_field['only_loggedin'] != '1' && ( $_field['only_loggedin_cap'] = '' );
718
		}
719
	}
720 15
	return $fields;
721
} );
722
723
724
/** Add a future fix to make sure field configurations include the form ID. */
725
add_filter( 'gravityview/view/configuration/fields', function( $fields, $view ) {
726 69
	if ( ! $view || empty( $fields ) ) {
727
		return $fields;
728
	}
729
730 69
	if ( ! $view->form || ! $view->form->ID ) {
731
		return $fields;
732
	}
733
734
	/**
735
	 * In order to instantiate the correct \GV\Field implementation
736
	 *  we need to provide a form_id inside the configuration.
737
	 *
738
	 * @todo Make sure this actually happens in the admin side
739
	 *  when saving the views.
740
	 */
741 69
	foreach ( $fields as $position => &$_fields ) {
742
743 69
		if ( empty( $_fields ) || ! is_array( $_fields ) ) {
744
			continue;
745
		}
746
747 69
		foreach ( $_fields as $uid => &$_field ) {
748 69
			if ( ! empty( $_field['id'] ) && is_numeric( $_field['id'] ) && empty( $_field['form_id'] ) ) {
749 69
				$_field['form_id'] = $view->form->ID;
750
			}
751
		}
752
	}
753
754 69
	return $fields;
755
}, 10, 2 );
756
757
758
/** Make sure the non-configured notice is not output twice. */
759
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...
760 21
	if ( class_exists( '\GravityView_frontend' ) ) {
761 21
		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...
762
763 21
		if ( empty( $wp_filter['gravityview_after'] ) ) {
764
			return;
765
		}
766
767
		/** WordPress 4.6 and lower compatibility, when WP_Hook classes were still absent. */
768 21
		if ( is_array( $wp_filter['gravityview_after'] ) ) {
769
			if ( ! empty( $wp_filter['gravityview_after'][10] ) ) {
770
				foreach ( $wp_filter['gravityview_after'][10] as $function_key => $callback ) {
771
					if ( strpos( $function_key, 'context_not_configured_warning' ) ) {
772
						unset( $wp_filter['gravityview_after'][10][ $function_key ] );
773
					}
774
				}
775
			}
776
			return;
777
		}
778
779 21
		foreach ( $wp_filter['gravityview_after']->callbacks[10] as $function_key => $callback ) {
780 21
			if ( strpos( $function_key, 'context_not_configured_warning' ) ) {
781 21
				unset( $wp_filter['gravityview_after']->callbacks[10][ $function_key ] );
782
			}
783
		}
784
	}
785
} );
786