Source for file funzioni_generali.inc
Documentation is available at funzioni_generali.inc
* Funzioni di utilita' generale su stringhe, array, classi, file, etc.
* @author Ubik <emiliano.leporati@gmail.com>
* Definizioni delle costanti
require_once('defines.inc');
require_once('funzioni_data.inc');
require_once('funzioni_url.inc');
require_once('c_crypter.inc');
/* *********************************************************************************************
* *********************************************************************************************/
* Eccezione durante l'interazione con la base dati
parent::__construct($function. ": ". $message);
* Eccezione a livello di codice in fase di sviluppo
* Eccezione a livello applicativo
* Ritorna TRUE se la costante e' definita e ha valore == TRUE, FALSE altrimenti
* @param string $constant
* Ritorna il valore della costante se e' definita, $valore-default altrimenti
* @param string $constant
* @param mixed $valore_default
* Ritorna TRUE se il valore passato e' "TRUE", FALSE altrimenti
return ($valore === "TRUE" || $valore === "true" ? TRUE : FALSE);
* Ritorna il tempo corrente in millisecondi
* Ritorna $else se $value == FALSE (stringa vuota, null, etc)
function invl($value, $else)
return $value ? $value : $else;
/* *********************************************************************************************
* *********************************************************************************************/
* Tronca la stringa alla dimensione specificata, aggiungendo eventuali ellissi
if ($len && strlen($str) > $len + 1) {
* Ritorna il valore formattato in modo consono per essere inserito in una stringa javascript racchiusa fra apici singoli (apici singoli quotati e caratteri speciali trasformati in entita'
* Ritorna il valore formattato come una valuta (. come separatore migliaia, , come separatore decimale, due decimali di default
* @param integer $decimali
function valuta($valore, $decimali = 2)
* Racchiude un valore fra apici singoli
* Racchiude un valore fra apici doppi
* Racchiude un valore fra parentesi tonde
* Dice se $stringa termina per $finale, senza tener conto delle maiuscole e minuscole (case - insensitive)
* @param string $stringa La stringa in cui verificare il finale
* @param string $finale La parte terminale da verificare
* Dice se $stringa inizia per $finale, senza tener conto delle maiuscole e minuscole (case - insensitive)
* @param string $stringa La stringa in cui verificare l'inizio
* @param string $inizio La parte iniziale da verificare
* Dice se $stringa termina per $finale, tenendo conto delle maiuscole e minuscole (case - sensitive)
* @param string $stringa La stringa in cui verificare il finale
* @param string $finale La parte terminale da verificare
* Dice se $stringa inizia per $finale, tenendo conto delle maiuscole e minuscole (case - sensitive)
* @param string $stringa La stringa in cui verificare l'inizio
* @param string $inizio La parte iniziale da verificare
* @param string $stringa La stringa da trasformare
* Aggiunge "return" all'inizio e ";" alla fine della stringa, se mancano
* @param string $stringa La stringa da trasformare
$stringa = trim($stringa);
if (strpos($stringa, "return") === FALSE) {
$stringa = "return ". $stringa;
if (substr($stringa, - 1) != ";") {
* Trasforma tutte le & della stringa passata in &
* Rimuove dalla stringa passata tutte le sezioni e i caratteri inutili per il parser XML (commenti, tabulazioni, etc.)
return preg_replace("#\n|\r|\t|<!--.*?-->|/\*.*?\*/#si","",$stringa);
* Dato un array di coppie (attributo, valore), ritorna una stringa con spazio iniziale rappresentante tali coppie formattate in formato HTML (attributo="valore")
* @param array $array_attributi
foreach($array_attributi as $nome => $valore) {
$risultato .= " ". $nome. "=". dQt($valore);
foreach($array_attributi as $nome => $valore) {
/* *********************************************************************************************
* *********************************************************************************************/
* Legge il file .ini specificato ed esegue delle define per ognuna delle chiavi presenti
* @param string $file Il file .ini
* @param bool $crittato Indica se i valori dei parametri sono crittati o meno
$cry = new CRYPTER("Chiave in chiaro furbizzima per crittare gli filez iniz");
$GLOBALS['DRIVERS'] = array();
foreach($_sect as $_sect_name => $_keys) {
// valori della sezione corrente
foreach($_keys as $_name => $_value) {
$_vals[$_name] = $cry->decrypt($_value);
$_vals[$_name] = $_value;
// gestisce i valori ini condizionali utilizzando la direttiva MATCH nel file ini su nomehost:porta
$_regexp = "/{$_vals['MATCH']}/";
if (isset ($_SERVER['HTTP_HOST'])) {
// se non matcha, non vado avanti
// quindi non riempio $_all_defines,
// e i valori di questa sezione non saranno definiti
// rendo globalmente disponibili i parametri di connessione ai vari DB
$GLOBALS[$_sect_name] = array();
foreach($_keys as $_name => $_value) {
$GLOBALS[$_sect_name][$_name] = $cry->decrypt($_value);
$GLOBALS[$_sect_name] = $_vals;
foreach($_all_defines as $_name => $_value) {
if (!defined('NS_GFX')) define('NS_GFX', 'http://ubk.googlecode.com');
if (!defined('NS_UBK')) define('NS_UBK', 'http://ubk.googlecode.com');
* Crea una versione crittata (aggiunge al file il suffisso .crypt) di un file .ini
* @param string $file Il file .ini
$cry = new CRYPTER("Chiave in chiaro furbizzima per crittare gli filez iniz");
$_f = fopen($file. ".crypt", "w+");
foreach($_sect as $_sect_name => $_keys) {
fwrite($_f, "[". $_sect_name. "]\n");
foreach($_keys as $_name => $_value) {
$_value = $cry->encrypt($_value);
fwrite($_f, $_name. "=". $_value. "\n");
/* *********************************************************************************************
* *********************************************************************************************/
* Ritorna $array[$chiave] se la chiave esiste, $se_manca altrimenti
* @param mixed $chiave La chiave da cercare
* @param array $array L'array in cui cercare
* @param mixed $se_manca L'alternativa
* Ritorna $array[$chiave] se la chiave esiste, fallisce altrimenti
* @param mixed $chiave La chiave da cercare
* @param array $array L'array in cui cercare
* Stampa (con delle echo) un array, scendendo ricorsivamente e indentando i sotto-array
* @param array &$array L'array da stampare
* @param int $livello Il livello di indentazione (da non impostare, serve per i sotto-array)
foreach($array as $chiave => $valore) {
echo str_repeat(" ", $livello * 5). "[$chiave] => ";
* Appiattisce un array contenente altri array ([a, [b, c], d] => [a, b, c, d])
foreach($a as $key => $value) {
* Versione ricorsiva di array_map, su un solo array
foreach($arr as $key => $value)
$result[$key] = array_map_r($func, $value);
$result[$key] = $func($value);
/* *********************************************************************************************
* *********************************************************************************************/
* Esegue le trasformazioni XSLT indicate in PHDIR/xsl/transform.xsl (se questo file esiste) sul testo XML passato.
* @param string $xml testo XML da trasformare
* @param bool $strip dice se rimuovere o meno header xml e namespaces
* @param string $xsl nome del file XSL da usare al posto dello standard
* @param array $params parametri da passare all'ambiente di trasformazione XSL
function xsl_transform($xml, $strip = false, $xsl = NULL, $params = NULL)
// preparazione parametri
$_fwk_root = constant_def('UBK_ROOT', 'C:/php/includes/ubk');
if (($_pos = strpos(PHDIR, ":")) !== FALSE) {
$_phdir = str_replace(array(' ','\\'), array('%20','/'), 'file:///' . PHDIR);
// ,'help-inline' => constant_def('HELP_INLINE', "'false'")
// $xml = utf8_encode($xml);
//xslt_set_log($_xslt_proc,true);
//xslt_set_log($_xslt_proc,path(PHDIR,'system/xslt.log'));
/* pre processing eventuale*/
$result = xslt_process($_xslt_proc, 'arg:/_xml', 'arg:/_xsl', NULL, $_arguments, $_params);
throw new CodeException("Impossibile applicare le pre-trasformazioni XSLT");//.xslt_error($_xslt_proc)
if (is_null($_xsl = $cache->xsl_get())) {
$cache->xsl_write($_xsl);
$_result = xslt_process($_xslt_proc, 'arg:/_xml', 'arg:/_xsl', NULL, $_arguments, $_params);
throw new CodeException('Impossibile applicare le trasformazioni XSLT');//.xslt_error($_xslt_proc)
' xmlns:ubk='. dQt(NS_UBK),
' xmlns:gfx='. dQt(NS_GFX)
* Ritorna il risultato della trasformazione xsl sul documento xml passato. Entrambi i parametri possono essere del codice xml / xsl o un nome di file.
* @param string $xml Nome del documento da trasformare, o testo xml da trasformare
* @param string $xsl Nome del documento di trasformazione, o codice xsl di trasformazione
$_arguments = array('/_xml' => utf8_encode($xml), '/_xsl' => $xsl);
$_result = xslt_process($_xslt_proc, 'arg:/_xml', 'arg:/_xsl', NULL, $_arguments, $params);
throw new CodeException('Impossibile applicare le trasformazioni XSLT ');
/* *********************************************************************************************
* *********************************************************************************************/
* Converte bytes nell'um + grande umanamente leggibile
$s = array('Bytes', 'kB', 'MB', 'GB', 'TB', 'PB');
* Esegue una copia del file o della directory specificata
* @param string $old_name Il file o directory sorgente
* @param string $new_name Il file o directory destinazione
* @param bool $copy_perms Dice se copiare o meno le permission presenti sul file di origine
function copy_file($old_name, $new_name, $copy_perms = TRUE)
// se e' un file, lo copio pari pari
copy($old_name, $new_name);
chmod($new_name, $permissions);
// se e' una dir, la copio con la sua routine
} elseif (is_dir($old_name)) {
copy_dir($old_name, $new_name, $copy_perms);
throw new FatalExeption("Impossibile copiare $old_name, non è nè un file nè una directory.");
* Esegue una copia della directory specificata
* @param string $old_name La directory sorgente
* @param string $new_name La directory destinazione
* @param bool $copy_perms Dice se copiare o meno le permission presenti sui file di origine contenuti nella directory
function copy_dir($old_name, $new_name, $copy_perms = TRUE)
// se la destinazione !esiste, la creo
// copio ogni file della dir sorgente nella dir destinazione
while (($file = readdir($dir)) !== FALSE) {
if($file != "." && $file != "..") {
copy_file("$old_name/$file", "$new_name/$file", $copy_perms);
* Crea il percorso indicato
* @param string $nome Il percorso completo del file da creare
for($i = 0; $i < count($_path); $i ++ ) {
* Genera il file specificato con il contenuto indicato. Se il percorso specificato nel nome del file non esiste, lo crea
* @param string $nome Il percorso completo del file da creare
* @param string $contenuto Il contenuto da scrivere nel file
for($i = 0; $i < count($_path) - 1; $i ++ ) {
$f = fopen($_path[$i], "w+");
* Ritorna un array con il contenuto della directory, che ha per chiavi i nomi dei file o delle directory, e per valori una stringa con il nome dei file per i file, o un array con il contenuto della directory per le
* @param string $nome Il percorso completo del file da creare
function dir_2_array($nome, $filtro = "*", $livelli = - 1)
if ($livelli == 0) return;
foreach($files as $file) {
if ($file != "." && $file != "..") {
$_result[$file] = dir_2_array($file, $filtro, $livelli - 1);
* Elimina una directory e tutto il suo contenuto
* @param string $dir Il percorso da eliminare
if($objs = glob($dir. "/*")){
|