我正在寻找一种在会员资料页面上显示的方式,即某些内容类型中的贡献数量。基本上它必须显示如下内容:
博客(10)
文章(10)
问题(19)
评论(30)
提示(3)
我已经安装了一些不同的模块(比如“用户统计信息”),我可以帮助我,但是没有成功。
我想知道通过开始使用uid并仅使用我想要显示的内容类型运行一些查询来将其硬编码到我的模板文件中是否最简单,但我不知道该怎么做那个。
非常感谢任何帮助建议。
施 - 梅斯蒂卡
修改
我找到了一个解决方案来手动执行每个内容类型的查询,但我仍然对一个更优雅和更顺畅的解决方案非常感兴趣。
我使用此代码:
global $user;
$userid = $user->uid;
$blog_count = db_result(db_query("SELECT COUNT(0) AS num FROM {node} n where n.type = 'blog' AND status = 1 AND n.uid = {$userid}"));
答案 0 :(得分:1)
鉴于您的简单要求以及手头有SQL语句的事实,我会说只是使用它。没有理由为您的网站添加另一个模块,并且为了单个查询而影响它的性能。
那就是说,从“关注点分离”的角度来看,你不应该只是在模板中删除这个SQL。相反,您应该使用template.php
文件中的预处理函数将其结果添加到可用变量列表中,将其范围限制在您需要的位置,这样您就不会在任何页面上运行此数据库查询,而是使用相应的配置文件页。
答案 1 :(得分:1)
如果您使用的是核心配置文件模块,则可以使用如下所示的内容。它将显示正在查看其配置文件的用户创建的节点。作为额外的好处,它只需要执行一个自定义数据库查询。
将此代码段插入主题文件夹中的template.php
,并将“THEMENAME”更改为主题名称:
function THEMENAME_preprocess_user_profile(&$variables) {
// Information about user profile being viewed
$account = $variables['account'];
// Get info on all content types
$content_types = node_get_types('names');
// Get node counts for all content types for current user
$stats = array();
$node_counts = db_query('SELECT type, COUNT(type) AS num FROM {node} WHERE status = 1 AND uid = %d GROUP BY type', $account->uid);
while ($row = db_fetch_array($node_counts)) {
$stats[] = array(
'name' => $content_types[$row['type']],
'type' => $row['type'],
'num' => $row['num'],
);
}
$variables['node_stats'] = $stats;
}
现在,在user-profile.tpl.php
中可以添加类似于:
// If user has created content, display stats
<?php if (count($node_stats) > 0): ?>
// For each content type, display a DIV with name and number of nodes
<?php foreach ($node_stats as $value): ?>
<div><?php print $value['name']; ?> (<?php print $value['num']; ?>)</div>
<?php endforeach; ?>
// Message to show for user that hasn't created any content
<?php else: ?>
<?php print $account->name; ?> has not created any content.
<?php endif; ?>
这只是您可以做的一般概念。您还可以为要查找/显示的内容类型添加限制,检查用户查看这些统计信息的权限,使用CSS更改统计信息的外观等。
如果您使用Content Profile,则可以使用THEMENAME_preprocess_node()
并在执行此代码之前检查该节点是否为配置文件节点。