二级链接无法显示的问题

由 firehare 于 周日, 2007-03-25 13:13 提交。

由于Ubuntu官方网站从MoinMoin迁移到Drupal,所以也试着学习Drupal,也试着参考Ubuntu官方网站( http://www.ubuntu.com )上的效果来学习制作Theme,其他都做好了,但就是在站点中增加参考站点右上角的主链接和次链接之后,只能显示主链接,而次链接却没有显示出来,我在page.tpl.php文件中添加了

<?php
 
if (isset($secondary_links)) {
echo
"Secondary Links 存在";
} else {
echo
"Secondary Links 不存在";
}
?>

结果显示Secondary Links 不存在。

我的做法是在管理》菜单》Primary Links 中添加了Products等菜单,然后添加二级菜单并将该菜单的父链接设为Products等主链接上,并勾选Products等主链接的Expanded选项。由于初次接触Drupal,不知哪里出错,还望大侠们指教!

比较奇怪。。。我没

比较奇怪。。。我没用过二级链接,有时间测试一下。。。

--------------------------------------------------
我的Drupal试验田:http://verydummy.com/drupal
--------------------------------------------------

這裡有數個地方要留

這裡有數個地方要留意

在內建的theme 中
primary link 的表示方式和一般的meau 是不同的
你不會在blocks 的header 中找到primary links
所以就算在menu 中primary link 是 expanded
它都不會expand

要將它可expand 化
要在theme 中移除

<?php if (isset($primary_links)) : ?>
     <?php print theme('links', $primary_links, array('class' => 'links primary-links')) ?>
<?php endif; ?>

在blocks 中將primary 放到header 中就可以了

那popup 的效果是用CSS 顯示的
沒有用到javascript 或 改什麼code

Joetsui's blog

可以具体说说不用Javas

可以具体说说不用Javascript,如何用CSS实现PopUp效果吗?

--------------------------------------------------------

Cartson's X次方

首要明白source code

首要明白source code 是ul li 的組合

<ul class="pri">

  <li>
    item1
    <ul class="sec">
      <li>sub-item1</li>
      <li>sub-item2</li>
    </ul>
  </li>

  <li>item2</li>

  <li>item3</li>

</ul>

css for firefox:

.pri li .sec{left:-999px;}
.pri li:hover .sec{left:0px;}

巧妙的使用hover 就可以了

Joetsui's blog

哇!真的好巧妙,谢

哇!真的好巧妙,谢谢分享:)

对了,这样的方法只针对Firefox吗,IE适用吗?
--------------------------------------------------------

Cartson's X次方

忘了打..... IE7+ IE6

忘了打.....

IE7+

IE6 因為只有 <a> support hover
要用javascript onmouseover 將 menu-hover class 加上去

  var sfEls = document.getElementById("pri").getElementsByTagName("LI");
  for (var i=0; i<sfEls.length; i++) {
    sfEls[i].onmouseover=function() {
      this.className+=" sfhover";
    }
    sfEls[i].onmouseout=function() {
      his.className=this.className.replace(new RegExp(" sfhover\\b"), "");
    }
  }

Joetsui's blog

我现在倒也不是说如

我现在倒也不是说如何使二级链接出现,主要是取不到 $secondary_links 的值,只要有值的话,那如何做就简单了!我现在不知道我到底错在哪里!我的Primary Links如下所示:

Products		否	编辑	禁用	删除
- What is Ubuntu?		编辑	禁用	删除
- Download			编辑	禁用	删除
- Get Ubuntu			编辑	禁用	删除
- Software Catalogue		编辑	禁用	删除
- Merchandise			编辑	禁用	删除
- Case Studies			编辑	禁用	删除
Support			否	编辑	禁用	删除
- Community			编辑	禁用	删除
- Documentation			编辑	禁用	删除
- Commercial			编辑	禁用	删除
- Training			编辑	禁用	删除
Community		否	编辑	禁用	删除
- Code of Conduct		编辑	禁用	删除
- Get Involved			编辑	禁用	删除
- Report a Problem		编辑	禁用	删除
- The Ubuntu Story		编辑	禁用	删除
Partners		否	编辑	禁用	删除
- Partner Programme		编辑	禁用	删除
- Programme Tracks		编辑	禁用	删除
- Case Studies			编辑	禁用	删除
- Software Programme		编辑	禁用	删除
- Hardware Programme		编辑	禁用	删除
- Find a Partner		编辑	禁用	删除
News			否	编辑	禁用	删除
- Spotlight			编辑	禁用	删除
- Security Notices		编辑	禁用	删除
- The Fridge			编辑	禁用	删除
- Planet Ubunt			编辑	禁用	删除
- Press Releases		编辑	禁用	删除
- Media Contact			编辑	禁用	删除

其中扩展勾选或不勾选都没作用!

设置情况如下:

 主链接与次级链接(primary and secondary links)为你的站点提供一个导航菜单,一般显示于浏览器窗口的右上角(不同的外观主题可能会放置在不同的位置)。可以在管理菜单页面设置所要显示的链接,或者也可以使用Drupal自带的菜单项。
包含主链接的菜单:
Primary Links
包含次级链接的菜单:
Primary Links
如果您选了和主链接一样的菜单,那么次级链接将显示这个导航结构中相应的次级结构。

不知问题出在哪里!
====
我心无畏,源自我本无知

查了phpTemplate.engine文

查了phpTemplate.engine文件,发现:

  $variables = array(
    'base_path'           => base_path(),
    'breadcrumb'          => theme('breadcrumb', drupal_get_breadcrumb()),
    'closure'             => theme('closure'),
    'content'             => $content,
    'feed_icons'          => drupal_get_feeds(),
    'footer_message'      => filter_xss_admin(variable_get('site_footer', FALSE)) . "\n" . theme('blocks', 'footer'),
    'head'                => drupal_get_html_head(),
    'head_title'          => implode(' | ', $head_title),
    'help'                => theme('help'),
    'language'            => $GLOBALS['locale'],
    'layout'              => $layout,
    'logo'                => theme_get_setting('logo'),
    'messages'            => theme('status_messages'),
    'mission'             => isset($mission) ? $mission : '',
    'primary_links'       => menu_primary_links(),
    'search_box'          => (theme_get_setting('toggle_search') ? drupal_get_form('search_theme_form') : ''),
    'secondary_links'     => menu_secondary_links(),
    'sidebar_left'        => $sidebar_left,
    'sidebar_right'       => $sidebar_right,
    'site_name'           => (theme_get_setting('toggle_name') ? variable_get('site_name', 'Drupal') : ''),
    'site_slogan'         => (theme_get_setting('toggle_slogan') ? variable_get('site_slogan', '') : ''),
    'css'                 => drupal_add_css(),
    'styles'              => drupal_get_css(),
    'scripts'             => drupal_get_js(),
    'tabs'                => theme('menu_local_tasks'),
    'title'               => drupal_get_title()
  );

而其中menu_secondary_links()函数如下:

function menu_secondary_links() {
  $msm = variable_get('menu_secondary_menu', 0);
  if ($msm == 0) {
    return NULL;
  }

  if ($msm == variable_get('menu_primary_menu', 0)) {
    return menu_primary_links(2, $msm);
  }

  return menu_primary_links(1, $msm);
} 

而 variable_get() 函数代码如下:

function variable_get($name, $default) {
  global $conf;

  return isset($conf[$name]) ? $conf[$name] : $default;
} 

所以从上面来看最关键的就是$conf['menu_secondary_menu']是否被设置了!
====
我心无畏,源自我本无知

找到 include/menu.inc

找到 include/menu.inc 文件,在 function menu_secondary_links() 中添加 print $msm; 语句,发现该值等于2,而variable_get('menu_primary_menu', 0) 也等于2,所以返回的是 menu_primary_links(2, 2); 所以查阅 menu_primary_links() 函数,如下所示:

function menu_primary_links($start_level = 1, $pid = 0) {
  if (!module_exists('menu')) {
    return NULL;
  }
  if (!$pid) {
    $pid = variable_get('menu_primary_menu', 0);
  }
  if (!$pid) {
    return NULL;
  }

  if ($start_level < 1) {
    $start_level = 1;
  }

  if ($start_level > 1) {
    $trail = _menu_get_active_trail_in_submenu($pid);
    if (!$trail) {
      return NULL;
    }
    else {
      $pid = $trail[$start_level - 1];
    }
  }

  $menu = menu_get_menu();
  $links = array();
  if ($pid && is_array($menu['visible'][$pid]) &&\
     isset($menu['visible'][$pid]['children'])) {
    $count = 1;
    foreach ($menu['visible'][$pid]['children'] as $cid) {
      $index = "menu-$start_level-$count-$pid";
      if (menu_in_active_trail_in_submenu($cid, $pid)) {
        $index .= "-active";
      }
      $links[$index] = menu_item_link($cid, FALSE);
      $count++;
    }
  }

  // Special case - provide link to admin/build/menu if primary links is empty.
  if (empty($links) && $start_level == 1 && $pid == variable_get('menu_primary_menu', 0) && user_access('administer menu')) {
    $links['1-1'] = array(
      'title' => t('Edit primary links'),
      'href' => 'admin/build/menu'
    );
  }

  return $links;
} 

可以肯定该函数返回的值是 NULL,所以对该函数进行测试!

if ($start_level > 1) {
    echo "hello";
    $trail = _menu_get_active_trail_in_submenu($pid);
    echo $trail;
    if (!$trail) {
      return NULL;
    }

发现 hello 被显示,而后面的 $trail 变量则没有显示,这使测试焦点集中在 menu_get_active_trail_in_submenu() 函数中!
====
我心无畏,源自我本无知

樓主, 在Administer->site

樓主,

在Administer->site building->blocks 中將primary-links 放到 header block 中就可以有"expanded"的primary-links了

theme 中的 print $primary-links 是一個exceptional 的方法表示primary-link
所以沒有"expand"

Joetsui's blog

可我的问题并不是

可我的问题并不是 print $primary-links 出不出现 Primary Link,而是 print $secondary-links 出不出现 Secondary Link 的问题,或者说如何获取主链接下的次链接数据的问题!
====
我心无畏,源自我本无知

試一下就會明白 在Admi

試一下就會明白

在Administer->site building->blocks 中將primary-links 放到 header block 中就可以有"expanded"的primary-links

Joetsui's blog

我做的是Theme,我前面

我做的是Theme,我前面说了要仿Ubuntu官方网站的右上角的效果,我把区块加上去是没有这样的效果的,而是需要生成类似如下的代码,而不是添加一个区块在 Header 区:

<ul>
  <li>xxxxx
    <ul class="submenu">
       <li>yyyyy<li>
       ....
   </ul>
  </li>
  ....
</ul>

所以我还是需要取得 $secondary_links 的值

====
我心无畏,源自我本无知

不明白的是 原始的

不明白的是

原始的 primary link 點選,那換頁時,secondary link會出現。
不管有沒有選expend都會出現。

我的疑問是 如果點了primary links,選單設定也建立好樹狀
那始終無法出現secondary link,只有primary links而已,
該怎麼辦?

之前是可以成功,可是server reinstall時,這功能就沒有反應了,不知道該怎麼想。

試一下 還做了個三級

試一下
還做了個三級的menu

http://joetsui.110mb.com/

Joetsui's blog

不再局限于 $primary_links 之类的了,自己写了一个,终于搞定了!

火起来不再使用 $primary_links 之类的函数,而是使用代码来完成我的设想!其代码如下:

<?php

$output
= "<ul>";
$pri_menu = menu_get_item(2);
//print_r($pri_menu);
foreach($pri_menu['children'] as $pm_item) {
   
$pri_links = menu_get_item($pm_item);
   
$output .= "<li><a href=".$pri_links['path'].">".$pri_links['title']."</a><ul class='submenu'>";
    foreach(
$pri_links['children'] as $sm_item) {
         
$sec_links = menu_get_item($sm_item);
         
$output .= "<li><a href=".$sec_links['path'].">".$sec_links['title']."</a></li>";
    }
   
$output .= "</ul>";
}
$output .= "</ul>";

print
$output;
?>

====
我心无畏,源自我本无知

插嘴一下 寫個resursive

插嘴一下
寫個resursive 的function 可以做到無限層結構
類似:

<?php
$output
= ''
function menu($id, &$output){
 
$pri_menu = menu_get_item($id);
  foreach(
$pri_menu['children'] as $pm_item) {
   
$output .= "<ul>";
   
$output .= "<li><a href=".$pri_links['path'].">".$pri_links['title']."</a>";
   
menu($pri_links['children'],&output);
   
$output .= "</ul>";
  }
}
?>

Joetsui's blog

本来是想写成递归形

本来是想写成递归形式的函数,主要是主链接的 <ul> 次链接的 <ul class="submenu"> 不太一致!不过还是要谢谢兄弟的热心呀!我是 Ubuntu 中文社区的 FireHare,以后多交流!!:)
====
我心无畏,源自我本无知

用一下css

用一下css 可以用同一個class 的

<ul class="menu">

  <li>
    item1
    <ul class="menu">
      <li>sub-item1</li>
      <li>sub-item2</li>
    </ul>
.  </li>

  <li>item2</li>

  <li>item3</li>

</ul>

.menu li .menu{left:-999px;}
.menu li:hover .menu{left:0px;}

我都有用ubuntu, 等待7.04 出正式版^^

Joetsui's blog

有道理,呵呵!还真

有道理,呵呵!还真是笨了一回!:)

====
我心无畏,源自我本无知

发现二个Bug!

发现二个Bug
其一:没有考虑次级链接不存在的情况
其二:没有考虑菜单的权重

故修改如下:

<?php

                $output
= "<ul>";
               
$pri_menu = menu_get_item(2);
               
$pm_links = array();
                foreach(
$pri_menu['children'] as $pmid) {
                   
$pm_item = menu_get_item($pmid);
                   
$pm_links[$pm_item['weight']] = $pm_item;
                    foreach(
$pm_item['children'] as $smid) {
                       
$sm_item = menu_get_item($smid);
                       
$pm_links[$pm_item['weight']]['sm_links'][$sm_item['weight']] = $sm_item;
                  }
                 
ksort($pm_links[$pm_item['weight']]['sm_links']);
                }
               
ksort($pm_links);

                foreach(
$pm_links as $pm_item) {
                   
$output .= "<li><a href=".$pm_item['path'].">".$pm_item['title']."</a>";
                    if (
count($pm_item['children']) != 0) {
                       
$output .= "<ul class='submenu'>";
                        foreach(
$pm_item['sm_links'] as $sm_item) {
                           
$output .= "<li><a href=".$sm_item['path'].">".$sm_item['title']."</a></li>";
                        }
                       
$output .= "</ul>";
                    }
                   
$output .="</li>";
                }
               
$output .= "</ul>";

                print
$output;

?>

====
我心无畏,源自我本无知

谢谢 joetsui 兄弟的帮忙!

十分感谢 Joetsui 兄弟的热心,不过 http://joetsui.110mb.com/ 好象打不开,不知是怎么回事?
====
我心无畏,源自我本无知

我可以打開........... Jo

我可以打開...........

Joetsui's blog

做了一个显示菜单的函数,希望对大家有所帮助

<?php
function show_menu_modified($id = 2)
{
   
$output = '';
   
$pri_menu = menu_get_item($id);
    if(@
is_array($pri_menu['children']))
    {
       
$output .= '<ul class="menu">'."\n";
       
$array_sort_weight = array();
        foreach(
$pri_menu['children'] as $sec_id)
        {
           
$sec_menu = menu_get_item($sec_id);
           
$array_sort_weight[] = $sec_menu['weight'];
        }
       
array_multisort($array_sort_weight, $pri_menu['children']);
        foreach(
$pri_menu['children'] as $sec_id)
        {
           
$sec_menu = menu_get_item($sec_id);
            if(@
is_array($sec_menu['children']) && $sec_menu['children'][0] > 0)
            {
               
$output .= '<li class="expanded"><p>'.$sec_menu['title'].'</p>'.show_menu_modified($sec_id).'</li>'."\n";
            }
            else
            {
               
$output .= '<li class="leaf"><a href="'.url($sec_menu['path']).'">'.$sec_menu['title'].'</a></li>'."\n";
            }
        }
       
$output .= "</ul>";
    }
    return
$output;
}
?>

有没有相关的模块可

有没有相关的模块可以做2级菜单的
找到一个DHTML_menu的模块可以用
但是模块必须是点击才能看见二级菜菜单
我也想要http://www.ubuntu.com/上的鼠标经停效果的菜单
怎么做到
(只要有相应的html框架,我就可以做到,对自己的css有信心,不用javascript可以实现)

default 的多級menu +css

default 的多級menu +css 己經可以

--------------------------------
Joetsui's blog

default

default 的必须是点击主菜单才出现二级 菜单
我是想在默认的情况下所有菜单都一直显示
然后我就可以用css控制了
就是怎么让全部的菜单显示出来这个问题
我用的是primary links作为主菜单 e.g.(home products about contact)
dhtml_menu这个模块只能在firefox里可以显示二级菜单,IE不行
请教joetsuihk了
(说明:我刚开始学drupal不久)

有一個expand

有一個expand 的選項的

--------------------------------
Joetsui's blog

哈哈 太谢谢了! 一找

哈哈
太谢谢了!
一找到这个复选框一切都搞定了
再次谢谢joetsui!
谢谢

^^ --------------------------

^^

--------------------------------
Joetsui's blog