Aktív menüpont beállítása views által létrehozott oldalakon

Kategória: 
Snippet

Mai néhány órás kínszenvedésem jegyzete, avagy miként állítsunk be aktív menüpontot olyan page típusú nézethez, amit nem fűztünk fel aktív menüútvonalra. Normál esetben ugye, ha csinálunk egy nézetet nezet1 útvonalra, egy másikat nezet1/nezet2 útvonalra, az active-trail szépen végigszalad az útvonalakon.

De mi van akkor, ha argumentumot használunk, netán olyan menüelem kell aktívnak, aminek semmi köze az adott útvonalhoz?

Az én esetemben konkrétan ez volt: Van egy og csoport, aminek vannak fórumtémái. Ezeknek a listáját kellett megjelentetni a csoport node oldalán fülön. Ebben nincsen semmi bonyolult, a page-nek kell node/%/forum útvonal, validálni az argumentumot, 'asztcsókolom.

Naja, de hogy lesz ebből aktív a csoportok útvonalon elhelyezkedő Csoportok főmenüpont az elsődleges linkek között?

Van egy modul, a menutrails, ami hasonlót csinál, ám ott csak tartalomtípusokra lehet ezeket ráhúzni. Elvileg contex-tel is meg lehet csinálni, viszont a menutrails mellett custom_breadcrumbs modul is elég dúvad módon túrja azokat a hookat, amikkel ezeket lehet babrálni, szóval nálam ez sem működött.

Végül szétkaptam a menutrails, és összeszedtem, hogy hogyan is lesz. Annyi a lényeg, hogy kell egy hook, amiben ezt meg tudjuk csinálni. Az én esetemben a hook_views_pre_render(&$view) volt a nyerő, hiszen nézethez kell kapcsolni a duhajkodásunkat.

  1. Kell egy $item = menu_get_item().
  2. Az $item tömbön kell a href értéket módosítani, vagyis $item['href'] = 'menüelem útvonala, amit aktívnak akarsz látni'.
  3. A végén ennyi kell: menu_set_item(NULL, $item);

És voila.

Nézzük az én kódomat, nekem az kellett, hogyha a node/%/tökmindegymi útvonalon vagyunk, akkor bizonyos tartalomtípusok esetében bizonyos menüelem legyen aktív:

/**
 * Implements hook_views_pre_render().
 */
function custom_hooks_views_pre_render(&$view) {
  if (strstr($view->current_display, 'page')) {
 
    if (arg(0) == 'node' && is_numeric(arg(1)) && arg(2)) {
      $item = menu_get_item();
      //itt biza be kell tölteni a node ojjektumot, mert az az ilyen oldalakon nincsen.
      $node = node_load(arg(1));
      switch ($node->type) {
        case 'group' : 
          $item['href'] = 'csoportok';
          menu_set_item(NULL, $item);
      }
    }
  }
}

Edit: Mivel közben nem csak view oldalon kellett használnom a trükköt, megtaláltam a pörfikthúkot, ami nem más, mint a hook_init, ez ugyanis minden oldalgeneráláskor lefut. Ebben nyugodtan lehet játszadozni.

Hozzászólások

Hozzászólás

A mező tartalma nem nyilvános.
  • Internal paths in double quotes, written as "internal:node/99", for example, are replaced with the appropriate absolute URL or relative path.
  • Engedélyezett HTML elemek: <a> <em> <strong> <cite> <code> <ul> <ol> <li> <dl> <dt> <dd> <del> <img>
  • A webcímek és email címek automatikusan linkekké alakulnak.
  • A sorokat és bekezdéseket a rendszer automatikusan felismeri.
  • Engedélyezett HTML elemek: <a> <blockquote> <br> <cite> <code> <dd> <del> <div> <dl> <dt> <em> <li> <ol> <p> <span> <strong> <ul>
  • You can enable syntax highlighting of source code with the following tags: <code>, <blockcode>, <bash>, <c>, <cpp>, <drupal5>, <drupal6>, <java>, <javascript>, <mysql>, <php>, <python>, <ruby>, <sql>. The supported tag styles are: <foo>, [foo].
  • Minden email cím át lesz alakítva ember által olvasható módon, vagy (ha a JavaScript engedélyezett) ki lesz cserélve kattintható, de biztonságos hivatkozásra.
By submitting this form, you accept the Mollom privacy policy.