【问题标题】:Styling menu block's menu links in Drupal 7在 Drupal 7 中样式化菜单块的菜单链接
【发布时间】:2012-03-09 12:54:36
【问题描述】:

我正在尝试在 Drupal 7 中设置块的样式,但我很难弄清楚!

我使用 menu_block 模块从主菜单中获取所有链接。它会在 ul 中生成一个带有链接的块,我想将其主题为每个菜单树的 div。

样式本身应该很简单,但我真的很难找到我应该用来设置样式的主题挂钩/模板文件名。

我尝试过使用theme_menu_treetheme_menu_link,但是它们的主题太多了,我看不出我在设计什么。我试过menu-tree--menu-block--main-menu.tpl.php,但变量与我需要的完全不同。

我的想法是我需要在block.tpl.php 中设置$content 变量的样式,但我不知道如何为特定块设置样式。如果我想在块(块类型)显示(在页脚中)时设置菜单点的样式,我应该在哪里挂钩?

【问题讨论】:

    标签: templates drupal hook drupal-themes


    【解决方案1】:

    我认为在hook_block_view_alter() 中执行此操作是最简单(不一定是最好)的地方

    function MYMODULE_block_view_alter(&$data, $block) {
     if ($block->module == 'menu_block') {
        // Extract the links from the available data
        $links = element_children($data['content']['#content']);
        $content = '';
    
        // Loop through the links and build up the required output.
        foreach ($links as $link) {
          $content .= '<div class="something">' . l($link['#title'], $link['#href']) . '</div>';
        }
    
        // Assign the new output to the block content...done :)
        $data['content'] = $content; 
      }
    }
    

    Devel module 和方便的dpm() 函数是您最好的朋友...它们可以让您在标准消息区域中以结构良好的格式检查任何 PHP 变量。如果您还没有安装它,我建议您这样做,这对于 Drupal 开发来说是绝对必须的。

    一旦你实现了那个钩子,别忘了清除 Drupal 的缓存,否则系统不会拾取它。

    【讨论】:

    • 非常感谢!这样做了 :) 但是覆盖 $data['content'] 的内容似乎很危险。如果另一个模块做同样的事情怎么办,那么我的代码很可能会中断:S 你说这不一定是最好的方法。您还有其他解决方法的想法吗?
    • 想想我不确定有没有更好的方法,只是觉得当时应该有:) 你可以通过设置@987654326 来确保你的钩子在这个过程中被最后调用在system 表中将您的模块的@ 列添加到较高的数字...这将确保您覆盖的内容总是可以说是“获胜”。
    【解决方案2】:

    我遇到了一个非常相似的问题,试图弄清楚如何正确命名我的模板和挂钩。谷歌搜索没有帮助(噪音太大),但最终我在 drupal.org 上尝试了Menu Block module documentation,它引导我朝着正确的方向前进......

    模板:menu-block-wrapper--main-menu.tpl.php

    <nav role="navigation" id="siteNavigation">
    <?php echo render($content); ?>
    </nav>
    

    钩子:THEMENAME_menu_tree__menu_block__MENUNAME()THEMENAME_menu_link__menu_block__MENUNAME()

    function THEME_menu_tree__menu_block__main_menu($vars) {
        return '<ul class="my-custom-menu-wrapper">' . $vars['tree'] . '</ul>';
    }
    
    function THEME_menu_link__menu_block__main_menu($data) {
    
        $el = $data['element'];
    
        // ... render any classes or other attributes that need to go in this <li> 
        $attr = drupal_attributes($el['#attributes']);
    
        // ... render the menu link
        $link = l($el['#title'], $el['#href'], $el['#localized_options']);
    
        // ... and render any submenus
        $sub_menu = drupal_render($el['#below']);
    
        return sprintf("\n<li %s>%s %s</li>", $attr, $link, $sub_menu);
    }
    

    【讨论】:

      【解决方案3】:

      使用打印主题,您可以将 CSS 样式添加到

        print theme('links', array('links' => menu_navigation_links($your_menu_name), 'attributes' => array('class'=> array('ul_class')) ));
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2012-04-19
          • 2011-04-30
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2013-11-25
          • 2023-03-10
          • 1970-01-01
          相关资源
          最近更新 更多