Menük háttérképének cseréje bizonyos oldalakon

hyper képe

Sziasztok!

Bizonyos oldalakon szeretnék eltérő '$primary_links' (elsődleges) és '$secondary_links' (másodlagos) menü háttereket megjeleníteni. Ennek a megvalósításában szeretném kikérni az ötleteiteket :)

A főoldalon és az Elérhetőség oldalon az eredeti (témában meghatározott) menü háttereket szeretném használni. Pathauto modult használok. Ezen oldalak URL-je mondjuk a következő:
http://www.oldalam.hu/
http://www.oldalam.hu/elerhetoseg

A következő 5 oldalnál egységes, de a főoldaltól eltérő színü háttérképet szeretnék használni:
http://www.oldalam.hu/hirek
http://www.oldalam.hu/hirek/politika
http://www.oldalam.hu/hirek/jatekok
http://www.oldalam.hu/hirek/telefonok
http://www.oldalam.hu/hirek/informatika

Az alábbi 4 oldalnál szintén az előzőektől eltérő elsődleges és eltérő másodlagos menü háttérképet szeretnék használni:
http://www.oldalam.hu/cikkek
http://www.oldalam.hu/cikkek/tesztek
http://www.oldalam.hu/cikkek/okostelefonok
http://www.oldalam.hu/cikkek/szamitastechnika

Ennél a 4 oldalnál szintén más elsődleges és másodlagos menü háttérképeket:
http://www.oldalam.hu/leirasok
http://www.oldalam.hu/leirasok/it
http://www.oldalam.hu/leirasok/jatekok
http://www.oldalam.hu/leirasok/szoftverek

A page.tpl.php átírására gondoltam. Vagy azt szeretném figyelni valahogy, hogy az URL-ben benne van-e a domain név utáni: 'hirek', 'cikkek', 'leirasok' string,
vagy ha van rá mód, akkor azt figyelném, hogy melyik elsődleges menüelem az aktív.

Hogy lehetne a legegyszerűbben és legértelmesebben megvalósítani ezt? :)
Remélem értitek mire gondoltam.

Köszi előre is!

Drupal verzió: 
Fórum: 
csakiistvan képe

add meg a body-nak a page.tpl.php fájlban hogy

<body class="<?php print $body_classes; ?>" > 

Ő beleteszi a classok közé hogy milyen node type, így mivel gondolom különbözőek a type-ok, már gyorsan, egyszerűen le lehet cserélni CSS-el a cuccost.

0
0

Drupal full-stack developer at Wunderman Thompson Budapest

hyper képe

Minden oldal sima 'oldal' tartalomtípus :)
Megnéztem és igy minden oldalnak ezt írja body classnak:
"not-front logged-in page-node node-type-page one-sidebar sidebar-left"
A főoldalnak pedig:
"front logged-in page-node one-sidebar sidebar-left"

Tehát ez igy sajnos jelen esetben nem jó megoldás :(

Énis iylen CSS class megoldással gondoltam átirni majd a hátteret, de a page.tpl-ben figyelni szeretném ezeket az aloldalakat, vagy URL-t vagy az oldalak szülőelemét is elég lenne és ennek megfelelően tenném hozzá a megfelelő class-t. Csak nem tudom mit és hogyan lenne jó figyelni :)

0
0
aboros képe

és az alapján variálod a body osztályait. ez az általános gyakorlat ilyen esetekre. valójában a page.tpl.php -hoz nem nyúlsz eltekintve attól, hogy legyen benne ez a fenti print $body_classes rész. inkább a template.php -ban a template_preprocess_page() -ben variálod a $vars['body_classes'] -t
a már említett arg() http://api.drupal.org/api/drupal/includes--path.inc/function/arg/6 segítségével figyeled hogy mi az aktuális oldal és hozzáadsz a body classeshoz ha kell.

0
0

-
clear: both;

hyper képe

template.php-ban nincs template_preprocess_page(), se $vars['body_classes'].

Az arg() fv-el nem igazán tudom figyelni az URL-t, mert az arg(0) annyit ad vissza, hogy: node; az arg(1) pedig az adott oldal ID-ját. Nekem az URL stringet lenne jó ha visszaadná :)

0
0
csakiistvan képe

nem tudom hol tartasz a fejlesztésben, de én inkább megnézném megoldható e a más-más content type, ha túl sok lenne neked aboros kolléga tippje :)

0
0

Drupal full-stack developer at Wunderman Thompson Budapest

csakiistvan képe

illetve pl a zen alsminkekben elég nagy a body calss, még a node-id illetve views esetén még a nevét is veleteszi.

Pl Zen alsminkben egy sima node classa

<body class="not-front not-logged-in node-type-user-profile i18n-en page-csoportvezeto-node-title section-csoportvezeto one-sidebar sidebar-second"> 
0
0

Drupal full-stack developer at Wunderman Thompson Budapest

hyper képe

aboros: köszi! megpróbálom. Ha elakadok szólok :P
csakiistvan: az oldal már teljesen kész van, csak ezt az utómódosítást kellene még megcsinálni :\ 48 oldalból áll, ugyhogy nem szivesen variálnám a content type-okat :)

0
0
csakiistvan képe

ahogy nézem a ZENben ez van a body classban:
<?php print $classes; ?>

hátha ez többet tol bele

0
0

Drupal full-stack developer at Wunderman Thompson Budapest

hyper képe

szantog képe

Huu, ugye nem gondoltad komolyan, hogy mindössze egy css extra class miatt a komplett tartalom struktúrát kell megváltoztatni?

0
0

----
Rájöttem, miért kérdezek olyan ritkán a drupal.hu-n. Amíg szedem össze az infokat a kérdéshez, mindig rájövök a megoldásra.

hyper képe

Nem tudom, hogy lenne a legcélszerűbb :S
Elakadtam sajnos :(

0
0
szantog képe

Ez nem neked szólt. :)

0
0

----
Rájöttem, miért kérdezek olyan ritkán a drupal.hu-n. Amíg szedem össze az infokat a kérdéshez, mindig rájövök a megoldásra.

szantog képe

3 lehetőség:
1. Zen alsmink készítése, ilyenkor készen kapod a bodyban az url első elemét section-[ezkellneked]
2. Context modul. Felveszed a 4 contextet útvonalra, akkor reactionnek theme, és section class, vagy body class, most nem tudom fejből
3. SMINKNEKVE_page_preprocessben (nem kifogás, hogy nincs, bele lehet ám írnil)
$path = explode('/', drupal_get_path_alias($_GET['q'])) és akkor a $path[0]-t vizsgálva hozzá lehet adni $body_class-hoz a szükséges classt.

0
0

----
Rájöttem, miért kérdezek olyan ritkán a drupal.hu-n. Amíg szedem össze az infokat a kérdéshez, mindig rájövök a megoldásra.

hyper képe

1. ez elég bonyolult nekem :)
2. ez már jobban hangzik de még nem tudnám megcsinálni ez alapján
3. ez még közelebb áll hozzám. ezt a _page_preprocess() -t a template.php-kban keressem? Valami alap garland témában találtam egy phptemplate_preprocess_page nevű fv-t.
Ha jól sejtem akkor az én téma könyvtáramba található template.php fileban hozzak létre egy 'page_preprocess' nevű funkciót és oda irjam bele ezt a $path-os kódot, amivel kinyerem a kívánt úuvonal neveket? Majd a page.tpl-ben elég ezt a fv-t meghívni és vizsgálni?

0
0
Geva képe

jól látod a megoldás menetét, kezdj csak hozzá,
de a _preprocess_page(&$vars, $hook) maga már egy függvény...

ezen a függvényen belül kellene a $body_classes tartalmához hozzáfűzni az útvonal álnevet pl ahogy szantog írta,

én a body id-ként állítottam össze egy változót az útvonal álnévvel, ehhez a honlaphoz: http://www.worldofyagyas.com/ ahol a body id szerint állítottam be egy div háttérképét, a felső menüpontok oldalaihoz

...  
$vars['body_id'] = ' id="' . $bdid . '"';            // Add a unique page id

a page.tpl.php -ben pedig

<BODY<?php print $body_id; ?> <?php print $body_classes; ?>>

... a $body_classes változóra másutt volt szükségem, nem akartam abba beleírni
0
0
hyper képe

Megpróbálom. Köszönöm!
Az én témám template.php-jában nincs semmilyen _preprocess_page() fv.
Ez nem baj? Hozzak létre benne mondjuk egy ilyen névvel egy függvényt?
function phptemplate_preprocess_page(&$vars)

0
0
Geva képe

a template.php-ben ezt a sminkedneve_preprocess_page() függvényt és ebbe írd a kódot. Ebbe a függvénybe kerülhet más is, ami a page-hoz kellhet :-)
nálam így kezdődik:

function sminkedneve_preprocess_page(&$vars, $hook) {
  global $theme;
 
  $path_alias = drupal_get_path_alias($_GET['q']);
  ...
 
}

(tehát a phptemplate helyett a sminkedneve kell)
0
0
hyper képe

Már részben működik! :)

template.php-ban létrehoztam ezt a fv-t:

function hdesign_preprocess_page(&$vars)
{
$path_alias = explode('/', drupal_get_path_alias($_GET['q']));
if ( $path_alias[0] == 'kapcsolat' ) $body_classes=$body_classes.'kapcsolat';
return $path_alias[0];
}

page.tpl-ben pedig ki print-eltem az oldalra a visszaadott értéket. Kíváncsi voltam mit ad vissza:
print about_preprocess_page();

Főoldalon visszaadja, hogy: node
A többi oldalon szépen visszaadja / jel utáni azonosítót. Pont erre volt szükségem! :)
Viszont kiír sajna egy hibaüzit:

warning: Missing argument 1 for hdesign_preprocess_page(), called in ...
on line 37 and defined in ... template.php on line 182.

37-es sor a page.tpl-ben az amivel kiiratom a visszaadott értéket.
182-es sor pedig a theme.php-ban ez a sor: function hdesign_preprocess_page(&$vars)

Még a body-hoz nem fűzi hozzá a kívánt 'kapcsolat' elnevezésű class-t.
Próbáltam igy is a template.php-ben: $vars['body_classes'] = $vars['body_classes'].'kapcsolat';
Így se akarta az igazát :\

0
0
Geva képe

function hdesign_preprocess_page(&$vars, $hook) {
 global $theme;
 ...
}

???

0
0
hyper képe

Megpróbáltam így is, de nem fűzi hozzá a 'kapcsolat' szócskát a body class-ához :(

template.php:

function hdesign_preprocess_page(&$vars, $hook)
{
	global $theme;
	$path_alias  = explode('/', drupal_get_path_alias($_GET['q']));
	if ( $path_alias[0] == 'kapcsolat' ) $vars['body_classes'] = $vars['body_classes'] .'kapcsolat';
}
0
0
aboros képe

az előfeldolgozóban -- most épp a template_preprocess_page, de van más preprocess is -- referenciaként kapod az adott templateben majdan elérhető változókat egy szép tömbben. az előfeldolgozó soha nem ad vissza semmit -- nincs benne return $tistutyafule; -- hanem a többhöz ad elemeket, vesz el elemeket vagy módosít meglévőket és ennyi.

a másik ami teljesen értelmetlen -- pont azért mert sosincs return a preprocessben -- hogy print template_preprocess_page .. nincs ilyen, soha. sőt, kézzel te a template_preprocess_bármi -t nem hívod sose, tplből legalábbis biztos nem, mert mire a tplhez érünk már lefutott a megfelelő preprocess, az a dolga, hogy a tpl számára előkészítse a változókat ;)

a referenciaként kapott tömbben a legfelső szint kulcsai változóként lesznek majd elérhetők a tplben.

szóval például a page.tpl.php -ban ez van:

<?php print $en_sajat_kis_valtozom; ?>

a template.php -ban meg ez:

function SMINKEDNEVE_preprocess_page(&$vars) {
  if (arg(0) == 'node' && arg(1) == 42) {
    $vars['en_sajat_kis_valtozom'] = 'negyvenkettes nodeon vagyunk, juheee';
  } else {
    $vars['en_sajat_kis_valtozom'] = 'nem negyvenkettes nodeon vagyunk';
  }
}
0
0

-
clear: both;

hyper képe

Értem Oké :)
Viszont ez még mindig nem oldotta meg az elsődleges feladatot, hogy a menü hátterét cserélgetni lehessen CSS-el :)

Ez az explode-os parancs mindenképpen kell, mert ezzel szépen fel tudom deríteni a kívánt oldalakat. Már csak az a kérdés, hogy a body class-ához hogyan tudom hozzáfűzni az egyes oldalakon más menü hátteret igénylő extra class tag-et?

A kapcsolat oldalon pl egy 'kapcsolat' tag-et szeretnék hozzáfűzni a body tag-hez. De nem teszi hozzá :(

template.php-ben:

$path_alias = explode('/', drupal_get_path_alias($_GET['q']));
if ( $path_alias[0] == 'kapcsolat' ) $body_classes=$body_classes.'kapcsolat';
0
0
Den képe

Pedig, leírták már páran, mit kell csinálni...

$body_classes=$body_classes.'kapcsolat';

Namost, a $body_classes nálad tömb, vagy string? Ha tömb, akkor azért rossz a saját class hozzáadás, ha string, akkor a classokat szóközzel illik elválasztani.

+ szerintem ott $vars['body_classes']-nek kell állni. A $body_classes változó a sablonban lesz ilyen formában elérhető.

Ezen felül: body elemhez kiíratod a $body_classes-t?

Ha más nincs, nem érted, akkor nézd meg a zend sminkben hogyan csinálják.

0
0
hyper képe

Szerintem az lesz a gond, hogy valamiért nem fut le a function hdesign_preprocess_page(&$vars) funkcióm :(
Le tudnám ezt valahogy tesztelni, hogy valóban le fut-e?

Probáltam fileba kiiratni valamit ellenőrzésképpen, hogy lefut-e a fv:

$file = fopen ("test.txt", "w");
fwrite($file, "hajaj");
fclose ($file);

777-es jogot adtam a test.txt filenak, amit a template.php-vel egy mappába helyeztem.

Sajnos semmit nem tett bele txt-be :(

Probáltam az adatbázishoz hozzáadni egy 'proba' táblát, amihez ugyancsak itt ebben a fv-ben probáltam hozzáadni egy teszt értéket, de ez is sikertelen volt. Kapcsolódtam ujra az adatbázishoz biztos ami biztos, de nem adott hozzá semmi értéket, így arra következtetek, hogy egyáltalán nem fut le ez a fv, úgyhogy valszeg itt akad meg az egész :(

szerk: most már biztos, hogy nem fut le. Beleírtam a page.tpl.php-ba ezt: hdesign_preprocess_page();
És így ugyan egy warning üzenet kíséretében, de lefutott a teszt adatbázisba írás kódom, amit a template.php-ba irtam a hdesign_preprocess_page() fv-be.

0
0
Den képe

Töröld a theme cache-t. Ha nem megy, mert nincs admin menüd, vagy drush-od, akkor az összes cache-t a teljesítmény/performance oldalon (admin/settings/performance) kell törölni.

Minden smink layert illető beavatkozásoknál, theme fv, preprocess a theme cache-t törölni kell.

0
0
york képe

Sminkek oldalon kell menteni, az uriti a smink cachet :).

0
0
hyper képe

Elég volt a sminkválasztós oldalon 'admin/build/themes/select' nyomni egy Mentés gombot :)

Most már tökéletesen lefut a '_preprocess_page(&$vars)' fv-em és valóban azt csinálja amit kell. Body classhoz hozzáírtam amiket kellett ily módon: $vars['body_classes'] .= ' kapcsolat';
Menü hátterének váltása úgy működik, ahogy szerettem volna. CSS-ben szépen megadom a class-oknak megfelelő képeket.

Köszönöm szépen mindenkinek a kitartó segítséget! :)

0
0
Den képe

Nem kell ez a fájlbaírós bűvészkedés, elég a drupal_set_message('hdesign_preprocess_page() running.'); is. http://drupalcontrib.org/api/drupal/drupal--includes--bootstrap.inc/func...

Ha használsz devel modult, akkor pedig a dd(); http://drupalcontrib.org/api/drupal/contributions--devel--devel.module/f...

0
0