-
Notifications
You must be signed in to change notification settings - Fork 0
/
Renderer.php
130 lines (117 loc) · 3.63 KB
/
Renderer.php
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
<?php
/*
Class: Renderer
Handles rendering of files
*/
namespace TJM\WPThemeHelper;
use TJM\Component\BufferManager\BufferManager;
class Renderer{
protected $bufferManager;
protected $pathManager;
/*
Method: __construct
Parameters:
opts(Array):
bufferManager(BufferManager): object that manages output buffers
pathManager(PathHelper): object that manages paths
*/
public function __construct($opts = Array()){
$this->bufferManager =
(isset($opts['bufferManager']))
? $opts['bufferManager']
: new BufferManager()
;
$this->pathManager =
(isset($opts['pathManager']))
? $opts['pathManager']
: new PathHelper()
;
}
/*=====
==render
=====*/
/*
Property: renderStack
Stack of templates currently being rendered. Used by renderParent to be able to render the parent of the currently rendering template.
*/
protected $renderStack = Array();
/*
Method: getTemplateContent
Render a template into a string.
Parameters:
templateFile(String): file name of template to use, path relative to theme directory or absolute.
data(Array): data to pass to template
Return:
(String|null): Rendered content of template, or null if it doesn't exist
*/
public function getTemplateContent($templateFile, $data = Array()){
$templatePath = $this->pathManager->getThemeFilePath($templateFile);
if($templatePath){
$this->bufferManager->start();
//--ensure same interface when loading skeleton through this function as not
extract($GLOBALS);
//--make data available directly to template
extract($data);
require($templatePath);
return $this->bufferManager->end();
}else{
return null;
}
}
/*
Method: render
Virtual alias for $this->renderTemplate(), with a default template of skeleton.php
Parameters:
templateFile(String): {see $this->outputTemplate()}
data(Array): {see $this->outputTemplate()}
*/
public function render($templateFile = 'skeleton.php', $data = Array()){
return $this->renderTemplate($templateFile, $data);
}
/*
Method: renderParent
Renders the parent theme template file. Useful if a child theme overrides a template but you still want to be able to render the parent version, such as from within the child template.
Parameters:
templateFile(String): {see $this->outputTemplate()}
data(Array): {see $this->outputTemplate()}
*/
public function renderParent($templateFile = null, $data = null){
if($templateFile === null){
$stackData = $this->renderStack[count($this->renderStack) - 1];
$templateFile = $stackData['template'];
$data = $stackData['data'];
}
if($data === null){
$data = Array();
}
$templatePath = $this->pathManager->getParentThemeFilePath($templateFile);
return $this->renderTemplate($templatePath, $data);
}
/*
Method: renderPiece
Virtual alias for $this->renderTemplate(), but setting template file to be in pieces folder
Parameters:
templateName(String): Name of piece, a file in the pieces directory minus the '.php' from the name
data(Array): {see $this->outputTemplate()}
*/
public function renderPiece($templateName = 'skeleton.php', $data = Array()){
$templatePath = substr($this->pathManager->getRelativePath($templateName, 'pieces', 'php'), 1);
return $this->renderTemplate($templatePath, $data);
}
/*
Method: renderTemplate
Renders a template
Parameters:
templateFile(String): {see $this->outputTemplate()}
data(Array): {see $this->outputTemplate()}
*/
public function renderTemplate($templateFile, $data = Array()){
$this->renderStack[] = Array(
'template'=> $templateFile
,'data'=> $data
);
$return = $this->getTemplateContent($templateFile, $data);
array_pop($this->renderStack);
return $return;
}
}