-
Notifications
You must be signed in to change notification settings - Fork 453
/
TemplateLocator.php
136 lines (115 loc) · 3.23 KB
/
TemplateLocator.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
131
132
133
134
135
136
<?php
namespace Concrete\Core\Filesystem;
use Concrete\Core\Foundation\Environment;
class TemplateLocator
{
protected $template;
protected function createTemplateFromInput($input)
{
$template = null;
if (!($input instanceof Template)) {
if (is_array($input)) {
$template = new Template($input[0], $input[1]);
} else if (is_string($input)) {
$template = new Template($input);
}
} else {
$template = $input;
}
return $template;
}
protected function createLocationFromInput($input)
{
$location = null;
if (!($input instanceof TemplateLocation)) {
if (is_array($input)) {
$location = new TemplateLocation($input[0], $input[1]);
} else if (is_string($input)) {
$location = new TemplateLocation($input);
}
} else {
$location = $input;
}
return $location;
}
public function __construct($template = null)
{
if ($template) {
$this->setTemplate($template);
}
}
/**
* @return Template
*/
public function getTemplate()
{
return $this->template;
}
public function setTemplate($template)
{
$this->template = $this->createTemplateFromInput($template);
}
protected $locations = [];
/**
* Adding a location tells our locator to look in an additional spot.
* @param $location
*/
public function addLocation($location)
{
$this->locations[] = $this->createLocationFromInput($location);
}
/**
* Adds a new place to look at the front of the line
* @param $location
*/
public function prependLocation($location)
{
array_unshift($this->locations, $this->createLocationFromInput($location));
}
protected function getPath(TemplateLocation $location, Template $template)
{
$location = $location->getLocation()
. '/'
. $template->getTemplateHandle() . '.php';
return $location;
}
public function getFile()
{
$location = $this->getLocation();
if ($location) {
return $location->getFile();
}
}
/**
* @return array
*/
public function getLocations()
{
return $this->locations;
}
public function getLocation()
{
$r = Environment::get();
$record = false;
foreach($this->locations as $location) {
$pkgHandle = null;
if ($this->template) {
$path = $this->getPath($location, $this->template);
if ($this->template->getPackageHandle()) {
$pkgHandle = $this->template->getPackageHandle();
}
} else {
$path = $location->getLocation();
}
if (!$pkgHandle) {
$pkgHandle = $location->getPackageHandle();
}
$record = $r->getRecord($path, $pkgHandle);
if ($record->exists()) {
return $record;
}
}
// Return the final record even if the file doesn't exist
return $record;
}
}