作者:老葛,北京亚艾元软件有限责任公司,http://www.yaiyuan.com
我们在前面提到过,不需要定义模块,只需要使用PHP filter模块,在自定义区块的内容里面,使用PHP代码,也可以实现动态的区块。我们以上面的例子作为对比,采用PHP代码的方式,实现同样的功能。
为此我们需要在区块管理界面添加一个自定义区块,配置信息如图所示:
PHP code形式的实现
在区块正文的文本格式中,我们选择了“PHP code”,同时在正文中输入了以下内容:
<?php
$output = "";
$num = 5;
$base_url = 'http://localhost/discuz';
$query = Database::getConnection('default', 'discuz')
->select('posts', 'p')
->fields('p', array('tid', 'subject'))
->condition('p.first', 1, '=')
->range(0, $num)
->orderBy('p.pid','DESC');
$result = $query->execute();
$output .= "<ul class='discuz-topics'>";
foreach ($result as $record) {
$output .= '<li>';
$output.=l($record->subject,$base_url.'/viewthread.php?tid='.$record->tid);
$output .= '</li>';
}
$output .= "</ul>";
print $output;
?>
这段代码和前面的discuz_topics_get_recent_topics函数中的代码基本一致,只是稍微做了修改。保存这个区块后,显示的效果如图所示:
PHP code形式的区块
这和我们在前面通过模块的形式,实现的功能是完全一样的,所不同的是,我们在这里没有实现任何钩子函数,省了很多功夫。这种方式对于我们这些开发者来说,可以省事不少。我记得以前,我还在公司的时候,做Drupal项目,我和同事合作,我看到他做了一个动态的区块,结果我在模块代码中怎么找都找不到,最后才发现,他放在了自定义区块中。
使用这种方式,在省事的同时,也带来了多种潜在的问题。比如说,程序员的习惯不同,如果一个开发者采用了这种形式,开发了一个动态区块,后来他不再维护这个项目,换了另外的程序员,这种PHP code的形式,就不利于后者理解这段代码的逻辑。此外,对于站点的其它管理员来说,如果他不小心编辑了这个区块,假如在他看来没有做任何修改,只是网站启用了CKeditor标签,不经意之间就会带来PHP语法错误。PHP语法错误的后果,和HTML语法错误的后果完全两回事的。后者仅仅会给个警告,而前者则会使整个网站挂掉。
推荐大家少采用这种方式,即便是采用了,也尽可能的在方便的时候,将其转换为模块的形式。其实模块的形式,熟悉了之后,也复杂不到哪里去。