-
-
Notifications
You must be signed in to change notification settings - Fork 211
/
class.xsltpage.php
178 lines (159 loc) · 4.8 KB
/
class.xsltpage.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
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
<?php
/**
* @package toolkit
*/
/**
* XSLTPage extends the Page class to provide an object representation
* of a Page that will be generated using XSLT.
*/
class XSLTPage extends Page
{
/**
* An instance of the XsltProcess class
* @var XsltProcess
*/
public $Proc;
/**
* The XML to be transformed
* @since Symphony 2.4 this variable may be a string or an XMLElement
* @var string|XMLElement
*/
protected $_xml;
/**
* The XSL to apply to the `$this->_xml`.
* @var string
*/
protected $_xsl;
/**
* An array of all the parameters to be made available during the XSLT
* transform
* @var array
*/
protected $_param = array();
/**
* An array of the PHP functions to be made available during the XSLT
* transform
* @var array
*/
protected $_registered_php_functions = array();
/**
* The constructor for the `XSLTPage` ensures that an `XSLTProcessor`
* is available, and then sets an instance of it to `$this->Proc`, otherwise
* it will throw a `SymphonyErrorPage` exception.
*/
public function __construct()
{
if (!XsltProcess::isXSLTProcessorAvailable()) {
Symphony::Engine()->throwCustomError(__('No suitable XSLT processor was found.'));
}
$this->Proc = new XsltProcess;
}
/**
* Setter for `$this->_xml`, can optionally load the XML from a file.
*
* @param string|XMLElement $xml
* The XML for this XSLT page
* @param boolean $isFile
* If set to true, the XML will be loaded from a file. It is false by default
*/
public function setXML($xml, $isFile = false)
{
$this->_xml = ($isFile ? file_get_contents($xml) : $xml);
}
/**
* Accessor for the XML of this page
*
* @return string|XMLElement
*/
public function getXML()
{
return $this->_xml;
}
/**
* Setter for `$this->_xsl`, can optionally load the XSLT from a file.
*
* @param string $xsl
* The XSLT for this XSLT page
* @param boolean $isFile
* If set to true, the XSLT will be loaded from a file. It is false by default
*/
public function setXSL($xsl, $isFile = false)
{
$this->_xsl = ($isFile ? file_get_contents($xsl) : $xsl);
}
/**
* Accessor for the XSL of this page
*
* @return string
*/
public function getXSL()
{
return $this->_xsl;
}
/**
* Sets the parameters that will output with the resulting page
* and be accessible in the XSLT. This function translates all ' into
* `'`, with the tradeoff being that a <xsl:value-of select='$param' />
* that has a ' will output `'` but the benefit that ' and " can be
* in the params
*
* @link http://www.php.net/manual/en/xsltprocessor.setparameter.php#81077
* @param array $param
* An associative array of params for this page
*/
public function setRuntimeParam($param)
{
$this->_param = str_replace("'", "'", $param);
}
/**
* Returns an iterator of errors from the `XsltProcess`. Use this function
* inside a loop to get all the errors that occurring when transforming
* `$this->_xml` with `$this->_xsl`.
*
* @return array
* An associative array containing the errors details from the
* `XsltProcessor`
*/
public function getError()
{
return $this->Proc->getError();
}
/**
* Allows the registration of PHP functions to be used on the Frontend
* by passing the function name or an array of function names
*
* @param mixed $function
* Either an array of function names, or just the function name as a
* string
*/
public function registerPHPFunction($function)
{
if (is_array($function)) {
$this->_registered_php_functions = array_unique(
array_merge($this->_registered_php_functions, $function)
);
} else {
$this->_registered_php_functions[] = $function;
}
}
/**
* The generate function calls on the `XsltProcess` to transform the
* XML with the given XSLT passing any parameters or functions
* If no errors occur, the parent generate function is called to add
* the page headers and a string containing the transformed result
* is result.
*
* @param null $page
* @return string
*/
public function generate($page = null)
{
$result = $this->Proc->process($this->_xml, $this->_xsl, $this->_param, $this->_registered_php_functions);
if ($this->Proc->isErrors()) {
$this->setHttpStatus(Page::HTTP_STATUS_ERROR);
return false;
}
parent::generate($page);
return $result;
}
}