Nemrég kezdtem ismerkedni a drupal 8 rendszerrel. Van némi tapasztalatom az előző rendszerekkel, de komolyabb egyedi modul fejlesztésére eddig nem volt szükségem a drupal 8 kialakítása pedig kicsit új nekem.
A könyv tartalomtípus remekül megfelel számomra az éppen szükséges feladathoz, ám a kialakítás miatt olyan helyekre kellene elhelyeznem a navigációt, amely a tartalmon kívülre esik.
Ezért vált szükségessé egy vissza tovább linkeket tartalmazó modul kialakítása, amelyet oda tehetek, ahova csak akarok. Maga a modul elkészítése nem jelent különösebb problémát, azonban valahogy le kellene kérdeznem az aktuális pozícióhoz képest az előző és következő könyvlap címét. Ez ami nem igazán sikerül.
Tulajdonképpen az is jó lenne, ha simán a könyvben megjelenő navigációt (előző, fel, következő) ki tudnám emelni külön modulba. A felelős kódrészleteket megtaláltam a könyv modulban, viszont a szükséges változókat kívülről nem sikerül megállapítanom.
Drupal 8 alatt, ha valaki fejlesztett ilyesmit és tudna nekem segíteni, hogy ilyen esetben, hogyan kérdezhetem le, illetve férhetek hozzá a szükséges változókhoz, kérem segítsen!
Symfony-ban nem igazán vagyok tapasztalt, ezért a drupal 8 működése szokatlan kicsit.
A problémával, már küzdök egy ideje, átböngésztem az angol oldal könyv modulhoz kapcsolódó írásait, de eddig nem sikerült megoldanom a problémát.
Segítségeteket előre is köszönöm!
Ha a navigációs blokk kell
akkor a Blokk elrendezés (Block layout) oldalon (admin/structure/block) a megfelelő régiónál kattints a Blokk elhelyezése (Place block) gombra, keresd meg a Könyv navigáció (Book navigation) blokkot és kattints ott is a Blokk elhelyezése (Place block) gombra.
Aztán beállítod ahogy szeretnéd és kész.
Üdv!
Dudás József
Nem a navigációs menü blokk a tartalom navigációs sáv kellene.
Nem a könyv modul navigációs menüje, hanem a tartalmi lapok alján megjelenő navigáció kellene egy külön modulban.
A navigációs menü az összes lapot felsorolja és nem jelöli az aktuálisan olvasott lapot (ekkor esetleg szűkíthető lenne).
A könyvlap alján lévő navigációban az előző lapra mutató link az adott könyv szülője és a következő lapra mutató link jelenik meg. Mindez automatikusan generálódik egy könyvlap megnyitásakor.
Ezt az alsó navigációt szeretném kiemelni egy külön modulba, hogy függetlenül hozhassak létre egy lapozó szekciót.
Maga a könyvlap template is formázható, de az a baj, hogy külön területre (régióba) szeretném kiemelni ezt a navigációt.
(A fő template-ben ezek a változók, már nem érhetők el (hiszen a könyvlap generálásakor vannak csak jelen) ekkor egyszerűen a template szerkesztése is megoldás lenne.)
Magát a navigációt generáló php kódot megtaláltam a könyv modulban, de ahhoz, hogy kiemelhessem és külön használhassam olyan változók elérésére lenne szükségem, amelyek elérési lehetőségét nem egészen értem, pedig biztosan megoldható valahogy, csak, még nem jöttem rá.
Ez a részlet állítja elő a navigációt
Csak a node objektumra van szükséged ahhoz, hogy meg tudd hívni.
Drupal konzolban nagyjából ennyi:
Létrehozod a modulodat (drupal generate:module) válaszolsz a kérdésekre
Aztán egy blokkot generálsz hozzá (drupal generate:plugin:block) válaszolsz a kérdésekre
Ennek eredményeként kapsz egy üres blokk objektumot aminek a build funkcióját kell a fentivel kiegészítened valahogy így:
Ne felejtsd el betenni az elejére ezt a sort:
Aztán a moduloknál bekapcsolod a modult, végül bekapcsolod a blokkodat abba vagy azokba a régiókba ahova akarod.
Üdv!
Dudás József
Én más irányba indultam
Igen nagyjából ez is jó, de ebben az esetben, hogy rendelhetek az alapértelmezett template helyett csak ehhez a modulhoz más kinézetet.
Én eredetileg külön akartam előállítani a linkeket, de ez a megoldás sem rossz, csak miként tudnék hozzá a book-navigation.html.twig helyett egy saját template-et rendelni, úgy, hogy az alapértelmezett navigációnak megmaradjon a saját template fájlja.
Így az alsó menü maradna az eredeti book-navigation.html.twig, de az egyedi modult külön twig fjllal formázhatnám.
Ha ebben tudnál segíteni annak nagyon örülnék, mert ekkor ez a megoldás is jó, sőt egyszerűbb is mint amit én próbáltam írni.
Talán lehet egy megoldás,
ha a modul fájlban felveszel saját témát és megcsinálod a template preprocesst hozzá:/*** Implements hook_theme().
*/
function MYMODULE_theme() {
return array(
'my_book_navigation' => array(
'variables' => array('book_link' => NULL),
),
);
}
/*** Prepares variables for my book navigation templates.
*
* Default template: my-book-navigation.html.twig.
*
* @param array $variables
*/
function template_preprocess_my_book_navigation(&$variables) {
template_preprocess_book_navigation($variables);
}
Ezután már használhatod a saját twig fájlod. A modulod templates könyvtárában létrehozol egy my-book-navigation.html.twig fájlt ahol megírod a saját megjelenésedet.Ezután már csak a block build funkciójában a #theme értékét átírod a saját témádra:'#theme' => 'my_book_navigation',
és a blokk a saját megjelenést használja.Ha van ennél egyszerűbb és drupal barátabb megoldás azt én is szívesen olvasom.Szóval érdekelt a dolog, mert nem találtam szépnek amit fentebb leírtam. És rátaláltam a megoldásra: https://www.drupal.org/node/2100775
Kell hozzá a hook_theme_registry_alter és a hook_theme_suggestions_HOOK_alter.
Utóbbi azért, hogy egy suggestiont feltételesen a téma variables változójához adjunk amit a blokk téma hívásánál adunk meg. Így elérjük, hogy az eredeti navigáció twig fájlja is érvényesüljön és ha mi hívjuk a blokkunkból akkor a saját twig fájl is érvényesül.
Tehát a MYMODULE.module fájlban:
És a block class build funkciója módosul így:
Ha ezután a téma könyvtárban létrehozod a book-navigation--MYMODULE.html.twig fájlt akkor a blokkod téma hívása már keresni fogja.
Üdv!
Dudás József
Köszönöm!
Köszönöm a segítséget! Már az előző alapján is sikerült megoldanom a problémát, de az új tanácsot is kipróbálom.
Modulprogramozásban, még akad tanulnivalóm, főként drupal 8 terén, de remélem idővel kellően kiismerem az új rendszert és Én is segíthetek, majd másoknak.