Completed
Push — master ( 589d3f...c5163f )
by Zack
12:27 queued 08:09
created

includes/class-data.php (1 issue)

Upgrade to new PHP Analysis Engine

These results are based on our legacy PHP analysis, consider migrating to our new PHP analysis engine instead. Learn more

1
<?php
2
3
/** If this file is called directly, abort. */
4
if ( ! defined( 'ABSPATH' ) ) {
5
	die;
6
}
7
8
class GravityView_View_Data {
9
10
	static $instance = NULL;
11
12
	protected $views = array();
13
14
	/**
15
	 *
16
	 * @param null $passed_post
17
	 */
18 3
	private function __construct( $passed_post = NULL ) {
19 3
		if ( defined( 'GRAVITYVIEW_FUTURE_CORE_LOADED' ) ) {
20
			/** Reset the new frontend request views, since we now have duplicate state. */
21 3
			gravityview()->request = new \GV\Dummy_Request();
22
		}
23
24 3
		if( !empty( $passed_post ) ) {
25
26 3
			$id_or_id_array = $this->maybe_get_view_id( $passed_post );
27
28 3
			if ( defined( 'GRAVITYVIEW_FUTURE_CORE_LOADED' ) ) {
29 3
				foreach( is_array( $id_or_id_array ) ? $id_or_id_array : array( $id_or_id_array ) as $view_id ) {
30 3
					if ( \GV\View::exists( $view_id ) && ! gravityview()->views->contains( $view_id ) ) {
0 ignored issues
show
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...
31 3
						gravityview()->views->add( \GV\View::by_id( $view_id ) );
32
					}
33
				}
34
			} else if ( ! empty( $id_or_id_array ) ) {
35
				$this->add_view( $id_or_id_array );
36
			}
37
		}
38
39 3
	}
40
41
	/**
42
	 * @deprecated
43
	 * @see \GV\View_Collection::count via `gravityview()->request->views->count()` or `gravityview()->views->count()`
44
	 * @return boolean
45
	 */
46 1
	public function has_multiple_views() {
47 1
		if ( defined( 'GRAVITYVIEW_FUTURE_CORE_LOADED' ) ) {
48 1
			return gravityview()->views->count() > 1;
49
		}
50
51
		//multiple views
52
		return count( $this->get_views() ) > 1 ? true : false;
53
	}
54
55
56
	/**
57
	 * Figure out what the View ID is for a variable, if any.
58
	 *
59
	 * Can be:
60
	 *      - WP_Post (Either a `gravityview` post type or not)
61
	 *      - Multi-dimensional array of WP_Post objects
62
	 *      - Array with `view_id` or `id` key(s) set
63
	 *      - String of content that may include GravityView shortcode
64
	 *      - Number representing the Post ID or View ID
65
	 *
66
	 * @param mixed $passed_post See method description
67
	 *
68
	 * @deprecated
69
	 * @see \GV\View_Collection::from_post and \GV\Shortcode::parse
70
	 *
71
	 * @return int|null|array ID of the View. If there are multiple views in the content, array of IDs parsed.
72
	 */
73 4
	public function maybe_get_view_id( $passed_post ) {
74 4
		$ids = array();
75
76 4
		if( ! empty( $passed_post ) ) {
77
78 4
			if( is_numeric( $passed_post ) ) {
79 1
				$passed_post = get_post( $passed_post );
80
			}
81
82
			// Convert WP_Posts into WP_Posts[] array
83 4
			if( $passed_post instanceof WP_Post ) {
84 4
				$passed_post = array( $passed_post );
85
			}
86
87 4
			if( is_array( $passed_post ) ) {
88
89 4
				foreach ( $passed_post as &$post) {
90 4
					if ( defined( 'GRAVITYVIEW_FUTURE_CORE_LOADED' ) && $post instanceof WP_Post ) {
91 4
						$views = \GV\View_Collection::from_post( $post );
92 4
						foreach ( $views->all() as $view ) {
93 4
							$ids []= $view->ID;
94
95
							/** And as a side-effect... add each view to the global scope. */
96 4
							if ( ! gravityview()->views->contains( $view->ID ) ) {
97 4
								gravityview()->views->add( $view );
98
							}
99
						}
100
					} else {
101
						/** Deprecated, see \GV\View_Collection::from_post */
102
						if( ( get_post_type( $post ) === 'gravityview' ) ) {
103
							$ids[] = $post->ID;
104
						} else{
105
							// Parse the Post Content
106
							$id = $this->parse_post_content( $post->post_content );
107
							if( $id ) {
108
								$ids = array_merge( $ids, (array) $id );
109
							}
110
111
							// Parse the Post Meta
112
							$id = $this->parse_post_meta( $post->ID );
113
							if( $id ) {
114 4
								$ids = array_merge( $ids, (array) $id );
115
							}
116
						}
117
					}
118
119
				}
120
121
			} else {
122
123 1
				if ( is_string( $passed_post ) ) {
124
125 1
					if ( defined( 'GRAVITYVIEW_FUTURE_CORE_LOADED' ) ) {
126 1
						$shortcodes = \GV\Shortcode::parse( $passed_post );
127 1
						foreach ( $shortcodes as $shortcode ) {
128 1
							if ( $shortcode->name == 'gravityview' && !empty( $shortcode->atts['id'] ) ) {
129 1
								$ids []= $shortcode->atts['id'];
130
131
								/** And as a side-effect... add each view to the global scope. */
132 1
								if ( ! gravityview()->views->contains( $shortcode->atts['id'] ) && \GV\View::exists( $shortcode->atts['id'] ) ) {
133 1
									gravityview()->views->add( $shortcode->atts['id'] );
134
								}
135
							}
136
						}
137
					} else {
138
						/** Deprecated, use \GV\Shortcode::parse. */
139
						$id = $this->parse_post_content( $passed_post );
140
						if( $id ) {
141 1
							$ids = array_merge( $ids, (array) $id );
142
						}
143
					}
144
145
				} else {
146
					$id = $this->get_id_from_atts( $passed_post );
147
					$ids[] = intval( $id );
148
				}
149
			}
150
		}
151
152 4
		if( empty($ids) ) {
153
			return NULL;
154
		}
155
156
		// If it's just one ID, return that.
157
		// Otherwise, return array of IDs
158 4
		return ( sizeof( $ids ) === 1 ) ? $ids[0] : $ids;
159
	}
160
161
	/**
162
	 * @return GravityView_View_Data
163
	 */
164 3
	public static function getInstance( $passed_post = NULL ) {
165
166 3
		if( empty( self::$instance ) ) {
167 3
			self::$instance = new GravityView_View_Data( $passed_post );
168
		}
169
170 3
		return self::$instance;
171
	}
172
173
	/**
174
	 * @deprecated
175
	 * @see \GV\View_Collection::all() via `gravityview()->views` or `gravityview()->request->views`.
176
	 */
177 1
	function get_views() {
178 1
		if ( defined( 'GRAVITYVIEW_FUTURE_CORE_LOADED' ) ) {
179 1
			if ( ! gravityview()->views->count() ) {
180
				return array();
181
			}
182 1
			return array_combine(
183
				array_map( function ( $view ) { return $view->ID; }, gravityview()->views->all() ),
184
				array_map( function ( $view ) { return $view->as_data(); }, gravityview()->views->all() )
185
			);
186
		}
187
		return $this->views;
188
	}
189
190
	/**
191
	 * @deprecated
192
	 * @see \GV\View_Collection::get() via `gravityview()->views` or `gravityview()->request->views`.
193
	 */
194 1
	function get_view( $view_id, $atts = NULL ) {
195 1
		if ( defined( 'GRAVITYVIEW_FUTURE_CORE_LOADED' ) ) {
196 1
			if ( ! $view = gravityview()->views->get( $view_id ) ) {
197 1
				if ( ! \GV\View::exists( $view_id ) ) {
198 1
					return false;
199
				}
200
201
				/** Emulate this weird side-effect below... */
202 1
				$view = \GV\View::by_id( $view_id );
203 1
				if ( $atts ) {
204
					$view->settings->update( $atts );
205
				}
206 1
				gravityview()->views->add( $view );
207
			}
208 1
			return $view->as_data();
209
		}
210
211
		if( ! is_numeric( $view_id) ) {
212
			do_action('gravityview_log_error', sprintf('GravityView_View_Data[get_view] $view_id passed is not numeric.', $view_id) );
213
			return false;
214
		}
215
216
		// Backup: the view hasn't been fetched yet. Doing it now.
217
		if ( ! isset( $this->views[ $view_id ] ) ) {
218
			do_action('gravityview_log_debug', sprintf('GravityView_View_Data[get_view] View #%s not set yet.', $view_id) );
219
			return $this->add_view( $view_id, $atts );
220
		}
221
222
		if ( empty( $this->views[ $view_id ] ) ) {
223
			do_action('gravityview_log_debug', sprintf('GravityView_View_Data[get_view] Returning; View #%s was empty.', $view_id) );
224
			return false;
225
		}
226
227
		return $this->views[ $view_id ];
228
	}
229
230
	/**
231
	 * Determines if a post, identified by the specified ID, exist
232
	 * within the WordPress database.
233
	 *
234
	 * @see http://tommcfarlin.com/wordpress-post-exists-by-id/ Fastest check available
235
	 * @param    int    $view_id    The ID of the post to check
236
	 *
237
	 * @deprecated
238
	 * @see \GV\View::exists()
239
	 *
240
	 * @return   bool   True if the post exists; otherwise, false.
241
	 * @since    1.0.0
242
	 */
243 1
	function view_exists( $view_id ) {
244 1
		return ( defined( 'GRAVITYVIEW_FUTURE_CORE_LOADED' ) && \GV\View::exists( $view_id ) ) || is_string( get_post_status( $view_id ) );
245
	}
246
247
	/**
248
	 *
249
	 * Add a view to the views array
250
	 *
251
	 * @param int|array $view_id View ID or array of View IDs
252
	 * @param array|string $atts Combine other attributes (eg. from shortcode) with the view settings (optional)
253
	 *
254
	 * @deprecated
255
	 * @see \GV\View_Collection::append with the request \GV\View_Collection available via `gravityview()->request->views`
256
	 *  or the `gravityview()->views` shortcut.
257
	 *
258
	 * @return array|false All views if $view_id is array, a view data array if $view_id is an int, false on errors.
259
	 */
260 1
	function add_view( $view_id, $atts = NULL ) {
261
262
		/** Deprecated. Do not edit. */
263 1
		if ( defined( 'GRAVITYVIEW_FUTURE_CORE_LOADED' ) ) {
264 1
			return \GV\Mocks\GravityView_View_Data_add_view( $view_id, $atts );
265
		}
266
267
		// Handle array of IDs
268
		if( is_array( $view_id ) ) {
269
			foreach( $view_id as $id ) {
270
271
				$this->add_view( $id, $atts );
272
			}
273
274
			return $this->get_views();
275
		}
276
277
		// The view has been set already; returning stored view.
278
		if ( !empty( $this->views[ $view_id ] ) ) {
279
			do_action('gravityview_log_debug', sprintf('GravityView_View_Data[add_view] Returning; View #%s already exists.', $view_id) );
280
			return $this->views[ $view_id ];
281
		}
282
283
		if( ! $this->view_exists( $view_id ) ) {
284
			do_action('gravityview_log_debug', sprintf('GravityView_View_Data[add_view] Returning; View #%s does not exist.', $view_id) );
285
			return false;
286
		}
287
288
		$form_id = gravityview_get_form_id( $view_id );
289
290
		if( empty( $form_id ) ) {
291
292
			do_action('gravityview_log_debug', sprintf('GravityView_View_Data[add_view] Returning; Post ID #%s does not have a connected form.', $view_id) );
293
294
			return false;
295
		}
296
297
		// Get the settings for the View ID
298
		$view_settings = gravityview_get_template_settings( $view_id );
299
300
		do_action('gravityview_log_debug', sprintf('GravityView_View_Data[add_view] Settings pulled in from View #%s', $view_id), $view_settings );
301
302
		// Merge the view settings with the defaults
303
		$view_defaults = wp_parse_args( $view_settings, defined( 'GRAVITYVIEW_FUTURE_CORE_LOADED' ) ? \GV\View_Settings::defaults() : self::get_default_args() );
304
305
		do_action('gravityview_log_debug', 'GravityView_View_Data[add_view] View Defaults after merging View Settings with the default args.', $view_defaults );
306
307
		if( ! empty( $atts ) && is_array( $atts ) ) {
308
309
			do_action('gravityview_log_debug', 'GravityView_View_Data[add_view] $atts before merging  with the $view_defaults', $atts );
310
311
			// Get the settings from the shortcode and merge them with defaults.
312
			$atts = shortcode_atts( $view_defaults, $atts );
313
314
			do_action('gravityview_log_debug', 'GravityView_View_Data[add_view] $atts after merging  with the $view_defaults', $atts );
315
316
		} else {
317
318
			// If there are no passed $atts, the defaults will be used.
319
			$atts = $view_defaults;
320
321
		}
322
323
		unset( $atts['id'], $view_defaults, $view_settings );
324
325
		$data = array(
326
			'id' => $view_id,
327
			'view_id' => $view_id,
328
			'form_id' => $form_id,
329
			'template_id' => gravityview_get_template_id( $view_id ),
330
			'atts' => $atts,
331
			'fields' => $this->get_fields( $view_id ),
332
			'widgets' => gravityview_get_directory_widgets( $view_id ),
333
			'form' => gravityview_get_form( $form_id ),
334
		);
335
336
		do_action('gravityview_log_debug', sprintf('GravityView_View_Data[add_view] View #%s being added.', $view_id), $data );
337
338
		$this->views[ $view_id ] = $data;
339
340
		return $this->views[ $view_id ];
341
	}
342
343
	/**
344
	 * Get the visible fields for a View
345
	 * @uses  gravityview_get_directory_fields() Fetch the configured fields for a View
346
	 * @uses  GravityView_View_Data::filter_fields() Only show visible fields
347
	 * @param  int $view_id View ID
348
	 *
349
	 * @deprecated
350
	 * @see \GV\View::$fields
351
	 *
352
	 * @return array|null Array of fields as passed by `gravityview_get_directory_fields()`
353
	 */
354 1
	function get_fields( $view_id ) {
355 1
		$dir_fields = gravityview_get_directory_fields( $view_id );
356 1
		do_action( 'gravityview_log_debug', '[render_view] Fields: ', $dir_fields );
357
358 1
		if ( defined( 'GRAVITYVIEW_FUTURE_CORE_LOADED' ) ) {
359 1
			if ( \GV\View::exists( $view_id ) ) {
360 1
				$view = \GV\View::by_id( $view_id );
361 1
				return $view->fields->by_visible()->as_configuration();
362
			}
363
		}
364
365
		// remove fields according to visitor visibility permissions (if logged-in)
366
		$dir_fields = $this->filter_fields( $dir_fields );
367
		do_action( 'gravityview_log_debug', '[render_view] Fields after visibility filter: ', $dir_fields );
368
369
		return $dir_fields;
370
	}
371
372
	/**
373
	 * Filter area fields based on specified conditions
374
	 *
375
	 * @deprecated
376
	 *
377
	 * @param array $dir_fields
378
	 * @return array
379
	 */
380
	private function filter_fields( $dir_fields ) {
381
382
		if ( defined( 'GRAVITYVIEW_FUTURE_CORE_LOADED' ) ) {
383
			throw new Exception( __METHOD__ . ' should not be called anymore. Why was it?' );
384
		}
385
386
		if( empty( $dir_fields ) || !is_array( $dir_fields ) ) {
387
			return $dir_fields;
388
		}
389
390
		foreach( $dir_fields as $area => $fields ) {
391
392
			foreach( (array)$fields as $uniqid => $properties ) {
393
394
				if( $this->hide_field_check_conditions( $properties ) ) {
395
					unset( $dir_fields[ $area ][ $uniqid ] );
396
				}
397
398
			}
399
		}
400
401
		return $dir_fields;
402
403
	}
404
405
406
	/**
407
	 * Check whether a certain field should not be presented based on its own properties.
408
	 *
409
	 * @deprecated
410
	 *
411
	 * @param array $properties
412
	 * @return boolean True: (field should be hidden) or False: (field should be presented)
413
	 */
414
	private function hide_field_check_conditions( $properties ) {
415
416
		if ( defined( 'GRAVITYVIEW_FUTURE_CORE_LOADED' ) ) {
417
			throw new Exception( __METHOD__ . ' should not be called anymore. Why was it?' );
418
		}
419
420
		// logged-in visibility
421
		if( ! empty( $properties['only_loggedin'] ) && ! GVCommon::has_cap( $properties['only_loggedin_cap'] ) ) {
422
			return true;
423
		}
424
425
		return false;
426
	}
427
428
	/**
429
	 * Retrieves view ID from an array.
430
	 *
431
	 * @param array $atts
432
	 * @deprecated Dead code, was probably superceded by GravityView_View_Data::parse_post_content
433
	 *
434
	 * @return int|null A view ID cast to int, or null.
435
	 */
436 1
	function get_id_from_atts( $atts ) {
437
438 1
		if ( defined( 'GRAVITYVIEW_FUTURE_CORE_LOADED' ) ) {
439 1
			$settings = new \GV\View_Settings();
440 1
			$settings->update( \GV\View_Settings::defaults() );
441 1
			$settings->update( shortcode_parse_atts( $atts ) );
442 1
			$view_id = $settings->get( 'view_id' );
443 1
			$view_id = empty( $view_id ) ? $settings->get( 'id' ) : $view_id;
444 1
			return empty( $view_id ) ? null : $view_id;
445
		}
446
		
447
		$atts = is_array( $atts ) ? $atts : shortcode_parse_atts( $atts );
448
449
		// Get the settings from the shortcode and merge them with defaults.
450
		$atts = wp_parse_args( $atts, defined( 'GRAVITYVIEW_FUTURE_CORE_LOADED' ) ? \GV\View_Settings::defaults() : self::get_default_args() );
451
452
		$view_id = ! empty( $atts['view_id'] ) ? (int)$atts['view_id'] : NULL;
453
454
		if( empty( $view_id ) && !empty( $atts['id'] ) ) {
455
			$view_id = (int)$atts['id'];
456
		}
457
458
		if( empty( $view_id ) ) {
459
			do_action('gravityview_log_error', 'GravityView_View_Data[get_id_from_atts] Returning; no ID defined (Atts)', $atts );
460
			return;
461
		}
462
463
		return $view_id;
464
	}
465
466
	/**
467
	 * Parse content to determine if there is a GV shortcode to allow for enqueing necessary files in the head.
468
	 *
469
	 * @uses gravityview_has_shortcode_r() Check whether shortcode exists (recursively)
470
	 * @uses shortcode_parse_atts() Parse each GV shortcode
471
	 * @uses  gravityview_get_template_settings() Get the settings for the View ID
472
	 * @param  string $content $post->post_content content
473
	 *
474
	 * @deprecated
475
	 * @see \GV\View_Collection::from_content
476
	 *
477
	 * @return int|null|array If a single View is found, the ID of the View. If there are multiple views in the content, array of IDs parsed. If not found, NULL
478
	 */
479 1
	public function parse_post_content( $content ) {
480 1
		if ( defined( 'GRAVITYVIEW_FUTURE_CORE_LOADED' ) ) {
481 1
			$ids = array();
482 1
			foreach ( \GV\Shortcode::parse( $content ) as $shortcode ) {
483 1
				if ( $shortcode->name == 'gravityview' && is_numeric( $shortcode->atts['id'] ) ) {
484 1
					if ( \GV\View::exists( $shortcode->atts['id'] ) && ! gravityview()->views->contains( $shortcode->atts['id'] ) ) {
485
						gravityview()->views->add( \GV\View::by_id( $shortcode->atts['id'] ) );
486
					}
487
					/**
488
					 * The original function outputs the ID even though it wasn't added by ::add_view()
489
					 * Wether this is a bug or not remains a mystery. But we need to emulate this behavior
490
					 * until better times.
491
					 */
492 1
					$ids []= $shortcode->atts['id'];
493
				}
494
			}
495 1
			if ( empty ( $ids ) ) {
496
				return null;
497
			}
498 1
			return ( sizeof( $ids ) === 1 ) ? $ids[0] : $ids;
499
		}
500
501
		/**
502
		 * @hack This is so that the shortcode is registered for the oEmbed preview in the Admin
503
		 * @since 1.6
504
		 */
505
		if( ! shortcode_exists('gravityview') && class_exists( 'GravityView_Shortcode' ) ) {
506
			new GravityView_Shortcode;
507
		}
508
509
		$shortcodes = gravityview_has_shortcode_r( $content, 'gravityview' );
510
511
		if( empty( $shortcodes ) ) {
512
			return NULL;
513
		}
514
515
		do_action('gravityview_log_debug', 'GravityView_View_Data[parse_post_content] Parsing content, found shortcodes:', $shortcodes );
516
517
		$ids = array();
518
519
		foreach ($shortcodes as $key => $shortcode) {
520
521
			$shortcode[3] = htmlspecialchars_decode( $shortcode[3], ENT_QUOTES );
522
523
			$args = shortcode_parse_atts( $shortcode[3] );
524
525
			if( empty( $args['id'] ) ) {
526
				do_action('gravityview_log_error', 'GravityView_View_Data[parse_post_content] Returning; no ID defined in shortcode atts', $shortcode );
527
				continue;
528
			}
529
530
			do_action('gravityview_log_debug', sprintf('GravityView_View_Data[parse_post_content] Adding view #%s with shortcode args', $args['id']), $args );
531
532
			// Store the View to the object for later fetching.
533
			$this->add_view( $args['id'], $args );
534
535
			$ids[] = $args['id'];
536
		}
537
538
		if( empty($ids) ) {
539
			return NULL;
540
		}
541
542
		// If it's just one ID, return that.
543
		// Otherwise, return array of IDs
544
		return ( sizeof( $ids ) === 1 ) ? $ids[0] : $ids;
545
546
	}
547
548
	/**
549
	 * Parse specific custom fields (Post Meta) to determine if there is a GV shortcode to allow for enqueuing necessary files in the head.
550
	 * @since 1.15.1
551
	 *
552
	 * @deprecated
553
	 * @see \GV\View_Collection::from_post
554
	 *
555
	 * @uses \GravityView_View_Data::parse_post_content
556
	 * @param int $post_id WP_Post ID
557
	 * @return int|null|array If a single View is found, the ID of the View. If there are multiple views in the content, array of IDs parsed. If not found, or meta not parsed, NULL
558
	 */
559
	private function parse_post_meta( $post_id ) {
560
		if ( defined( 'GRAVITYVIEW_FUTURE_CORE_LOADED' ) ) {
561
			/** Is private and no longer used in future mode. */
562
			throw new RuntimeException( __CLASS__ . '::parse_post_meta is no more. Why was it called?' );
563
		}
564
565
		/**
566
		 * @filter `gravityview/data/parse/meta_keys` Define meta keys to parse to check for GravityView shortcode content
567
		 * This is useful when using themes that store content that may contain shortcodes in custom post meta
568
		 * @param[in,out] array $meta_keys Array of key values to check. If empty, do not check. Default: empty array
569
		 * @param[in] int $post_id ID of the post being checked
570
		 */
571
		$meta_keys = (array)apply_filters( 'gravityview/data/parse/meta_keys', array(), $post_id );
572
573
		if( empty( $meta_keys ) ) {
574
			return NULL;
575
		}
576
577
		do_action( 'gravityview_log_debug', 'GravityView_View_Data[parse_post_meta] Search for GravityView shortcodes on the following custom fields keys:', $meta_keys );
578
579
		$meta_content = '';
580
581
		foreach( $meta_keys as $key ) {
582
			$meta = get_post_meta( $post_id, $key , true );
583
			if( ! is_string( $meta ) ) {
584
				continue;
585
			}
586
			$meta_content .= $meta . ' ';
587
		}
588
589
		if( empty( $meta_content ) ) {
590
			do_action('gravityview_log_error', sprintf( 'GravityView_View_Data[parse_post_meta] Returning; Empty custom fields for Post #%s (Custom fields keys:)', $post_id ), $meta_keys );
591
			return NULL;
592
		}
593
594
		do_action( 'gravityview_log_debug', 'GravityView_View_Data[parse_post_meta] Combined content retrieved from custom fields:', $meta_content );
595
596
		return $this->parse_post_content( $meta_content );
597
598
	}
599
600
	/**
601
	 * Checks if the passed post id has the passed View id embedded.
602
	 *
603
	 * Returns
604
	 *
605
	 * @since 1.6.1
606
	 *
607
	 * @param string $post_id Post ID where the View is embedded
608
	 * @param string $view_id View ID
609
	 * @param string $empty_is_valid If either $post_id or $view_id is empty consider valid. Default: false.
610
	 *
611
	 * @return bool|WP_Error If valid, returns true. If invalid, returns WP_Error containing error message.
612
	 */
613 1
	public static function is_valid_embed_id( $post_id = '', $view_id = '', $empty_is_valid = false ) {
614
615 1
		$message = NULL;
616
617
		// Not invalid if not set!
618 1
		if( empty( $post_id ) || empty( $view_id ) ) {
619
620 1
			if( $empty_is_valid ) {
621 1
				return true;
622
			}
623
624 1
			$message = esc_html__( 'The ID is required.', 'gravityview' );
625
		}
626
627 1
		if( ! $message ) {
628 1
			$status = get_post_status( $post_id );
629
630
			// Nothing exists with that post ID.
631 1
			if ( ! is_numeric( $post_id ) ) {
632
				$message = esc_html__( 'You did not enter a number. The value entered should be a number, representing the ID of the post or page the View is embedded on.', 'gravityview' );
633
634
				// @todo Convert to generic article about Embed IDs
635
				$message .= ' ' . gravityview_get_link( 'http://docs.gravityview.co/article/222-the-search-widget', __( 'Learn more&hellip;', 'gravityview' ), 'target=_blank' );
636
			}
637
		}
638
639 1
		if( ! $message ) {
640
641
			// Nothing exists with that post ID.
642 1
			if ( empty( $status ) || in_array( $status, array( 'revision', 'attachment' ) ) ) {
643
				$message = esc_html__( 'There is no post or page with that ID.', 'gravityview' );
644
			}
645
646
		}
647
648 1
		if( ! $message ) {
649 1
			if ( defined( 'GRAVITYVIEW_FUTURE_CORE_LOADED' ) && $post = get_post( $post_id ) )  {
650 1
				$views = GV\View_Collection::from_post( $post );
651
				$view_ids_in_post = array_map( function( $view ) { return $view->ID; }, $views->all() );
652
			} else {
653
				/** ::maybe_get_view_id deprecated. */
654
				$view_ids_in_post = GravityView_View_Data::getInstance()->maybe_get_view_id( $post_id );
655
			}
656
657
			// The post or page specified does not contain the shortcode.
658 1
			if ( false === in_array( $view_id, (array) $view_ids_in_post ) ) {
659 1
				$message = sprintf( esc_html__( 'The Post ID entered is not valid. You may have entered a post or page that does not contain the selected View. Make sure the post contains the following shortcode: %s', 'gravityview' ), '<br /><code>[gravityview id="' . intval( $view_id ) . '"]</code>' );
660
			}
661
		}
662
663 1
		if( ! $message ) {
664
665
			// It's a View
666 1
			if ( ( defined( 'GRAVITYVIEW_FUTURE_CORE_LOADED' ) && \GV\View::exists( $post_id ) )
667 1
				|| 'gravityview' === get_post_type( $post_id ) ) {
668
				$message = esc_html__( 'The ID is already a View.', 'gravityview' );;
669
			}
670
		}
671
672 1
		if( $message ) {
673 1
			return new WP_Error( 'invalid_embed_id', $message );
674
		}
675
676 1
		return true;
677
	}
678
679
	/**
680
	 * Get a specific default setting
681
	 * @param  string  $key          The key of the setting array item
682
	 * @param  boolean $with_details Include details
683
	 * @return mixed|array                If using $with_details, return array. Otherwise, mixed.
684
	 */
685 1
	public static function get_default_arg( $key, $with_details = false ) {
686
687 1
		$args = defined( 'GRAVITYVIEW_FUTURE_CORE_LOADED' ) ? \GV\View_Settings::defaults( $with_details ) : self::get_default_args( $with_details );
688
689 1
		if( !isset( $args[ $key ] ) ) { return NULL; }
690
691 1
		return $args[ $key ];
692
	}
693
694
	/**
695
	 * Retrieve the default args for shortcode and theme function
696
	 *
697
	 * @param boolean $with_details True: Return array with full default settings information, including description, name, etc. False: Return an array with only key => value pairs.
698
	 * @param string $group Only fetch
699
	 *
700
	 * @return array $args Associative array of default settings for a View
701
	 *      @param[out] string $label Setting label shown in admin
702
	 *      @param[out] string $type Gravity Forms field type
703
	 *      @param[out] string $group The field group the setting is associated with. Default: "default"
704
	 *      @param[out] mixed  $value The default value for the setting
705
	 *      @param[out] string $tooltip Tooltip displayed for the setting
706
	 *      @param[out] boolean $show_in_shortcode Whether to show the setting in the shortcode configuration modal
707
	 *      @param[out] array  $options Array of values to use when generating select, multiselect, radio, or checkboxes fields
708
	 *      @param[out] boolean $full_width True: Display the input and label together when rendering. False: Display label and input in separate columns when rendering.
709
	 *
710
	 * @deprecated
711
	 * @see \GV\View_Settings::defaults()
712
	 */
713 6
	public static function get_default_args( $with_details = false, $group = NULL ) {
714 6
		if ( defined( 'GRAVITYVIEW_FUTURE_CORE_LOADED' ) ) {
715 6
			return \GV\View_Settings::defaults( $with_details, $group );
716
		}
717
718
		/**
719
		 * @filter `gravityview_default_args` Modify the default settings for new Views
720
		 * @param[in,out] array $default_args Array of default args.
721
		 * @deprecated
722
		 * @see filter `gravityview/view/settings/defaults`
723
		 */
724
		$default_settings = apply_filters( 'gravityview_default_args', array(
725
			'id' => array(
726
				'label' => __('View ID', 'gravityview'),
727
				'type' => 'number',
728
				'group'	=> 'default',
729
				'value' => NULL,
730
				'tooltip' => NULL,
731
				'show_in_shortcode' => false,
732
			),
733
			'page_size' => array(
734
				'label' 	=> __('Number of entries per page', 'gravityview'),
735
				'type' => 'number',
736
				'class'	=> 'small-text',
737
				'group'	=> 'default',
738
				'value' => 25,
739
				'show_in_shortcode' => true,
740
			),
741
			'offset' => array(
742
				'label' 	=> __('Offset entries starting from', 'gravityview'),
743
				'type' => 'number',
744
				'class'	=> 'small-text',
745
				'group'	=> 'default',
746
				'value' => 0,
747
				'show_in_shortcode' => false,
748
			),
749
			'lightbox' => array(
750
				'label' => __( 'Enable lightbox for images', 'gravityview' ),
751
				'type' => 'checkbox',
752
				'group'	=> 'default',
753
				'value' => 1,
754
				'tooltip' => NULL,
755
				'show_in_shortcode' => true,
756
			),
757
			'show_only_approved' => array(
758
				'label' => __( 'Show only approved entries', 'gravityview' ),
759
				'type' => 'checkbox',
760
				'group'	=> 'default',
761
				'value' => 0,
762
				'show_in_shortcode' => true,
763
			),
764
			'admin_show_all_statuses' => array(
765
				'label' => __( 'Show all entries to administrators', 'gravityview' ),
766
				'desc'	=> __('Administrators will be able to see entries with any approval status.', 'gravityview'),
767
				'tooltip' => __('Logged-out visitors and non-administrators will only see approved entries, while administrators will see entries with all statuses. This makes it easier for administrators to moderate entries from a View.', 'gravityview'),
768
				'requires' => 'show_only_approved',
769
				'type' => 'checkbox',
770
				'group'	=> 'default',
771
				'value' => 0,
772
				'show_in_shortcode' => false,
773
			),
774
			'hide_until_searched' => array(
775
				'label' => __( 'Hide View data until search is performed', 'gravityview' ),
776
				'type' => 'checkbox',
777
				'group'	=> 'default',
778
				'tooltip' => __( 'When enabled it will only show any View entries after a search is performed.', 'gravityview' ),
779
				'value' => 0,
780
				'show_in_shortcode' => false,
781
			),
782
			'hide_empty' => array(
783
				'label' 	=> __( 'Hide empty fields', 'gravityview' ),
784
				'group'	=> 'default',
785
				'type'	=> 'checkbox',
786
				'value' => 1,
787
				'show_in_shortcode' => false,
788
			),
789
			'user_edit' => array(
790
				'label'	=> __( 'Allow User Edit', 'gravityview' ),
791
				'group'	=> 'default',
792
				'desc'	=> __('Allow logged-in users to edit entries they created.', 'gravityview'),
793
				'value'	=> 0,
794
				'tooltip' => __('Display "Edit Entry" fields to non-administrator users if they created the entry. Edit Entry fields will always be displayed to site administrators.', 'gravityview'),
795
				'type'	=> 'checkbox',
796
				'show_in_shortcode' => true,
797
			),
798
			'user_delete' => array(
799
				'label'	=> __( 'Allow User Delete', 'gravityview' ),
800
				'group'	=> 'default',
801
				'desc'	=> __('Allow logged-in users to delete entries they created.', 'gravityview'),
802
				'value'	=> 0,
803
				'tooltip' => __('Display "Delete Entry" fields to non-administrator users if they created the entry. Delete Entry fields will always be displayed to site administrators.', 'gravityview'),
804
				'type'	=> 'checkbox',
805
				'show_in_shortcode' => true,
806
			),
807
			'sort_field' => array(
808
				'label'	=> __('Sort by field', 'gravityview'),
809
				'type' => 'select',
810
				'value' => '',
811
				'group'	=> 'sort',
812
				'options' => array(
813
					'' => __( 'Default', 'gravityview'),
814
					'date_created' => __( 'Date Created', 'gravityview'),
815
				),
816
				'show_in_shortcode' => true,
817
			),
818
			'sort_direction' => array(
819
				'label' 	=> __('Sort direction', 'gravityview'),
820
				'type' => 'select',
821
				'value' => 'ASC',
822
				'group'	=> 'sort',
823
				'options' => array(
824
					'ASC' => __('ASC', 'gravityview'),
825
					'DESC' => __('DESC', 'gravityview'),
826
					//'RAND' => __('Random', 'gravityview'),
827
				),
828
				'show_in_shortcode' => true,
829
			),
830
			'sort_columns' => array(
831
				'label' 	=> __( 'Enable sorting by column', 'gravityview' ),
832
				'left_label' => __( 'Column Sorting', 'gravityview' ),
833
				'type' => 'checkbox',
834
				'value' => false,
835
				'group'	=> 'sort',
836
				'tooltip' => NULL,
837
				'show_in_shortcode' => true,
838
				'show_in_template' => array( 'default_table', 'preset_business_data', 'preset_issue_tracker', 'preset_resume_board', 'preset_job_board' ),
839
			),
840
			'start_date' => array(
841
				'label' 	=> __('Filter by Start Date', 'gravityview'),
842
				'class'	=> 'gv-datepicker',
843
				'desc'	=> __('Show entries submitted after this date. Supports relative dates, such as "-1 week" or "-1 month".', 'gravityview' ),
844
				'type' => 'text',
845
				'value' => '',
846
				'group'	=> 'filter',
847
				'show_in_shortcode' => true,
848
			),
849
			'end_date' => array(
850
				'label' 	=> __('Filter by End Date', 'gravityview'),
851
				'class'	=> 'gv-datepicker',
852
				'desc'	=> __('Show entries submitted before this date. Supports relative dates, such as "now" or "-3 days".', 'gravityview' ),
853
				'type' => 'text',
854
				'value' => '',
855
				'group'	=> 'filter',
856
				'show_in_shortcode' => true,
857
			),
858
			'class' => array(
859
				'label' 	=> __('CSS Class', 'gravityview'),
860
				'desc'	=> __('CSS class to add to the wrapping HTML container.', 'gravityview'),
861
				'group'	=> 'default',
862
				'type' => 'text',
863
				'value' => '',
864
				'show_in_shortcode' => false,
865
			),
866
			'search_value' => array(
867
				'label' 	=> __('Search Value', 'gravityview'),
868
				'desc'	=> __('Define a default search value for the View', 'gravityview'),
869
				'type' => 'text',
870
				'value' => '',
871
				'group'	=> 'filter',
872
				'show_in_shortcode' => false,
873
			),
874
			'search_field' => array(
875
				'label' 	=> __('Search Field', 'gravityview'),
876
				'desc'	=> __('If Search Value is set, you can define a specific field to search in. Otherwise, all fields will be searched.', 'gravityview'),
877
				'type' => 'number',
878
				'value' => '',
879
				'group'	=> 'filter',
880
				'show_in_shortcode' => false,
881
			),
882
			'single_title' => array(
883
				'label'	=> __('Single Entry Title', 'gravityview'),
884
				'type'	=> 'text',
885
				'desc'	=> __('When viewing a single entry, change the title of the page to this setting. Otherwise, the title will not change between the Multiple Entries and Single Entry views.', 'gravityview'),
886
				'group'	=> 'default',
887
				'value'	=> '',
888
				'show_in_shortcode' => false,
889
				'full_width' => true,
890
			),
891
			'back_link_label' => array(
892
				'label'	=> __('Back Link Label', 'gravityview'),
893
				'group'	=> 'default',
894
				'desc'	=> __('The text of the link that returns to the multiple entries view.', 'gravityview'),
895
				'type'	=> 'text',
896
				'value'	=> '',
897
				'show_in_shortcode' => false,
898
				'full_width' => true,
899
			),
900
			'embed_only' => array(
901
				'label'	=> __('Prevent Direct Access', 'gravityview'),
902
				'group'	=> 'default',
903
				'desc'	=> __('Only allow access to this View when embedded using the shortcode.', 'gravityview'),
904
				'type'	=> 'checkbox',
905
				'value'	=> '',
906
				'show_in_shortcode' => false,
907
				'full_width' => true,
908
			),
909
			'post_id' => array(
910
				'type' => 'number',
911
				'value' => '',
912
				'show_in_shortcode' => false,
913
			),
914
		));
915
916
		// By default, we only want the key => value pairing, not the whole array.
917
		if( empty( $with_details ) ) {
918
919
			$defaults = array();
920
921
			foreach( $default_settings as $key => $value ) {
922
				$defaults[ $key ] = $value['value'];
923
			}
924
925
			return $defaults;
926
927
		}
928
		// But sometimes, we want all the details.
929
		else {
930
931
			foreach ($default_settings as $key => $value) {
932
933
				// If the $group argument is set for the method,
934
				// ignore any settings that aren't in that group.
935
				if( !empty( $group ) && is_string( $group ) ) {
936
					if( empty( $value['group'] ) || $value['group'] !== $group ) {
937
						unset( $default_settings[ $key ] );
938
					}
939
				}
940
941
			}
942
943
			return $default_settings;
944
945
		}
946
	}
947
948
949
}
950