Login   Register  
PHP Classes
elePHPant
Icontem

File: lib/functions.inc

Recommend this page to a friend!
Stumble It! Stumble It! Bookmark in del.icio.us Bookmark in del.icio.us
  Classes of José Filipe Lopes Santos  >  Ticket Calendar  >  lib/functions.inc  >  Download  
File: lib/functions.inc
Role: Auxiliary script
Content type: text/plain
Description: Misc Functions
Class: Ticket Calendar
View the dates of scheduled tickets on a calendar
Author: By
Last change:
Date: 10 months ago
Size: 16,195 bytes
 

Contents

Class file image Download
<?php

/**
 * Diversificadas funções.
 *
 * @author José Filipe Lopes Santos <jfilipe@med.up.pt>
 * @since 27-04-2010
 * @version 2.0 - data da últ. actualização: 05-01-2010
 * @package tts
 * @subpackage libraries
 */


/**
 * Obtem os parametros para o to_date().
 *
 * Esta função obtem a data e formato usado na função sql to_date()
 *
 * @return array(mensagem de erro,data,formato)
 * @param array $parts_date array com as partes da data
 * @param string $predefined_format formato das datas predefinido
 * @desc Obtem os parametros para o to_date().
 */
function getTo_dateParams($parts_date,$predefined_format){

	// array com as partes dos formatos
	$parts_formats = array("DD","MM","YYYY","HH24","MI","SS");
	
	// formatos das datas válidos
	$valid_formats = array("YYYY","YYYY-MM","MM-YYYY","DD-MM-YYYY","YYYY-MM-DD",
						   "DD-MM-YYYY-HH24","DD-MM-YYYY-HH24-MI","DD-MM-YYYY-HH24-MI-SS");
	
	$date = ""; // data
	$format = ""; // formato
	$error_msg = ""; // mensagem em caso de erro

	// apurar a data e o formato  
	for ($i=0;$i<sizeof($parts_date);$i++){
		if ($parts_date[$i] != ""){ // só junta as partes preenchidas
			$date .= "-".$parts_date[$i];
			$format .= "-".$parts_formats[$i];
		}
	}
	
	// tirar o 1º '-'
	if ($date != "") $date = substr($date,1,strlen($date));
	if ($format != "") $format = substr($format,1,strlen($format));

	// se não tiver data => retorna a data e fornato vazios
	if ($date == "" || strcmp($date,"--") == 0 || strcmp($date,"0000-00-00") == 0) // não tem data
		return array($error_msg,"","");
		
	// vericar se o formato da data é válido
	if (!in_array($format,$valid_formats) && $format != ""){ // formato inválido
		$error_msg = "O formato ".$format." da data ".$date." é incorrecto !";
		return array($error_msg,$date,$format);
	} else {
		
		// se a data e formato estão vazios, o formato fica com o predefinido
		if ($date == "" && $format == "")
			$format = $predefined_format;
			
		return array($error_msg,$date,$format);
	}
}


/**
 * Obtem os parametros para o str_to_date() em mysql.
 *
 * Esta função obtem a data e formato usado na função sql str_to_date() do mysql.
 *
 * @return array(mensagem de erro,data,formato)
 * @param array $parts_date array com as partes da data
 * @param string $predefined_format formato das datas predefinido
 */
function getStrToDateParams($parts_date,$predefined_format){

	// array com as partes dos formatos
	$parts_formats = array("%d","%m","%Y","%H","%i","%s");
	
	// formatos das datas válidos
	$valid_formats = array("%Y","%Y-%m","%m-%Y","%d-%m-%Y","%Y-%m-%d","%d-%m-%Y-%H","%d-%m-%Y-%H-%i","%d-%m-%Y-%H-%i-%s");
	
	$date = ""; // data
	$format = ""; // formato
	$error_msg = ""; // mensagem em caso de erro

	// apurar a data e o formato
	for ($i=0;$i<sizeof($parts_date);$i++){
		if ($parts_date[$i] != "" && !ereg("(^00)",$parts_date[$i])){ // só junta as partes preenchidas
			$date .= "-".$parts_date[$i];
			$format .= "-".$parts_formats[$i];
		}
	}
	
	// tirar o 1º '-'
	if ($date != "") $date = substr($date,1,strlen($date));
	if ($format != "") $format = substr($format,1,strlen($format));

	// se não tiver data => retorna a data e fornato vazios
	if ($date == "" || strcmp($date,"--") == 0 || strcmp($date,"0000-00-00") == 0) // não tem data
		return array($error_msg,"","");
		
	// vericar se o formato da data é válido
	if (!in_array($format,$valid_formats) && $format != ""){ // formato inválido
		$error_msg = "O formato ".$format." da data ".$date." é incorrecto !";
		return array($error_msg,$date,$format);
	} else {
		
		// se a data e formato estão vazios, o formato fica com o predefinido
		if ($date == "" && $format == "")
			$format = $predefined_format;
			
		return array($error_msg,$date,$format);
	}
}


/**
 * Verifica se a data é válida.
 *
 * Esta função verifica se a data é válida.
 *
 * @param string $date data em causa
 * @param string $delim delimitador
 * @return true - se a data é válida ou se existem campos vazios, false - caso contrário
 */
function isValidDate($date,$delim="-"){

	$date_parts = array();
	$valid = false;
	
	// obter as partes da data
	$date_parts = explode($delim,$date);
	
	// verificar se todas as partes estão preenchidas
	foreach ($date_parts as $date_part){ // para cada parte da data
		if ($date_part == "") // parte vazia
			return true;
	}
		
	// se não tiver 3 partes (dia, mês e ano), retorna true
	if (count($date_parts) < 3)
		return true;
	
	// verificar se a data é válida
	$valid = checkdate($date_parts[1],$date_parts[0],$date_parts[2]);
	
	return $valid;
}


/**
 * Obtem o timestamp dessa data.
 *
 * Esta função obtem o timestamp de uma dada data.
 *
 * @return integer timestamp da respectiva data
 * @param string $date data em causa
 * @param string[optional] $delim delimitador
*/
function getTimestamp($date,$delim="-"){

	$date_parts = array();	
									
	// canalizar as datas para as variáveis, consoante o nº de partes da data
	$date_parts = explode($delim,$date);
		
	// verificar se existem partes da data vazias
	for ($i=0;$i<6;$i++)
		// inicializar com zero
		if (empty($date_parts[$i])) $date_parts[$i]=0;
		
	return mktime($date_parts[3],$date_parts[4],$date_parts[5],$date_parts[1],$date_parts[0],$date_parts[2]);	
}


/**
 * Normalizar campos e strings.
 *
 * Esta função normaliza campos e strings com ou sem acentos, isto é,
 * converte caracteres especiais na string em caracteres normalizados e,
 * converte a string resultante para minúsculas
 *
 * @return string condição de pesquisa normalizada
 * @param string $campo campo a normalizar ou não
 * @param string $string string a normalizar
 * @param bool $esta_normalizado booleano que indica se o campo já está normalizado
 * @param string $tipo_comparacao tipo de comparação
 * @param bool[optional] $exact_phrase booleano que indica se quer pesquisar pela frase exacta ou não
 * @desc Normalizar campos e strings.
*/

function getWhereNormalized($campo,$string,$esta_normalizado,$tipo_comparacao,$exact_phrase = true){

         $caracteres_especiais = "áéíõùâêîòúãçóûÀÈÌÁÉÕÙÂÊÎÒÚÃÇÓÛ"; // caracteres com acentos
         $caracteres_norm = "aeiouaeiouacouAEIAEOUAEIOUACOU"; // resp. normalização

         if ($esta_normalizado) // o campo já está normalizado
         	$campo_normalizado = $campo;
         else
          	// normaliza o campo
         	$campo_normalizado = "upper(translate(".$campo.",'".$caracteres_especiais."','".$caracteres_norm."'))";          	

         // detectar o prefixo do like
         $pref_like = "";
         if (strncasecmp($string,"+",1) == 0 && strlen($string) > 1) $pref_like = ""; 
         if (strncasecmp($string,"-",1) == 0 && strlen($string) > 1) $pref_like = "not";         
         else $pref_like = "";
         
         if ((strncasecmp($string,"+",1) == 0 || strncasecmp($string,"-",1) == 0) && strlen($string) > 1) // tem caracteres de comparação no início da string
         	$string = substr($string,1,strlen($string)); // retirar esses caracteres
         
         // normalizar a string
         $string_normalizada =  normaliza_string($string);         

         // se não se quiser pesquisar pela frase, tal e qual como está (exacta),
         // pesquisa-se pelos registos que contenham todas essas palavras pela mesma ordem  
         if (!$exact_phrase){
         	// se fôr do gênero "a b"
         	if (eregi("[a-z0-9]+[[:space:]][a-z0-9]+",$string_normalizada))
         		// substitui espaços por '%', para pesquisar tb nos intervalos (ex: "a%b%c")
         		$string_normalizada = ereg_replace("[[:space:]]","%",$string_normalizada);
         }         
         
         // retornar a condição de pesquisa, consoante o tipo
         if (strcmp($tipo_comparacao,"%like%") == 0) // tipo de comparação 'like' por qualquer string
         	return $campo_normalizado." ".$pref_like." like '%".$string_normalizada."%'";
         elseif (strcmp($tipo_comparacao,"like%") == 0) // tipo de comparação 'like' só no início da string
         	return $campo_normalizado." ".$pref_like." like '".$string_normalizada."%'";         
         elseif (strcmp($tipo_comparacao,"=") == 0) // tipe de comparação '='
         	return $campo_normalizado." = '".$string_normalizada."'";         
}


/**
 * Normaliza strings.
 *
 * Esta função normaliza strings
 *
 * @return string $string_norm string normalizada
 * @param string $string string a normalizar
 * @param bool $trim=true booleano que indica se é para retirar espaços em branco
 * @desc Normaliza strings.
 */
function normaliza_string($string,$trim = true){

	$string_norm = "";
	
    $caracteres_especiais = "áéíõùàâêîòúãçóûÀÈÌÁÉÕÙÂÊÎÒÚÃÇÓÛ"; // caracteres com acentos
    $caracteres_norm = "aeiouaaeiouacouAEIAEOUAEIOUACOU"; // resp. normalização
	
    // tirar espaços em branco, se fôr caso disso
    if ($trim)
    	$string = trim($string);
    
    // substituir os caracteres acentuados, pelos mesmos sem acento
    $string_norm = strtr($string,$caracteres_especiais,$caracteres_norm);
    
    // substituir qualquer outro caracter que não seja letras e nº's por espaços
    if (!eregi("^([a-z0-9]+)$",$string_norm)) // existem caracteres especiais
    	$string_norm = ereg_replace("[^a-zA-Z0-9]"," ",$string_norm);
    	
    // converter para maisculas
    $string_norm = strtoupper($string_norm);
    
    return $string_norm;
}


/**
  * Substitui a última "," da mensagem por "e", excepto a do fim da mensagem.
  *
  * Esta função substitui a última "," da mensagem por "e", excepto a do fim da mensagem,
  * para que essa mensagem faça sentido e, esteja ortográficamente correcta
  *
  * @param string $msg mensagem em caso de erro, apurada nas condições de pesquisa
  * @param integer $nresultados nº de resultados obtidos
  * @return string $frase frase completa dado o nº de resultados
  * @desc Substitui a última "," da mensagem por "e", excepto a do fim da mensagem
*/
function MensagemCorrecta($msg,$nresultados){

         $msg = substr($msg,0,strrpos($msg,",")); // tirar últ. vírgula
         $msg1 = substr($msg,0,strrpos($msg,",")); // string até à últ. vírgula
         $msg2 = substr($msg,strrpos($msg,","),strlen($msg)); // o resto da string
         $msg2 = ereg_replace(","," e",$msg2); // sustituir a últ vírgula por "e"
         $msg_final = $msg1.$msg2; // juntar as strings

         // obter a frase correcta consoante o nº de resultados
         if ($nresultados == 0){ // não existem resultados
             if ($msg_final != "")
                 $frase = "Não foram encontrados resultados com ".$msg_final;
             else
                 $frase = "Não foram encontrados resultados";
         } else if ($nresultados > 0) // existem resultados
             $frase = "Foram encontrados $nresultados resultados com ".$msg_final;
         else if ($nresultados == -1){ // mensagem de erro: campos não numéricos
             if (strpos($msg_final," e ") != "") // + que 1 campo
                 $frase = $msg_final." têm que ser numéricos";
             else // só um campo
                 $frase = $msg_final." tem que ser numérico";

             $frase = strtoupper(substr($frase,0,1)).substr($frase,1,strlen($frase));
         }

         return $frase;
}


/**
 * Obtem o nome do campo normalizado.
 *
 * Esta função pega num campo de um select e, obtem o campo correspondente em minúsculas
 * sem as funções sql to_char() e to_date().
 *
 * @return string $field campo normalizado
 * @param string $field campo a normalizar
*/
function getNormalizedFieldName($field){
	
	// é campo to_char(field,'format')
	if (strpos($field,",") != ""){
		// tirar to_char(, e só fica field,'format'
		$field = substr($field,strpos($field,"(")+1,strlen($field));
		// tirar ,'format' a field,'format' e temos o campo pretendido
		$field = substr($field,0,strpos($field,","));
	}

	// converter para minúsculas
	$field = strtolower($field);

	return $field;	
}


/**
 * Destaca as palavras encontradas.
 *
 * Esta função, do texto indicado, destaca as palavras
 * que coincidem com as palavras de pesquisa.
 *
 * @param string $text texto em causa 
 * @param string $str_search_words string com as palavras de pesquisa
 * @param string $tag_open tag de início da palavra a destacar
 * @param string $tag_close tag de fim da palavra a destacar
 * @return string texto com as palavras destacadas
 */
function HighlightText($text,$str_search_words,$tag_open,$tag_close){
	
	$highlight_text = "";
	
	// se não estiverem indicadas palavras de pesquisa, retorna o texto como estava
	if (trim($str_search_words) == "") return $text;
	
	// obter as palavras de pesquisa
	$search_words = explode(" ",trim($str_search_words));
	
	// texto normalizado
	$text_norm = normaliza_string($text);
	
	
	foreach ($search_words as $word){ // para cada palavra de pesquisa
		
		// obter a palavra de pesquisa normalizada
		$word_norm = normaliza_string($word);
		
		if (ereg($word_norm,$text_norm)){ // essa palavra ocorre no texto

			// se essa palavra não ocorre no texto, salta à frente
			if (!ereg($word_norm,normaliza_string($text,false))) continue; 
			
			// determinar as posiçóes de início e de fim da palavra a destacar
			$pos_ini = strpos(normaliza_string($text,false),$word_norm);
			$len = strlen($word_norm);
			$pos_fim = $pos_ini + $len - 1;
			
			// se tiver um caracter especial, avança uma posição à frente
			if (normaliza_string($text[$pos_ini]) == " "){
				$pos_ini++;
				$pos_fim++;
			}			
			
			// determinar as partes do texto: texto antes, palavra destacada, texto depois
			$text_before = substr($text,0,$pos_ini);
			$word_text = substr($text,$pos_ini,$len);
			$text = substr($text,$pos_fim+1,strlen($text));

			// refazer o texto com a palavra destacada
			$highlight_text .= $text_before.$tag_open.$word_text.$tag_close;
			
		}
	}
	
	if ($text != "") // ainda não terminou o texto
		$highlight_text .= $text; // junta o resto do texto
	
	return $highlight_text;	
}


/**
 * Obtem uma string a partir dos dados.
 * 
 * Esta função, obtem uma string a partir dos dados.
 *
 * @param array $data dados em causa
 * @param array $fields array com os campos pretendidos e respectivos separadores
 * @param string[optional] $global_sep separador global
 * @return string $str string resultante
 */
function getDataString($data,$fields,$global_sep = ";"){

	$str = "";
	
	foreach ($data as $index=>$info){ // para cada item
		
		// juntar o separador global
		$str .= $global_sep;
		
		$n = 0;
		foreach ($fields as $field=>$sep){ // para cada campo
				
			if (!empty($info[$field])){ // existem dados para esse campo
				
				// juntar esse dado
				$str .= $info[$field];
				
				if ($n < sizeof($fields) -1) // não é o último campo
					// juntar o separador desse campo
					$str .= $sep;
			}	
					
			$n++;
		}
	}
	
	// retirar o 1º separador global
	if ($str != "")
		$str = substr($str,1,strlen($str));
	
	return $str;
}


/**
 * Retira os espaços em branco em excesso.
 * 
 * Esta função retira os espaços em branco em excesso, 
 * cortando todos os espaços em branco no início e no fim da string,
 * deixando apenas um espaço entre as palavras.
 *
 * @return string string sem espaços em branco em excesso
 * @param string $string string possívelmente com espaços em branco em excesso
*/
function StripWhiteSpaces($string){		
	
	$parts2 = array();
	$nparts2 = 0;
	
	$parts = explode(" ",trim($string));
	
	foreach ($parts as $part){ // para cada parte 
		if (trim($part) != "") // só se aproveitam as partes não vazias
			$parts2[$nparts2++] = $part;
	}
		
	return implode(" ",$parts2);
}


/**
 * Limita a string.
 *
 * Esta função limita uma dada string, dado o nº máximo de caracteres da string.
 *
 * @param string $string string em causa
 * @param integer $max nº máximo de caracteres
 * @return string $string_limited string limitada 
 */
function LimitString($string,$max){
	
	$string_limited = "";
	$more = " ..."; // string que indica que o nome é demasiado grande
	$limit = $max - strlen($more); // tamanho a partir do qual corta a string

	if (strlen($string) <= $max) // não ultrapassa o limite
		$string_limited = $string; // fica igual
	else 
		// cortar a string
		$string_limited = substr($string,0,$limit).$more;
		
	return $string_limited;
}

?>