Completed
Push — master ( b9ab02...8a7f17 )
by Zack
54:54 queued 46:56
created

View_Template   A

Complexity

Total Complexity 6

Size/Duplication

Total Lines 130
Duplicated Lines 0 %

Coupling/Cohesion

Components 2
Dependencies 3

Test Coverage

Coverage 100%

Importance

Changes 1
Bugs 0 Features 1
Metric Value
dl 0
loc 130
ccs 27
cts 27
cp 1
rs 10
c 1
b 0
f 1
wmc 6
lcom 2
cbo 3

4 Methods

Rating   Name   Duplication   Size   Complexity  
A __construct() 0 10 1
A __destruct() 0 3 1
B render() 0 25 1
A add_id_specific_templates() 0 19 3
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 23 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
 * Load up the Gamajo Template Loader.
11
 *
12
 * @see https://github.com/GaryJones/Gamajo-Template-Loader
13
 */
14
if ( ! class_exists( 'Gamajo_Template_Loader' ) ) {
15
	require gravityview()->plugin->dir( 'future/lib/class-gamajo-template-loader.php' );
16
}
17
18
/**
19
 * The View Template class .
20
 *
21
 * Renders a \GV\View and a \GV\Entry_Collection via a \GV\View_Renderer.
22
 */
23
abstract class View_Template extends Template {
24
	/**
25
	 * Prefix for filter names.
26
	 * @var string
27
	 */
28
	protected $filter_prefix = 'gravityview/template/views';
29
30
	/**
31
	 * Directory name where custom templates for this plugin should be found in the theme.
32
	 * @var string
33
	 */
34
	protected $theme_template_directory = 'gravityview/views/';
35
36
	/**
37
	 * Directory name where the default templates for this plugin are found.
38
	 * @var string
39
	 */
40
	protected $plugin_template_directory = 'templates/views/';
41
42
	/**
43
	 * @var \GV\View The view connected to this template.
44
	 */
45
	public $view;
46
47
	/**
48
	 * @var \GV\Entry_Collection The entries that need to be rendered.
49
	 */
50
	public $entries;
51
52
	/**
53
	 * @var \GV\Request The request context.
54
	 */
55
	public $request;
56
57
	/**
58
	 * @var string The template slug to be loaded (like "table", "list")
59
	 */
60
	public static $slug;
61
62
	/**
63
	 * Initializer.
64
	 *
65
	 * @param \GV\View $view The View connected to this template.
66
	 * @param \GV\Entry_Collection $entries A collection of entries for this view.
67
	 * @param \GV\Request $request The request context.
68
	 */
69 12
	public function __construct( View $view, Entry_Collection $entries, Request $request ) {
70 12
		$this->view = $view;
71 12
		$this->entries = $entries;
72 12
		$this->request = $request;
73
74
		/** Add granular overrides. */
75 12
		add_filter( $this->filter_prefix . '_get_template_part', array( $this, 'add_id_specific_templates' ), 10, 3 );
76
77 12
		parent::__construct();
78 12
	}
79
80 3
	public function __destruct() {
81 3
		remove_filter( $this->filter_prefix . '_get_template_part', array( $this, 'add_id_specific_templates' ) );
82 3
	}
83
84
	/**
85
	 * Enable granular template overrides based on current post, view, form, etc.
86
	 *
87
	 * The loading order is:
88
	 *
89
	 * - post-[ID of post or page where view is embedded]-view-[View ID]-table-footer.php
90
	 * - post-[ID of post or page where view is embedded]-table-footer.php
91
	 * - view-[View ID]-table-footer.php
92
	 * - form-[Form ID]-table-footer.php
93
	 * - table-footer.php
94
	 *
95
	 * @see  Gamajo_Template_Loader::get_template_file_names() Where the filter is
96
	 * @param array $templates Existing list of templates.
97
	 * @param string $slug      Name of the template base, example: `table`, `list`, `datatables`, `map`
98
	 * @param string $name      Name of the template part, example: `body`, `footer`, `head`, `single`
99
	 *
100
	 * @return array $templates Modified template array, merged with existing $templates values
101
	 */
102 12
	public function add_id_specific_templates( $templates, $slug, $name ) {
103
104 12
		$specifics = array();
105
106 12
		list( $slug_dir, $slug_name ) = self::split_slug( $slug, $name );
107
108 12
		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...
109
110 12
		if ( ! $this->request->is_view() && $post ) {
111 1
			$specifics []= sprintf( '%spost-%d-view-%d-%s.php', $slug_dir, $post->ID, $this->view->ID, $slug_name );
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...
introduced by
Expected 1 space before "="; 0 found
Loading history...
112 1
			$specifics []= sprintf( '%spost-%d-%s.php', $slug_dir, $post->ID, $slug_name );
0 ignored issues
show
introduced by
Expected 1 space before "="; 0 found
Loading history...
113
		}
114
0 ignored issues
show
Coding Style introduced by
Functions must not contain multiple empty lines in a row; found 2 empty lines
Loading history...
115
		
116 12
		$specifics []= sprintf( '%sview-%d-%s.php', $slug_dir, $this->view->ID, $slug_name );
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...
introduced by
Expected 1 space before "="; 0 found
Loading history...
117 12
		$specifics []= sprintf( '%sform-%d-%s.php', $slug_dir, $this->view->form->ID, $slug_name );
0 ignored issues
show
introduced by
Expected 1 space before "="; 0 found
Loading history...
118
119 12
		return array_merge( $specifics, $templates );
120
	}
121
122
	/**
123
	 * Output some HTML.
124
	 *
125
	 * @return void
126
	 */
127 14
	public function render() {
128 14
		$context = Template_Context::from_template( $this );
129
130
		/**
131
		 * Make various pieces of data available to the template
132
		 *  under the $gravityview scoped variable.
133
		 *
134
		 * @filter `gravityview/template/view/context`
135
		 * @param \GV\Template_Context $context The context for this template.
136
		 * @param \GV\View_Template $template The current template.
137
		 * @since 2.0
138
		 */
139 14
		$this->push_template_data( $context = apply_filters( 'gravityview/template/view/context', $context, $this ), 'gravityview' );
140
141
		/**
142
		 * @filter `gravityview/template/view/render` Before rendering.
143
		 * @param \GV\View_Template $template The current template.
144
		 * @since 2.0
145
		 */
146 14
		do_action( 'gravityview/template/view/render', $context );
147
148
		/** Load the template. */
149 14
		$this->get_template_part( static::$slug );
150 14
		$this->pop_template_data( 'gravityview' );
151 14
	}
152
}
153
154
/** Load implementations. */
155
require gravityview()->plugin->dir( 'future/includes/class-gv-template-view-table.php' );
156
require gravityview()->plugin->dir( 'future/includes/class-gv-template-view-list.php' );
157
require gravityview()->plugin->dir( 'future/includes/class-gv-template-view-legacy.php' );
158