ড্রুপাল 7 এ প্রোগ্রামিকভাবে একটি মেনু তৈরি করুন


15

একটি নবাগত প্রশ্ন ছেলেরা।

কোনও চিন্তা কীভাবে আমি প্রোগ্রামিকভাবে মেনু তৈরি করতে পারি? বলে যে আমার কাছে 3 টি আলাদা মেনু রয়েছে যা আমি তৈরি করতে চাই। প্রথম মেনুটি শিরোলেখের শীর্ষ বামে স্থাপন করা হবে। দ্বিতীয় মেনুটি প্রথম মেনুর নীচে স্থাপন করা হবে। তৃতীয় মেনুটি হবে প্রধান নেভিগেশন।

এই মেনুগুলি কি একই গ্রুপের অধীনে থাকতে পারে? স্টাইলিংয়ে কি সমস্যা হবে?

ধন্যবাদ

উত্তর:


25

আপনি যদি কোনও আপডেট স্ক্রিপ্টে এটি করার চেষ্টা করছেন, এটির কাজ করা উচিত:

$menus = array(
  array(
    'menu_name' => 'menu_test_one',
    'title' => 'My Menu One',
    'description' => 'Lorem Ipsum',
  ),
  array(
    'menu_name' => 'menu_test_two',
    'title' => 'My Menu Two',
    'description' => 'Lorem Ipsum',
  ),
  array(
    'menu_name' => 'menu_test_three',
    'title' => 'My Menu Three',
    'description' => 'Lorem Ipsum',
  ),
);

$links = array(
  array(
    array(
      'link_title' => 'Link1',
      'link_path' => 'http://yourdomain.com/link1',
      'menu_name' => 'menu_test_one',
      'weight' => 0,
      'expanded' => 0,
    ),
    array(
      'link_title' => 'Link2',
      'link_path' => 'http://yourdomain.com/link2',
      'menu_name' => 'menu_test_one',
      'weight' => 1,
      'expanded' => 0,
    ),
  ),
  array(
    array(
      'link_title' => 'Link3',
      'link_path' => 'http://yourdomain.com/link3',
      'menu_name' => 'menu_test_two',
      'weight' => 0,
      'expanded' => 0,
    ),
    array(
      'link_title' => 'Link4',
      'link_path' => 'http://yourdomain.com/link4',
      'menu_name' => 'menu_test_two',
      'weight' => 1,
      'expanded' => 0,
    ),
  ),
  array(
    array(
      'link_title' => 'Link5',
      'link_path' => 'http://yourdomain.com/link5',
      'menu_name' => 'menu_test_three',
      'weight' => 0,
      'expanded' => 0,
    ),
    array(
      'link_title' => 'Link6',
      'link_path' => 'http://yourdomain.com/link6',
      'menu_name' => 'menu_test_three',
      'weight' => 1,
      'expanded' => 0,
    ),
  ),
);

// Save menu group into menu_custom table
foreach ($menus as $menu) {
  // Look the table first if the data does exist
  $exists = db_query("SELECT title FROM {menu_custom} WHERE menu_name=:menu_name", array(':menu_name' => $menu['menu_name']))->fetchField();
  // Save the record if the data does not exist
  if (!$exists) {
    menu_save($menu);
  }
}

$item = ''; 
foreach ($links as $layer1) {
  foreach ($layer1 as $link) {
    // Build an array of menu link 
    $item = array(
      'link_path' => $link['link_path'],
      'link_title' => $link['link_title'],
      'menu_name' => $link['menu_name'],
      'weight' => $link['weight'],
      'expanded' => $link['expanded'],
    );
    // Look the table first if the data does exist
    $exists = db_query("SELECT mlid from {menu_links} WHERE link_title=:link_title AND link_path=:link_path", array(':link_title' =>  $link['link_title'], ':link_path' => $link['link_path']))->fetchField();
    // Save the record if the data does not exist
    if (!$exists) {  
      menu_link_save($item);
    }
  }
}

আমার পদ্ধতির ভুল হলে মন্তব্যগুলি স্বাগত। ধন্যবাদ।


এটি আমি যা চাই ঠিক তাই। আমাকে আপনার কোড চেষ্টা করে দেখতে দিন এবং পরে প্রতিক্রিয়া জানাতে। ভাগ করে নেওয়ার জন্য ধন্যবাদ
ব্যবহারকারী 8012

5
$ বিদ্যমান ডিবি ক্যোয়ারিকে চালানোর পরিবর্তে আরও ভবিষ্যতের প্রমাণ (তবে কিছুটা ধীরে ধীরে ধীরে) পদ্ধতিটি ব্যবহার করা হবে ((মেনু_লোড ($ মেনু ['মেনু_নাম']))) {মেনু_সেভ ($ মেনু); }
বালা ক্লার্ক

দুর্দান্ত, সুন্দর!
টাইলার ডারডেন

আমার পরামর্শটি হ'ল একটি ক্যোয়ারির পরিবর্তে মেনু_জেট_মেনাস () ব্যবহার করুন। তারপরে আপনি মেনুগুলিকে কোনও if (!array_key_exists($menu, $menus)) {ভারে সংরক্ষণ করতে পারেন এবং কেবল একটি করতে পারেন - এছাড়াও মেনু_জেট_মেনাস () এ একক প্যারাম FALSE যুক্ত করে কেবলমাত্র কাস্টম মেনুগুলি দেয়।
খ্রিস্টান

1
এছাড়াও আপনি যখন মেনু লিঙ্কটি উপস্থিত আছেন কিনা তা পরীক্ষা করে দেখুন: // ডেটা উপস্থিত থাকলে প্রথমে টেবিলটি দেখুন $ বিদ্যমান = ... একই লিঙ্কের সংমিশ্রণটি বিভিন্ন মেনুতে থাকতে পারে আপনাকে মেনু_নামের জন্যও পরীক্ষা করতে হবে।
hugronaphor

4

অ্যারে থেকে সহজেই একটি মেনু পপুলেশন করার একটি উপায় এখানে:

<?php
function populate_menu($links, $menu_name, $plid = 0) {
  foreach ($links as $link) {
    $ls = array(
      'menu_name' => $menu_name,
      'link_title' => $link['link_title'],
      'link_path' => $link['link_path'],
      'plid' => $plid,
    );
    $newpid = menu_link_save($ls);
    if (!empty($link['childs'])) {
      populate_menu($link['childs'], $menu_name, $newpid);
    }
  }
}


$items = array(
  array(
    'link_title' => 'Menu1',
    'link_path' => '<front>',
    'childs' => array(
      array(
        'link_title' => 'Sub Item 1',
        'link_path' => '<front>',
        'childs' => array(
          array(
            'link_title' => 'Link item 1',
            'link_path' => '<front>',
          ),
          array(
            'link_title' => 'Link item 2',
            'link_path' => '<front>',
          ),
        ),
      ),
      array(
        'link_title' => 'Sub Item 2',
        'link_path' => '<front>',
        'childs' => array(
          array(
            'link_title' => 'Link item',
            'link_path' => '<front>',
          ),
        ),
      ),
    ),
  ),
);
populate_menu($items, 'main-menu');

2

hook_menu()আপনার কাস্টম মডিউলটি প্রয়োগ করার জন্য আপনার প্রয়োজনীয় সমস্ত কিছুই। কাস্টম মডিউল তৈরির জন্য, এই ডকুমেন্টেশনটি দেখুন

//Define the menus in the function which goes in your MYMODULE.module file  
function MYMODULE_menu() {
  //the menu which will point to http://yoursite/first-menu
  $items['first-menu'] = array(
    'title' => 'First menu',  // will appear as the name of the link
    // Page callback, etc. need to be added here.
  );

  //the menu which will point to http://yoursite/second-menu
  $items['second-menu'] = array(
    'title' => 'Second menu',  // will appear as the name of the link
    // Page callback, etc. need to be added here.
  );

  //the menu which will point to http://yoursite/third-menu
  $items['third-menu'] = array(
    'title' => 'third menu',  // will appear as the name of the link
    // Page callback, etc. need to be added here.
  );

  return $items;
}

page.tpl.phpআপনার থিমের ফাইলটিতে নিম্নলিখিত কোড যুক্ত করে আপনি যে কোনও অঞ্চলে মেনু মুদ্রণ করতে পারবেন ।

//add this line in <div id="header"></div> to print it in header.
<?php
$menu1 = menu_navigation_links('first-menu');
print theme('links__first_menu', array('links' => $menu1));

//print second menu just below first menu
$menu2 = menu_navigation_links('second-menu');
print theme('links__second_menu', array('links' => $menu1));
?>

আপনার মুদ্রণের দরকার নেই third-menuকারণ এটি ডিফল্টরূপে নেভিগেশন মেনুতে উপস্থিত হবে।


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


1
নেভিগেশন মেনু তৈরি এবং এটি কোনও পৃষ্ঠায় যুক্ত করার জন্য এটি সর্বোত্তম অনুশীলন নয়। হুক_মেনু () পৃষ্ঠা কলব্যাক তৈরি করার জন্য, নেভিগেশন মেনু তৈরির জন্য নয়। পার্থক্য ব্যাখ্যা করে যা নীচের পড়ুন। api.drupal.org/api/drupal/includes!menu.inc/group/menu/7
খ্রিস্টান

1
@ ক্রিশ্চিয়ানের উত্তর দেওয়ার সময় আমি ড্রুপাল শিখতে শুরু করেছি; এবং যেভাবে আমি দ্রুপাল শিখতে পছন্দ করতাম তা হ'ল এখানে জিনিসগুলির উত্তর দিয়ে আসলে জিনিসগুলি চেষ্টা করে। আমার কাছে জ্ঞানের বর্তমান স্তরে আমি অবশ্যই এই ধরণের উত্তরটি ভোট দিয়ে দেব; তবে আমি শুরুতে যেভাবে ভেবেছিলাম সে সম্পর্কে আমি আসলে একরকম গর্বিত :) আপনি যেভাবে ব্যাখ্যা করেছেন এবং লিঙ্কটি দিয়েছেন তাতে আমি তার প্রশংসা করি।
অজিৎ

আরে অজিতস, সব ভাল - আমি প্রায়শই ভোটের উত্তর নিই না। উত্তরের আগে আমি কেবল একটি আপডেট যুক্ত করব যা বলবে যে আপনি আর এই পদ্ধতির পরামর্শ দিচ্ছেন না। জবাবের জন্য ধন্যবাদ.
খ্রিস্টান

আমার ডাউনটোট সরিয়ে দিয়েছে
খ্রিস্টান

0

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

রফতানি লিপির উদাহরণ এখানে:

$menu_name = 'menu-footer-secondary-menu';

// Create menu if doesn't exist.
if (!menu_load($menu_name)) {
  $menu = array(
    'menu_name' => $menu_name,
    'title' => t('Footer secondary menu'),
    'description' => '',
  );
  menu_save($menu);
}

// Import menu links from JSON.
$menu_string = 'Impressum {"url":"node\/1","options":{"attributes":[]}}
Datenschutzbestimmungen {"url":"node\/2","options":{"attributes":[]}}
Nutzungsbedingungen {"url":"node\/3","options":{"attributes":[]}}
';

$options = array(
  //'link_to_content' => TRUE, // Look for existing nodes and link to them.
  'create_content' => TRUE, // Create new content (also if link_to_content not set).
  'remove_menu_items' => TRUE, // Removes current menu items.
  'node_type' => 'page',
  'node_body' => 'Page is in development...',
  'node_author' => 1,
  'node_status' => 1,
);

menu_import_string($menu_string, $menu_name, $options);

আপনি এই স্ক্রিপ্টটি hook_update_N () বা আপডেট স্ক্রিপ্ট প্রসেসরের সাহায্যে চালাতে পারেন


0

একটি মেনু ব্লক তৈরি করার জন্য, আপনার। ইনস্টল ফাইলটিতে hook_enable () প্রকার প্রয়োগ করে

function mymodule_enable() {
  $t = get_t();
  if (module_exists('menu')) {
    menu_save(array(
      'menu_name' => 'my-new-menu',
      'title' => $t('My New Menu'),
      'description' => $t('My Menu description'),
    ));
  }
 }

একই। ইনস্টল ফাইলটিতে, hook_uninstall () প্রয়োগ করে।

function mymodule_uninstall() {
  if (module_exists('menu')) {
   if ($my_menu = menu_load('my-new-menu')) {
    menu_delete($my_menu);
  }
 }
}

হুক_মেনু () প্রয়োগ করার সময় আপনার। Module ফাইলে পরবর্তী।

function mymodule_menu() {
  return array(
   'mypage' => array(
   'title' => 'My Page',        
   'description' => 'My Page description',    
   'page callback' => 'my_page_callback_func',
   'page arguments' => array(arg(0)),
   'access arguments' => array('access content'),
   'menu_name' => 'my-new-menu',
   'file' => 'my.new.page.inc',
   'file path' => drupal_get_path('module', 'mymodule') . '/includes',
  ),
 );     
}

.Inc ফাইলটি হ'ল মাইমডিউল ফোল্ডারের মধ্যে থাকা ফোল্ডার অন্তর্ভুক্ত।

দেখুন devel আরও তথ্যের জন্য মডিউল এর devel.install এবং devel.module ফাইল।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.