PageRenderTime 25ms CodeModel.GetById 2ms app.highlight 18ms RepoModel.GetById 1ms app.codeStats 0ms

/includes/php/PHPReports/PHPReportsUtil.php

http://tracmor.googlecode.com/
PHP | 397 lines | 255 code | 28 blank | 114 comment | 22 complexity | 705770984933b049d3cf563cc2aa4f3e MD5 | raw file
  1<?php
  2	/******************************************************************************
  3	*																										*
  4	*	Useful functions and classes to deal with PHPReports stuff.						*
  5	*	This file is part of the standard PHPReports package.								*
  6	*																										*
  7	******************************************************************************/
  8
  9	/******************************************************************************
 10	*																										*
 11	*	This function will return if there is a PHPReports path in the PHP			*
 12	*	ini_get("include_path").																	*
 13	*																										*
 14	******************************************************************************/
 15	function getPHPReportsIncludePath(){
 16		$aPaths = explode((stristr(PHP_OS,"WIN")?";":":"),ini_get("include_path"));
 17		foreach($aPaths as $sPath)
 18			if(stristr($sPath,"phpreports"))
 19				return $sPath;
 20		return null;
 21	}
 22
 23	/******************************************************************************
 24	*																										*
 25	*	Returns the temporary file path. It's up to your operational system to		*
 26	*	return that. In most cases, on Linux it will return /tmp and on				*
 27	*	Windows c:\temp																				*
 28	*																										*
 29	******************************************************************************/
 30	function getPHPReportsTmpPath(){
 31		$sPath = tempnam(null,"check");
 32		unlink($sPath);
 33		return realpath(dirname($sPath));
 34	}
 35
 36	/******************************************************************************
 37	*																										*
 38	*	This function will return the file path where the PHPReports classes			*
 39	*	are.																								*
 40	*																										*
 41	******************************************************************************/
 42	function getPHPReportsFilePath(){
 43		$sPath = getPHPReportsIncludePath();
 44		if(!is_null($sPath))
 45			return $sPath;
 46		// put your distro path here
 47		return __INCLUDES__ . "/php/PHPReports/";
 48	}
 49
 50	/******************************************************************************
 51	*																										*
 52	*	XSLTProcessorClass																			*
 53	*	This class is used as base for XSLT process.											*
 54	*																										*
 55	******************************************************************************/
 56	class XSLTProcessorClass{
 57		var $_sXML;
 58		var $_sXSLT;
 59		var $_sOutput;
 60		var $_aParms;
 61
 62		/**
 63			Constructor
 64		*/
 65		function XSLTProcessorClass(){
 66			$this->_sXML	=null;
 67			$this->_sXSLT	=null;
 68			$this->_sOutput=null;
 69			$this->_aParms	=null;
 70		}
 71
 72		/**
 73			Sets the XML data file path
 74		*/
 75		function setXML($sXML_=null){
 76			$this->_sXML=$sXML_;
 77		}
 78
 79		/**
 80			Returns the XML data file path
 81		*/
 82		function getXML(){
 83			return $this->_sXML;
 84		}
 85
 86		/**
 87			Sets the style sheet file path
 88		*/
 89		function setXSLT($sXSLT_=null){
 90			$this->_sXSLT=$sXSLT_;
 91		}
 92
 93		/**
 94			Returns the style sheet file path
 95		*/
 96		function getXSLT(){
 97			return $this->_sXSLT;
 98		}
 99
100		/**
101			Specify the output file path
102			A null just returns the result on the run method
103		*/
104		function setOutput($sOutput_=null){
105			$this->_sOutput=$sOutput_;
106		}
107
108		/**
109			Return the output file path
110		*/
111		function getOutput(){
112			return $this->_sOutput;
113		}
114
115		/**
116			Specify the parameters array
117		*/
118		function setParms($aParms_=null){
119			if(is_null($aParms_))
120				return;
121			if(!is_array($aParms_))
122				return;
123			$this->_aParms=$aParms_;
124		}
125
126		/**
127			Insert a parameter
128			sParm_ - parameter name
129			oVal_  - parameter value
130		*/
131		function setParm($sParm_=null,$oVal_=null){
132			if(is_null($sParm_))
133				return;
134			$this->_aParms[$sParm_]=$oVal_;
135		}
136
137		/**
138			Returns a parameter value
139			sParm_ - parameter name
140		*/
141		function getParm($sParm_){
142			if(!array_key_exists($sParm_))
143				return null;
144			return $this->_aParms[$sParm_];
145		}
146
147		/**
148			Remove a parameter
149			sParm_ - parameter name
150		*/
151		function removeParm($sParm_=null){
152			if(is_null($sParm_))
153				return;
154			if(!array_key_exists($sParm_,$this->_aParms))
155				return;
156			unset($this->_aParms[$sParm_]);
157		}
158
159		/**
160			This method MUST be overwritten on every subclass to reflect
161			the behaviour of the desired XSLT processor.
162			It MUST return the result, and if defined an output, save it.
163		*/
164		function run(){
165		}
166	}
167
168	/******************************************************************************
169	*																										*
170	*	Sablotron processor																			*
171	*	http://www.gingerall.com/charlie/ga/xml/p_sab.xml									*
172	*	http://www.php.net/manual/en/ref.xslt.php												*
173	*	Used on PHP4 or installed from the PECL modules.									*
174	*																										*
175	******************************************************************************/
176	class Sablotron_xp extends XSLTProcessorClass{
177		function run(){
178			if(is_null($this->_sXML)){
179				print "ERROR: no XML file specified";
180				return;
181			}
182			if(is_null($this->_sXSLT)){
183				print "ERROR: no XSLT file specified";
184				return;
185			}
186			$oXSLT = xslt_create();
187			$sRst	 = xslt_process($oXSLT,$this->_sXML,$this->_sXSLT,$this->_sOutput,null,$this->_aParms);
188			xslt_free($oXSLT);
189			return $sRst;
190		}
191	}
192
193	/******************************************************************************
194	*																										*
195	*	PHP5 XSL processing																			*
196	*	Uses libxslt																					*
197	*	http://www.php.net/manual/en/ref.xsl.php												*
198	*																										*
199	******************************************************************************/
200	class PHPXSL_xp extends XSLTProcessorClass{
201		function run(){
202			// xml document
203			$oXML = new DomDocument();
204			$oXML->load($this->_sXML);
205			$oXML->xinclude();
206
207			// xslt document
208			$oXSL = new DomDocument();
209			$oXSL->load($this->_sXSLT);
210
211			// xslt processor
212			$oProc = new XSLTProcessor();
213			$oProc->importStyleSheet($oXSL);
214
215			// set all the parameters
216			if(!is_null($this->_aParms)){
217				foreach($this->_aParms as $k => $v)
218					$oProc->setParameter("",$k,$v);
219			}
220
221			// make the transformation
222			$sRst = $oProc->transformToXML($oXML);
223			unset($oProc);
224			unset($oXSL);
225			unset($oXML);
226
227			// if output is not null, save the result there
228			if(!is_null($this->_sOutput)){
229				$fHand = @fopen($this->_sOutput,"w");
230				@fputs($fHand,$sRst);
231				@fclose($fHand);
232			}
233			return $sRst;
234		}
235	}
236
237	/******************************************************************************
238	*																										*
239	*	XSLT Processor factory																		*
240	*	Returns a XSLT processor based on the current environment						*
241	*	or the user choice (need to hack the code below).									*
242	*																										*
243	******************************************************************************/
244	class XSLTProcessorFactory{
245		function get(){
246			// PHP major version number
247			$iVer = intval(substr(phpversion(),0,1));
248
249			// if PHP4 and Sablotron is installed
250			if($iVer<=4 && function_exists("xslt_create"))
251				return new Sablotron_xp();
252			// if PHP5 and Sablotron is installed
253			else if($iVer>=5 && function_exists("xslt_create"))
254				return new Sablotron_xp();
255			// if PHP5, Sablotron is not installed	and XSL support is compiled
256			else if($iVer>=5 && !function_exists("xslt_create") && class_exists("XSLTProcessor"))
257				return new PHPXSL_xp();
258			// there is no XSLT processor installed!
259			else
260				return null;
261		}
262	}
263
264	/******************************************************************************
265	*																										*
266	*	PHPReportsError																				*
267	*	Process error messages																		*
268	*																										*
269	******************************************************************************/
270	class PHPReportsError{
271		function PHPReportsError($sMsg_=null,$sURL_=null){
272			if(is_null($sMsg_))
273				return;
274
275			print "<p style='width:400px;background-color:#F5F5F5;border-style:solid;border-width:2;border-color:#CCCCCC;padding:10px 10px 10px 10px;margin:20px;font-family:verdana,arial,helvetica,sans-serif;color:#505050;font-size:12px;'>";
276			print "<span style='font-size:18px;color:#FF0000;font-weight:bold;'>OOOOPS, THERE'S AN ERROR HERE.</span><br/><br/>";
277			print $sMsg_."<br/><br/>";
278
279			if(!is_null($sURL_))
280				print "<a href='$sPath/help/$sURL_'>More about this error here.</a><br/><br/>";
281
282			print "<span style='font-size:10px;font-weight:bold;'>This error message was generated by PHPReports</span>";
283			print "</p>";
284			exit();
285		}
286	}
287
288	class PHPReportsErrorTr {
289		var $_aMsgs;
290
291		function PHPReportsErrorTr(){
292			$this->_aMsgs = Array();
293
294			// default English messages
295			$this->_aMsgs["OPS"]["default"]				= "OOOOPS, THERE'S AN ERROR HERE.";
296			$this->_aMsgs["ERROR"]["default"]			= "This error message was generated by phpReports.";
297			$this->_aMsgs["NODATA"]["default"]			= "No data was found.";
298			$this->_aMsgs["NOPAGE"]["default"]			= "No PAGE element was found on your XML file.";
299			$this->_aMsgs["NOIF"]["default"]				= "No database interface '%s' available.";
300			$this->_aMsgs["REFUSEDCON"]["default"]		= "Connection refused.";
301			$this->_aMsgs["QUERYERROR"]["default"]		= "There's an error on your SQL query.";
302			$this->_aMsgs["NOCOLUMNS"]["default"]		= "No columns returned from your query.";
303			$this->_aMsgs["PAGEPARSER"]["default"]		= "Could not copy the temporary page parser to the temporary directory.";
304			$this->_aMsgs["DYNLINK"]["default"]			= "Specified a dynamic link but no COLUMN element found";
305			$this->_aMsgs["EXPLINK"]["default"]			= "Specified an expression link but no COLUMN element found";
306			$this->_aMsgs["NOFIELD"]["default"]			= "You're trying to retrieve the <b>VALUE</b> of a field called <b>%s</b>, but it is not on your SQL query. Please check your query.";
307			$this->_aMsgs["NOFIELDSUM"]["default"]		= "You're trying to retrieve the <b>SUM</b> of a field called <b>%s</b>, but it is not on your SQL query. Please check your query.";
308			$this->_aMsgs["NOFIELDMAX"]["default"]		= "You're trying to retrieve the <b>MAX VALUE</b> of a field called <b>%s</b>, but it is not on your SQL query. Please check your query.";
309			$this->_aMsgs["NOFIELDMIN"]["default"]		= "You're trying to retrieve the <b>MIN VALUE</b> of a field called <b>%s</b>, but it is not on your SQL query. Please check your query.";
310			$this->_aMsgs["NOFIELDAVG"]["default"]		= "You're trying to retrieve the <b>AVERAGE</b> of a field called <b>%s</b>, but it is not on your SQL query. Please check your query.";
311			$this->_aMsgs["CANTWRITEPAGE"]["default"]	= "Can't write file <b>%s</b> to the disk. Check your disk quota/space and rights.";
312			$this->_aMsgs["DYNBOOK"]["default"]			= "Specified a dynamic bookmark but no COLUMN element found";
313			$this->_aMsgs["EXPBOOK"]["default"]			= "Specified an expression bookmark but no COLUMN element found";
314			$this->_aMsgs["NOXMLTRANS"]["default"]		= "COL parameter <b>%s</b> not found on XML translation.";
315			$this->_aMsgs["NOXSLT"]["default"]			= "There is no XSLT processor available. Check if you compiled PHP with <b>--enable-xslt</b> and the <a href=\"http://www.gingerall.com/charlie/ga/xml/p_sab.xml\">Sablotron</a> library (for <a href=\"http://www.php.net/manual/en/ref.xslt.php\">PHP4</a>) or with <b>--enable-xsl</b> (for <a href=\"http://www.php.net/manual/en/ref.xsl.php\">PHP5</a>).";
316			$this->_aMsgs["NOPATH"]["default"]			= "Seems that you didn't specified the phpReports path on the PHP <b>include_path</b> statement or <b>php.ini</b>. I don't know there the classes are.";
317			$this->_aMsgs["NOCODE"]["default"]			= "Could not create the output code to run your report. Please check if the webserver user have rights to write in your <b>%s</b> directory.";
318			$this->_aMsgs["NOXML"]["default"]			= "Could not find the XML file with your data (<b>%s</b>) to run your report. Please check the filename and if the webserver user have rights to write in your temporary directory.";
319			$this->_aMsgs["NOXMLSET"]["default"]		= "The XML input file <b>%s</b> was not found.";
320			$this->_aMsgs["NOXSLTSET"]["default"]		= "The XSLT input file <b>%s</b> was not found.";
321			$this->_aMsgs["NOPLUGIN"]["default"]		= "There is no <b>%s</b> output plugin (<b>%s</b>).";
322			$this->_aMsgs["NOLOAD"]["default"]			= "Could not find file <b>%s</b> for report loading.";
323			$this->_aMsgs["NOTEMPLATE"]["default"]		= "The template file <b>%s</b> was not found.";
324			$this->_aMsgs["INVALIDCON"]["default"]		= "Your database connection handle is not valid.";
325
326			// Brazilian Portuguese messages
327			$this->_aMsgs["OPS"]["pt_BR"]					= "OOOOPS, OCORREU UM ERRO AQUI.";
328			$this->_aMsgs["ERROR"]["pt_BR"]				= "Essa mensagem de erro foi gerada pelo phpReports.";
329			$this->_aMsgs["NODATA"]["pt_BR"]				= "N?o foram encontrados dados.";
330			$this->_aMsgs["NOPAGE"]["pt_BR"]				= "N?o h? um elemento PAGE (p?gina) no seu relat?rio.";
331			$this->_aMsgs["NOIF"]["pt_BR"]				= "N?o h? dispon?vel a interface '%s' para banco de dados.";
332			$this->_aMsgs["REFUSEDCON"]["pt_BR"]		= "Conex?o recusada.";
333			$this->_aMsgs["QUERYERROR"]["pt_BR"]		= "Erro na consulta SQL.";
334			$this->_aMsgs["NOCOLUMNS"]["pt_BR"]			= "N?o foram retornados colunas de dados na sua consulta.";
335			$this->_aMsgs["PAGEPARSER"]["pt_BR"]		= "N?o consegui copiar o conversor de p?ginas para o diret?rio tempor?rio.";
336			$this->_aMsgs["DYNLINK"]["pt_BR"]			= "Foi especificado um link din?mico mas n?o existe um elemento COLUMN.";
337			$this->_aMsgs["EXPLINK"]["pt_BR"]			= "Foi especificado um link com uma express?o mas n?o existe um elemento COLUMN.";
338			$this->_aMsgs["NOFIELD"]["pt_BR"]			= "Voc? est? tentando recuperar o <b>VALOR</b> de um campo chamado <b>%s</b>, mas ele n?o existe na sua consulta. Por favor revise sua consulta.";
339			$this->_aMsgs["NOFIELDSUM"]["pt_BR"]		= "Voc? est? tentando recuperar a <b>SOMA</b> de um campo chamado <b>%s</b>, mas ele n?o existe na sua consulta. Por favor revise sua consulta.";
340			$this->_aMsgs["NOFIELDMAX"]["pt_BR"]		= "Voc? est? tentando recuperar o <b>VALOR M?XIMO</b> de um campo chamado <b>%s</b>, mas ele n?o existe na sua consulta. Por favor revise sua consulta.";
341			$this->_aMsgs["NOFIELDMIN"]["pt_BR"]		= "Voc? est? tentando recuperar o <b>VALOR M?NIMO</b> de um campo chamado <b>%s</b>, mas ele n?o existe na sua consulta. Por favor revise sua consulta.";
342			$this->_aMsgs["NOFIELDAVG"]["pt_BR"]		= "Voc? est? tentando recuperar o <b>VALOR M?DIO</b> de um campo chamado <b>%s</b>, mas ele n?o existe na sua consulta. Por favor revise sua consulta.";
343			$this->_aMsgs["CANTWRITEPAGE"]["pt_BR"]	= "N?o consegui escrever o arquivo <b>%s</b> no disco. Verifique suas permiss?es e espa?o em disco.";
344			$this->_aMsgs["DYNBOOK"]["pt_BR"]			= "Foi especificado um bookmark din?mico mas n?o existe um elemento COLUMN.";
345			$this->_aMsgs["EXPBOOK"]["pt_BR"]			= "Foi especificado um bookmark com uma express?o mas n?o existe um elemento COLUMN.";
346			$this->_aMsgs["NOXMLTRANS"]["pt_BR"]		= "O par?metro <b>%s</b> de COL n?o foi encontrado na tradu??o para XML.";
347			$this->_aMsgs["NOXSLT"]["pt_BR"]				= "N?o h? um processador XSLT dispon?vel. Verifique se voc? compilou o PHP com <b>--enable-xslt</b> e a library <a href=\"http://www.gingerall.com/charlie/ga/xml/p_sab.xml\">Sablotron</a> (para o <a href=\"http://www.php.net/manual/en/ref.xslt.php\">PHP4</a>) ou com <b>--enable-xsl</b> (para o <a href=\"http://www.php.net/manual/en/ref.xsl.php\">PHP5</a>).";
348			$this->_aMsgs["NOPATH"]["pt_BR"]				= "Parece que voc? n?o especificou o path do phpReports com o comando <b>include_path</b> ou no <b>php.ini</b>. N?o sei onde as classes est?o.";
349			$this->_aMsgs["NOCODE"]["pt_BR"]				= "N?o pude criar o c?digo de sa?da para rodar seu relat?rio. Por favor verifique se o usu?rio do servidor web tem direitos para escrever no diret?rio <b>%s</b>.";
350			$this->_aMsgs["NOXML"]["pt_BR"]				= "N?o pude encontrar o arquivo XML com seus dados (<b>%s</b>) para rodar seu relat?rio. Por favor verifique o nome do arquivo e se o usu?rio do servidor web tem direitos de escrita no seu diret?rio de arquivos tempor?rios.";
351			$this->_aMsgs["NOXMLSET"]["pt_BR"]			= "O arquivo XML de entrada <b>%s</b> n?o foi encontrado.";
352			$this->_aMsgs["NOXSLTSET"]["pt_BR"]			= "O arquivo XSLT de entrada <b>%s</b> n?o foi encontrado.";
353			$this->_aMsgs["NOPLUGIN"]["pt_BR"]			= "O plugin de sa?da <b>%s</b> n?o existe (<b>%s</b>).";
354			$this->_aMsgs["NOLOAD"]["pt_BR"]				= "N?o encontrei o arquivo <b>%s</b> para carregar o relat?rio.";
355			$this->_aMsgs["NOTEMPLATE"]["pt_BR"]		= "O arquivo de template <b>%s</b> n?o foi encontrado.";
356			$this->_aMsgs["INVALIDCON"]["pt_BR"]		= "A vari?vel da conex?o com o banco de dados n?o ? v?lida. %s";
357		}
358
359		function showMsg($sMsg_=null,$oParms_=null){
360			if(!$sMsg_)
361				return;
362			if($_SESSION["phpReportsLanguage"])
363				$sLang = $_SESSION["phpReportsLanguage"];
364			else
365				$sLang = $GLOBALS["phpReportsLanguage"];
366			if(!$sLang)
367				$sLang = "default";
368
369			$sTitle	= $this->_aMsgs["OPS"][$sLang];
370			$sError	= $this->_aMsgs["ERROR"][$sLang];
371			$sMsg		= $this->_aMsgs[$sMsg_][$sLang];
372
373			// if the message have no translation
374			if(!$sMsg)
375				$sMsg = $this->_aMsgs[$sMsg_]["default"];
376			// if the message is still null ...
377			if(!$sMsg)
378				$sMsg = "$sMsg_?";
379
380			if($oParms_)
381				$sMsg = vsprintf($sMsg,$oParms_);
382
383			print "<p style='width:400px;background-color:#F5F5F5;border-style:solid;border-width:2;border-color:#CCCCCC;padding:10px 10px 10px 10px;margin:20px;font-family:verdana,arial,helvetica,sans-serif;color:#505050;font-size:12px;'>";
384			print "<span style='font-size:18px;color:#FF0000;font-weight:bold;'>$sTitle</span><br/><br/>";
385			print "$sMsg<br/><br/>";
386			print "<span style='font-size:10px;font-weight:bold;'>$sError</span>";
387			print "</p>";
388			exit();
389		}
390	}
391
392	function isNumericType($sType=null){
393		$sStr = "NUMBER,NUMERIC,INT,DOUBLE,DECIMAL,REAL,TINY,SHORT,LONG,FLOAT,LONGLONG,INT24,YEAR,CID,FLOAT4,FLOAT8,INT2,".
394		"INT4,MONEY,OID,RELTIME,XID,DOUBLE PRECISION,SMALLINT,TINYINT,BIGINT,INT64,INT8,DATE,DATETIME";
395		return stristr($sStr,$sType);
396	}
397?>