Aktuális menüpont jelölése node megtekintésekor

thamas képe

Minden node 1 főkategóriába és annek 1 alkategóriájába tartozik. Az elsődleges linkek a főkategóriákra, a másodlagos linkek az alkategóriákra mutatnak (az útvonalakat kézzel írtam be).

Azt szeretném, hogy mikor megjelenítek egy node-ot, akkor a hozzá tartozó menü elemek aktívak legyenek. A node breadcrumb elméletileg tudja ezt, gyakorlatilag nem egészen (s ez paalt is zavarja ;o) ).

Itt egy teszt site oldal: http://print1.szabolcs.net/kozelet/20081007-valami-kozeleti-interju

Ötlet?

Melyik modulhoz, modulokhoz kapcsolódik a téma?: 
Drupal verzió: 
Illyés Edit képe

Elvileg azt hiszem, lekérdezheted az aktív másodlagos menüpont szülőjét, én a gyakorlatban JQuery-vel csinálom, az csak 1 sor ;)

function activate_menuparent() {
$('#menu-id > li > ul > li > a.active').parent('li').parent('ul').parent('li').children('a').addClass('active');
}
0
0
thamas képe

Köszönöm a választ!

Ezt a kódot bemásolom a template.php-ba és kész?

Ha ez ott van és utána megnézem a főkategória / alkategória besorolású node-omat, akkor a elsődleges menüben a főkategóriára és a másodlagos menüben az alkategóriára mutató menüpont aktív lesz?

Vagy van még egyéb teendő?

(Sajnos magamtól nem tudom, mert még mindig nem volt időm megtanulni php / drupal kódot írni...)

0
0

Üdvözlettel:
Hajas Tamás

Illyés Edit képe

Nem, ezt bemásolod egy valami.js fájlba, a végére írod, hogy

if (Drupal.jsEnabled) {
 $(document).ready(activate_menuparent);
}

Utána template.php-ben hozzáadod az oldalhoz:

drupal_add_js($data = "utvonal/valami.js", $type = "theme", $scope = "footer");

De az se biztos, hogy ez a Javascript így neked jó, lehet, hogy kalapálni kell rajta egy kicsit, ha nálad más a HTML. (#menu-id-t értelemszerűen lecserélni a saját menüd id-jére).

0
0
Illyés Edit képe

A Node Breadcrumb modul nem oldja meg ezt a problémát?

0
0
thamas képe

Ahogy a témaindítóban is írtam, nem működik. Persze lehet, hogy én bénázok. A modul leírása alapján úgy értettem az NB azt csinálja pont, ami nekem kell. De csak kinyitotta másodlagos menüt, nem jelölte aktívnak a szükséges menüelemeket. Erről írt paal az issue trackerbe (amit fent szintén linkeltem).

De lehet, hogy a sminken is kalapálni kell - nekem pl. csak most tűnt fel, hogy nem minden sminkben mutatja a menü az aktív állapotot akkor sem, ha mondjuk egy page van a menübe bedrótozva.

Egyébiránt néztem még a Menu Trails-t is, elvileg az is kimondottan erről (is) szólna, de annak csak a 6.x verziója stabil és aktív. Az 5.x dev is működik a hozzászólások szerint , de annál szintén php funkciót kellene beilleszteni a template.php-ba és ebbe egyelőre beletört a bicskám.

Köszönöm a kieglészítést. A napokban nem volt időm rendes időtartamra a géphez ülnöm, de ki fogok próbálni mindent és vissza fogok jelezni mire jutottam.

0
0

Üdvözlettel:
Hajas Tamás

Magus képe

function orseolo_menu_set_active_item($path = NULL) {
	static $stored_mid;
	$orig_q = $_GET['q'];
 
	if (!isset($stored_mid) || isset($path)) {
		if (!isset($path)) {
			$path = $_GET['q'];
		}
		else {
			$_GET['q'] = $path;
		}
		$menu = menu_get_menu();
 
		while ($path && !isset($menu['path index'][$path])) {
			$path = substr($path, 0, strrpos($path, '/'));
		}
		$stored_mid = isset($menu['path index'][$path]) ? $menu['path index'][$path] : 0;
 
		// Search for default local tasks to activate instead of this item.
		$continue = TRUE;
		while ($continue) {
			$continue = FALSE;
			if (isset($menu['items'][$stored_mid]['children'])) {
				foreach ($menu['items'][$stored_mid]['children'] as $cid) {
					if ($menu['items'][$cid]['type'] & MENU_LINKS_TO_PARENT) {
						$stored_mid = $cid;
						$continue = TRUE;
					}
				}
			}
		}
 
		// Reset the cached $menu in menu_get_item().
		$context_menu = menu_get_item(null, $path);
		$items[] = $context_menu;
 
		// Grab the menu tree from active context item to the root
		$mid = $context_menu['pid'];
		while ($mid && ($item = menu_get_item($mid))) {
			$items[] = $item;
			$mid = $item['pid'];
		}
		$items = array_reverse($items);
 
		menu_set_location($items);
	}
	drupal_add_js("set_active_menu_item('menu_$stored_mid')","inline");
	$_GET['q'] = $orig_q;
	return $stored_mid;
}

És a hozzá tartozó JS:

var active_menu_item_id = 0;
function set_active_menu_item(menu_item_id) {
	active_menu_item_id = menu_item_id;
}
 
 
function set_active_menu_item_do() {
	if (document.getElementById(active_menu_item_id)) document.getElementById(active_menu_item_id).className = document.getElementById(active_menu_item_id).className + " active";
}
 
var oldonload = window.onload;
if (typeof window.onload != 'function') {
	window.onload = set_active_menu_item_do;
}
else {
	window.onload = function() {
		if (oldonload) {
			oldonload();
		}
		set_active_menu_item_do();
	}
}

"Kicsit" gány, de működik.

0
0

- - - - -
Orseolo Magus
[email protected]

thamas képe

Köszönöm neked is a választ!

A php kód gondolom a template.php-ba megy. A JS-t pedig a headerből hivatkozom meg és önálló file-ban tárolom?

A "gány"-ság miben nyilvánul meg? Lehet megbízhatóan használni?

Jobb ez vmilyen szempontból, mint Edit javaslata? Vagy csak más?

Köszönöm!

0
0

Üdvözlettel:
Hajas Tamás

Magus képe

"A php kód gondolom a template.php-ba megy. A JS-t pedig a headerből hivatkozom meg és önálló file-ban tárolom?" -> így van.

"A "gány"-ság miben nyilvánul meg? Lehet megbízhatóan használni?"
Abban, hogy biztos van ennél szebb megoldás, nekem stabilan működik 3 site-on.

Nem hiszem, hogy jobb, az Övét nem próbáltam, egyszerűen csak más megközelítés szerintem.

O. Magus

0
0

- - - - -
Orseolo Magus
[email protected]