From 3257465eec899be0c090cf2ef54fdb3a58ab82f2 Mon Sep 17 00:00:00 2001 From: knut <> Date: Fri, 12 May 2006 06:08:43 +0000 Subject: Added TXmlTransform control #99 --- framework/Exceptions/messages.txt | 7 +- framework/Web/UI/WebControls/TXmlTransform.php | 193 +++++++++++++++++++++++++ 2 files changed, 199 insertions(+), 1 deletion(-) create mode 100644 framework/Web/UI/WebControls/TXmlTransform.php (limited to 'framework') 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 @@ + + * @author Qiang Xue + * @link http://www.pradosoft.com + * @copyright Copyright © 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 + * @author Qiang Xue + * @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); + } +} +?> -- cgit v1.2.3