You are here

在node.tpl.php中调用模块,模块怎么知道当前node的$nid和$title

dreamour 的头像
Submitted by dreamour on 星期五, 2010-11-05 08:29

使用module_invoke调用模块,模块怎么知道具体调用模块的是哪一个节点?

就是node.tpl.php怎么与模块交流信息的问题。

论坛:

g089h515r806 的头像

1,从node.tpl.php中调用模块里面的函数(比如在这里调用module_invoke)

如果你调用到了node.tpl.php,那么就说明,你访问的是一个节点,也就是drupal内部路径node/nid的形式,这里的Nid是一个整数。

如果在这个时候调用其它模块的函数,也就是在node.tpl.php里面调用其它模块的函数,那么模块中,可以通过arg(1)来或许节点id,通过nid就可以获得当前节点的title。

 

2,对于从模块--〉node.tpl.php的调用顺序,需要了解Drupal模板的预处理机制,其实模板就是一个theme函数,就是为了方便美工,以及方便覆写,复用,在theme函数的基础上作了进一步的抽象。

 

 

dreamour 的头像

代码如下:

<?php
$block = module_invoke('philquotes', 'block', 'view', 0, $nid);
print $block['content'];
?>

然后,在模块的程序中,如模块文件philquotes.module的函数philquotes_block,进行如下参数的接受

function philquotes_block($op='list' , $delta=0, $nid, $edit=array()) {

下面就可以使用节点序号$nid了。

这里暗藏一个问题,就是$nid参数放在$edit参数之前,在需要$edit参数的时候会不会出现问题。

 

也谢谢葛老师及时回复。

 

g089h515r806 的头像

function philquotes_block($op='list' , $delta=0, $edit=array(), $nid=1)

 

$block = module_invoke('philquotes', 'block', 'view', 0, array(), $nid);

dreamour 的头像

1.我的方法导致警告错误
warning: array_merge_recursive() [function.array-merge-recursive]: Argument #5 is not an array in……
模块调用
<?php
$block = module_invoke('philquotes', 'block', 'view', 0, $nid);
print $block['content'];
?>
模块里面的函数
function philquotes_block($op='list' , $delta=0, $nid, $edit=array()) {
 

2.葛老师的方法很好,没有警告错误了:
<?php
$block = module_invoke('philquotes', 'block', 'view', 0, array(), $nid);
print $block['content'];
?>
相应地模块里的函数写法是这样
function philquotes_block($op='list' , $delta=0, $edit=array(), $nid) {
警告错误消失了。
 

dreamour 的头像

不设置默认值会出错:

    * warning: Missing argument 4 for philquotes_block() in

F:\wamp\www\gofangke\sites\all\modules\philquotes\philquotes.module on line 24.