Completed
Push — develop ( fae07d...25e00b )
by Zack
19:01
created

Request::_has_field_key()   A

Complexity

Conditions 5
Paths 9

Size

Total Lines 22

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 11
CRAP Score 5.0144

Importance

Changes 0
Metric Value
cc 5
nc 9
nop 1
dl 0
loc 22
ccs 11
cts 12
cp 0.9167
crap 5.0144
rs 9.2568
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 14 and the first side effect is on line 6.

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;
3
4
/** If this file is called directly, abort. */
5
if ( ! defined( 'GRAVITYVIEW_DIR' ) ) {
6
	die();
7
}
8
9
/**
10
 * The Request abstract class.
11
 *
12
 * Knows more about the request than anyone else.
13
 */
14
abstract class Request {
15 77
	public function __construct() {
16 77
	}
17
18
	/**
19
	 * Check if WordPress is_admin(), and make sure not DOING_AJAX.
20
	 *
21
	 * @return boolean
22
	 */
23 19
	public static function is_admin() {
24 19
		$doing_ajax = defined( 'DOING_AJAX' ) ? DOING_AJAX : false;
25 19
		$load_scripts_styles = preg_match( '#^/wp-admin/load-(scripts|styles).php$#', Utils::_SERVER( 'SCRIPT_NAME' ) );
26
27 19
		return is_admin() && ! ( $doing_ajax || $load_scripts_styles );
28
	}
29
30
	/**
31
	 * This is the frontend.
32
	 *
33
	 * @return boolean True or false.
34
	 */
35
	public static function is_frontend() {
36
		return ! is_admin();
37
	}
38
39
	/**
40
	 * Is this the Add Media / From URL preview request?
41
	 *
42
	 * Will not work in WordPress 4.8+
43
	 *
44
	 * @return boolean
45
	 */
46 2
	public static function is_add_oembed_preview() {
47
		/** The preview request is a parse-embed AJAX call without a type set. */
48 2
		return ( self::is_ajax() && ! empty( $_POST['action'] ) && $_POST['action'] == 'parse-embed' && ! isset( $_POST['type'] ) );
0 ignored issues
show
introduced by
Detected access of super global var $_POST, probably need manual inspection.
Loading history...
introduced by
Detected usage of a non-sanitized input variable: $_POST
Loading history...
49
	}
50
51
	/**
52
	 * Is this an AJAX call in progress?
53
	 *
54
	 * @return boolean
55
	 */
56 2
	public static function is_ajax() {
57 2
		return defined( 'DOING_AJAX' ) && DOING_AJAX;
58
	}
59
60
	/**
61
	 * Is this a REST request? Call after parse_request.
62
	 *
63
	 * @return boolean
64
	 */
65
	public static function is_rest() {
66
		return ! empty( $GLOBALS['wp']->query_vars['rest_route'] );
67
	}
68
69
	/**
70
	 * The current $post is a View, no?
71
	 *
72
	 * @api
73
	 * @since 2.0
74
	 * @todo tests
75
	 *
76
	 * @return \GV\View|false The view requested or false
77
	 */
78 64
	public function is_view() {
79 64
		global $post;
0 ignored issues
show
Compatibility Best Practice introduced by
Use of global functionality is not recommended; it makes your code harder to test, and less reusable.

Instead of relying on global state, we recommend one of these alternatives:

1. Pass all data via parameters

function myFunction($a, $b) {
    // Do something
}

2. Create a class that maintains your state

class MyClass {
    private $a;
    private $b;

    public function __construct($a, $b) {
        $this->a = $a;
        $this->b = $b;
    }

    public function myFunction() {
        // Do something
    }
}
Loading history...
80 64
		if ( $post && get_post_type( $post ) == 'gravityview' ) {
0 ignored issues
show
introduced by
Found "== '". Use Yoda Condition checks, you must
Loading history...
81 6
			return \GV\View::from_post( $post );
82
		}
83 60
		return false;
84
	}
85
86
	/**
87
	 * Checks whether this is a single entry request
88
	 *
89
	 * @api
90
	 * @since 2.0
91
	 * @todo tests
92
	 *
93
	 * @param int $form_id The form ID, since slugs can be non-unique. Default: 0.
94
	 *
95
	 * @return \GV\GF_Entry|false The entry requested or false.
96
	 */
97 15
	public function is_entry( $form_id = 0 ) {
98 15
		$entry = false;
99
100 15
		if ( $id = get_query_var( Entry::get_endpoint_name() ) ) {
101
102 1
			static $entries = array();
103
104 1
			if ( isset( $entries[ "$form_id:$id" ] ) ) {
105 1
				return $entries[ "$form_id:$id" ];
106
			}
107
108 1
			if ( ! $view = $this->is_view() ) {
109
				/**
110
				 * A shortcode probably.
111
				 */
112 1
				$view = gravityview()->views->get();
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...
113
			}
114
115
			/**
116
			 * A joined request.
117
			 */
118 1
			if ( $view && ( $joins = $view->joins ) ) {
119
				$forms = array_merge( wp_list_pluck( $joins, 'join' ), wp_list_pluck( $joins, 'join_on' ) );
120
				$valid_forms = array_unique( wp_list_pluck( $forms, 'ID' ) );
121
122
				$multientry = array();
123
				foreach ( $ids = explode( ',', $id ) as $i => $id ) {
124
125
					$valid_form = \GV\Utils::get( $valid_forms, $i, 0 );
126
127
					if ( ! $e = GF_Entry::by_id( $id, $valid_form ) ) {
128
						return false;
129
					}
130
131
					if ( ! in_array( $e['form_id'], $valid_forms ) ) {
132
						return false;
133
					}
134
135
					array_push( $multientry, $e );
136
				}
137
138
				// Allow Edit Entry to only edit a single entry on a multi-entry
139
				$is_edit_entry = apply_filters( 'gravityview_is_edit_entry', false );
140
141
				// Edit entry links are single-entry based
142
				if ( $is_edit_entry && 1 !== count( $multientry ) ) {
143
					return false;
144
				}
145
146
				$entry = Multi_Entry::from_entries( array_filter( $multientry ) );
147
			}  else {
148
				/**
149
				 * A regular one.
150
				 */
151 1
				$entry = GF_Entry::by_id( $id, $form_id );
152
			}
153
154 1
			$entries[ "$form_id:$id" ] = $entry;
155
		}
156
157 15
		return $entry;
158
	}
159
160
	/**
161
	 * Checks whether this an edit entry request.
162
	 *
163
	 * @api
164
	 * @since 2.0
165
	 * @todo tests
166
	 *
167
	 * @param int $form_id The form ID, since slugs can be non-unique. Default: 0.
168
	 *
169
	 * @return \GV\Entry|false The entry requested or false.
170
	 */
171 10
	public function is_edit_entry( $form_id = 0 ) {
172
		/**
173
		* @filter `gravityview_is_edit_entry` Whether we're currently on the Edit Entry screen \n
174
		* The Edit Entry functionality overrides this value.
175
		* @param boolean $is_edit_entry
176
		*/
177 10
		if ( ( $entry = $this->is_entry( $form_id ) ) && apply_filters( 'gravityview_is_edit_entry', false ) ) {
178
			return $entry;
179
		}
180 10
		return false;
181
	}
182
183
	/**
184
	 * Checks whether this an entry search request.
185
	 *
186
	 * @api
187
	 * @since 2.0
188
	 * @todo implementation
189
	 *
190
	 * @return boolean True if this is a search request.
191
	 */
192 12
	public function is_search() {
193
194 12
		$search_method = apply_filters( 'gravityview/search/method', 'get' );
195
196 12
		if ( 'post' === $search_method ) {
197 1
			$get = $_POST;
0 ignored issues
show
introduced by
Detected access of super global var $_POST, probably need manual inspection.
Loading history...
introduced by
Detected usage of a non-sanitized input variable: $_POST
Loading history...
198
		} else {
199 12
			$get = $_GET;
0 ignored issues
show
introduced by
Detected access of super global var $_GET, probably need manual inspection.
Loading history...
introduced by
Detected usage of a non-sanitized input variable: $_GET
Loading history...
200
		}
201
202 12
		unset( $get['mode'] );
203
204 12
		$get = array_filter( $get, 'gravityview_is_not_empty_string' );
205
206 12
		if( $has_field_key = $this->_has_field_key( $get ) ) {
207 1
			return true;
208
		}
209
210 12
		return isset( $get['gv_search'] ) || isset( $get['gv_start'] ) || isset( $get['gv_end'] ) || isset( $get['gv_by'] ) || isset( $get['gv_id'] );
211
	}
212
213
	/**
214
	 * Calculate whether the $_REQUEST has a GravityView field
215
	 *
216
	 * @internal
217
	 * @todo Roll into the future Search refactor
218
	 *
219
	 * @since 2.0.7
220
	 *
221
	 * @param array $get $_POST or $_GET array
222
	 *
223
	 * @return bool True: GravityView-formatted field detected; False: not detected
224
	 */
225 11
	private function _has_field_key( $get ) {
226
227 11
		$has_field_key = false;
228
229 11
		$fields = \GravityView_Fields::get_all();
230
231 11
		$meta = array();
232 11
		foreach ( $fields as $field ) {
233 11
			if( empty( $field->_gf_field_class_name ) ) {
234 11
				$meta[] = preg_quote( $field->name );
235
			}
236
		}
237
238 11
		foreach ( $get as $key => $value ) {
239 1
			if ( preg_match('/^filter_(([0-9_]+)|'. implode( '|', $meta ) .')$/sm', $key ) ) {
0 ignored issues
show
Coding Style introduced by
Expected 1 spaces after opening bracket; 0 found
Loading history...
240
				$has_field_key = true;
241 1
				break;
242
			}
243
		}
244
245 11
		return $has_field_key;
246
	}
247
}
248
249
/** Load implementations. */
250
require gravityview()->plugin->dir( 'future/includes/class-gv-request-frontend.php' );
251
require gravityview()->plugin->dir( 'future/includes/class-gv-request-admin.php' );
252
require gravityview()->plugin->dir( 'future/includes/rest/class-gv-request-rest.php' );
253
require gravityview()->plugin->dir( 'future/includes/class-gv-request-mock.php' );
254