Drupal primary menü

shinean képe

Háj!

Szal egy olyan kérdésem lenne, hogy a már meglévő primary menü mellé én készítettem egy újat, csak nem tudom, hogy kódból hogyan lehet rá hivatkozni.
A primary menü az okés: $primary_links (asszem így hirtelen), de ha újat hozok létre, akkor mi lenne a megoldás. Tennem kéne valamit, vagy rögtön el lehet érni?
Köszönöm a válaszokat!

Illyés Edit képe

A legegyszerűbb, ha a kérdéses menüt Secondary links címszó alatt viszed fel, ekkor $secondary_links néven lesz elérhető.

Ha már felhasználtad mindkettőt, akkor kérdés , hogy mit értesz "kód" alatt, ahonnan hivatkozni akarsz rá. Smink? Modul?...

0
0
shinean képe

A sminkből szeretnék hivatkozni rá. Pl: egy adott link megnyomása és egy paraméter vizsgálat után szeretném kirakni, vagy a sima primary menüt, vagy egy általam készített menüt. A secondary menün gondolkoztam, csak az a gond, hogy csak egy menünek kell látszania.

0
0
Illyés Edit képe

A menük láthatóságát a blokk beállítások között tudod szabályozni. Pl. ha a Secondary links menüt csak termékoldalon szeretnéd megjeleníteni, akkor az Oldalaktól függő megjelenítés c. lenyíló űrlapon megadod a termekek/* útvonalat. Bonyolultabb PHP kódot is írhatsz ide (paramétervizsgálat).

0
0
Paal képe

Ezzel csak egy gond van, hogy ha elnavigálsz a "primary" valamelyik menüpontjára és a hozzá tartozó "secondary" valamely menüpontját kiválasztod, akkor nem lesz aktív a "primary"-ban az, ahonnan származik. Vagyis nem tudod, hogy melyik elsődleges menü almenüjében állsz (ki a szülő?)... Hetek óta ezzel szívok, és nem találtam rá megoldást.


Kigondoltam egy egyszerű megoldást, de annyira nem értek a php-hoz, hogy rendesen meg is írjam. Annyit kellene tenni, hogy a linkek generálásakor meg kellene nézni, hogy az alias micsoda, és ha tartalmazza az elsődleges menüpont aliasát, akkor tegyen egy class="active" tagot a link hivatkozásába.



4.7.x-nél így le tudtam kérni, hogy hol vagyok:

$my_path = explode("/", drupal_get_path_alias('node/'.$node->nid));


és ha a $my_path[1]; változó értéke egyenlő lenne a "primary" aliasával, akkor jöhetne az "active".

Ahogy nézem, az 5-ösnél ez már nem működik. Megpróbálom kinyomozni, hogy mire változott.


Üdv, Pali

0
0

--
Palócz Paal Pál, a drupal.hu admin csoportjának tagja
Ajánlott olvasmány: Eric Steven Raymond - Hogyan kérdezzünk okosan

Illyés Edit képe

Van rá folt: Menu items in active trail should be styled.

Egyébként az arg() függvénnyel tudod az URL-t febontani, pl. www.akarmi.hu/termekek/elelmiszer/pekaru/... esetén:

arg(0) -> "termekek", arg(1) -> "elelmiszer", stb.

Esetleg még szükséged lehet a _menu_get_active_trail függvényre.

0
0
shinean képe

Köszi a válaszokat. Elszórakozom velük :)

0
0
Illyés Edit képe

Bocsi, de hülyeséget írtam. Az arg() függvénnyel csak akkor tudsz a fenti módon dolgozni, ha Views modullal állítottad elő a /termekek, /termekek/pekaru, stb. oldalakat. Szokványos esetben az arg() mindig "node" értéket fog visszaadni.

Büntetésből akkor most részletesen leírom:

<?php
 
/*
Hol vagyok?
*/
 
$utvonal = explode("/", drupal_get_path_alias('node/'.$node->nid));
 
/*
Vegyük az $utvonal tömb első elemét, értéke pl. www.akarmi.hu/termekek/pekaru/kenyer esetén 'termekek' lesz. Ezt kell majd később összevetnünk a Primary menü linkjeinek  útvonalával (/termekek, /szolgaltatasok, stb).
*/
 
$ittvagyok = $utvonal[0];
 
/*
A Primary menü azonosítója mid=2. Ellenőrizni a menu adatbázis-táblában! A menu_get_item() visszaad egy tömböt, ebből kell majd kihalásznunk előbb a Primary menü gyermekeit, majd a gyermekekhez tartozó útvonalakat.
*/
 
$menu = menu_get_item(2);
 
/*
Ebben a tömbben fogjuk tárolni a Primary menü útvonalait.
*/
 
$tomb = array();
 
/*
És most halászunk...
*/
 
$szam = 0;
foreach ($menu['children'] as $child) {
 
/*
Fogjuk a Primary menü gyermekeit...
*/
 
$menuitem = menu_get_item($child);
 
 
/*
A gyermekek ['path'] eleme kell nekünk, pontosabban a hozzájuk tartozó útvonal álnév.
*/
 
$ut = drupal_get_path_alias($menuitem['path']);
 
/*
Adjuk hozzá ahhoz a tömbhöz, amiben a Primary menü útvonalait tároljuk.
*/
 
$tomb[$szam] = $ut;
 
$szam++;
 
}
 
/*
Most elkezdjük kiírni a Primary menü elemeit.
*/
 
$szamlalo = 0;
 
foreach ($primary_links as $link){
 
/*
Ha valamelyik primary link útvonala megyegyezik az $ittvagyok értékével, rátesszük az "aktív" stílusosztályt.
*/
 
if ($tomb[$szamlalo] == $ittvagyok){
 
$aktiv = ' class="aktiv" ';
}
 
else {
 
$aktiv = "";
}
 
?>
 
<li<?php print $aktiv ?>>
 
<?php print $link; $szamlalo++; ?>
 
</li>
 
<?php } ?>

Nem biztos, hogy működik, mert most nem tudom tesztelni. De valahogy így...

Sajnos nem sikerült szépen formáznom ezt a hozzászólást...

U.i.: Értelemszerűen a page.tpl.php fájlba kell a fenti kódot beilleszteni. Valamint kell egy CSS osztály az .aktiv osztályra:

li.aktiv a {
color: #ffcc00;
}

U.u.i.: Kipróbáltam, működik.

0
0
Paal képe

Nálam a forrásban (nincs ul-tag sem):

<li>
Array</li>
<li>
Array</li>

Majd otthon megnézem jobban.

Köszi, Pali

0
0

--
Palócz Paal Pál, a drupal.hu admin csoportjának tagja
Ajánlott olvasmány: Eric Steven Raymond - Hogyan kérdezzünk okosan

Illyés Edit képe

Az ul kimaradt.

	<?php
	$utvonal = explode("/", drupal_get_path_alias('node/'.$node->nid));
	$ittvagyok = $utvonal[0];
	$menu = menu_get_item(2);
	$tomb = array();
	$szam = 0;
	foreach ($menu['children'] as $child) {
	$menuitem = menu_get_item($child);
	$ut = drupal_get_path_alias($menuitem['path']);
	$tomb[$szam] = $ut;
	$szam++;
	}
	?>
	<ul id="primary">
	<?php
	$szamlalo = 0;
	foreach ($primary_links as $link){
	if ($tomb[$szamlalo] == $ittvagyok){
	$aktiv = ' class="aktiv" ';
	}
	else {
	$aktiv = "";
	}
	?>
	<li<?php print $aktiv ?>>
    <?php print $link; $szamlalo++; ?>
	</li>
	<?php } ?>
	</ul>

Ja, és ez 4.7 alatt megy, 5.0 alatt nem próbáltam.

0
0
Paal képe

Istennő vagy!!! De 5.x alatt nem megy sajnos. Gondolom változtattak pár dolgot. Esetleg át tudnád írni?


Nagyon köszi!

Üdv, Pali


Ps.:

Maga a li tag megkapja az "aktiv" class-t, csak éppen a link kiíratása nem jó.


<ul id="primary">
<li class="aktiv" >
    Array</li>
<li>
    Array</li>
</ul>	


Ez van a tömbben:
Array ( [title] => Kezdőlap [href] =>  [attributes] => Array ( ) )
Array ( [title] => Könyv nyitólap [href] => node/4 [attributes] => Array ( ) )
0
0

--
Palócz Paal Pál, a drupal.hu admin csoportjának tagja
Ajánlott olvasmány: Eric Steven Raymond - Hogyan kérdezzünk okosan

Illyés Edit képe

Az 5.0-ig még nem jutottam el, és a héten nem is lesz rá időm. :(
Úgy látom, a menu_get_item és a drupal_get_path_alias egyaránt benne van a HEAD API-ban, tehát elvileg mennie kell.

Fontos: ez a szkript csak akkor működik rendesen, hogyha pontosan adod meg az útvonal álneveket!

Például:

Primary menu:

  • Termékek -> /termekek
  • Szolgáltatások -> /szolgaltatasok

Termékek menü:

  • Első termék -> /termekek/1, vagy /termekek/elso
  • Második termék -> /termekek/2, vagy /termekek/masodik

Szolgáltatások menü:

  • Első szolgaltatas -> /szolgaltatasok/1, vagy /szolgaltatasok/elso
  • Második szolgaltatas -> /szolgaltatasok/2, vagy /szolgaltatasok/masodik

A dolog logikája tehát:

  1. Lekérdezed menu_get_item segítségével a Primary menü gyermekeit, majd drupal_get_path_alias segítségével a hozzájuk tartozó útvonal álneveket, ezeket kirámolod egy tömbbe (a tömb elemei tehát: /termekek, /szolgaltatasok, stb.)
  2. Lekérdezed drupal_get_path_alias segítségével az aktuális útvonal első tagját (/termekek, vagy /szolgaltatasok)
  3. Elkezded egyenként kiírni a Primary menü elemeit, és ahol az aktuális útvonal első tagja egyezik az éppen kiírandó menü elem útvonalával, ott ráteszed az aktiv osztályt.
0
0
Paal képe

Szia!

3. Elkezded egyenként kiírni a Primary menü elemeit, és ahol az aktuális útvonal első tagja egyezik az éppen kiírandó menü elem útvonalával, ott ráteszed az aktiv osztályt.


Igen, ezt én is így gondoltam, csak a 3. lépést nem tudtam, hogyan kellene megcsinálni.

Nagyon köszi a segítséget!

Üdv, Pali

0
0

--
Palócz Paal Pál, a drupal.hu admin csoportjának tagja
Ajánlott olvasmány: Eric Steven Raymond - Hogyan kérdezzünk okosan