", 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 = '
';
//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 = '
';
//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;
}
?>