Webes feladatok

+ Egyedi weboldal készítése
+ Webáruház készítése
+ Domain, tárhely intézés

... bővebben

Joomla weboldalak

+ Adminisztráció
+ Egyedi modulok, komponensek
+ Kinézet (template) készítés
+ Problémamegoldás

... bővebben

Xmap és Virtuemart - menüpont nélkül

2009. június 07. vasárnap, 17:47

Vannak olyan esetek, amikor menüpontot kell beszúrni egy menübe ahhoz, hogy egy másik komponens megfelelően működjön. Ilyen eset lehet például az, ha modulpozíciókat akarunk kötni VM-hez, ekkor kell egy Virtuemart-ra mutató menüpont, ugyanis csak ekkor keletkezik ItemId. Ha nem akarjuk megjeleníteni a menüsorban, nem gond, ugyanis a modulpozícióhoz kötés működik inaktív menüponttal is.

Oldaltérkép generáláshoz mindig is az XMap nevű Joomla komponenst használtam, így a jelen esetben is ezt fogtam munkára. Azonban ahhoz, hogy Virtuemart linkeket kapjak, szükség van egy megjelenített, a webshopra mutató menüpontra. Egy kicsi XMap kód túrás és így a megoldás a tovább után.

Módosított XMap verzió: 1.1.2

Megoldás

Elképzelhető a probléma kiküszöbölése új menü létrehozásával (és eltüntetésével -- CSS), de az nem túl elegáns megoldás. Így hát marad a kódmodifikáció.

Az oldaltérkép megjelenítéséért az XMap frontend része felelős, természetesen erősen megtámogatva az admin részen belül található osztályokkal (A megoldáshoz nincs szükség ezekre).

Az egyetlen szerkesztendő fájl: ../components/com_xmap/xmap.php

printMenuTree() fv-n belül (306. sor):

Először is át kell írni az SQL kérést, hogy ne legyen korlátozó kondíció a published vizsgálat. Ehhez ki kell venni a m.published='1' AND részt és be kell illeszteni a SELECT listába a m.published mezőt.

Tehát az SQL kérésnek így kell kinéznie:

 
$sql = "SELECT m.id, m.name, m.parent, m.link, m.type, m.browserNav,
m.menutype, m.ordering, m.params, m.componentid,m.home, c.name AS component, m.published"
 . "\n FROM #__menu AS m"
 . "\n LEFT JOIN #__components AS c ON m.type='components' AND c.id=m.componentid"
 . "\n WHERE m.parent=".$menu->id." AND m.menutype = '".$menu->menutype."'"
 . ( $this->noauth ? '' : "\n AND m.access <= '". $this->gid ."'" )
 . "\n ORDER BY m.menutype,m.parent,m.ordering";
 

A következő lépés a rekurzív iteráció apró módosítása, hogy csak azokat az elemeket vizsgálja, amik aktívak vagy a Virtuemart-ra mutatnak.

Sor száma: 326. sor (a foreach-on belül):

 
if (($item->published == '1') or (strpos($item->link, 'virtuemart') > -1)) {
 

Ne felejtsük el lezárni az If-et!( XmapPlugins::printTree( $this, $item, $cache, $extensions ); utáni sorba kell rakni. )

ui. Figyelni kell arra, hogy a kukában ne maradjon semmilyen menüpont, mert bezavarhat. (Nálam volt egy VM-es, így kétszer generálta le a listát)