Geçerli sayfaya göre alt bağlantılar nasıl çıkarılır?


10

Diğer sayfalar menü öğelerinin üst öğesi olan bir menü öğesine sahip bir sayfaya inerken, bu alt menü öğelerinin bir listesini gösterebilmek istiyorum. Aşağıdaki kodu kullanıyorum.

$trail = menu_get_active_trail();
menu_build_tree('main-menu', array(
  'expanded' => array($trail[1]['mlid'])
));

Ancak, döndürülen dizi (gereksiz birçok kaldırıldı ile) böyle görünüyor.

array
'49950 PKY Truck Beauty 312' => 
array
  'link' => &
    array
      'menu_name' => string 'main-menu' (length=9)
      'mlid' => string '312' (length=3)
      'plid' => string '311' (length=3)
  'below' => 
    array
      '49952 Seminars 314' => 
        array
          'link' => &
            array
              'menu_name' => string 'main-menu' (length=9)
              'mlid' => string '314' (length=3)
              'plid' => string '311' (length=3)
      '50000 HDMA Breakfast 316' => 
        array
          'link' => &
            array
              'menu_name' => string 'main-menu' (length=9)
              'mlid' => string '316' (length=3)
              'plid' => string '311' (length=3)
      '50000 MATS Concert 315' => 
        array
          'link' => &
            array
              'menu_name' => string 'main-menu' (length=9)
              'mlid' => string '315' (length=3)
              'plid' => string '311' (length=3)

314, 315 ve 316'nın 312'nin 'altında' olduğuna dikkat edin? Onlar benim menü yapısında kardeşler ve bu her biri için aynı değere sahip gibi görünüyor plid(311). Açıkçası ben dizi başka bir işlev geçerek bu düzeltmek, ama ben yardım edemem ama sadece bir şey eksik düşünüyorum düşünüyorum.


Zamandan dolayı, CSS ile ilgili sorunu düzeltiyorum, ancak memnun olmamasına rağmen. $tree = menu_build_tree('main-menu', array( 'expanded' => array($trail[1]['mlid']) )); drupal_render(menu_tree_output($tree))Daha sonra CSS kullanarak uldolguları kaldırmak için bağlantıları biçimlendirebilir, böylece hepsi aynı seviyede görünürler. İdeal değil, etkili. EDIT: üzgünüm, nasıl satır sonları çalışmak için anlayamıyorum.
Chris Rockwell

elde etmek istediğiniz şeyin örnek bir ekran görüntüsünü yayınlayamadınız mı? Dürüst olmak gerekirse, soruyu biraz dağınık buldum (Bunu söylemeye cesaret ediyorum çünkü henüz cevap yazılmadı). Alt öğeleri nerede göstermek istersiniz? Menü ile ilgili modüller neden tatmin edici değil? Lütfen soruyu biraz daha açıklığa kavuşturun ve belki de iyi bir çözüm bulabiliriz.
Sk8erPeter

@ Sk8erPeter, dağınıksa özür dilerim. Gittiğim çözüm (yorumumda atıfta bulunuluyor) burada kullanılıyor: link . Ana soru şudur: menu_build_tree () neden beklenmeyen seviyelere sahip iç içe bir dizi döndürüyor (tüm bağlantılar aynı olmalıdır)? Alt öğeleri nerede gösterdiğimi görmek için, dahil ettiğim bağlantıyı kullanın ve ana gezinme çubuğundaki herhangi bir bağlantıyı tıklayın (css, tıklanamayacakları yanılsamasını vermek için kullanılır).
Chris Rockwell

Modüller ile ilgili olarak, bir cursory bakış yeterli bir şey ortaya çıkmadı. Bunun nedeni, 4 veya 5 satır kodda gerçekleştirilmesi gereken bir çözüm için başka bir modül kurmakla ilgilenmememdi. Zaten böyle şeyler için kullandığım özel bir 'içerir' modülü var. Şimdi, her yerden ararım get_sub_menu_based_on_active_page()ve hazırım. Css kullanıcı akıllıca hiçbiri yapar gibi yuvalama sorunu anlamaya çalışıyorum geçmek zorunda kaldı.
Chris Rockwell

1
Ben bir cevap yayınlanmıştır başka yaklaşımla, bunu en kolay çözümlerden biri olduğunu düşünüyorum. Ve düzgün çalışıyor. Önerilen modül Drupal kullanıcıları arasında gerçekten popüler.
Sk8erPeter

Yanıtlar:


8

Sadece takip etmek istedim. Ben bu soruya geri geldi ve şunları buldum: /programming/2716787/how-to-get-all-the-menu-items-below-a-certain-parent-in-drupal olduğunu tam ihtiyacım olan şey.

Yukarıda belirtilen bağlantıdan kopyalanan ve ihtiyaçlarımı karşılayacak şekilde değiştirilen kod (esas olarak, sabit kodlanmış bir değer kullanmak yerine, menü ağacını oluşturmak için geçerli yolu kullanmak için:

$parent = menu_link_get_preferred($_GET['q']);
$parameters = array(
  'active_trail' => array($parent['plid']),
  'only_active_trail' => FALSE,
  'min_depth' => $parent['depth']+1,
  'max_depth' => $parent['depth']+1,
  'conditions' => array('plid' => $parent['mlid']),
);

$children = menu_build_tree($parent['menu_name'], $parameters);

return '<div class="content-sub-menu content-padder">' . drupal_render(menu_tree_output($children)) . '</div>';

1
Bu iyi çalışıyor, ancak current_path()yerine kullanmalısınız $_GET['q']. $_GET['q']yol takma adını döndürür ve current_path()düğüm / kimlik alır.
mediaashley

6

Menü blok modülü kullanılarak kolayca yapılabilir (yapılandırılması yaklaşık 5 dakika sürer).

Menü bloğu ekran görüntüsü

Tüm yapman gereken

  1. Modülü etkinleştirme
  2. Gidiyor admin/structure/block
  3. "Menü bloğu ekle" yi tıklamak
  4. "Başlangıç ​​seviyesi" ni "2. seviye (İkincil)" olarak ayarlayın ve "Bu bloğun hangi temaların ve bölgelerin görüntüleneceğini belirtin" altında görüntülenmesi gereken bölgeyi ayarlayın .

  5. Ekran görüntüleri:

    • Bu, yapılandırma sayfasının görünüşüdür

      ekran görüntüsü

    • Etkin Menü blok modülü bloklarıyla yönetici / yapı / blok sayfası

      ekran görüntüsü

    • Devel modülü ile bazı "Temel sayfa" içerikleri oluşturdum ve bunlara bazı menü bağlantıları sağladım ve iç içe bir menü hiyerarşisi oluşturdum

      • Bu, alt menüleri olmayan varsayılan ön sayfadır ("Ana menü - 2. seviye" bloğu, ikinci kenar öğesi bulunmadığından sol kenar çubuğunda GÖSTERİLEMEZ)

      ekran görüntüsü

      • Bu ikinci menüdür, bazı alt öğelerle, sol kenar çubuğunda "Ana menü - 2. düzey" i zaten görebilirsiniz, ancak yalnızca 2. düzey alt öğeler görülebilir

        ekran görüntüsü

        ikinci seviye ürünler

      • Şimdi daha derine iniyoruz:

        Üçüncü seviye alt öğeler de görülebilir

Bu görev için Menü blok modülünü kullanmanın en kolay ve en hızlı çözümlerden biri olduğunu düşünüyorum .


Bu yazı için neden bir oylama aldığımı gerçekten merak ediyorum. Önerilen modül işi yapar ve ben adım adım öğretici yazdım. Downvoter neden nedenlerle ilgili bir yorum yayınlamıyor? (Belki de yararlı olabilir (belki değil), en azından tepki verebilirim.)
Sk8erPeter

0

Yorumlarda belirtildiği gibi, API işlevini kullanarak ve daha sonra CSS ile şekillendirme sona erdi:

/* --------------- *\
    Sub-menus
    used on main pages
\* --------------- */
.content-sub-menu ul.menu {
  list-style: none;
  padding: 0;
  margin: 0;
}
.content-sub-menu > ul.menu {
  margin-bottom: 25px;
}
.content-sub-menu ul.menu a {
  font-size: 1.5em;
  padding: 10px;
  margin-top: 5px;
  display: inline-block;
  min-width: 33%;
}

0

Bu, geçerli sayfanın alt menüsünü almak için düzgün çalışır:

function build_left_menu()
{
    global $language_url;
    static $use_theme = NULL;
// Get the entire main menu tree
    $left_menu_tree = menu_tree_all_data('main-menu'); // Your main menu
$left_menu_tree_values = array_values($left_menu_tree); //get value only
    $html = "<div id=\"sidemenu\"><ul id=\"side-nav\" class=\"side-nav-content\"><h3>In this section:</h3>";
foreach ($left_menu_tree_values as $index => $item) {
        $link = $item["link"];
        if ($index === 0) {
            $item_class = "first-item panel side-menu ";
        } else {
            $item_class = "panel side-menu ";
        }
        $options_anchor = array();
        if ($item["below"]) {
            $options_anchor = array("attributes" => array('class' => array('dropdown-toggle'),
                'data-toggle' => 'dropdown',
                'data-delay' => 1000,
                'data-close-others' => "false",
                'data-hover' => "dropdown",
            )
            );
        }
        // Merge in defaults.
        $options_anchor += array(
            'attributes' => array(),
            'html' => FALSE,
        );

        //Default needed class
        $options['attributes']['class'][] = 'subpage-link collapsed';
        // Append active class.
        if (($link['link_path'] == $_GET['q'] || ($link['link_path'] == '<front>' && drupal_is_front_page())) &&
            (empty($options_anchor['language']) || $options_anchor['language']->language == $language_url->language)) {
            if ($item["below"]) {
                foreach ($item["below"] as $item_below) {
                    $link_below = $item_below["link"];
                    $options_anchor = array();
                    $html .= "<li class='" . $item_class . "'>";
                    $html .= override_left_l($link_below['link_title'], $link_below['link_path'], $options_anchor).'</li>';
                }
            }
        }
    }
    $html .= "</ul></div>";
    return $html;
}

Umarım bu yardım!


İşleviniz tanımsız bir işlevi çağırıyor (override_left_l)!
DrCord

0

@Chris Rockwell ve @ Mario Awad

Drupal'da acemi oldum, bu yüzden bu işlevi nereye ekleyeceğimi anlamak benim için zor .. Bunun için özür dilerim. Ancak, lütfen bu dosyayı hangi dosyaya eklemeliyiz diye bahsedebilir misiniz?

Her sayfada yalnızca alt öğeleri görüntüleyecek yan çubuk gezinmesi oluşturmaya çalışıyorum. Kenar çubuğunda, farklı sayfalarda görüntülenen farklı gezinme bağlantılarıyla gezinme menüsü nasıl oluşturulur?

Takdir ediyorum!

Teşekkürler!


0

Bir düğümün yolu verilen alt menü öğelerini alan bir işlevi göndermeyi bitirdim. Buradan kontrol edebilirsiniz : http://softkube.com/blog/getting-child-menu-items-drupal-menu-tree

Yazının güncellenmesi durumunda geleceğin kanıtı cevabının bağlantısını ekliyorum ve sonunda kodun tamamını da kopyalayacağım.

Sizin durumunuzda, tüm alt menü öğelerini listelemek için temanızda böyle bir şey çalıştırabilirsiniz. İfadeyi echove temayı beğeninize göre değiştirin.

$path = current_path();
$nids = skl_get_all_menu_node_children_ids($path);
$children = node_load_multiple($nids);
foreach($children as $c) {
    echo $c->title . ': ' . url('node/' $c->nid) . '<br />';
}

Ve işte fonksiyonun tam kodu. Gelecekteki olası güncellemeler için bağlantıyı kontrol edin.

İyi şanslar.

/**
 * Returns node ids of all the child items, including children of children
 * on all depth levels, of the given node path. Returns an empty array
 * if any error occurs.
 * 
 * @param string $node_path
 * @return array
 */
function skl_get_all_menu_node_children_ids($node_path) {
    //Stop and return an empty array if node path is empty
    if(empty($node_path)) {
        return array();
    }

    //Init empty array to hold the results
    $nids = array();

    //Init parent keys. Check 'foreach' loop on parent keys for more info.
    $parent_keys = array('plid', 'p1', 'p2', 'p3', 'p4', 'p5', 'p6', 'p7', 'p8', 'p9');

    //Collect menu item corresponding to this path to begin updates.
    //Reference: http://stackoverflow.com/a/11615338/136696
    //Note: we couldn't find a way to get the sub-tree starting from this item
    //only and hence we had to get the whole menu tree built and then loop on
    //the current item part only. Not so bad considering that Drupal will
    //most probably have the whole menu cached anyway.
    $parent_menu_item = menu_link_get_preferred($node_path);

    //Stop and return empty array if a proper current menu item couldn't be found
    if(empty($parent_menu_item['menu_name']) || empty($parent_menu_item['mlid'])) {
        return array();
    }

    //Init parent item mlid for easier usage since now we know it's not empty
    $parent_menu_item_mlid = $parent_menu_item['mlid'];

    //Build whole menu based on the preferred menu_name gotten from this item
    $menu = menu_build_tree($parent_menu_item['menu_name']);

    //Reset menu cache since 'menu_build_tree' will cause trouble later on after 
    //you call pathauto to update paths as it can only be called once. 
    //Check: https://www.drupal.org/node/1697570
    menu_reset_static_cache();

    //Init processing array. This will hold menu items as we process them.
    $menu_items_to_process = array();

    //First run to fill up the processing array with the top level items
    foreach($menu as $top_level_menu_item) {
        $menu_items_to_process[] = $top_level_menu_item;
    }

    //While the processing array is not empty, keep looping into lower
    //menu items levels until all are processed.
    while(count($menu_items_to_process) > 0) {
        //Pop the top item from the processing array
        $mi = array_pop($menu_items_to_process);

        //Get its node id and add it to $nids if it's a current item child
        //Note that $parent_keys contains all keys that drupal uses to
        //set a menu item inside a tree up to 9 levels.
        foreach($parent_keys as $parent_key) {
            //First, ensure the current parent key is set and also mlid is set
            if(!empty($mi['link']['mlid']) && !empty($mi['link'][$parent_key])) {
                //If the link we're at is the parent one, don't add it to $nids
                //We need this check cause Drupal sets p1 to p9 in a way you
                //can easily use to generate breadcrumbs which means we will
                //also match the current parent, but here we only want children
                if($mi['link']['mlid'] != $parent_menu_item_mlid) {
                    //Try to match the link to the parent menu item
                    if($mi['link'][$parent_key] == $parent_menu_item_mlid) {
                        //It's a child, add it to $nids and stop foreach loop.
                        //Link_path has the path to the node. Example: node/63.
                        if(!empty($mi['link']['link_path'])) {
                            $nids[] = str_replace('node/', '', 
                                      $mi['link']['link_path']);
                            break;
                        }
                    }
                }
            }
        }

        //Add its child items, if any, to the processing array
        if(!empty($mi['below']) && is_array($mi['below'])) {
            foreach($mi['below'] as $child_menu_item) {
                //Add child item at the beginning of the array so that when
                //we get the list of node ids it's sorted by level with
                //the top level elements first; which is easy to attain
                //and also useful for some applications; why not do it.
                array_unshift($menu_items_to_process, $child_menu_item);
            }
        }
    }

    //Return
    return $nids;
}

Teşekkürler Mario. Kullandığınız üzerinden bu seçti neden üstüne Yorum yapabilir $parametersiçinde menu_build_tree?
Chris Rockwell

Geri dönüşünüz için teşekkür ederiz. Ne $parameterskullandığım önemli değil, gerekli bilgileri alamadım ve inan bana çok baktım. Tek istediğim, bir yol verildiğinde, tüm seviyelerde tüm alt menü öğelerini almak ve sadece bir yol bulamadım. Biri varsa lütfen bana bildirin, cevabımı ve blog yayınımı öğrenmekten ve güncellemekten memnuniyet duyarım. Şerefe.
Mario Awad
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.