Vissza tovább navigáció könyv modulhoz drupal 8-ban.

HF leon képe

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!

Taxonomy upgrade extras: 
Melyik modulhoz, modulokhoz kapcsolódik a téma?: 
Drupal verzió: 
dj képe

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.

0
0

Üdv!
Dudás József

HF leon képe

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á.

0
0
dj képe

      $build['book_navigation'] = array(
        '#theme' => 'book_navigation',
        '#book_link' => $node->book,
        '#weight' => 100,
        // The book navigation is a listing of Node entities, so associate its
        // list cache tag for correct invalidation.
        '#cache' => [
          'tags' => $node->getEntityType()->getListCacheTags(),
        ],
      );

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:

  public function build() {
    $build = [];
    // Load the current node.
    $node = \Drupal::routeMatch()->getParameter('node');
    if (!empty($node->book['bid']) && empty($node->in_preview)) {
      $book_node = Node::load($node->book['bid']);
      if (!$book_node->access()) {
        return;
      }
      $build['my_book_navigation'] = array(
        '#theme' => 'book_navigation',
        '#book_link' => $node->book,
        '#weight' => 100,
        // The book navigation is a listing of Node entities, so associate its
        // list cache tag for correct invalidation.
        '#cache' => [
          'tags' => $node->getEntityType()->getListCacheTags(),
        ],
      );
    }
 
    return $build;
  }

Ne felejtsd el betenni az elejére ezt a sort:

use Drupal\node\Entity\Node;

Aztán a moduloknál bekapcsolod a modult, végül bekapcsolod a blokkodat abba vagy azokba a régiókba ahova akarod.

0
0

Üdv!
Dudás József

HF leon képe

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.

0
0
dj képe

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:

/**
 * Implements hook_theme_registry_alter()
 */
function MYMODULE_theme_registry_alter(&$theme_registry) {
  // Add new variable to variables array name suggestion.
  $theme_registry['book_navigation']['variables']['suggestion'] = NULL;
}
 
/**
 * Implements hook_theme_suggestions_HOOK_alter()
 */
function MYMODULE_theme_suggestions_book_navigation_alter(array &$suggestions, array $variables) {
  if (!empty($variables['suggestion'])) { 
    $suggestions[] = $variables['suggestion'];
  }
}

És a block class build funkciója módosul így:

  public function build() {
    $build = [];
    // Load the current node.
    $node = \Drupal::routeMatch()->getParameter('node');
    if (!empty($node->book['bid']) && empty($node->in_preview)) {
      $book_node = Node::load($node->book['bid']);
      if (!$book_node->access()) {
        return;
      }
      $build['test_book_navigation'] = array(
        '#theme' => 'book_navigation',
        '#book_link' => $node->book,
        '#suggestion' => 'book_navigation__MYMODULE',
        '#weight' => 100,
        // The book navigation is a listing of Node entities, so associate its
        // list cache tag for correct invalidation.
        '#cache' => [
          'tags' => $node->getEntityType()->getListCacheTags(),
        ],
      );
    }
 
    return $build;
  }

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.

2
0

Üdv!
Dudás József

HF leon képe

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.

0
0