2015-03-30 189 views
1

我正在drupal的第一个网站上工作,并且还阅读了主题和模块开发的一些基础知识。现在,我创建(压倒一切的主题鲜明的)我自己的主题,即page.tpl.php中并没有要求输出主菜单项的主题()函数:为什么要在page.tpl.php中使用theme()函数?

<?php print theme('links__system_main_menu', array('links' => $main_menu, 'attributes' => array('id' => 'main-menu', 'class' => array('links', 'inline', 'clearfix')), 'heading' => t('Main menu'))); ?> 

我大致了解该功能是什么,但为什么我应该在这种情况下使用它?如果从模块输出数据 - 通过选定的主题风格化输出,这将是有意义的。但在这种情况下,我需要的所有东西都直接在$main_menu数组中,我可以将其设置为无论如何,但是我想要什么,theme()函数在page.tpl.php中有什么用处?

回答

3

为什么要在page.tpl.php中使用theme()函数?

您不应该。在你的page.tpl.php中

/** 
* Implements hook_preprocess_page(). 
*/ 
function yourtheme_preprocess_page(&$vars) { 
    $vars['main_menu'] = theme('links__system_main_menu', array('links' => $vars['main_menu'], 'attributes' => array('id' => 'main-menu', 'class' => array('links', 'inline', 'clearfix')), 'heading' => t('Main menu'))); 
} 

,然后简单地print $main_menu;

为了避免调用主题()函数在你的页面模板,你可以在你的template.php做到这一点。

+1

答案可能不会提供OP要求的内容,但他现在需要知道的内容。加1指出Drupal的良好实践。 – D34dman 2015-03-31 10:32:34

+0

它不起作用 - 我将该函数添加到template.php,并且print $ main_menu正在返回“Array”字符串。顺便说一句。 $ main_menu已经在page.tpl.php中定义了,注释如下:* - $ main_menu(array):一个包含 – Incredible 2015-03-31 11:11:53

+0

的主菜单链接的数组你可以在你的template.php中搜索main_menu吗?它应该在那里定义,因为这个变量在你的page.tpl.php中可用。你应该找到它的定义,并覆盖它。 – 2015-03-31 16:11:17

0

的一点是,如果你走线槽Drupal的主题系统,它提供了一个机会,其他安装的模块做了改变 - 他们的钩子函数将被调用:

https://www.drupal.org/node/933976

换句话说,如果你不要做“干净”的方式,可能会发生某些其他模块功能无法使用的情况。

1

使用theme('links__system_main_menu', ...)的要点是要重新使用现有的通用links主题实现的主题。 system_main_menu后缀(后两个_),允许您提供通用links的更具体的实现。如果您然后覆盖首页(即page-front.tpl.php)和nodes of a specific content的页面模板,则不必复制HTML代码。这使得更容易维护,因为您不必将更改复制到多个文件。

+0

有道理,谢谢.. – Incredible 2015-04-02 10:12:44

相关问题