Completed
Push — develop ( 72e688...d5488d )
by Zack
06:52
created

Entry::add_rewrite_endpoint()   A

Complexity

Conditions 2
Paths 2

Size

Total Lines 12

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 6
CRAP Score 2.0116

Importance

Changes 0
Metric Value
cc 2
nc 2
nop 0
dl 0
loc 12
ccs 6
cts 7
cp 0.8571
crap 2.0116
rs 9.8666
c 0
b 0
f 0
1
<?php
2
namespace GV;
3
4
/** If this file is called directly, abort. */
5
if ( ! defined( 'GRAVITYVIEW_DIR' ) ) {
6
	die();
7
}
8
9
/**
10
 * The base \GV\Entry class.
11
 *
12
 * Contains all entry data and some processing and logic rules.
13
 */
14
abstract class Entry {
15
16
	/**
17
	 * @var string The identifier of the backend used for this entry.
18
	 * @api
19
	 * @since 2.0
20
	 */
21
	public static $backend = null;
22
23
	/**
24
	 * @var int The ID for this entry.
25
	 *
26
	 * @api
27
	 * @since 2.0
28
	 */
29
	public $ID = null;
30
31
	/**
32
	 * @var mixed The backing entry.
33
	 */
34
	protected $entry;
35
36
	/**
37
	 * Adds the necessary rewrites for single Entries.
38
	 *
39
	 * @internal
40
	 * @return void
41
	 */
42 3
	public static function add_rewrite_endpoint() {
43 3
		global $wp_rewrite;
44
45 3
		$endpoint = self::get_endpoint_name();
46
47
		/** Let's make sure the endpoint array is not polluted. */
48 3
		if ( in_array( array( EP_PERMALINK | EP_PERMALINK | EP_ROOT, $endpoint, $endpoint ), $wp_rewrite->endpoints ) ) {
49
			return;
50
		}
51
52 3
		add_rewrite_endpoint( $endpoint, EP_PAGES | EP_PERMALINK | EP_ROOT );
53 3
	}
54
55
	/**
56
	 * Return the endpoint name for a single Entry.
57
	 *
58
	 * Also used as the query_var for the time being.
59
	 *
60
	 * @internal
61
	 * @return string The name. Default: "entry"
62
	 */
63 56
	public static function get_endpoint_name() {
64
		/**
65
		 * @filter `gravityview_directory_endpoint` Change the slug used for single entries
66
		 * @param[in,out] string $endpoint Slug to use when accessing single entry. Default: `entry`
67
		 */
68 56
		$endpoint = apply_filters( 'gravityview_directory_endpoint', 'entry' );
69
70 56
		return sanitize_title( $endpoint );
71
	}
72
73
	/**
74
	 * Construct a \GV\Entry instance by ID.
75
	 *
76
	 * @param int|string $entry_id The internal entry ID.
77
	 *
78
	 * @api
79
	 * @since 2.0
80
	 * @return \GV\Entry|null An instance of this entry or null if not found.
81
	 */
82 22
	public static function by_id( $entry_id ) {
83 22
		return null;
84
	}
85
86
	/**
87
	 * Return the backing entry object.
88
	 *
89
	 * @return array The backing entry object.
90
	 */
91 157
	public function as_entry() {
92 157
		return $this->entry;
93
	}
94
95
	/**
96
	 * Return the link to this entry in the supplied context.
97
	 *
98
	 * @api
99
	 * @since 2.0
100
	 *
101
	 * @param \GV\View|null $view The View context.
102
	 * @param \GV\Request $request The Request (current if null).
103
	 * @param boolean $track_directory Keep the housing directory arguments intact (used for breadcrumbs, for example). Default: true.
104
	 *
105
	 * @return string The permalink to this entry.
106
	 */
107 10
	public function get_permalink( \GV\View $view = null, \GV\Request $request = null, $track_directory = true ) {
108 10
		if ( is_null( $request ) ) {
109 2
			$request = &gravityview()->request;
110
		}
111
112 10
		global $post;
113
114 10
		$args = array();
115
116 10
		$view_id = is_null ( $view ) ? null : $view->ID;
0 ignored issues
show
Documentation introduced by
The property ID does not exist on object<GV\View>. 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...
117
118 10
		$permalink = null;
119
120
		/** This is not a regular view. */
121 10
		if ( ! $request->is_view() ) {
122
123
			/** Must be an embed of some sort. */
124 7
			if ( is_object( $post ) && is_numeric( $post->ID ) ) {
125 2
				$permalink = get_permalink( $post->ID );
126
127 2
				$view_collection = View_Collection::from_post( $post );
128
129 2
				if( 1 < $view_collection->count() ) {
130 1
					$args['gvid'] = $view_id;
131
				}
132
			}
133
		}
134
135
		/** Fallback to regular view base. */
136 10
		if ( is_null( $permalink ) ) {
137 9
			$permalink = get_permalink( $view_id );
138
		}
139
140
		/**
141
		 * @filter `gravityview_directory_link` Modify the URL to the View "directory" context
142
		 * @since 1.19.4
143
		 * @param string $link URL to the View's "directory" context (Multiple Entries screen)
144
		 * @param int $post_id ID of the post to link to. If the View is embedded, it is the post or page ID
145
		 */
146 10
		$permalink = apply_filters( 'gravityview_directory_link', $permalink, $request->is_view() ? $view_id : ( $post ? $post->ID : null ) );
147
148 10
		$entry_endpoint_name = \GV\Entry::get_endpoint_name();
149
150 10
		$entry_slug = $this->get_slug( true, $view, $request, $track_directory );
151
152
		/** Assemble the permalink. */
153 10
		if ( get_option( 'permalink_structure' ) && ! is_preview() ) {
154
			/**
155
			 * Make sure the $directory_link doesn't contain any query otherwise it will break when adding the entry slug.
156
			 * @since 1.16.5
157
			 */
158 2
			$link_parts = explode( '?', $permalink );
159
160 2
			$query = ! empty( $link_parts[1] ) ? '?' . $link_parts[1] : '';
161
162 2
			$permalink = trailingslashit( $link_parts[0] ) . $entry_endpoint_name . '/'. $entry_slug .'/' . $query;
163
		} else {
164 9
			$args[ $entry_endpoint_name ] = $entry_slug;
165
		}
166
167 10
		if ( $track_directory ) {
168 10
			if ( ! empty( $_GET['pagenum'] ) ) {
169 1
				$args['pagenum'] = intval( $_GET['pagenum'] );
170
			}
171
172 10
			if ( $sort = Utils::_GET( 'sort' ) ) {
173 1
				$args['sort'] = $sort;
174 1
				$args['dir'] = Utils::_GET( 'dir' );
175
			}
176
		}
177
178 10
		$permalink = add_query_arg( $args, $permalink );
179
180
		/**
181
		 * @filter `gravityview/entry/permalink` The permalink of this entry.
182
		 * @since 2.0
183
		 * @param string $permalink The permalink.
184
		 * @param \GV\Entry $entry The entry we're retrieving it for.
185
		 * @param \GV\View|null $view The view context.
186
		 * @param \GV\Request $request The request context.
187
		 */
188 10
		return apply_filters( 'gravityview/entry/permalink', $permalink, $this, $view, $request );
189
	}
190
191
	/**
192
	 * Get the entry slug
193
	 *
194
	 * @internal (for now!)
195
	 * @todo Should $apply_filter be default true or false? Unit tests pass either way...
196
	 *
197
	 * @since 2.7
198
	 *
199
	 * @uses \GravityView_API::get_entry_slug
200
	 *
201
	 * @param bool $apply_filter Whether to apply the `gravityview/entry/slug` filter. Default: false.
202
	 * @param \GV\View|null $view The View context.
203
	 * @param \GV\Request $request The Request (current if null).
204
	 * @param boolean $track_directory Keep the housing directory arguments intact (used for breadcrumbs, for example). Default: true.
205
	 *
206
	 * @return string Unique slug ID, passed through `sanitize_title()`, with `gravityview/entry/slug` filter applied
207
	 */
208 157
	public function get_slug( $apply_filter = false, \GV\View $view = null, \GV\Request $request = null, $track_directory = true ) {
209
210 157
		$entry_slug = \GravityView_API::get_entry_slug( $this->ID, $this->as_entry() );
211
212 157
		if( ! $apply_filter ) {
213 157
			return $entry_slug;
214
		}
215
216
		/**
217
		 * @filter `gravityview/entry/slug` Modify the entry URL slug as needed.
218
		 * @since 2.2.1
219
		 * @param[in,out] string $entry_slug The slug, sanitized with sanitize_title()
220
		 * @param null|\GV\Entry $this The entry object.
221
		 * @param null|\GV\View $view The view object.
222
		 * @param null|\GV\Request $request The request.
223
		 * @param bool $track_directory Whether the directory is tracked.
224
		 */
225 9
		$entry_slug = apply_filters( 'gravityview/entry/slug', $entry_slug, $this, $view, $request, $track_directory );
226
227 9
		return $entry_slug;
228
	}
229
230
	/**
231
	 * Is this a multi-entry (joined entry).
232
	 *
233
	 * @since 2.2
234
	 *
235
	 * @return boolean
236
	 */
237 100
	public function is_multi() {
238 100
		return $this instanceof Multi_Entry;
239
	}
240
241
	/**
242
	 * If this is a Multi_Entry filter it by Field
243
	 *
244
	 * @since 2.2
245
	 *
246
	 * @param \GV\Field $field The field to filter by.
247
	 * @param int $fallback A fallback form_id if the field supplied is invalid.
248
	 *
249
	 * @return \GV\Entry|null A \GV\Entry or null if not found.
250
	 */
251 94
	public function from_field( $field, $fallback = null ) {
252 94
		if ( ! $this->is_multi() ) {
253 90
			return $this;
254
		}
255 6
		return Utils::get( $this, $field->form_id, $fallback );
0 ignored issues
show
Documentation introduced by
The property form_id does not exist on object<GV\Field>. 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...
256
	}
257
}
258