GravityView  2.17
The best, easiest way to display Gravity Forms entries on your website.
class-gv-entry.php
Go to the documentation of this file.
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  public static function add_rewrite_endpoint() {
43  global $wp_rewrite;
44 
45  $endpoint = self::get_endpoint_name();
46 
47  /** Let's make sure the endpoint array is not polluted. */
48  if ( in_array( array( EP_PERMALINK | EP_PERMALINK | EP_ROOT, $endpoint, $endpoint ), $wp_rewrite->endpoints ) ) {
49  return;
50  }
51 
52  add_rewrite_endpoint( $endpoint, EP_PAGES | EP_PERMALINK | EP_ROOT );
53  }
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  public static function get_endpoint_name() {
64  /**
65  * @filter `gravityview_directory_endpoint` Change the slug used for single entries
66  * @param string $endpoint Slug to use when accessing single entry. Default: `entry`
67  */
68  $endpoint = apply_filters( 'gravityview_directory_endpoint', 'entry' );
69 
70  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  public static function by_id( $entry_id ) {
83  return null;
84  }
85 
86  /**
87  * Return the backing entry object.
88  *
89  * @return array The backing entry object.
90  */
91  public function as_entry() {
92  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  public function get_permalink( \GV\View $view = null, \GV\Request $request = null, $track_directory = true ) {
108  if ( is_null( $request ) ) {
109  $request = &gravityview()->request;
110  }
111 
112  global $post;
113 
114  $args = array();
115 
116  $view_id = is_null ( $view ) ? null : $view->ID;
117 
118  $permalink = null;
119 
120  /** This is not a regular view. */
121  if ( ! $request->is_view( false ) ) {
122 
123  /** Must be an embed of some sort. */
124  if ( is_object( $post ) && is_numeric( $post->ID ) ) {
125  $permalink = get_permalink( $post->ID );
126 
127  $view_collection = View_Collection::from_post( $post );
128 
129  if( 1 < $view_collection->count() ) {
130  $args['gvid'] = $view_id;
131  }
132  }
133  }
134 
135  /** Fallback to regular view base. */
136  if ( is_null( $permalink ) ) {
137  $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  $permalink = apply_filters( 'gravityview_directory_link', $permalink, $request->is_view( false ) ? $view_id : ( $post ? $post->ID : null ) );
147 
148  $entry_endpoint_name = \GV\Entry::get_endpoint_name();
149 
150  $entry_slug = $this->get_slug( true, $view, $request, $track_directory );
151 
152  /** Assemble the permalink. */
153  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  $link_parts = explode( '?', $permalink );
159 
160  $query = ! empty( $link_parts[1] ) ? '?' . $link_parts[1] : '';
161 
162  $permalink = trailingslashit( $link_parts[0] ) . $entry_endpoint_name . '/'. $entry_slug .'/' . $query;
163  } else {
164  $args[ $entry_endpoint_name ] = $entry_slug;
165  }
166 
167  if ( $track_directory ) {
168  if ( ! empty( $_GET['pagenum'] ) ) {
169  $args['pagenum'] = intval( $_GET['pagenum'] );
170  }
171 
172  if ( $sort = Utils::_GET( 'sort' ) ) {
173  $args['sort'] = $sort;
174  $args['dir'] = Utils::_GET( 'dir' );
175  }
176  }
177 
178  $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  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  public function get_slug( $apply_filter = false, \GV\View $view = null, \GV\Request $request = null, $track_directory = true ) {
209 
210  $entry_slug = \GravityView_API::get_entry_slug( $this->ID, $this->as_entry() );
211 
212  if( ! $apply_filter ) {
213  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 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  $entry_slug = apply_filters( 'gravityview/entry/slug', $entry_slug, $this, $view, $request, $track_directory );
226 
227  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  public function is_multi() {
238  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  public function from_field( $field, $fallback = null ) {
252  if ( ! $this->is_multi() ) {
253  return $this;
254  }
255  return Utils::get( $this, $field->form_id, $fallback );
256  }
257 }
If this file is called directly, abort.
get_permalink(\GV\View $view=null, \GV\Request $request=null, $track_directory=true)
Return the link to this entry in the supplied context.
If this file is called directly, abort.
global $post
Definition: delete-entry.php:7
as_entry()
Return the backing entry object.
static get_endpoint_name()
Return the endpoint name for a single Entry.
is_multi()
Is this a multi-entry (joined entry).
static by_id( $entry_id)
Construct a instance by ID.
from_field( $field, $fallback=null)
If this is a Multi_Entry filter it by Field.
If this file is called directly, abort.
static get_entry_slug( $id_or_string, $entry=array())
Get the entry slug for the entry.
Definition: class-api.php:550
If this file is called directly, abort.
gravityview()
The main GravityView wrapper function.
$entry_slug
Definition: notes.php:30
get_slug( $apply_filter=false, \GV\View $view=null, \GV\Request $request=null, $track_directory=true)
Get the entry slug.
$entry
Definition: notes.php:27
$entry
static add_rewrite_endpoint()
Adds the necessary rewrites for single Entries.