= 6) $CONF_MENU["menu_alias"] = NULL; //alias, se non c'e' (di solito preso dal rew alias) //DEPRECATO tipo personalizzato //$CONF_MENU["menu_src"] = ""; //forzo il contenuto del menu usato solo per menu TXT //$CONF_MENU["menu_src_s"] = ""; //forzo il contenuto del menu quando la pagina e' selezionata solo per menu TXT $CONF["autoOrdStart"] = 100000;//serve per creare un ordinamento standard che altrimenti non verrebbe mantenuto con una funzione usort o uasot $CONF["disable_menu_link"] = NULL; //per disabilitare eventuali redirect in maniera globale o per pagina $CONF["menu_from_vis"] = "indi"; //ALL, pagine_dinamiche visualizza tutte le sorgenti di menu, ovvero anche le pagine dinamiche $CONF["menu_riferimento"] = "root"; //visualizza le pagine con lo stesso "menu_ref" assegnato, ALL per tutti i riferimenti $CONF["menu_livello"] = "0"; //visualizza le pagine di questo livello, ALL per tutti i livelli (mettere anche menu_riferimento = ALL!) $CONF["menu_vis"] = "SI"; //se NO toglie il menu dalla pagina $CONF["menu_tipo"] = "TXT"; // TXT o IMG o TPL oppure un array con le chiavi che si vuole in risposta, ad es array("pagina", "menu_txt") nell'array di risposta l'id della pagina è la chiave oppure 'array' per averle tutte $CONF["menu_link_sempre"] = "NO"; // Se SI mette sempre i link anche se siamo nella pagina (solo per menu TXT o IMG) $CONF["menu_gruppo_vis"] = "ALL"; //definisce il gruppo da visualizzare se ALL viualizza tutti, se "main" solo quelli con la variabile "menu_gruppo" non specificata $CONF["menu_includi_force"] = ""; //include forzatamente una pagina $CONF["menu_includi_solo"] = []; $CONF["menu_escludi"] = ""; //definisce la pagine da escludere dal menu ($CONF["menu_escludi"] = "azienda|programmazione";) oppure "menu_escludi" => "azienda|programmazione", $CONF["menu_escludi_figlie"] = ""; //esclude le pagine figlie $CONF["menu_includi_protette"] = "SI"; //include le pagine protette $CONF["menu_output"] = "var"; //oppure "array" per avere un array testuale $CONF["menu_multi_all"] = NULL; //non usare $CONF["menu_tpl_no_link"] = NULL; //template senza link, prima pero' mettere in 'indi.inc.php' su qualche pagina il tag 'menu_no_link' $CONF["menu_tpl_no_link_sel"] = NULL; //template senza link selezionato //per tipo TPL $CONF["menu_tpl_corpo"] = "[menu_txt]"; //ripetuto ad ogni riga, può essere il nome di una funzione che accetta 2 parametri ($menu, $isSelezionato) $CONF["menu_tpl_corpo_sel"] = ""; //SE PRESENTE cambia il template per la pagina selezionata, se non presente viene messo menu_tpl_corpo $CONF["menu_tpl_testa"] = ""; //opzionale, e' la testa del menu non ripetuta $CONF["menu_tpl_coda"] = ""; //opzionale, e' la cada del menu non ripetuta $CONF["menu_tpl_sel"] = "selected"; //tetso TPL per pagina selezionata (#menu_sel#) $CONF["menu_tpl_nosel"] = ""; //tetso TPL per pagina selezionata (#menu_sel#) $CONF["menu_tpl_sep"] = ""; //separatore per il menu TPL esempio " | ">, e' aggiunto automaticamente per ogni voce di menu, oppure manualmente con il tag $CONF["menu_tpl_alt"] = "dispari|pari|baubau"; //alterna una variabile fra due o piu' cose, es tabella "||<\tr>", RICORDA DI METTERE NEL TEMPLATE IL NOME DELLA VARIABILEE [menu_tpl_alt] !!!!! $CONF["menu_tpl_eval_pre"] = ""; //codice da valutare nel ciclo prima della costruzione del template $CONF["menu_tpl_eval_post"] = ""; //codice da valutare nel ciclo dopo la costruzione del template $CONF["menu_tpl_func_post"] = ""; //cecca 24/05/2013 : funzione da richiamare nel ciclo dopo la costruzione del template, vedi esempio sotto (checkmenu) //rimappa automaticamente un vecchio parametro al rewId quando si fa genera_link //attiva il redirect 301 + segnalazione "vecchio formato" se si chiama la pagina con il vecchio parametro //duplica (nella pagina) $_GET['rewId'] in $_GET[$CONF["rewIdAlias"]] //settare sempre e solo su $MENU ($MENU[{id}][$lang]['rewIdAlias']) //ATTENZIONE: negli include questa mappatura non è attiva, usare sempre rewAlias se possibile $CONF["rewIdAlias"] = ""; /* function checkmenu(&$menu, &$out) { if ($menu["menu_txt"] == "Il Caminetto") { $out = "\n
$out
\n"; } //echo "
menu:-".print_r($menu, true)."-
"; } */ // per tipo testo $CONF["menu_txt_sep_sx"] = ""; $CONF["menu_txt_sep_dx"] = ""; $CONF["menu_txt_sep"] = " | "; $CONF["menu_txt_sel_sx"] = ""; $CONF["menu_txt_sel_dx"] = ""; //per tipo immagine $CONF["menu_img_path"] = "menu/"; $CONF["menu_img_link"] = "PAGINA"; $CONF["menu_img_sel"] = "_s"; $CONF["menu_img_ext"] = ".gif"; $CONF["menu_img_sep_sx"] = ""; $CONF["menu_img_sep_dx"] = ""; $CONF["menu_img_sep"] = ""; //pagina precedente e successiva $CONF["menu_pagina_successiva_precedente"] = "TUTTE"; //TUTTE o GRUPPO stabilisce se cercare solo nelle pagine dello stesso gruppo (menu_ref) $CONF["menu_pagina_successiva_precedente_init"] = "SI"; //decide se calcolare la pag. succ. e prec. sempre function menu_init() { global $MENU; trigger_error("chiamata menu_init()"); main_link_globale(); uasort($MENU, "indi_ordina_menu"); } //crea fondamentalmente l' alias inverso in base al rewrite degli indirizzi //prepara tutti i link del sito per essere usati nel menu //usato nel modo non indi function main_link_globale() { global $CONF,$MENU,$LANG,$CONF_MENU,$TXT; $i=1; $l=1; $tot_lang = indi_tot_lingue(); $CA3 = array("
","
","
","/"," ","!","\"","£","$","%","*","#","@",";",":","?","^","&", "£", "¦", "§", "«", "¯", "°", "´","¶", "·", "º", "»","+","--","---"); $ordine_menu = $CONF["autoOrdStart"];//serve per creare un ordinamento standard che altrimenti non verrebbe mantenuto con una funzione usort o uasot //faccio il merge reset($MENU); while(list($k, $v)=each($MENU)) { $ordine_menu+=100; if(!isset($v["xxx"]["ord"])){//se non è specificato un ordinamento do un valore che rispecchi quello del database $MENU[$k]["xxx"]["ord"] = $ordine_menu; } //while ($next = next($array)) { //$k = key($array); $v = $array[$k]; reset($LANG); while(list($k1, $v1)=each($LANG)) { // while ($next = next($LANG)) { //$k1 = key($LANG); $v1 = $LANG[$k]; $i++; // faccio il merge con di tutte le pagine (questo è un po' lentino); $MENU[$k][$k1] = array_merge($CONF_MENU, (array)$MENU[$k]['xxx'], (array)$MENU[$k][$k1]); //creo link ??? sistemare per lingua e parametri aggiuntivi //array inverso per pagine con sottopagine if($CONF["indi_subversion"] > 5) { //if($MENU[$k][$k1]["menu_alias"] == "") $MENU[$k][$k1]["menu_alias"] = $k; } //------------------------------- 3/4 --------------------------------------------- if($CONF["REW"] == "ver_3" or $CONF["REW"] == "ver_4") { //creo un doppio database per ricerca veloce con chiave alias e con chiave lingua pagina //se c'e' l' alias esplicito if(isset($MENU[$k][$k1]["rew_alias"])) { $rew_alias = $MENU[$k][$k1]["rew_alias"]; if(is_array($GLOBALS["REW_ALIAS"][strtolower($rew_alias)])) { //provo con la lingua $rew_alias = $rew_alias."-".$k1; //ricontrollo $suffix = 1; $string = $rew_alias; while(is_array($GLOBALS["REW_ALIAS"][strtolower($rew_alias)])){ $suffix++; $rew_alias = $string."-".$suffix; } } //alias automatico con il nome della pagina } elseif($CONF["REW_alias_automatico"] == "SI" and isset($MENU[$k][$k1]["menu_txt"])) { if($CONF["indi_subversion"] < 1) { //$rew_alias = $k1."_".$k."_".str_replace(" ","-",$MENU[$k][$k1]["menu_txt"]); $rew_alias = str_replace(" ","-",$MENU[$k][$k1]["menu_txt"]); $suffix = 1; $string = $rew_alias; while(is_array($GLOBALS["REW_ALIAS"][strtolower($rew_alias)])){ $suffix++; $rew_alias = $string."-".$suffix; } } else { //$rew_alias = $k1."_".$k."_".str_replace(" ","-",$MENU[$k][$k1]["menu_txt"]); $rew_alias = str_replace(" ","-",$MENU[$k][$k1]["menu_txt"]); //controllo se esiste gia' //?? if(is_array($GLOBALS["REW_ALIAS"][strtolower($rew_alias)])) { //provo con la lingua $rew_alias = $rew_alias."-".$k1; $suffix = 1; $string = $rew_alias; while(is_array($GLOBALS["REW_ALIAS"][strtolower($rew_alias)])){ $suffix++; $rew_alias = $string."-".$suffix; } } } } elseif($CONF["REW_alias_gerarchico"] == "SI") { if($CONF["indi_subversion"] < 2 or $CONF["REW_alias_gerarchico_force_ver_1"] == TRUE) { $rew_alias_1 = $MENU[$k][$k1]["menu_txt"]; if(isset($MENU[$k][$k1]["rew_alias"])) $rew_alias_1 = $MENU[$k][$k1]["rew_alias"]; $rew_alias_1_ref = $MENU[$k][$k1]["menu_ref"]; $rew_alias_2 = $MENU[$rew_alias_1_ref][$k1]["menu_txt"]; if(isset($MENU[$rew_alias_1_ref][$k1]["rew_alias"])) $rew_alias_2 = $MENU[$rew_alias_1_ref][$k1]["rew_alias"]; $rew_alias_2_ref = $MENU[$rew_alias_1_ref][$k1]["menu_ref"];//variabile morta if($rew_alias_2) $rew_alias = $rew_alias_2."/".$rew_alias_1; else $rew_alias = $rew_alias_1; //if(strpos($rew_alias,"##")) str_replace("##invia_amico##", "aa",$rew_alias); $rew_alias = str_replace($CA3,"-",$rew_alias); $rew_alias = str_replace("--","-",$rew_alias); if($CONF['mcharset'] == "UTF-8"){ $rew_alias = str_replace($CONF['findNotAlfabeto'],$CONF['replaceNotAlfabeto'],$rew_alias); } else { $rew_alias = str_replace($CONF['findNotAlfabetoIso'],$CONF['replaceNotAlfabeto'],$rew_alias); } //controllo se esiste gia' //?? if(is_array($GLOBALS["REW_ALIAS"][strtolower($rew_alias)])) { //provo con la lingua $rew_alias = $rew_alias."-".$k1; $suffix = 1; $string = $rew_alias; while(is_array($GLOBALS["REW_ALIAS"][strtolower($rew_alias)])){ $suffix++; $rew_alias = $string."-".$suffix; } } } else { //nuovo rew aias gerarchico $rew_alias_1 = $MENU[$k][$k1]["menu_txt"]; if($rew_alias_1) { $rew_alias_1 = str_replace($CA3,"-",$rew_alias_1); $rew_alias_1 = str_replace("--","-",$rew_alias_1); } if(isset($MENU[$k][$k1]["rew_alias"])) $rew_alias_1 = $MENU[$k][$k1]["rew_alias"]; $rew_alias_1_ref = $MENU[$k][$k1]["menu_ref"]; $rew_alias_2 = $MENU[$rew_alias_1_ref][$k1]["menu_txt"]; if($rew_alias_2) { $rew_alias_2 = str_replace($CA3,"-",$rew_alias_2); $rew_alias_2 = str_replace("--","-",$rew_alias_2); } if(isset($MENU[$rew_alias_1_ref][$k1]["rew_alias"])) $rew_alias_2 = $MENU[$rew_alias_1_ref][$k1]["rew_alias"]; $rew_alias_2_ref = $MENU[$rew_alias_1_ref][$k1]["menu_ref"]; if($rew_alias_2) { $rew_alias = $rew_alias_2."/".$rew_alias_1; } else { $rew_alias = $rew_alias_1; } /* if($CONF['mcharset'] == "UTF-8"){ $rew_alias = str_replace($CONF['findNotAlfabeto'],$CONF['replaceNotAlfabeto'],$rew_alias); } else { $rew_alias = str_replace($CONF['findNotAlfabetoIso'],$CONF['replaceNotAlfabeto'],$rew_alias); } */ //controllo se esiste gia' //?? if(is_array($GLOBALS["REW_ALIAS"][strtolower($rew_alias)])) { //provo con la lingua $rew_alias = $rew_alias."-".$k1; $suffix = 1; $string = $rew_alias; while(is_array($GLOBALS["REW_ALIAS"][strtolower($rew_alias)])){ $suffix++; $rew_alias = $string."-".$suffix; } } } //XXXXXXXXXXX } elseif($CONF["REW_alias_key"] == "SI" and isset($MENU[$k][$k1]["key"])) { $rew_alias = str_replace(" ","-",$MENU[$k][$k1]["key"]); } else { //costruita $rew_alias = $k1."_".$k; } //costuisco array in base all' alias risultante $GLOBALS["REW_ALIAS"][strtolower($rew_alias)] = array($k,$k1); //$GLOBALS["REW_ALIAS_LWR"][strtolower($rew_alias)] = array($k,$k1); $GLOBALS["REW_ALIAS_INV"][$k1][$k] = $rew_alias; $MENU[$k][$k1]["rew_alias"] = $rew_alias; //------------------------------- 5/6 --------------------------------------------- } else if(in_array($CONF["REW"], array("ver_5", "ver_6"))){ $REW5_monolang = $CONF["REW"] == "ver_5" && $CONF['REW5_monolang'] && count($LANG)==1; //lingua due lettere $l2 = $GLOBALS[LANG3TO2][$k1]; //creo un doppio database per ricerca veloce con chiave alias e con chiave lingua pagina //se c'e' l' alias esplicito if(isset($MENU[$k][$k1]["rew_alias"])) { $rew_alias = $MENU[$k][$k1]["rew_alias"]; //alias automatico con il nome della pagina } elseif($CONF["REW_alias_automatico"] == "SI") { $rew_alias = str_replace(" ","-",trim($MENU[$k][$k1]["menu_txt"])); if(!$rew_alias) $rew_alias = $k; } elseif($CONF["REW_alias_gerarchico"] == "SI") { //nuovo rew aias gerarchico $rew_alias_1 = indiStringToRewAlias($MENU[$k][$k1]["menu_txt"]); if(!$rew_alias_1) $rew_alias_1 = $k; if(isset($MENU[$k][$k1]["rew_alias"])){ $rew_alias_1 = substr($MENU[$k][$k1]["rew_alias"],3); } $rew_alias_1_ref = $MENU[$k][$k1]["menu_ref"]; $rew_alias_2 = indiStringToRewAlias($MENU[$rew_alias_1_ref][$k1]["menu_txt"]); if(isset($MENU[$rew_alias_1_ref][$k1]["rew_alias"]) && !$REW5_monolang){ $rew_alias_2 = substr($MENU[$rew_alias_1_ref][$k1]["rew_alias"],3); } $rew_alias_2_ref = $MENU[$rew_alias_1_ref][$k1]["menu_ref"]; if($rew_alias_2) { $rew_alias = $rew_alias_2."/".$rew_alias_1; //$rew_alias = substr($rew_alias,3); //devo togliere i 3 caratteri della lingua } else { $rew_alias = $rew_alias_1; } } elseif($CONF["REW_alias_key"] == "SI" and isset($MENU[$k][$k1]["key"])) { $rew_alias = str_replace(" ","-",$MENU[$k][$k1]["key"]); } else { //è stato qui per varie settimane, mai scattato: if($_SERVER['REMOTE_ADDR'] == '192.168.0.177' || $_GET['debugtnx']) die; $rew_alias = $k; } //aggiungo alias nel caso di homepage senza lingua def if(!$REW5_monolang && $k == $CONF['pagina_def'] && $k1 != $CONF['lingua_def']) { $GLOBALS["REW_ALIAS"][$l2."/"] = array($k,$k1); } if($rew_alias) { //controllo se è unico //costuisco array in base all' alias risultante if($REW5_monolang) $rew_alias = $rew_alias; else $rew_alias = $l2."/".$rew_alias; $suffix = 1; $string = $rew_alias; while(is_array($GLOBALS["REW_ALIAS"][$rew_alias])){ $suffix++; $rew_alias = $string."-".$suffix; } //imposto lingua e pagina $GLOBALS["REW_ALIAS"][$rew_alias] = array($k,$k1); //$GLOBALS["REW_ALIAS_LWR"][strtolower($rew_alias)] = array($k,$k1); $GLOBALS["REW_ALIAS_INV"][$k1][$k] = $rew_alias; $MENU[$k][$k1]["rew_alias"] = $rew_alias; } else { d_err("rew_alias vuoto pagina:$k lingua:$k1 "); } } } unset($MENU[$k]['xxx']); } //riciclo tutto reset($MENU); while(list($k, $v)=each($MENU)) { reset($LANG); while(list($k1, $v1)=each($LANG)) { //genero il link e controllo, togliere per migliorare le prestazioni => viene usato da menu() per sostituire [link] nel tpl $MENU[$k][$k1]["link"] = genera_link($k, $k1, $MENU[$k][$k1]["menu_link_agg"]); //assegno la pagina e la lingua $MENU[$k][$k1]["pagina"] = $k; $MENU[$k][$k1]["lang"] = $k1; //aggiungo array per cache dei menu $ref = $MENU[$k][$k1]["menu_ref"]; if($ref) $GLOBALS["MENU_REF"][$ref]++; } } } function indiTabellaSitemapXmlOutput(){ global $CONF; indiSitemapXmlOutput( db_qa("select pagina, rewId as agg, lang from sitemap where host = '".$_SERVER['SERVER_NAME']."' AND isPubblico = 1 AND status = 200 order by lang = '".$CONF['lingua_def']."' DESC") ); } function indiSitemapXmlOutput($uris){//$uris = [["pagina"=>"", "agg"=>"array_o_rewId", "lang"=>""],[...]] global $LANG3TO2, $MENU; $group = array(); foreach($uris as $u){ if(is_array($u['agg'])){ $agg = $u['agg']; $k = md5(serialize($u['agg'])); } else if($u['agg']){ $agg = array("rewId"=>$u["agg"]); $k = $u["agg"]; } else{ $agg = []; $k = 0; } $group[$u['pagina']][$k][$u["lang"]] = genera_link_assoluto($u['pagina'], $u['lang'], $agg); } $xml = new DomDocument('1.0', 'utf-8'); $xml->formatOutput = true; $urlset = $xml->createElement('urlset'); $urlset->appendChild(new DomAttr('xmlns', 'http://www.google.com/schemas/sitemap/0.9')); $urlset->appendChild(new DomAttr('xmlns:xhtml', 'http://www.w3.org/1999/xhtml')); $xml->appendChild($urlset); foreach($group as $pagina=>$rewIds) foreach($rewIds as $rewId=>$urls){ $lingueSenzaMenuLink = array(); foreach($urls as $l=>$u) if( !$MENU[$pagina][$l]['menu_link_force'] && ( !$MENU[$pagina][$l]['menu_link'] || !$MENU[$MENU[$pagina][$l]['menu_link']][$l]['menu_link_force']//la pagina rimanda a una pagina che rimanda a un link esterno quindi genererebbe il link direttamente alla pagina esterna ) ) $lingueSenzaMenuLink[] = $l; $lingueAlternate = $lingueSenzaMenuLink;//devo ciclare due volte l'array lingue foreach($lingueSenzaMenuLink as $l){ $url = $xml->createElement('url'); $url->appendChild($xml->createElement('loc', $urls[$l])); if(count($lingueAlternate) > 1){ foreach($lingueAlternate as $linguaAlternate){ //subelement for every alternate version of the page, including itself. https://support.google.com/webmasters/answer/2620865?hl=en $e = $xml->createElement('xhtml:link'); $e->setAttribute('rel', 'alternate'); $e->setAttribute('hreflang', $LANG3TO2[$linguaAlternate]); $e->setAttribute('href', $urls[$linguaAlternate]); $url->appendChild($e); } } //$url->appendChild($xml->createElement('lastmod', date("Y-m-d"))); $urlset->appendChild($url); } } $xml->save("php://output"); die; } function menuToAlias($m){ if($m['rew_alias']) return $m['rew_alias']; else if($m['menu_txt']) return $m['menu_txt']; else return $m['pagina'];//questo c'è solo con tabellaSitemap } function indiStringToUrl($s){//usata da tabellaSitemap, applico rew_alias_minuscolo / rew_alias_solo_alfanumerici e quoto i caratteri speciali global $CONF; $s = trim($s); if($CONF['rew_alias_minuscolo']){ $s = mb_strtolower($s); } $replacer = $CONF['tabellaSitemapCarattereSostituzione']; if($CONF['rew_alias_solo_alfanumerici']){ if($CONF['mcharset'] != "UTF-8") $find = $CONF['findNotAlfabetoIso']; else $find = $CONF['findNotAlfabeto']; $s = str_replace( $find, $CONF['replaceNotAlfabeto'], $s ); $s = preg_replace("/[^a-zA-Z\d]+/", $replacer, $s); } $sostituzioni = array(""); if($CONF['tabellaSitemapSostituisciCaratteriRiservati']) $sostituzioni = array_merge($sostituzioni, array("!", "*", "'", "(", ")", ";", ":", "@", "&", "=", "+", "$", ",", "/", "?", "#", "[", "]", "%")); if($CONF['tabellaSitemapSostituisciSpazi']) $sostituzioni = array_merge($sostituzioni, array(" ", "\t", "\n", "\r", "\0", "\x0B")); if($sostituzioni) $s = str_replace($sostituzioni, $replacer, $s); if(!$s) $s = $replacer;//altrimenti si creano url con "//" else{ $s = preg_replace("/".$replacer."{2,}/u", $replacer, $s);// /u => forzo PCRE_UTF8 (il file è ansi) if(strlen($s) > 1 && substr($s, -1) == $replacer) $s = substr($s, 0, -1);//evito che l'url finisca con -/ (se il titolo della pagina finisce con un carattere particolare) } return rawurlencode($s); } function indiStringToRewAlias($s){//usa da rew3 / rew5 global $CONF; $replacer = "-"; $s = trim($s); $s = str_replace(array(" ", "/", ":"), $replacer, $s); if($CONF['rew_alias_minuscolo']){ $s = mb_strtolower($s); } if($CONF['rew_alias_solo_alfanumerici']){ if($CONF['mcharset'] != "UTF-8") $find = $CONF['findNotAlfabetoIso']; else $find = $CONF['findNotAlfabeto']; $s = str_replace( $find, $CONF['replaceNotAlfabeto'], $s ); $s = preg_replace("/[^\w\d]+/u", $replacer, $s);// /u => forzo PCRE_UTF8 (il file è ansi) } $s = preg_replace("/".$replacer."{2,}/u", $replacer, $s);// /u => forzo PCRE_UTF8 (il file è ansi) return $s; } function indiMenuMerge(){ global $CONF, $MENU, $LANG, $CONF_MENU; $ordine_menu = $CONF["autoOrdStart"]; foreach($MENU as $k=>$v){ $ordine_menu += 100; if(is_array($v["xxx"]) && !isset($v["xxx"]["ord"])){//se non è specificato un ordinamento do un valore che rispecchi quello del database $MENU[$k]["xxx"]["ord"] = $ordine_menu; } foreach($LANG as $l=>$lingua){ $MENU[$k][$l] = array_merge($CONF_MENU, (array)$MENU[$k]['xxx'], (array)$MENU[$k][$l]); $MENU[$k][$l]["pagina"] = $k; $MENU[$k][$l]["lang"] = $l; } unset($MENU[$k]['xxx']); } } function indiTabellaSitemapHit($uri){ if($_SERVER['TNX_LIMITA_CARICO']) return; if(($CONF["tabellaSitemapUsaTransazioni"] || $CONF["tabellaSitemapUsaLockTables"]) && tabellaSitemapAggiornaGetLastRunningPID()){ //fare un update vorrebbe dire aspettare la fine di tabellaSitemapAggiorna //spesso succede anche con la semplice select fatta prima di questo punto, per questo sono stati implementati i semafori return; } while(db_q("UPDATE sitemap SET lastHit = now() WHERE uri = '".addslashes($uri)."' AND host = '".addslashes($_SERVER['SERVER_NAME'])."'") === false){ if(!db_q("ALTER TABLE `sitemap` ADD COLUMN `lastHit` datetime NULL")){ trigger_error("Non sono riuscito ad aggiungere lastHit a sitemap"); return;//altrimenti loop infinito } } } function indiPersonalizzaTabellaSitemap301Centralizzati(){ $centralized301 = []; $redirects = cakeBoot("Redirectpermanente")->find("all", array("contain" => false)); if($redirects) foreach($redirects as $redirect){ $nuovoUri = []; $nuovoUri['uri'] = explode("/", $redirect["Redirectpermanente"]["uri"]); $nuovoUri['isPubblico'] = 0; $nuovoUri['status'] = "301"; $nuovoUri['lang'] = $redirect["Redirectpermanente"]["lang"]; $nuovoUri['rawImport'] = true; $nuovoUri['pagina'] = $redirect["Redirectpermanente"]["pagina_id"]; $nuovoUri['rewId'] = "0"; $centralized301[] = $nuovoUri; } return $centralized301; } // function tabellaSitemapAggiorna( function indiTabellaSitemapAggiorna($importing = false){//ritorna false se viene interrotta da altro processo partito global $CONF, $MENU, $LANG, $DATI; session_write_close(); if($DATI['tabellaSitemapAggiornaReport']) $time = -1 * microtime(true); $indiPersonalizzaTabellaSitemap = ''; if($importing || !@db_qrs("select count(*) from sitemap")){//sto importando gli url di un'altra REW oppure la tabella non c'è / è vuota cakeBoot();//per avere clearCakeCache clearCakeCache();//se ho appena rimosso la tabella sitemap da' errore... $a = cakeBoot("Sitemap");//crea la tabella se necessario } $custom301 = array(); if(!$importing){ if(function_exists("indiPersonalizzaTabellaSitemap")) $indiPersonalizzaTabellaSitemap = "indiPersonalizzaTabellaSitemap"; if(function_exists("indiPersonalizzaTabellaSitemap301")){ $custom301 = indiPersonalizzaTabellaSitemap301(); } else if($DATI["tabellaSitemapRedirectPermanentCentralizzati"]){ $custom301 = indiPersonalizzaTabellaSitemap301Centralizzati(); } } $uris = [ [ 'isPubblico' => 0,//a regola non è una pagina, è un file xml 'rawImport' => false, 'pagina' => 'sitemap', 'rewId' => 0, 'rawImport' => 1, 'status' => 200, 'uri' => array('sitemap'), 'lang' => $CONF['lingua_def'], ], [ 'isPubblico' => 0, 'rawImport' => false, 'pagina' => 'robots.txt', 'rewId' => 0, 'rawImport' => 1, 'status' => 200, 'uri' => array('robots.txt'), 'lang' => $CONF['lingua_def'], ] ]; $host = $_SERVER['SERVER_NAME']; foreach($MENU as $k=>$v) foreach($LANG as $l=>$lingua){ if(!tabellaSitemapAggiornaAmILastRunningPID()) return false; //in caso di menu_link inserisco un 200 anche se realmente quell'url generera un 302 //prima ho provato inserendo un 302 legato alla pagina di destinazione //ma in quella maniera dovevo fare una gestione particolare per settare $MENU[link/rew_alias] e $GLOBALS["MENU_REF"] //quindi preferisco inserirli come 200, visto che vengono usati pochissimo visto che nel genera_link si è sempre ritornato direttamente l'url della pagina linkata //in generale credo menu_link sia una cosa poco utile //se volessi riattivarlo c'è da rivedere anche indiLeggiTabellaSitemap // if($v[$l]['menu_link']){ // $status = 302; // $target = $v[$l]['menu_link']; // } // else{ $status = 200; $target = $k; $uri = array( 'isPubblico' => $MENU[$k][$l]['menu_pagina_vis'] != 'NO' && $MENU[$k][$l]['protetta'] != "SI", 'pagina' => $target, 'rewId' => 0,//deve essere il default della tabella anche se trasformo la colonna in varchar 'status' => $status, 'uri' => array(), 'lang' => $l, ); //creo il nuovo uri if($k == $CONF['pagina_def'] && $l == $CONF['lingua_def']){ //root del sito $rootDiversa = db_qrs(" select count(*) from sitemap WHERE uri = '' AND ( pagina != '".addslashes($target)."' OR lang != '".$l."' ) AND lang IN ('".implode("','", array_keys($LANG))."') AND host = '".addslashes($host)."' "); if($rootDiversa){//cancello tutti gli inserimenti con "/", altrimenti creerebbe un uri "-2/" e genererebbe il relativo 301 db_q(" delete from sitemap WHERE uri = '' AND lang IN ('".implode("','", array_keys($LANG))."') AND host = '".addslashes($host)."' "); } } else if($importing){ $uri['uri'] = explode("/", $v[$l]['rew_alias']); //questo if non ha mai funzionato perchè explode di null è true (array("")) //comunque non lo attivo, perchè se triggero un errore la procedura si blocca //e comunque questa situazione si vede nella mail di report prima importazione // if(!$uri['uri']){ // trigger_error("Non ho trovato l'url per la pagina $k in $l (rew $CONF[REW])"); // } } else{ $pezzi = array(); if(count($LANG) > 1 || !$CONF['REW5_monolang']) $pezzi[] = $GLOBALS['LANG3TO2'][$l]; if(!$v[$l]['rew_alias']){//omologo a versioni precedenti, se c'è rew_alias non è più gerarchico, ne aggiungo la lingua $padre = $v[$l]['menu_ref']; if($MENU[$padre] && $CONF["tabellaSitemapLivelliGerarchia"]){ $nonno = $MENU[$padre][$l]['menu_ref']; if($MENU[$nonno] && $CONF["tabellaSitemapLivelliGerarchia"] > 1){ $bisnonno = $MENU[$nonno][$l]['menu_ref']; if($MENU[$bisnonno] && $CONF["tabellaSitemapLivelliGerarchia"] > 2){ $pezzi[] = menuToAlias($MENU[$bisnonno][$l]); } $pezzi[] = menuToAlias($MENU[$nonno][$l]); } $pezzi[] = menuToAlias($MENU[$padre][$l]); } } if($k != $CONF['pagina_def']){ //tutte le home senza nome $pezzi[] = menuToAlias($v[$l]); } $uri['uri'] = $pezzi; } //non personalizzo le pagine con menu_link, non devono avere varianti di pagina e ha poco senso customizzare un link 302 if($indiPersonalizzaTabellaSitemap/* && $status == 200 in prima versione creavo anche dei 302 ora creo solo 200 */){ $time = -microtime(true); /* indiPersonalizzaTabellaSitemap può restituire: - niente (null o array vuoto) per rimuovere del tutto la pagina - il singolo uri variato (array di un livello) - un'array multi livello con uri, rewId e is_pubblica (gli altri dati dovrebbero essere presi dal parametro passato) */ $uriPersonlizzati = $indiPersonalizzaTabellaSitemap($uri); $time += microtime(true); $GLOBALS['indiPersonalizzaTabellaSitemapTime'] += $time; $GLOBALS['tabellaSitemapBench'][$uri['pagina']] += $time; if($uriPersonlizzati){ $primaChiave = array_shift(array_keys($uriPersonlizzati)); if(!is_array($uriPersonlizzati[$primaChiave])){//l'array di varianti potrebbe essere fatta strana e usare 'uri' come chiave, quindi controllo il primo elemento //array a singolo livello $uris[] = $uriPersonlizzati; } else{ //faccio un controllo univoco solo sui 200 (posso restituire anche più redirect dalla funzione di personalizzazione) // cakeBoot();//per essere sicuri che ci sia Set // $uriPersonlizzati200 = $uriPersonlizzati; // foreach($uriPersonlizzati200 as $k1=>$v1) if($v1['status'] != 200) unset($uriPersonlizzati200[$k1]); // if(count(array_unique(Set::extract("/./rewId", $uriPersonlizzati200))) != count($uriPersonlizzati200)) trigger_error("Sembra che la chiave rewId non sia univoca"); //versione 5/2020, più veloce e senza cake $tutiRewId = array(); $count200 = 0; foreach($uriPersonlizzati as $k1=>$v1) if($v1['status'] == 200){ $count200++; $tutiRewId[] = $v1['rewId']; } if(count(array_unique($tutiRewId)) != $count200) trigger_error("Sembra che la chiave rewId non sia univoca"); unset($tutiRewId); foreach($uriPersonlizzati as $id=>$u){ if( !array_key_exists('isPubblico', $u) || !array_key_exists('rewId', $u) || !array_key_exists('pagina', $u) || !array_key_exists('lang', $u) || !array_key_exists('status', $u) ){ trigger_error("Sembra che indiPersonalizzaTabellaSitemap non abbia restituito tutti i dati necessari"); } $uris[] = $u; } } } //else non la aggiungo a $uris } else{ //prevedo che sia sempre un array di url $uris[] = $uri; } } if($custom301){ $uris = array_merge($uris, $custom301); } if($_GET['debugtnx'] || $GLOBALS['indiPersonalizzaTabellaSitemapTime'] > 10){ $GLOBALS['indiPersonalizzaTabellaSitemapTime'] = number_format($GLOBALS['indiPersonalizzaTabellaSitemapTime'], 2); if(!$GLOBALS['tabellaSitemapBench']) $GLOBALS['tabellaSitemapBench'] = []; asort($GLOBALS['tabellaSitemapBench']); $GLOBALS['tabellaSitemapBench'] = array_reverse($GLOBALS['tabellaSitemapBench'], true); $GLOBALS['tabellaSitemapBench'] = array_slice($GLOBALS['tabellaSitemapBench'], 0, 5, true); foreach($GLOBALS['tabellaSitemapBench'] as $k=>$v){ $GLOBALS['tabellaSitemapBench'][$k] = number_format($v, 2); if(!(float)$GLOBALS['tabellaSitemapBench'][$k]) unset($GLOBALS['tabellaSitemapBench'][$k]); } $messaggio = "indiPersonalizzaTabellaSitemap lenta (".$GLOBALS['indiPersonalizzaTabellaSitemapTime']." sec), pagine lente: ".print_r($GLOBALS['tabellaSitemapBench'], true); if($_GET['debugtnx']){ /* if($_SERVER['REMOTE_ADDR'] == '192.168.0.177' || $_GET['debugtnx']){ echo '
';
				$debugBacktrace = debug_backtrace(); array_unshift($debugBacktrace, array('file'=>__FILE__, 'line'=>__LINE__, 'function'=>'debugTnx')); foreach($debugBacktrace as $debugLine) echo "".str_replace("/tnx/www/html/www/", "", $debugLine['file']).""." ".$debugLine['function']."()
"; $printMe = $GLOBALS['aahahaethathate']; ob_start(); if(is_object($printMe)||is_array($printMe)) print_r($printMe); else var_dump($printMe); echo htmlentities(ob_get_clean(), ENT_COMPAT|ENT_HTML401|ENT_SUBSTITUTE, 'UTF-8'); echo '
'; } die($messaggio); */ } else trigger_error($messaggio); } if($CONF["tabellaSitemapUsaLockTables"]) db_q("LOCK TABLES sitemap WRITE");//non locko prima perchè durante il lock posso fare query solo sulle tabelle locked $tutteLePagine = array();//per pulizia pagine disattivate da indiPersonalizzaTabellaSitemap $tutteLeLingue = array();//per pulizia lingue disattivate da indiPersonalizzaTabellaSitemap $variantiPagina = array();//per pulizia varianti cancellate $segnalaAccorciati = array(); foreach($uris as $u){ if(!tabellaSitemapAggiornaAmILastRunningPID()) return false; $uri = $u['uri']; $rawImport = $u['rawImport'] || $importing;//se false applico rew_alias_minuscolo / rew_alias_solo_alfanumerici e quoto i caratteri speciali (mai quando sto importando gli url della precendete versione) $target = $u['pagina']; $l = $u['lang']; $status = $u['status']; $rewId = $u['rewId']; $isPubblico = $u['isPubblico'] ? 1 : 0;//per lavorare con true / false $accorciato = false; if(!$rawImport){ if($rimuoviParole = $CONF['tabellaSitemapRimuoviParole'][$l]){ foreach($uri as $kk=>$uu){ $uriParole = explode(" ", $uu);//qui non c'è ancora il separatore foreach($uriParole as $kkk=>$uuu) if(in_array(strtolower($uuu), $rimuoviParole)) unset($uriParole[$kkk]); $uri[$kk] = implode(" ", $uriParole); if(!$uri[$kk]) $uri[$kk] = " "; } } if($lunghezzaMax = $CONF['tabellaSitemapLunghezzaMassimaUrl']){ $conta = 0;//parto da 0 invece che da -1 perchè alla fine va sempre aggiunto lo slash che nel db non c'è foreach($uri as $k=>$uu){ $conta++;//slash if($conta >= $lunghezzaMax){ $accorciato = true; unset($uri[$k]); } else{ $size = strlen($uu); if(($conta + $size) >= $lunghezzaMax){ $accorciato = true; $rimanenti = $lunghezzaMax - $conta; $uri[$k] = substr($uri[$k], 0, $rimanenti); $conta += $rimanenti; } else{ $conta += $size; } } } } $uri = array_map("indiStringToUrl", $uri); } else{ $uri = array_map("rawurlencode", $uri); } $uri = implode("/", $uri); if($accorciato && $isPubblico/* opzione qui segnalaSoloPubblici? */){ $segnalaAccorciati[] = $uri . "/" . ($isPubblico?"":" (url nascosto)"); } // if($rewId) //posso usare la 0 come pagina indice if($status == 200){//ci sono anche i 301, che se creati dall'utente potrebbero puntare a pagine morte $variantiPagina[$l][$target][] = $rewId; if(!$tutteLePagine[$target]) $tutteLePagine[$target] = $target; if(!$tutteLeLingue[$l]) $tutteLeLingue[$l] = $l; } //se finisce già col separatore (traling space o url "vuoto") evito di duplicare il separator (come fa indiStringToUrl) $separator = substr($uri, -1) == $CONF['tabellaSitemapCarattereSostituzione'] ? '' : $CONF['tabellaSitemapCarattereSostituzione']; if(false && $GLOBALS['contatoreUrlDuplicatiIndi'][$uri]){ $i = $GLOBALS['contatoreUrlDuplicatiIndi'][$uri]; $suffix = $separator.$i; } else{ $i = 1; $suffix = ''; } while(db_qrs( "select count(*) from sitemap WHERE ". "uri = '".addslashes($uri.$suffix)."'".//ha lo stesso url " AND (pagina != '".addslashes($target)."' OR lang != '".$l."' OR rewId != '".addslashes($rewId)."')".//non punta già a questa pagina in questa lingua " AND host = '".addslashes($host)."'". " AND status != '404'" )){ $i++; // $GLOBALS['contatoreUrlDuplicatiIndi'][$uri] = $i;//questo serve per evitare di fare query di ricerca inutili in caso di molti duplicati: RIMOSSO gli url possono essere ciclati in ordine diverso e con questo contatore cambiarebbero nome $suffix = $separator.$i; //$suffix = "-".rand(100,999).'/';se utilizzo il random, nel momento in cui c'è una pagina in + o in - con il random cambiano tutte le generazioni e quindi tutti gli url che hanno la parte randomizzata if($i > 900){ trigger_error("più di 900 pagine con nome \"$uri\"? VERRANNO GENERATI URL DUPLICATI, CORREGGERE"); break; } } $uri .= $suffix; //se ha già un link (stessa pagina, stessa lingua) lo trasformo in 301 per creare uno storico if($status == 200){//potrei essere in fase di creazione di un 301 (senza annullerei il 200) $daTrasformareIn301 = db_qrs(" select id from sitemap WHERE uri != '".addslashes($uri)."' AND pagina = '".addslashes($target)."' AND lang = '".$l."' AND rewId = '".addslashes($rewId)."' AND status = 200 AND host = '".addslashes($host)."' "); if($daTrasformareIn301) db_q(" update sitemap set status = 301, statusChange = now() WHERE id = $daTrasformareIn301 "); } //controllo se già nel database $uriGiaNelDb = db_qr(" select id, status, isPubblico from sitemap WHERE uri = '".addslashes($uri)."' AND host = '".addslashes($host)."' AND ( ( pagina = '".addslashes($target)."' AND lang = '".$l."' AND rewId = '".addslashes($rewId)."' ) OR status = 404 ) "); if($uriGiaNelDb){ //lo modifico solo se la priorità del mio status è maggiore, quindi: //- sto creando un 302 e quello che c'è è un 404 <- questo caso non esiste più, in prima versione creavo anche dei 302 ora creo solo 200 //- sto creando un 200 e quello che c'è è un 301, 302 o un 404 //- non prevedo la creazione di altro al momento if($status < $uriGiaNelDb['status']){ //esisteva già un uri con la stessa pagina e la stessa lingua //oppure un vecchio 404 //lo riutilizzo db_q(" update sitemap set status = '".$status."', isPubblico = '".$isPubblico."', pagina = '".addslashes($target)."', lang = '".$l."', rewId = '".addslashes($rewId)."', statusChange = now() WHERE id = $uriGiaNelDb[id] "); } else if($status == $uriGiaNelDb['status'] && $isPubblico != $uriGiaNelDb['isPubblico']){ db_q(" update sitemap set isPubblico = '".$isPubblico."', statusChange = now() WHERE id = $uriGiaNelDb[id] "); } else{ //non devo fare assolutamente niente, cè già un 200 che punta a questa pagina in questa lingua, anche se stessi creando un 302 evito, è inutile } } else{ db_q(" insert into sitemap set uri = '".addslashes($uri)."', pagina = '".addslashes($target)."', isPubblico = '".addslashes($isPubblico)."', lang = '".$l."', status = '".$status."', rewId = '".addslashes($rewId)."', host = '".addslashes($host)."', statusChange = now() "); } //ripesco eventuali 404 preesistenti che puntavano alla stessa pagina/lang/rewid db_q(" UPDATE sitemap SET status = 301 WHERE status = 404 AND pagina = '".addslashes($target)."' AND lang = '".$l."' AND rewId = '".addslashes($rewId)."' AND host = '".addslashes($host)."' "); } if($segnalaAccorciati){ indi_email(array( "oggetto" => "URL accorciati a $lunghezzaMax caratteri", "to" => $DATI['email'], // "email_html" => "SI", "messaggio" => implode("\r\n", $segnalaAccorciati) )); } //trasformo in 404 gli inserimenti delle pagine / lingue cancellate //i redirect alla pagina cancellata li lascio tali, perchè se ripristino la pagina tornano a funzionare db_q(" update sitemap set status = 404, statusChange = now() WHERE ( pagina NOT IN ('".implode("','", $tutteLePagine)."', 'sitemap') OR lang NOT IN ('".implode("','", $tutteLeLingue)."') ) AND status IN (301, 200) AND host = '".addslashes($host)."' "); foreach($variantiPagina as $l=>$pagine) foreach($pagine as $target=>$ids){ if(!tabellaSitemapAggiornaAmILastRunningPID()) return false; $ids = array_map("addslashes", $ids); db_q(" update sitemap set status = 404, statusChange = now() WHERE pagina = '".addslashes($target)."' AND rewId NOT IN ('".implode("','", $ids)."') AND lang = '".addslashes($l)."' AND host = '".addslashes($host)."' AND status IN (301, 200) "); } if($CONF["tabellaSitemapUsaLockTables"]) db_q("UNLOCK TABLES"); if(!mt_rand(0,100)){ //lento $query = "SELECT * FROM sitemap GROUP BY uri, host HAVING count(*) > 1"; if($count = db_qa("$query")) trigger_error("Ci sono ".count($count)." url duplicati ($query)"); } db_q("delete from sitemap where host ".($DATI['dove_sono']=='loc'?'not ':'')."in ('demo.tnx.it','demo2.tnx.it','demo3.tnx.it','demo4.tnx.it','demo5.tnx.it','php70.demo.tnx.it')"); // if($num = db_affected_rows()) trigger_error("Rimosse $num righe in tabella sitemap di url ".($DATI['dove_sono']=='loc'?'non ':'')."demo*.tnx.it"); if($DATI['tabellaSitemapAggiornaReport']){ $time += microtime(true); indi_dev_email("tabellaSitemapAggiornaReport $_SERVER[HTTP_HOST] $DATI[nome_sito]", $time); } if($CONF["indiMenuCacheKey"]) indiSiteCacheUnset($CONF["indiMenuCacheKey"]); //attenzione: qui le mappe dei link non sono avvalorate return true; } function indiLeggiTabellaSitemap(){ //cecca 22/06/2023 per ora disabilito la cache di questa, perchè su ibfor se aggiungo una pagina non viene vista dalla mod menu, devo capire meglio cosa non funziona cachando questa // indiCache("VAR", "indiLeggiTabellaSitemap", function() { global $REW_ALIAS, $REW_ALIAS_INV, $CONF, $MENU, $LANG; $qUris = db_q("select uri, pagina, lang, rewId, isPubblico, status from sitemap where host = '".addslashes($_SERVER['SERVER_NAME'])."' AND status IN (200)"); $uris = []; while($u = mysql_tnx_fetch_assoc($qUris)){ $l = $u['lang']; $p = $u['pagina']; $ur = $u['uri']; $rewId = $u['rewId']; if(in_array($p, ['robots.txt', 'sitemap'])){ $MENU[$p][$l]['pagina'] = $p; $MENU[$p][$l]["menu_pagina_vis"] = 'NO'; } else if(!$MENU[$p] && !tabellaSitemapAggiornaGetLastRunningPID()){ trigger_error("Uri ($ur) senza pagina di destinazione ($p), se cambiato \$MENU verrà lanciato tabellaSitemapAggiorna"); continue; } $REW_ALIAS[$ur] = array($p, $l, $rewId, $u['isPubblico']);//$REW_ALIAS serve per riconoscere un url lecito e per impostare isPubblico if(!$rewId){ //$REW_ALIAS_INV[$l][$p] = $ur;//serviva solo per genera_link e posso prendere i dati direttamente da $MENU $MENU[$p][$l]["rew_alias"] = $ur; if($MENU[$p][$l]["menu_ref"]) $GLOBALS["MENU_REF"][$MENU[$p][$l]["menu_ref"]]++;//serve per menu_multi_tpl } else{ $MENU[$p][$l]["rewId"][$rewId] = $ur; } $uris[] = $u; } d_info("indiLeggiTabellaSitemap 1","--------- INIT MENU","INDI"); $CONF['tabellaSitemapLetta'] = true; if($uris){ //il genera_link lo faccio dopo aver riempito tutta la $MENU, perchè in caso di menu_link leggo i dati da una chiave che potrebbe non essere ancora avvalorata foreach($uris as $u) if(!$u['rewId'] && $MENU[$p] /* se non c'è $MENU[$p] ha già dato un errore sopra e ne darebbe un altro il genera_link */){ $l = $u['lang']; $p = $u['pagina']; $MENU[$p][$l]["link"] = genera_link($p, $l, $MENU[$p][$l]["menu_link_agg"]); } } d_info("indiLeggiTabellaSitemap 2","--------- INIT MENU","INDI"); $ret = array("MENU"=>&$MENU, "MENU_REF"=>&$GLOBALS["MENU_REF"], "REW_ALIAS"=>&$REW_ALIAS); return $ret; // }, function($ret) { // $CONF['tabellaSitemapLetta'] = true; // $GLOBALS["MENU"] = $ret["MENU"]; // $GLOBALS["MENU_REF"] = $ret["MENU_REF"]; // $GLOBALS["REW_ALIAS"] = $ret["REW_ALIAS"]; // d_info("indiLeggiTabellaSitemap indiCache onCached","--------- INIT MENU","INDI"); // }); /* VECCHIA VERSIONE CON DB_QA $uris = db_qa("select uri, pagina, lang, rewId, isPubblico, status from sitemap where host = '".addslashes($_SERVER['SERVER_NAME'])."' AND status IN (200)"); //anche le pagine con menu_link hanno status = 200, ma dopo essere riconosciute generano un 302 if(db_err()) return false; foreach($uris as $u){ $l = $u['lang']; $p = $u['pagina']; $ur = $u['uri']; $rewId = $u['rewId']; if(in_array($p, ['robots.txt', 'sitemap'])){ $MENU[$p][$l]['pagina'] = $p; $MENU[$p][$l]["menu_pagina_vis"] = 'NO'; } else if(!$MENU[$p] && !tabellaSitemapAggiornaGetLastRunningPID()){ trigger_error("Uri ($ur) senza pagina di destinazione ($p): tabellaSitemapAggiorna?"); continue; } $REW_ALIAS[$ur] = array($p, $l, $rewId, $u['isPubblico']);//$REW_ALIAS serve per riconoscere un url lecito e per impostare isPubblico if(!$rewId){ //$REW_ALIAS_INV[$l][$p] = $ur;//serviva solo per genera_link e posso prendere i dati direttamente da $MENU $MENU[$p][$l]["rew_alias"] = $ur; if($MENU[$p][$l]["menu_ref"]) $GLOBALS["MENU_REF"][$MENU[$p][$l]["menu_ref"]]++;//serve per menu_multi_tpl } else{ $MENU[$p][$l]["rewId"][$rewId] = $ur; } } $CONF['tabellaSitemapLetta'] = true; //il genera_link lo faccio dopo aver riempito tutta la $MENU, perchè in caso di menu_link leggo i dati da una chiave che potrebbe non essere ancora avvalorata foreach($uris as $u) if(!$u['rewId'] && $MENU[$p] /* se non c'è $MENU[$p] ha già dato un errore sopra e ne darebbe un altro il genera_link ){ $l = $u['lang']; $p = $u['pagina']; $MENU[$p][$l]["link"] = genera_link($p, $l, $MENU[$p][$l]["menu_link_agg"]); } */ return true; } function indi_tot_lingue() { global $MENU, $LANG; return (int) count($LANG); } function indi_tot_pagine() { global $MENU, $LANG; return (int) count($MENU); } function indi_tot_pagine_lingue() { global $MENU, $LANG; return (int) count($MENU)*count($LANG); } //controllo se il menu è stato modificato function menu_is_modificato() { global $DATI; if($DATI['indi_menu_tot_pagine'] == indi_tot_pagine_lingue()) { return FALSE; } return true; } function indi_ordina_menu($a, $b){ global $CONF, $lang; $l = $lang; if ((!isset($a[$l]["ord"]) && !isset($b[$l]["ord"])) || $a[$l]["ord"] == $b[$l]["ord"]) { if($a[$l]["menu_txt"] == $b[$l]["menu_txt"]) return 0; else return $a[$l]["menu_txt"] < $b[$l]["menu_txt"]; } return ((int)$a[$l]["ord"] < (int)$b[$l]["ord"]) ? -1 : 1; } //tova la pagina precedente, evitando le pagine nascoste e disabilitate e le pagine protette function menu_pagina_precedente($pagina = NULL) { global $DATI, $lang; if($pagina == NULL) $pagina = $GLOBALS['DATI']["pagina"]; if($GLOBALS["CONF"]["DEBUG"] == "SI") $time = indi_time(); //mi copio il menu $MENU2 = $GLOBALS['MENU']; $c = 0; $find_next = ""; $key_curr = ""; $find_prev_provvisorio = ""; while(list($k, $v)=each($MENU2) and $find_next == "") { $c++; $KEY[$c] = $k; if($k == $pagina) { //trovata pagina corrente $key_curr = $c; $KEY = array_reverse($KEY); reset($KEY); //ciclo le chiavi delle pagine precedenti while(list($kk, $vv)=each($KEY)) { if($vv != $pagina and $MENU2[$vv][$GLOBALS['lang']]['menu_pagina_vis'] == "SI" and $MENU2[$vv][$GLOBALS['lang']]['protetta'] != "SI") { //mi salvo il primo che trovo if($find_prev_provvisorio == "") $find_prev_provvisorio = $vv; if($MENU2[$vv][$GLOBALS['lang']]['menu_ref'] == menu_riferimento(NULL,$pagina)) { //trovo la pagina dello stesso gruppo se c'e' (menu_ref) return $vv; } //controllo che il riferimento non sia della stessa pagina e scarto il link $pagina_link1 = $MENU2[$find_prev_provvisorio][$lang]['menu_link']; if($pagina == $pagina_link1) $find_prev_provvisorio = ""; } } //ho fatto tutto il giro allora imposto il provvisorio meglio di niente if($find_prev_provvisorio != "" and $GLOBALS["DATI"]["menu_pagina_successiva_precedente"] == "TUTTE") { //controllo se il link rimanda a questa pagina $pagina_link1 = $MENU2[$find_prev_provvisorio][$GLOBALS['lang']]['menu_link']; $padre = $DATI[indi_menu_ref_1]; if($pagina == $pagina_link1) return ""; //if($padre == $pagina_link1) return ""; return $find_prev_provvisorio; } else { return ""; } } } } //tova la pagina successiva, evitando le pagine nascoste e disabilitate e le pagine protette function menu_pagina_successiva($pagina = NULL) { if($pagina == NULL) $pagina = $GLOBALS['DATI']["pagina"]; //mi copio il menu $MENU2 = $GLOBALS['MENU']; $c = 0; $find_next = ""; $key_curr = ""; $find_next_provvisorio = ""; while(list($k, $v)=each($MENU2) and $find_next == "") { $c++; $KEY[$c] = $k; if($k == $pagina) { //trovata pagina corrente $key_curr = $c; $KEY = array_reverse($KEY); reset($KEY); } //adesso cerco quella successiva dopo aver trovato la pagina corrente if($key_curr != "" and $k != $pagina and $MENU2[$k][$GLOBALS['lang']]['menu_pagina_vis'] == "SI" and $MENU2[$k][$GLOBALS['lang']]['protetta'] != "SI") { //mi salvo il primo che trovo if($find_next_provvisorio == "") $find_next_provvisorio = $k; if($MENU2[$k][$GLOBALS['lang']]['menu_ref'] == menu_riferimento(NULL,$pagina)) { //trovo la pagina dello stesso gruppo se c'e' (menu_ref) return $k; } } } //qui ho fatto tutto il giro in avanti, allora decido se tornare una pagina di gruppo diverso ... if($find_next_provvisorio != "" and $GLOBALS["DATI"]["menu_pagina_successiva_precedente"] == "TUTTE") { return $find_next_provvisorio; } else { return ""; } } function menu_tpl_corpo($tpl, $menu, $selezionato){ if(function_exists($tpl)) return $tpl($menu, $selezionato); else return $tpl; } //funzione per creare il menu, nella configurazione delle pagine imposto i vari parametri function menu($PARAM=NULL,$livello=NULL,$riferimento=NULL) { //d_info("menu"); global $MENU,$DATI,$CONF; //if($GLOBALS["CONF"]["DEBUG"] == "SI") d_info($PARAM, "MENU"); //creo struttura multilivello //se CONFIGURAZIONE viene passata come parametro, sovrascrive tutte le impostazioni precedenti //la configurazione iniziale viene ereditata prima di tutto da CONF, sovrascritta da DATI e sovrascritta da CONFIGURAZIONE if(is_array($PARAM)) $CONFIGURAZIONE = $PARAM; else { if($PARAM != NULL) $CONFIGURAZIONE["menu_tipo"] = $PARAM; if($livello != NULL) $CONFIGURAZIONE["menu_livello"] = $livello; if($riferimento != NULL) $CONFIGURAZIONE["menu_riferimento"] = $riferimento; } $CONFIGURAZIONE = array_merge($CONF, $DATI,(array)$CONFIGURAZIONE); //print $CONFIGURAZIONE["menu_riferimento"]; // da rivedere ??? //if($CONFIGURAZIONE["menu_livello"] != "0") { // if ($riferimento == NULL) $CONFIGURAZIONE["menu_riferimento"] = $DATI[pagina]; // else $CONFIGURAZIONE["menu_riferimento"] = $riferimento; //} //implemento CACHE APC if($DATI['indi_apc_menu'] == "SI" and isset($GLOBALS[apc_menu_key]) ) { $apc_menu_key2 = md5(serialize($CONFIGURAZIONE)).$GLOBALS[apc_menu_key]; $menu_output = apc_fetch($apc_menu_key2); if($menu_output) { if($GLOBALS["CONF"]["DEBUG"] == "SI") d_info($apc_menu_key2, "MENU -> APC"); return $menu_output; } } //annullo tutto se decido di non visualizzare il menu if($CONFIGURAZIONE["menu_vis"] == "NO") return ""; if(function_exists($CONFIGURAZIONE["menu_tpl_corpo"])){ if($CONFIGURAZIONE["menu_tpl_corpo_sel"]) trigger_error("E' stata passata una funzione menu_tpl_corpo quindi menu_tpl_corpo_sel verrà ignorato"); $CONFIGURAZIONE["menu_tpl_corpo_sel"] = $CONFIGURAZIONE["menu_tpl_corpo"]; } $pagina = $CONFIGURAZIONE["pagina"]; $lang = $CONFIGURAZIONE["lang"]; //imposto riferimento di ROOT $ref_start = $CONFIGURAZIONE["menu_riferimento"]; $ref_lev = $CONFIGURAZIONE["menu_livello"]; $livello_ref_start = menu_livello($ref_start); if($CONFIGURAZIONE["menu_riferimento"] == "root") $riferimento_pagina = menu_riferimento($CONFIGURAZIONE["menu_livello"]); else $riferimento_pagina = menu_riferimento($CONFIGURAZIONE["menu_livello"],$CONFIGURAZIONE["menu_riferimento"]); reset($MENU); $MENU_ARRAY = array(); while(list($k, $pg)=each($MENU)) { //d("$k"); while(list($k, $menu)=each($pg)) { if($k == $lang) { //trovo livello pagina corrente if(isset($menu["pagina"])) $livello_pagina = menu_livello($menu["pagina"]); else $livello_pagina = 0; $menu["livello"] = $livello_pagina; //controllo ALL ??? if($CONFIGURAZIONE["menu_escludi_figlie"] != "") $rif_orig_pagina = $menu["menu_ref"]; if($CONFIGURAZIONE["menu_riferimento"] == "ALL") $menu["menu_ref"] = $riferimento_pagina; if($CONFIGURAZIONE["menu_livello"] == "ALL") { if($CONFIGURAZIONE["menu_riferimento"] != "ALL") { //print $livello_pagina; $menu["menu_ref"] = menu_riferimento($livello_ref_start+1,$menu["pagina"]); $riferimento_pagina = $ref_start; } $livello_pagina = $CONFIGURAZIONE["menu_livello"]; } //decido se visualizzare la pagina if($CONFIGURAZIONE["menu_includi_solo"]){ $visibile_f = in_array($menu['pagina'], $CONFIGURAZIONE["menu_includi_solo"]); } else{ if($menu['menu_pagina_vis'] == "SI") $visibile = 1; else $visibile = 0; if($CONFIGURAZIONE["menu_escludi"] != "") { $ARR = explode("|",$CONFIGURAZIONE["menu_escludi"]); while(list($k, $v)=@each($ARR)) { if($v == $menu['pagina']){ $visibile = 0; } } } //escludo figlie if($CONFIGURAZIONE["menu_escludi_figlie"] != "") { //d_err($CONFIGURAZIONE["menu_escludi_figlie"]); //if(indi_cerca($CONFIGURAZIONE["menu_escludi_figlie"],$menu["menu_ref"])) $visibile = 0; $ARR = explode("|",$CONFIGURAZIONE["menu_escludi_figlie"]); //$ARR = $CONFIGURAZIONE["menu_escludi_figlie"]; while(list($k, $v)=@each($ARR)) { if($v == $rif_orig_pagina){ $visibile = 0; } } } //inclusione forzata if($CONFIGURAZIONE["menu_includi_force"] != "") { $visibile_f = false; $ARR = explode("|",$CONFIGURAZIONE["menu_includi_force"]); while(list($k, $v)=@each($ARR)) { if($v == $menu['pagina']) $visibile_f = true; } } } if( ( ($menu["menu_from"] == $CONFIGURAZIONE["menu_from_vis"] or $CONFIGURAZIONE["menu_from_vis"] == "ALL") and $livello_pagina == $CONFIGURAZIONE["menu_livello"] and $menu["menu_ref"] == $riferimento_pagina and ($menu["menu_gruppo"] == $CONFIGURAZIONE["menu_gruppo_vis"] or $CONFIGURAZIONE["menu_gruppo_vis"] == "ALL") and $visibile === 1 and ($menu['protetta'] != "SI" or $CONFIGURAZIONE["menu_includi_protette"] == "SI") ) or $visibile_f ) { $riferimento0 = ""; $riferimento1 = ""; $riferimento2 = ""; $riferimento3 = ""; $riferimento4 = ""; $riferimento0 = $pagina; if(isset($MENU[$riferimento0][$lang]['menu_ref'])){ $riferimento1 = $MENU[$riferimento0][$lang]['menu_ref']; if(isset($MENU[$riferimento1][$lang]['menu_ref'])){ $riferimento2 = $MENU[$riferimento1][$lang]['menu_ref']; if(isset($MENU[$riferimento2][$lang]['menu_ref'])){ $riferimento3 = $MENU[$riferimento2][$lang]['menu_ref']; if(isset($MENU[$riferimento3][$lang]['menu_ref'])){ $riferimento4 = $MENU[$riferimento3][$lang]['menu_ref']; } } } } //trovo sottolivello ??? da fare con array if($menu["pagina"] == $riferimento0 or $menu["pagina"] == $riferimento1 or $menu["pagina"] == $riferimento2 or $menu["pagina"] == $riferimento3 or $menu["pagina"] == $riferimento4 or $menu["pagina"] == $riferimento5) $dove_sono = 1; else $dove_sono = 0; //MULTILIVELLO if(($dove_sono != 0 and $CONFIGURAZIONE["menu_multi"] == "SI") or $CONFIGURAZIONE["menu_multi_all"] != "") $multi = "#MMUL#"; else $multi = ""; if($CONFIGURAZIONE["menu_multi_all"] == "SI") $multi = "#MMUL-$menu[pagina]#"; //SEPARATORE SI NO if($menu["menu_sep"] == "SI") { $sep_sx = "<1>"; $sep_dx = "<2>"; } else { $sep_sx = ""; $sep_dx = ""; } //DA CAMBIARE MENU PERSONALIZZATO if($menu["menu_src"] != "") { //controllo presenza di testo, senno' metto nome pagina //creo il codice //controllo inizio fine if($dove_sono and $CONFIGURAZIONE["menu_link_sempre"] != "SI") $out .= $sep_sx.$menu["menu_src_s"].$multi.$sep_dx; else $out .= $sep_sx.$menu["menu_src"].$multi.$sep_dx; } else { //############################################ //######### MENU TEMPLATIZZATO (TPL) ######### //############################################ //mi serve la variabile selezionata if($CONFIGURAZIONE["menu_tipo"] == "TPL") { //contatore $menu_tpl_cont++; $menu["menu_tpl_cont"] = $menu_tpl_cont; //codice per alternare QUALUNQUE COSA $menu_tpl_alt_cont++; $menu_tpl_alt = explode("|",$CONFIGURAZIONE["menu_tpl_alt"]); $menu_tpl_alt_num = count($menu_tpl_alt); $menu["menu_tpl_alt"] = $menu_tpl_alt[$menu_tpl_alt_cont-1]; if($menu_tpl_cont % $menu_tpl_alt_num == 0) $menu_tpl_alt_cont = 0; // $TPL_ENTRATO = 1; //eval pre if($CONFIGURAZIONE["menu_tpl_eval_pre"] != "") eval($CONFIGURAZIONE["menu_tpl_eval_pre"]); //aggiungo variabile menu_tpl_sel if($dove_sono) $menu["menu_sel"] = $CONFIGURAZIONE["menu_tpl_sel"]; else $menu["menu_sel"] = $CONFIGURAZIONE["menu_tpl_nosel"]; //controllo presenza di testo, senno' metto nome pagina if($menu["menu_no_link"] and $CONFIGURAZIONE["menu_tpl_no_link"] != "") { if($dove_sono and $CONFIGURAZIONE["menu_tpl_no_link_sel"] != "") $riga_out = $sep_sx.$CONFIGURAZIONE["menu_tpl_no_link_sel"].$sep_dx; else $riga_out = $sep_sx.$CONFIGURAZIONE["menu_tpl_no_link"].$sep_dx; } else { if($dove_sono and $CONFIGURAZIONE["menu_tpl_corpo_sel"] != "") $riga_out = $sep_sx.menu_tpl_corpo($CONFIGURAZIONE["menu_tpl_corpo_sel"], $menu, true).$sep_dx; else $riga_out = $sep_sx.menu_tpl_corpo($CONFIGURAZIONE["menu_tpl_corpo"], $menu, false).$sep_dx; } //eval post se e' definito eval lo eseguo if($CONFIGURAZIONE["menu_tpl_eval_post"] != "") eval($CONFIGURAZIONE["menu_tpl_eval_post"]); if($CONFIGURAZIONE["menu_tpl_func_post"] != "") $CONFIGURAZIONE["menu_tpl_func_post"]($menu, $riga_out); //$riga_out = indi_tpl($riga_out,$menu); $riga_out = indi_tpl($riga_out,$menu,0,"Q"); $riga_out = indi_tpl($riga_out,$menu,1,"Q"); $out .= $riga_out; if($CONFIGURAZIONE["menu_output"] == "array") { $MENU_ARRAY[] = $riga_out; } } else if($CONFIGURAZIONE["menu_tipo"] == "array" || is_array($CONFIGURAZIONE["menu_tipo"])) { if(is_array($CONFIGURAZIONE["menu_tipo"])) { foreach($CONFIGURAZIONE["menu_tipo"] as $k) $MENU_ARRAY[$menu['pagina']][$k] = $menu[$k]; } else $MENU_ARRAY[$menu['pagina']] = $menu; } // ######### MENU TESTUALE else if($CONFIGURAZIONE["menu_tipo"] == "TXT") { //controllo presenza di testo, senno' metto nome pagina if ($menu["menu_txt"] != "") $txt = $menu["menu_txt"]; else $txt = $menu["nome"]; //creo il codice if($dove_sono and $CONFIGURAZIONE["menu_link_sempre"] != "SI") $out .= $sep_sx.$CONFIGURAZIONE[menu_txt_sel_sx].$txt.$CONFIGURAZIONE[menu_txt_sel_dx].$multi.$sep_dx; else $out .= $sep_sx.''.$txt.''.$multi.$sep_dx; } else if($CONFIGURAZIONE["menu_tipo"] == "FLASH") { // $txt = menu_tpl_sos($CONFIGURAZIONE[menu_tpl],$menu); //creo il codice $out .= $sep_sx.$CONFIGURAZIONE[menu_txt_sel_sx].$txt.$CONFIGURAZIONE[menu_txt_sel_dx].$multi.$sep_dx; } // ######### MENU IMMAGINE else if($CONFIGURAZIONE["menu_tipo"] == "IMG") { //controllo presenza alt, senno' metto nome pagina if ($menu["menu_txt"] != "") $alt = $menu["menu_txt"]; else $alt = $menu["nome"]; $alt = encode($alt); //creo il nome immagine if($dove_sono) $sel = $CONFIGURAZIONE["menu_img_sel"]; else $sel = ""; // $path_img = $CONFIGURAZIONE["dir_pic"].$CONFIGURAZIONE["menu_img_path"].$menu["lang"].'/'.$menu["pagina"].$sel.$CONFIGURAZIONE["menu_img_ext"]; $path_img = $CONFIGURAZIONE["dir_pic"].$CONFIGURAZIONE["menu_img_path"].$menu["lang"].'/'.$menu["pagina"].$sel.$CONFIGURAZIONE["menu_img_ext"]; $size = @getimagesize($path_img); $img = ''.$alt.''; //creo il codice if($dove_sono and $CONFIGURAZIONE['menu_link_sempre'] != "SI") { $out .= $sep_sx.$img.$multi.$sep_dx; } else { if (isset($CONFIGURAZIONE["menu_aggiungi_parametri"])) { $out .= $sep_sx.''.$img.''.$multi.$sep_dx; } else { $out .= $sep_sx.''.$img.''.$multi.$sep_dx; } } } else if($CONFIGURAZIONE["menu_tipo"] == "IMG_OVER") { //aggiungo javascript $DATI["window.onload:prepareImageSwap(document.body)"] = "vis"; //controllo presenza alt, senno' metto nome pagina if ($menu["menu_txt"] != "") $alt = $menu["menu_txt"]; else $alt = $menu["nome"]; $alt = encode($alt); //creo il nome immagine if($dove_sono) $path_img = $CONFIGURAZIONE["dir_pic"].$CONFIGURAZIONE["menu_img_path"].$menu["lang"].'/'.$menu["pagina"]."_hv.gif"; else $path_img = $CONFIGURAZIONE["dir_pic"].$CONFIGURAZIONE["menu_img_path"].$menu["lang"].'/'.$menu["pagina"]."_nm.gif"; $size = @getimagesize($path_img); $img = ''.$alt.''; //creo il codice if($dove_sono and $CONFIGURAZIONE[menu_link_sempre] != "SI") $out .= $sep_sx.$img.$multi.$sep_dx; else $out .= $sep_sx.''.$img.''.$multi.$sep_dx; } } } } } } if($CONFIGURAZIONE["menu_tipo"] == "TXT" or $CONFIGURAZIONE["menu_tipo"] == "FLASH") { $out = str_replace("<2><1>",$CONFIGURAZIONE[menu_txt_sep],$out); $out = str_replace("<1>",$CONFIGURAZIONE[menu_txt_sep_sx],$out); $out = str_replace("<2>",$CONFIGURAZIONE[menu_txt_sep_dx],$out); } if($CONFIGURAZIONE["menu_tipo"] == "IMG") { $out = str_replace("<2><1>",$CONFIGURAZIONE[menu_img_sep],$out); $out = str_replace("<1>",$CONFIGURAZIONE[menu_img_sep_sx],$out); $out = str_replace("<2>",$CONFIGURAZIONE[menu_img_sep_dx],$out); } if($CONFIGURAZIONE["menu_tipo"] == "IMG_OVER") { $out = str_replace("<2><1>",$CONFIGURAZIONE[menu_img_sep],$out); $out = str_replace("<1>",$CONFIGURAZIONE[menu_img_sep_sx],$out); $out = str_replace("<2>",$CONFIGURAZIONE[menu_img_sep_dx],$out); } //controllo anche che esista almeno una pagina per stampare il template if($CONFIGURAZIONE["menu_tipo"] == "TPL" and $TPL_ENTRATO) { $out = $CONFIGURAZIONE["menu_tpl_testa"].$out.$CONFIGURAZIONE["menu_tpl_coda"]; $out = indi_tpl($out,$CONFIGURAZIONE,1,"Q"); //controllo se nel menu c'e' il tag sep, per capire la modalita' da adottare if(stristr($out,"")) { $out = str_replace("<1>","",$out); $out = str_replace("<2>","",$out); $out = str_replace("",$CONFIGURAZIONE["menu_tpl_sep"],$out); $out = str_replace("","",$out); } else { //separatore $out = str_replace("<2><1>",$CONFIGURAZIONE["menu_tpl_sep"],$out); $out = str_replace("<1>","",$out); $out = str_replace("<2>","",$out); } } if($CONFIGURAZIONE["menu_tipo"] == 'array' || is_array($CONFIGURAZIONE["menu_tipo"])) { return $MENU_ARRAY; } else if($CONFIGURAZIONE["menu_output"] == "array") { unset($out); $out["testa"] = $CONFIGURAZIONE["menu_tpl_testa"]; $out["coda"] = $CONFIGURAZIONE["menu_tpl_coda"]; while(list($a_k, $a_pagina)=@each($MENU_ARRAY)) { $out_pagina = str_replace("<2><1>",$CONFIGURAZIONE["menu_tpl_sep"],$a_pagina); $out_pagina = str_replace("<1>","",$out_pagina); $out_pagina = str_replace("<2>","",$out_pagina); $out_pagina = indi_tpl($out_pagina,$CONFIGURAZIONE,1,"Q"); $out["corpo"][$a_k] = $out_pagina; } } //CACHE if($DATI['indi_apc_menu'] == "SI" and isset($apc_menu_key2)) apc_store($apc_menu_key2, $out, $DATI['indi_apc_menu_time']); //if($GLOBALS["CONF"]["DEBUG"] == "SI") d_info("Fine", "MENU"); return $out; //return encode($out); } //estrae parametro dall' array MENU function menu_estrai($variabile,$pagina=NULL,$lang=NULL) { if($variabile) { if($lang == NULL) $lang = $GLOBALS['DATI']['lang']; if($pagina == NULL) $pagina = $GLOBALS['DATI']['pagina']; return $GLOBALS[MENU][$pagina][$lang][$variabile]; } else return FALSE; } function menu_livello($pagina=NULL,$lang=NULL) { global $MENU,$DATI; if($lang == NULL) $lang = $DATI["lang"]; if($pagina == NULL) $pagina = $DATI["pagina"]; $riferimento0 = ""; $riferimento1 = ""; $riferimento2 = ""; $riferimento3 = ""; $riferimento4 = ""; if(isset($MENU[$pagina][$lang]['menu_ref'])){ $riferimento0 = $MENU[$pagina][$lang]['menu_ref']; if(isset($MENU[$riferimento0][$lang]['menu_ref'])){ $riferimento1 = $MENU[$riferimento0][$lang]['menu_ref']; if(isset($MENU[$riferimento1][$lang]['menu_ref'])){ $riferimento2 = $MENU[$riferimento1][$lang]['menu_ref']; if(isset($MENU[$riferimento2][$lang]['menu_ref'])){ $riferimento3 = $MENU[$riferimento2][$lang]['menu_ref']; if(isset($MENU[$riferimento3][$lang]['menu_ref'])){ $riferimento4 = $MENU[$riferimento3][$lang]['menu_ref']; } } } } } //trovo livello della pagina if ($riferimento0 == "root") return 0; if ($riferimento1 == "root") return 1; if ($riferimento2 == "root") return 2; if ($riferimento3 == "root") return 3; if ($riferimento4 == "root") return 4; } //funzione trova riferimento in base al livello e alla pagina di partenza function menu_riferimento($livello=NULL,$pagina=NULL,$lang=NULL) { global $MENU,$DATI; if($lang == NULL) $lang = $DATI["lang"]; if($pagina == NULL) $pagina = $DATI["pagina"]; if($livello == NULL) $livello = menu_livello($pagina,$lang); //$livello_corrente = menu_livello($DATI["pagina"],$DATI["lang"]); //$lev = $livello_corrente-$livello; //print "|$lev|"; //if($lev == "0") return $MENU[$pagina][$lang][menu_ref]; $riferimento0 = ""; $riferimento1 = ""; $riferimento2 = ""; $riferimento3 = ""; $riferimento4 = ""; //creo i riferimenti in ordine inverso $riferimento0 = $pagina; $riferimento1 = $MENU[$riferimento0][$lang]['menu_ref']; $riferimento2 = $MENU[$riferimento1][$lang]['menu_ref']; $riferimento3 = $MENU[$riferimento2][$lang]['menu_ref']; $riferimento4 = $MENU[$riferimento3][$lang]['menu_ref']; $riferimento0 = $pagina; if(isset($MENU[$riferimento0][$lang]['menu_ref'])){ $riferimento1 = $MENU[$riferimento0][$lang]['menu_ref']; if(isset($MENU[$riferimento1][$lang]['menu_ref'])){ $riferimento2 = $MENU[$riferimento1][$lang]['menu_ref']; if(isset($MENU[$riferimento2][$lang]['menu_ref'])){ $riferimento3 = $MENU[$riferimento2][$lang]['menu_ref']; if(isset($MENU[$riferimento3][$lang]['menu_ref'])){ $riferimento4 = $MENU[$riferimento3][$lang]['menu_ref']; } } } } if ($riferimento0 != "root" and $riferimento0 != "") $REF[0] = $riferimento0; if ($riferimento1 != "root" and $riferimento1 != "") $REF[1] = $riferimento1; if ($riferimento2 != "root" and $riferimento2 != "") $REF[2] = $riferimento2; if ($riferimento3 != "root" and $riferimento3 != "") $REF[3] = $riferimento3; if ($riferimento4 != "root" and $riferimento4 != "") $REF[4] = $riferimento4; if ($riferimento5 != "root" and $riferimento5 != "") $REF[5] = $riferimento5; $REF[] = "root"; $REF = array_reverse($REF); //???? if(isset($REF[$livello])) return $REF[$livello]; } // MENU MULTILIVELLO function menu_multi($M){ global $MENU,$DATI; if($lang == NULL) $lang = $DATI["lang"]; if($pagina == NULL) $pagina = $DATI["pagina"]; $M[0] = array_merge($M[A],$M[0]); $M[1] = array_merge($M[A],$M[1]); $M[2] = array_merge($M[A],$M[2]); //$M[0][menu_multi] = "SI"; if($M[0][menu_livello] == "") $M[0][menu_livello] = "0"; //$M[1][menu_multi] = "SI"; if($M[1][menu_livello] == "") $M[1][menu_livello] = "1"; //$M[2][menu_multi] = "SI"; if($M[2][menu_livello] == "") $M[2][menu_livello] = "2"; //monto il menu //forzo l' opzione multi $m1 = menu($M[0]); $m2 = menu($M[1]); $m3 = menu($M[2]); //creo il menu $m = str_replace("#MMUL#",$m2,$m1); $m = str_replace("#MMUL#",$m3,$m); $m = str_replace("#MMUL#","",$m); return $m; } function menu_multi_all($M){ global $MENU,$DATI; if($lang == NULL) $lang = $DATI["lang"]; if($pagina == NULL) $pagina = $DATI["pagina"]; $M[0] = array_merge($M[A],(array)$M[0]); $M[1] = array_merge($M[A],(array)$M[1]); $M[2] = array_merge($M[A],(array)$M[2]); $M[3] = array_merge($M[A],(array)$M[3]); $M[0]['menu_multi_all'] = "SI"; if($M[0]['menu_livello'] == "") $M[0]['menu_livello'] = "0"; $M[1]['menu_multi_all'] = "SI"; if($M[1]['menu_livello'] == "") $M[1]['menu_livello'] = "1"; $M[2]['menu_multi_all'] = "SI"; if($M[2]['menu_livello'] == "") $M[2]['menu_livello'] = "2"; //monto il menu //root $m0 = menu($M[0]); //print_r($m0); //mi creo tutti i menu di tutti i riferimenti di livello 1 //copio conf $M_TMP = $M[1]; $MENU_TMP = $MENU; reset($MENU_TMP); while(list($k, $v)=each($MENU_TMP)) { $lev = menu_livello($k); if($lev == "0") { $M_TMP['menu_riferimento'] = "$k"; $M_TMP['menu_livello'] = "1"; $m_tmp = menu($M_TMP); $m0 = str_replace("#MMUL-$k#",$m_tmp,$m0); } } $M_TMP = $M[2]; $MENU_TMP = $MENU; reset($MENU_TMP); while(list($k, $v)=each($MENU_TMP)) { $lev = menu_livello($k); if($lev == "1") { $M_TMP['menu_riferimento'] = "$k"; $M_TMP['menu_livello'] = "2"; $m_tmp = menu($M_TMP); $m0 = str_replace("#MMUL-$k#",$m_tmp,$m0); } } $M_TMP = $M[2]; $MENU_TMP = $MENU; while(list($k, $v)=each($MENU_TMP)) { $lev = menu_livello($k); if($lev == "2") { $m0 = str_replace("#MMUL-$k#","",$m0); } } //pulisco $m0 = str_replace("#MMUL#","",$m0); return $m0; } function menu_multi_tpl($M){ d_info("menu_multi_tpl"); global $MENU,$MENU_REF,$DATI; if(menu_is_modificato()) { //potrebbero esserci dei problemi perche' l' array $MENU_REF non è aggiornato //indi_debug("menu_multi_tpl(): menu_is_modificato() TRUE ","damiano@tnx.it"); } //$apckey = md5(serialize($CONFIGURAZIONE))."menu_multi_tpl"; //$m = apc_fetch($apckey); //if ($m != null) return $m; if(is_array($M[0])) $M[0] = array_merge((array)$M['A'],(array)$M[0]); if(is_array($M[1])) $M[1] = array_merge((array)$M['A'],(array)$M[1]); if(is_array($M[2])) $M[2] = array_merge((array)$M['A'],(array)$M[2]); if(is_array($M[3])) $M[3] = array_merge((array)$M['A'],(array)$M[3]); if(is_array($M[4])) $M[4] = array_merge((array)$M['A'],(array)$M[4]); $M[0]['menu_multi_all'] = "SI"; if($M[0]['menu_livello'] == "") $M[0]['menu_livello'] = "0"; $M[1]['menu_multi_all'] = "SI"; if($M[1]['menu_livello'] == "") $M[1]['menu_livello'] = "1"; $M[2]['menu_multi_all'] = "SI"; if($M[2]['menu_livello'] == "") $M[2]['menu_livello'] = "2"; $M[3]['menu_multi_all'] = "SI"; if($M[3]['menu_livello'] == "") $M[3]['menu_livello'] = "3"; $M[4]['menu_multi_all'] = "SI"; if($M[4]['menu_livello'] == "") $M[4]['menu_livello'] = "4"; //monto il menu //root $m0 = menu($M[0]); //d_err($MENU_REF); d_info("menu_multi_tpl 0 finito"); //mi creo tutti i menu di tutti i riferimenti di livello 1 //copio conf $MENU_TMP = $MENU; if($M[1]['menu_tpl_corpo'] != "") { $M_TMP = $M[1]; reset($MENU_TMP); while(list($k, $v)=each($MENU_TMP)) { $lev = menu_livello($k); if($lev == $M[1]['menu_livello']-1) { $M_TMP['menu_riferimento'] = "$k"; $M_TMP['menu_livello'] = $M[1]['menu_livello']; if(!$M['A']["#MMUL-$k#"] and $MENU_REF[$k]) { $m_tmp = menu($M_TMP); $m0 = str_replace("#MMUL-$k#",$m_tmp,$m0); } else { $m0 = str_replace("#MMUL-$k#",$M['A']["#MMUL-$k#"],$m0); } } } } else { return $m0; } d_info("menu_multi_tpl 1 finito"); if($M[2]['menu_tpl_corpo'] != "") { $M_TMP = $M[2]; reset($MENU_TMP); while(list($k, $v)=each($MENU_TMP)) { $lev = menu_livello($k); if($lev == $M[2]['menu_livello']-1) { $M_TMP['menu_riferimento'] = "$k"; $M_TMP['menu_livello'] = $M[2]['menu_livello']; if($MENU_REF[$k]) { $m_tmp = menu($M_TMP); $m0 = str_replace("#MMUL-$k#",$m_tmp,$m0); } else { $m0 = str_replace("#MMUL-$k#","",$m0); } } } } else { return $m0; } d_info("menu_multi_tpl 2 finito"); if($M[3]['menu_tpl_corpo'] != "") { $M_TMP = $M[3]; reset($MENU_TMP); while(list($k, $v)=each($MENU_TMP)) { $lev = menu_livello($k); if($lev == $M[3]['menu_livello']-1) { $M_TMP['menu_riferimento'] = "$k"; $M_TMP['menu_livello'] = $M[3]['menu_livello']; if($MENU_REF[$k]) { $m_tmp = menu($M_TMP); $m0 = str_replace("#MMUL-$k#",$m_tmp,$m0); } else { $m0 = str_replace("#MMUL-$k#","",$m0); } } } } else { // apc_store($apckey, $m0, 3600); d_info("menu_multi_tpl 3 exit"); return $m0; } d_info("menu_multi_tpl 3 finito"); if($M[4]['menu_tpl_corpo'] != "") { $M_TMP = $M[4]; reset($MENU_TMP); while(list($k, $v)=each($MENU_TMP)) { $lev = menu_livello($k); if($lev == $M[4]['menu_livello']-1) { $M_TMP['menu_riferimento'] = "$k"; $M_TMP['menu_livello'] = $M[4]['menu_livello']; if($MENU_REF[$k]) { $m_tmp = menu($M_TMP); $m0 = str_replace("#MMUL-$k#",$m_tmp,$m0); } else { $m0 = str_replace("#MMUL-$k#","",$m0); } } } } else { // apc_store($apckey, $m0, 3600); d_info("menu_multi_tpl 4 exit"); return $m0; } d_info("menu_multi_tpl 4 finito"); // if($M[3]['menu_tpl_corpo'] != "") { // $M_TMP = $M[3]; // $MENU_TMP = $MENU; // while(list($k, $v)=each($MENU_TMP)) { // $lev = menu_livello($k); // if($lev == $M[3][menu_livello]-1) { // $m0 = str_replace("#MMUL-$k#","",$m0); // } // // } // d_info("MMM-fine"); // } else { // // return $m0; // // } // apc_store($apckey, $m0, 3600); d_info("menu_multi_tpl exit"); return $m0; } //PRENDE UN MENU DA UN ARRAY PRONTO function menu_test($tipo="LIS"){ //tabella //lista //div $LIS = array( "menu_tipo" => "TPL", "menu_tpl_testa" => "", ); return menu($$tipo); } //con indi set function menu2($CONF){ return menu(indi_set($CONF)); } function menu_indi($CONF){ return menu(indi_set($CONF)); } //sostituisce un campo dell' array passato all' identificativo parentesi graffe function menu_tpl_sos($testo,$ARR) { if(!strpos($testo,"}")) return $testo; $pattern = '/{([^}{]*?)}/si'; if (preg_match_all ($pattern, $testo, $matches)) { // nl2br(print_r ($matches)); } else { //return $testo; } while(list($k, $v)=@each($matches[1])) { //effettua la sostituzione senza lasciare traccia $REP[$k] = $ARR[$v]; } $out = str_replace($matches[0], $REP, $testo); return $out; } function menu_tpl_format ($campo){ //$campo = explode("=>",$campo); return $campo; } //funzione di associazione per menu di indi function menu_db($CONF) { global $DATI; $CONF = indi_set($CONF); if(isset($CONF["query"])){ $R = db_q($CONF["query"]); if(is_array($R)) { //controlo accpppiamenti } else d_err("Query nulla","mod_menu"); } } //funzione semplice di menu function menu_array($profondita = -1, $ref = "root"){//se passo -1 come profondità fa tutti i livelli global $MENU, $lang; $return = array(); ${"MENU"+$profondita} = $MENU;//duplico l'array perchè se no chiamandola ricorsivamente sposta il puntatore foreach(${"MENU"+$profondita} as $id=>$pagina){ if($MENU[$id][$lang]["menu_ref"] == $ref && $MENU[$id][$lang]["menu_pagina_vis"] == "SI"){ $return_i = $MENU[$id]; if($profondita){ $return_i["FIGLI"] = menu_array($profondita-1, $id); if(!$return_i["FIGLI"]) unset($return_i["FIGLI"]); } $return[$id] = $return_i; } } return $return; } ?>