বর্তমান পৃষ্ঠার উপর ভিত্তি করে চাইল্ড লিঙ্কগুলি কীভাবে আউটপুট করা যায়


10

কোনও পৃষ্ঠাতে অবতরণের সময় মেনু আইটেমটি রয়েছে যা অন্য পৃষ্ঠাগুলির মেনু আইটেমগুলির পিতামাতা, আমি সেই শিশু মেনু আইটেমগুলির একটি তালিকা প্রদর্শন করতে সক্ষম হতে চাই। আমি নিম্নলিখিত কোড ব্যবহার করছি।

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

তবে, ফিরে আসা অ্যারেটি দেখতে অনেকটা (অনেক অপ্রয়োজনীয় অপসারণের সাথে)।

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, এবং 316 312 এর নীচে রয়েছে? তারা আমার মেনু স্ট্রাকচারে ভাই-বোন এবং এটি plid(311) এর সমান মান থাকা প্রত্যেকের দ্বারা যাচাই করা হয়েছে বলে মনে হয় । স্পষ্টতই আমি অন্য ফাংশনের মধ্য দিয়ে অ্যারে পেরিয়ে এটি ঠিক করতে পারি, তবে আমি সহায়তা করতে পারি না তবে মনে করি আমি কেবল কিছু মিস করছি।


সময়ের স্বার্থে, আমি সিএসএস দিয়ে বিষয়টি ঠিক করছি, যদিও আমি এতে সন্তুষ্ট নই। $tree = menu_build_tree('main-menu', array( 'expanded' => array($trail[1]['mlid']) )); drupal_render(menu_tree_output($tree))তারপরে সিএসএস ব্যবহার করে আমি ulপ্যাডিংগুলি সরানোর জন্য লিঙ্কগুলি স্টাইল করতে পারি , যাতে তারা প্রদর্শিত হয় যে এগুলি সমস্ত একই স্তরের। আদর্শ নয়, তবে কার্যকর। সম্পাদনা: দুঃখিত, কাজ করার জন্য কীভাবে লাইন ব্রেক পেতে হবে তা আমি বুঝতে পারি না।
ক্রিস রকওয়েল

আপনি কী অর্জন করতে চান তার একটি নমুনার স্ক্রিনশট পোস্ট করতে পারেন না? সত্যি কথা বলতে, আমি প্রশ্নটি কিছুটা অগোছালো অবস্থায় পেয়েছি (আমি এখনও এটির উত্তর দিতে পারি নি বলে বলার সাহস করে)। আপনি কোথায় সন্তানের আইটেমগুলি দেখাতে সক্ষম হতে চান? কেন মেনু সম্পর্কিত মডিউল সন্তুষ্ট হয় না? দয়া করে প্রশ্নটি আরও কিছুটা পরিষ্কার করুন এবং সম্ভবত আমরা একটি ভাল সমাধান খুঁজে পেতে পারি।
Sk8erPeter

@ Sk8erPeter, আমি যদি ক্ষুব্ধ হই তবে আমি ক্ষমা চাইছি। আমি যে সমাধানটি দিয়েছিলাম (আমার মন্তব্যে রেফারেন্স করা হয়েছে) এখানে ব্যবহার করা হচ্ছে: লিঙ্ক । মূল প্রশ্নটি হ'ল: কেন মেনু_বিল্ড_ট্রি () অপ্রত্যাশিত মাত্রাগুলিযুক্ত একটি নেস্টেড অ্যারে ফিরিয়ে দিচ্ছে (সমস্ত লিঙ্ক একই হওয়া উচিত)? আমি শিশুদের আইটেমগুলি কোথায় প্রদর্শন করছি তা দেখতে, আমি অন্তর্ভুক্ত লিঙ্কটি ব্যবহার করুন এবং মূল এনএভি বারের যে কোনও লিঙ্কে ক্লিক করুন (সিএসএস তারা ক্লিকযোগ্য নয় এমন বিভ্রম দেওয়ার জন্য ব্যবহৃত হয়)।
ক্রিস রকওয়েল

মডিউলগুলি সম্পর্কে, একটি অভিহিত দৃষ্টিতে পর্যাপ্ত পরিমাণে এমন কোনও কিছুই ঘটেনি। এটি হতে পারে কারণ 4 বা 5 লাইন কোডে সম্পন্ন হওয়া কোনও সমাধানের জন্য আমি আর কোনও মডিউল ইনস্টল করতে খুব আগ্রহী ছিল না। আমার ইতিমধ্যে একটি কাস্টম রয়েছে 'অন্তর্ভুক্ত' মডিউল যা আমি এই জাতীয় জিনিসের জন্য ব্যবহার করি। এখন, যে কোনও জায়গা থেকে, আমি কল করি get_sub_menu_based_on_active_page()এবং আমি প্রস্তুত। বাসা বাঁধার সমস্যাটি বের করার চেষ্টা থেকে আমাকে এগিয়ে যেতে হয়েছিল কারণ সিএসএস ব্যবহারকারীকে বুদ্ধিমান করে না।
ক্রিস রকওয়েল

1
আমি অন্য পদ্ধতির সাথে একটি উত্তর পোস্ট করেছি , আমি মনে করি এটি একটি সহজ সমাধান। এবং এটি সঠিকভাবে কাজ করে। প্রস্তাবিত মডিউলটি ড্রুপাল ব্যবহারকারীদের মধ্যে সত্যই জনপ্রিয়।
Sk8erPeter

উত্তর:


8

শুধু ফলো-আপ করতে চেয়েছিলেন। আমি এই প্রশ্নে ফিরে এসে নিম্নলিখিতগুলি খুঁজে পেয়েছি: /programming/2716787/how-to-get-all-the-menu-items-below-a-certain-parent-in-drupal যা ঠিক আমার যা দরকার ছিল

উপরে বর্ণিত লিঙ্কটি থেকে অনুলিপি করা কোডটি এবং আমার প্রয়োজন অনুসারে সংশোধন করা হয়েছে (মূলত হার্ড-কোডেড মান ব্যবহার না করে মেনু ট্রিটি তৈরি করতে বর্তমান পথটি ব্যবহার করতে হবে)

$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
এটি ভালভাবে কাজ করে তবে আপনার current_path()পরিবর্তে এটি ব্যবহার করা উচিত $_GET['q']$_GET['q']পাথের ওরফে ফিরে আসবে, যেখানে current_path()নোড / আইডি পাবেন।
মিডিয়াশলে

6

এটি মেনু ব্লক মডিউল ব্যবহার করে সহজেই করা যায় (এটি কনফিগার করতে প্রায় 5 মিনিট সময় লাগে)।

মেনু ব্লক স্ক্রিনশট

আপনাকে যা করতে হবে তা হ'ল

  1. মডিউল সক্ষম করা হচ্ছে
  2. যাচ্ছি admin/structure/block
  3. "মেনু ব্লক যুক্ত করুন" ক্লিক করে
  4. "আরম্ভের স্তরটি" "২ য় স্তরের (মাধ্যমিক)" এ সেট করুন এবং "এই ব্লকটি কোন থিম এবং অঞ্চলে প্রদর্শিত হবে তা উল্লেখ করুন" এর অধীনে যেখানে অঞ্চলটি প্রদর্শিত হবে সেটিকে সেট করুন

  5. স্ক্রীনশট:

    • কনফিগারেশন পৃষ্ঠাটি দেখতে এইভাবে

      স্ক্রিনশট

    • সক্ষম মেনু ব্লক মডিউল ব্লক সহ অ্যাডমিন / কাঠামো / ব্লক পৃষ্ঠা

      স্ক্রিনশট

    • আমি ডিভেল মডিউল সহ কিছু "বেসিক পৃষ্ঠা" সামগ্রী তৈরি করেছি এবং সেগুলিতে কিছু মেনু লিঙ্ক সরবরাহ করেছি এবং একটি নেস্টেড মেনু স্তরক্রম তৈরি করেছি

      • এটি কোনও সাবমেনাস ছাড়াই ডিফল্ট সম্মুখ পৃষ্ঠা ("মেনু - ২ য় স্তরের" ব্লকটি বাম পাশের বারে দেখা যাবে না, কারণ এতে কোনও দ্বিতীয় স্তরের শিশু আইটেম নেই)

      স্ক্রিনশট

      • এটি দ্বিতীয় মেনু, কিছু শিশু উপাদান সহ, আপনি ইতিমধ্যে বাম দিকের সাইডবারে "প্রধান মেনু - ২ য় স্তর" দেখতে পারেন, তবে কেবল ২ য় স্তরের শিশু উপাদানগুলিই দেখা যায়

        স্ক্রিনশট

        দ্বিতীয় স্তরের আইটেম

      • এখন আরও গভীরতর:

        তৃতীয় স্তরের শিশু উপাদানগুলিও দেখা যায়

আমি মনে করি যে এই কাজের জন্য মেনু ব্লক মডিউল ব্যবহার করা অন্যতম সহজ এবং দ্রুত সমাধান।


কেন আমি এই পোস্টের জন্য ডাউনটা পেয়েছি তা সত্যিই জানতে আগ্রহী। প্রস্তাবিত মডিউলটি কাজটি করে এবং আমি একটি ধাপে ধাপে টিউটোরিয়াল লিখেছিলাম। ডাউনওয়োটার কারণগুলি সম্পর্কে কেন একটি মন্তব্য পোস্ট করে না? (সম্ভবত এটি কার্যকর হবে (সম্ভবত না), আমি কমপক্ষে প্রতিক্রিয়া জানাতে পারি))
Sk8erPeter

0

মন্তব্যে উল্লিখিত হিসাবে, আমি এপিআই ফাংশনটি ব্যবহার করে শেষ করেছি এবং তারপরে CSS এর সাথে স্টাইলিং করেছি:

/* --------------- *\
    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

বর্তমান পৃষ্ঠার উপ-মেনু পেতে সঠিকভাবে কাজ করে এই ফাংশন:

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;
}

এই সাহায্য আশা করি!


আপনার ফাংশনটি একটি অনির্ধারিত ফাংশন (ওভাররাইড_ফেলা_এল) কল করে!
ড্রকর্ড

0

@ ক্রিস রকওয়েল এবং @ মারিও আওয়াদ

আমি দ্রুপালে নবাগত তাই এই ফাংশনটি কোথায় যুক্ত করব তা আমার পক্ষে বুঝতে অসুবিধা হয় .. আমি এর জন্য ক্ষমা চাইছি। তবে, আপনি কি দয়া করে এটি উল্লেখ করতে পারেন যে কোন ফাইলটিতে আমাদের এই ফাংশনটি যুক্ত করা উচিত?

আমি সাইড বার নেভিগেশন তৈরি করার চেষ্টা করছি যা প্রতিটি পৃষ্ঠায় কেবলমাত্র শিশু উপাদানগুলি প্রদর্শন করবে। বিভিন্ন পৃষ্ঠায় প্রদর্শিত বিভিন্ন নেভিগেশন লিঙ্কগুলি সহ সাইডবারে নেভিগেশন মেনু কীভাবে তৈরি করবেন?

আমি প্রশংসা করি!

ধন্যবাদ!


0

আমি সবেমাত্র একটি ফাংশন পোস্ট করে শেষ করেছি যা নোডের পথে শিশু মেনু আইটেমগুলি পায়। আপনি এটি এখানে পরীক্ষা করতে পারেন: http://softkube.com/blog/getting-child-menu-items-drupal-menu-tree

পোস্টটি আপডেট হওয়ার ক্ষেত্রে আমি উত্তরটির লিঙ্কটি অন্তর্ভুক্ত করছি এবং শেষের দিকে আমি পুরো কোডটি অনুলিপি / পেস্ট করব।

আপনার ক্ষেত্রে, সমস্ত চাইল্ড মেনু আইটেমের তালিকা তৈরি করতে আপনি আপনার থিমটিতে কিছু সহজেই এটি চালাতে পারেন। echoআপনার পছন্দ অনুসারে বিবৃতি এবং থিমটি সংশোধন করুন ।

$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 />';
}

এবং এখানে ফাংশন এর সম্পূর্ণ কোড। সম্ভাব্য ভবিষ্যতের আপডেটের জন্য লিঙ্কটি পরীক্ষা করুন।

শুভকামনা।

/**
 * 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;
}

ধন্যবাদ মারিও আপনি কেন এটিকে কেন ব্যবহার করে বেছে $parametersনিয়েছেন তা সম্পর্কে মন্তব্য করতে পারেন menu_build_tree?
ক্রিস রকওয়েল

সাহায্য করার জন্য ধন্যবাদ. আমি যা $parametersব্যবহার করেছি তা বিবেচনা করেই প্রয়োজনীয় তথ্য আমি পাইনি, এবং বিশ্বাস করুন যে আমি অনেকটা তাকিয়েছি। আমি যা চেয়েছিলাম তা হল, একটি পথ দেওয়া, সমস্ত স্তরের সমস্ত শিশু মেনু আইটেমগুলি পান এবং আমি কেবল কোনও উপায় খুঁজে পাই না। যদি কেউ থাকে তবে আমাকে জানান, আমি আমার উত্তর এবং ব্লগ পোস্টটি শিখতে এবং আপডেট করতে পেরে খুশি হব। চিয়ার্স।
মারিও আওয়াদ
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.