Joomla.it Forum
Non solo Joomla... => Sviluppo => : _Ardito87_ 19 Dec 2013, 18:27:17
-
Ciao a tutti,
mi serve recuperare l'itemid della voce di menu che seleziono.
Se non avessi attivato la modalita seo url_frielndly avrei potuto utilizzare Request::getVar('Itemid').
Mi serve recuperare l'item id prima che joomla carichi tutte le voci menu nella memoria, quindi questo non mi permette di usare JSite::getMenu()->getActive()->id, in quanto mi serve prima che Joomla crei il menu.
Non riesco a trovare una soluzione... eppure joomla penso che dovra riconveritire url_friendly in un url che puo' utilizzare recuperando tutti gli attributi dell url normale tra cui itemid
-
JRequest::getInt('Itemid') forse sarebbe meglio; comunque joomla ricrea la variabile durante il processo di inizializzazione del framework e pertanto la è disponibile.
l'unico modo di accedere al sistema, te lo scrivo ma non ho capito che vuoi fare, prima che joomla carichi i menù è un plugin di tipo system legato a onAfterInitialise.
ciao.
-
La prima query che joomla fa è questa:
SELECT m.id, m.menutype, m.title, m.alias, m.note, m.path AS route, m.link, m.type, m.level, m.language,m.browserNav, m.access, m.params, m.home, m.img, m.template_style_id, m.component_id, m.parent_id,e.element as component
FROM ff1xp_menu AS m
LEFT JOIN ff1xp_extensions AS e
ON m.component_id = e.extension_id
WHERE m.published = 1
AND m.parent_id > 0
AND m.client_id = 0
ORDER BY m.lft
Una cosa che trovo che vada bene per il 99%dei siti. Il mio sito ha circa 8000 voci di meno, il processo legato a quella query è di circa 2 secondi, in tutti i siti si aggira sui 0.4 secondi.
In locale ho pensato ma se invece di caricare tutte le voci di menu carico solo quelle che verrano visualizzate nella pagina selezionata?
In locale ho implementato quello che volevo andando a recuperare solo i menu e le voci di menu che sono inseriti nella pagina che voglio visualizzare. Bene funziona tutto e il tempo è diminuti a 0.5secondi.
Porto la modifica in rete e non funziona. Perche' in locale non ho attivo user_friendly quindi in ogni url ho l'attributo itemid che posso recuperare con Request::getVar('Itemid').
In remoto questo non lo posso fare perchè ho attivo l'user-friendly.
Potresti farmi capire cosa intendevi con un plugin di tipo system legato a onAfterInitialise??
Grazie mille
-
ok, ora comincia ad avere un senso :)
la prima cosa che proverei è implementare la cache in mysql, ma questo richiede che il server sia tuo.
la query indicata viene eseguita sempre, ma almeno dopo la la fase di inizializzazione, quindi lo spazio per scrivere un plugin c'è. ma prima di gettarsi nel coding, dimmi, come hai fatto la modifica indicata?
hai modificato direttamente la classe JMenuSite o come?
ciao
-
Grazie mille per risposte...
Ho modificato la classe JMenuSite che estende JMenu in questo modo:
$itemid = JRequest::getInt('Itemid');
//recupero i menu presenti in tutte le pagine
$db =& JFactory::getDBO();
$query = "Select params from #__modules_menu MM, #__modules M where MM.menuid=0 and MM.moduleid=M.id and M.module IN ('mod_menu','mod_accordeonck') and language='it-IT'";
$db->setQuery($query);
$result1=$db->loadObjectList();
$result2=array();
//recupero i menu presenti nella pagina desiderata
if($itemid!=""){
$db =& JFactory::getDBO();
$query = "Select params from #__modules_menu MM, #__modules M where MM.menuid=".$itemid." and MM.moduleid=M.id and M.module IN ('mod_menu','mod_accordeonck') and language='it-IT'";
$db->setQuery($query);
$result2=$db->loadObjectList();
}
$result= array_merge($result1,$result2);
$menutype="";
//echo print_r($result);
foreach($result as $r){
$a = json_decode($r->params);
if(!strstr($menutype,$a->menutype));
$menutype.="'".$a->menutype."',";
}
poi ho aggiungo questa riga quando effettua quella query
$query->where('m.menutype IN ('.$menutype.')');
-
sul codice mi fido ciecamente...
dai un'occhiata alla tabella #__ menu, il field `path` dovrebbe consentirti di risalire all'Itemid dall'url sef.
inutile parlare di plugin, se hai modificato il codice di joomla inserisci anche questo lookup nel file stesso.
ciao
-
Ciao si in effetti cosi potrei risolvere, ti ringrazio.
Strano però che joomla effettui quella query, non capisco proprio perchè hanno implementato quella cosa in questo modo.
Ciao e grazie
-
perché in più del 99% dei siti è molto più efficiente prendere l'intero menù che non effettuare più queries, lo hai detto tu... ;D ;D
ciao