summaryrefslogtreecommitdiff
path: root/framework
diff options
context:
space:
mode:
Diffstat (limited to 'framework')
-rw-r--r--framework/Exceptions/messages.txt7
-rw-r--r--framework/Web/UI/WebControls/TXmlTransform.php193
2 files changed, 199 insertions, 1 deletions
diff --git a/framework/Exceptions/messages.txt b/framework/Exceptions/messages.txt
index fa12238a..effc3636 100644
--- a/framework/Exceptions/messages.txt
+++ b/framework/Exceptions/messages.txt
@@ -297,4 +297,9 @@ stack_empty = TStack is empty.
queue_data_not_iterable = TQueue can only fetch data from an array or a traversable object.
queue_empty = TQueue is empty.
-callback_not_support_no_priority_state_update = Callback request does not support unprioritized pagestate update. \ No newline at end of file
+callback_not_support_no_priority_state_update = Callback request does not support unprioritized pagestate update.
+
+xmltransform_xslextension_required = TXmlTransform require the PHP's XSL extension
+xmltransform_transformpath_invalid = TransformPath '{0}' is invalid.
+xmltransform_documentpath_invalid = DocumentPath '{0}' is invalid.
+xmltransform_transform_required = Either TransformContent or TransformPath property must be set.
diff --git a/framework/Web/UI/WebControls/TXmlTransform.php b/framework/Web/UI/WebControls/TXmlTransform.php
new file mode 100644
index 00000000..12dae09d
--- /dev/null
+++ b/framework/Web/UI/WebControls/TXmlTransform.php
@@ -0,0 +1,193 @@
+<?php
+/**
+ * TXmlTransform class file
+ *
+ * @author Knut Urdalen <knut.urdalen@gmail.com>
+ * @author Qiang Xue <qiang.xue@gmail.com>
+ * @link http://www.pradosoft.com
+ * @copyright Copyright &copy; 2005 PradoSoft
+ * @license http://www.pradosoft.com/license/
+ * @package System.Web.UI.WebControls
+ */
+
+/**
+ * TXmlTransform class
+ *
+ * TXmlTransform uses the PHP's XSL extension to perform
+ * {@link http://www.w3.org/TR/xslt XSL transformations} using the
+ * {@link http://xmlsoft.org/XSLT/ libxslt library}.
+ *
+ * To associate an XML style sheet with TXmlTransform set the
+ * {@link setTransformPath TransformPath} property to the namespace or path to the style sheet
+ * or set the {@link setTransformContent TransformContent} property to the XML style sheet
+ * data as a string.
+ *
+ * To associate the XML data to be transformed set the {@link setDocumentPath DocumentPath}
+ * property to the namespace or path to the XML document or set the
+ * {@link setDocumentContent DocumentContent} property to the XML data as a string.
+ *
+ * To add additional parameters to the transformation process you can use the {@link getParameters Parameters}
+ * property.
+ *
+ * @author Knut Urdalen <knut.urdalen@gmail.com>
+ * @author Qiang Xue <qiang.xue@gmail.com>
+ * @package System.Web.UI.WebControls
+ * @since 3.1
+ */
+class TXmlTransform extends TControl {
+
+ const EXT_XML_FILE = '.xml';
+ const EXT_XSL_FILE = '.xsl';
+
+ /**
+ * Constructor
+ *
+ * Initializes the TXmlTransform object and ensure that the XSL extension is available
+ * @throws TConfigurationException If XSL extension is not available
+ */
+ public function __construct() {
+ if(!class_exists('XSLTProcessor', false)) {
+ throw new TConfigurationException('xmltransform_xslextension_required');
+ }
+ }
+
+ /**
+ * @return string The path to the XML style sheet.
+ */
+ public function getTransformPath() {
+ return $this->getViewState('TransformPath', '');
+ }
+
+ /**
+ * @param string The path to the XML style sheet. It must be in namespace format.
+ */
+ public function setTransformPath($value) {
+ if(!is_file($value)) {
+ $value = Prado::getPathOfNamespace($value, self::EXT_XSL_FILE);
+ if($value === null) {
+ throw new TInvalidDataValueException('xmltransform_transformpath_invalid', $value);
+ }
+ }
+ $this->setViewState('TransformPath', $value, '');
+ }
+
+ /**
+ * @return string XML style sheet as string
+ */
+ public function getTransformContent() {
+ return $this->getViewState('TransformContent', '');
+ }
+
+ /**
+ * @param string $value XML style sheet as string
+ */
+ public function setTransformContent($value) {
+ $this->setViewState('TransformContent', $value, '');
+ }
+
+ /**
+ * @return string The path to the XML document. It must be in namespace format.
+ */
+ public function getDocumentPath() {
+ return $this->getViewState('DocumentPath', '');
+ }
+
+ /**
+ * @param string Namespace or path to XML document
+ * @throws TInvalidDataValueException
+ */
+ public function setDocumentPath($value) {
+ if(!is_file($value)) {
+ $value = Prado::getPathOfNamespace($value, self::EXT_XML_FILE);
+ if($value === null) {
+ throw new TInvalidDataValueException('xmltransform_documentpath_invalid', $value);
+ }
+ }
+ $this->setViewState('DocumentPath', $value, '');
+ }
+
+ /**
+ * @return string XML data
+ */
+ public function getDocumentContent() {
+ return $this->getViewState('DocumentContent', '');
+ }
+
+ /**
+ * @param string $value XML data. If not empty, it takes precedence over {@link setDocumentPath DocumentPath}.
+ */
+ public function setDocumentContent($value) {
+ $this->setViewState('DocumentContent', $value, '');
+ }
+
+ /**
+ * Returns the list of parameters to be applied to the transform.
+ * @return TAttributeCollection the list of custom parameters
+ */
+ public function getParameters() {
+ if($params = $this->getViewState('Parameters',null)) {
+ return $params;
+ } else {
+ $params = new TAttributeCollection();
+ $this->setViewState('Parameters', $params, null);
+ return $params;
+ }
+ }
+
+ private function getTransformXmlDocument() {
+ if(($content = $this->getTransformContent()) !== '') {
+ $document = new DOMDocument();
+ $document->loadXML($content);
+ return $document;
+ } else if(($path = $this->getTransformPath()) !== '') {
+ $document = new DOMDocument();
+ $document->load($path);
+ return $document;
+ } else {
+ throw new TConfigurationException('xmltransform_transform_required');
+ }
+ }
+
+ private function getSourceXmlDocument() {
+ if(($content = $this->getDocumentContent()) !== '') {
+ $document = new DOMDocument();
+ $document->loadXML($content);
+ return $document;
+ } else if(($path = $this->getDocumentPath()) !== '') {
+ $document = new DOMDocument();
+ $document->load($path);
+ return $document;
+ } else {
+ return null;
+ }
+ }
+
+ /**
+ * Performs XSL transformation and render the output.
+ * @param THtmlWriter The writer used for the rendering purpose
+ */
+ public function render($writer) {
+ if(($document=$this->getSourceXmlDocument()) === null) {
+ $textWriter = new TTextWriter();
+ parent::render(new THtmlWriter($textWriter));
+ $document = new DOMDocument();
+ $document->loadXML($textWriter->flush());
+ }
+ $stylesheet = $this->getTransformXmlDocument();
+
+ // Perform XSL transformation
+ $xslt = new XSLTProcessor();
+ $xslt->importStyleSheet($stylesheet);
+
+ // Check for parameters
+ $parameters = $this->getParameters();
+ foreach($parameters as $name => $value) {
+ $xslt->setParameter('', $name, $value);
+ }
+ $output = $xslt->transformToXML($document);
+
+ // Write output
+ $writer->write($output);
+ }
+}
+?>