GravityView  2.10.1
The best, easiest way to display Gravity Forms entries on your website.
class-gv-renderer-view.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 \GV\View_Renderer class.
11  *
12  * Houses some preliminary \GV\View rendering functionality.
13  */
14 class View_Renderer extends Renderer {
15 
16  /**
17  * Renders a \GV\View instance.
18  *
19  * @param \GV\View $view The View instance to render.
20  * @param \GV\Request $request The request context we're currently in. Default: `gravityview()->request`
21  *
22  * @api
23  * @since 2.0
24  *
25  * @return string The rendered View.
26  */
27  public function render( View $view, Request $request = null ) {
28  if ( is_null( $request ) ) {
29  $request = &gravityview()->request;
30  }
31 
32  if ( ! $request->is_renderable() ) {
33  gravityview()->log->error( 'Renderer unable to render View in {request_class} context', array( 'request_class' => get_class( $request ) ) );
34  return null;
35  }
36 
37  /**
38  * @filter `gravityview_template_slug_{$template_id}` Modify the template slug about to be loaded in directory views.
39  * @since 1.6
40  * @param deprecated
41  * @see The `gravityview_get_template_id` filter
42  * @param string $slug Default: 'table'
43  * @param string $view The current view context: directory.
44  */
45  $template_slug = apply_filters( 'gravityview_template_slug_' . $view->settings->get( 'template' ), 'table', 'directory' );
46 
47  /**
48  * Figure out whether to get the entries or not.
49  *
50  * Some contexts don't need initial entries, like the DataTables directory type.
51  *
52  * @filter `gravityview_get_view_entries_{$template_slug}` Whether to get the entries or not.
53  * @param boolean $get_entries Get entries or not, default: true.
54  */
55  $get_entries = apply_filters( 'gravityview_get_view_entries_' . $template_slug, true );
56 
57  $hide_until_searched = $view->settings->get( 'hide_until_searched' );
58 
59  /**
60  * Hide View data until search is performed.
61  */
62  $get_entries = ( $hide_until_searched && ! $request->is_search() ) ? false : $get_entries;
63 
64  /**
65  * Fetch entries for this View.
66  */
67  if ( $get_entries ) {
68  $entries = $view->get_entries( $request );
69  } else {
70  $entries = new \GV\Entry_Collection();
71  }
72 
73  /**
74  * Load a legacy override template if exists.
75  */
76  $override = new \GV\Legacy_Override_Template( $view, null, null, $request );
77  foreach ( array( 'header', 'body', 'footer' ) as $part ) {
78  if ( ( $path = $override->get_template_part( $template_slug, $part ) ) && strpos( $path, '/deprecated' ) === false ) {
79  /**
80  * We have to bail and call the legacy renderer. Crap!
81  */
82  gravityview()->log->notice( 'Legacy templates detected in theme {path}', array( 'path' => $path ) );
83 
84  /**
85  * Show a warning at the top, if View is editable by the user.
86  */
87  add_action( 'gravityview_before', $this->legacy_template_warning( $view, $path ) );
88 
89  return $override->render( $template_slug );
90  }
91  }
92 
93  /**
94  * @filter `gravityview/template/view/class` Filter the template class that is about to be used to render the view.
95  * @since 2.0
96  * @param string $class The chosen class - Default: \GV\View_Table_Template.
97  * @param \GV\View $view The view about to be rendered.
98  * @param \GV\Request $request The associated request.
99  */
100  $class = apply_filters( 'gravityview/template/view/class', sprintf( '\GV\View_%s_Template', ucfirst( $template_slug ) ), $view, $request );
101  if ( ! $class || ! class_exists( $class ) ) {
102  gravityview()->log->notice( '{template_class} not found, falling back to legacy', array( 'template_class' => $class ) );
103  $class = '\GV\View_Legacy_Template';
104  }
105  $template = new $class( $view, $entries, $request );
106 
107  /**
108  * Remove multiple sorting before calling legacy filters.
109  * This allows us to fake it till we make it.
110  */
111  $parameters = $view->settings->as_atts();
112  if ( ! empty( $parameters['sort_field'] ) && is_array( $parameters['sort_field'] ) ) {
113  $has_multisort = true;
114  $parameters['sort_field'] = reset( $parameters['sort_field'] );
115  if ( ! empty( $parameters['sort_direction'] ) && is_array( $parameters['sort_direction'] ) ) {
116  $parameters['sort_direction'] = reset( $parameters['sort_direction'] );
117  }
118  }
119 
120  /** @todo Deprecate this! */
121  $parameters = \GravityView_frontend::get_view_entries_parameters( $parameters, $view->form->ID );
122 
123  global $post;
124 
125  /** Mock the legacy state for the widgets and whatnot */
126  \GV\Mocks\Legacy_Context::push( array_merge( array(
127  'view' => $view,
128  'entries' => $entries,
129  'request' => $request,
130  ), empty( $parameters ) ? array() : array(
131  'paging' => $parameters['paging'],
132  'sorting' => $parameters['sorting'],
133  ), empty( $post ) ? array() : array(
134  'post' => $post,
135  ) ) );
136 
137  add_action( 'gravityview/template/after', $view_id_output = function( $context ) {
138  printf( '<input type="hidden" class="gravityview-view-id" value="%d">', $context->view->ID );
139  } );
140 
141  ob_start();
142  $template->render();
143 
144  remove_action( 'gravityview/template/after', $view_id_output );
145 
147  return ob_get_clean();
148  }
149 }
If this file is called directly, abort.
if(! isset( $gravityview)||empty( $gravityview->template)) $template
The entry loop for the list output.
If this file is called directly, abort.
$class
$entries
gravityview()
Definition: _stubs.php:26
global $post
Definition: delete-entry.php:7
render(View $view, Request $request=null)
Renders a instance.
static pop()
Restores last saved state and context.
Definition: _mocks.php:410
static push( $configuration)
Set the state depending on the provided configuration.
Definition: _mocks.php:400
If this file is called directly, abort.
If this file is called directly, abort.
get_entries( $request=null)
Retrieve the entries for the current view and request.