【问题标题】:Get current user access level in Joomla 2.5在 Joomla 2.5 中获取当前用户访问级别
【发布时间】:2013-08-23 17:44:41
【问题描述】:

在 Joomla 2.5.14 中,我有一个获取当前用户组 ID 的脚本,例如:

$groups = $user->get('groups');
foreach($groups as $group) {
    echo "<p>Your group ID is:" . $group . "</p>";
};

现在,考虑到他的访问级别,我需要计算该用户能够阅读的文章数量。

为此,我需要从 viewlevels 表中选择访问级别,如下所示:

id     title            rules JSON encoded access control.
1   Public      [1]
2   AccessA     [13,8,16,17]
3   AccesssF    [8]
4   AccessD     [14,8]
6   AccessB     [8,16,17]
7       AccessC     [8,17]

因此,例如,第 17 组可能会阅读 AccessA、AccessB 和 Access C 中的文章。

我尝试了以下查询,但没有选择任何行:

$query="SELECT * FROM xmb9d_viewlevels WHERE rules LIKE '%.$group.%'";

如何选择当前用户组的所有访问级别,然后统计他能够阅读的文章数?

感谢您的帮助!

【问题讨论】:

    标签: php mysql joomla


    【解决方案1】:

    首先 https://github.com/joomla/joomla-cms/blob/master/libraries/joomla/access/access.php#L285

    JAccess::getGroupsByUser($userId, $recursive = true)
    

    将通过继承为您提供用户匹配的组(除非您将 $recursive 设为 false)

    https://github.com/joomla/joomla-cms/blob/master/libraries/joomla/access/access.php#L402

    JAccess::getAuthorisedViewLevels($userId) 将为您提供允许用户以数组形式查看的所有视图级别。

    如果你这样做了

    $allowedViewLevels = JAccess::getAuthorisedViewLevels($userId);
    

    如果别无他法

    $implodedViewLevels = implode(',', $allowedViewLevels);
    
    ....
    
    $query->select($db->quoteName('id'))
    ->from('#__content')
    ->where($db->quoteName('access') . 'IN (' . $implodedViewLevels . ')';
     ....
    

    (未经测试,但您大致了解)。 在 joomla 中,总是尝试让 api 为您完成工作,而不是与之抗争。

    【讨论】:

    • 嗨,explode 不能在阵列上工作。但我明白了。也许我可以遍历数组并构建访问级别字符串,用逗号分隔,我可以在查询中使用。
    【解决方案2】:

    我认为您只需要从 LIKE 子句中删除句点即可。如:

    $query="SELECT * FROM xmb9d_viewlevels WHERE rules LIKE '%$group%'";
    

    此外,为了使其不特定于数据库,您应该用#__(注意:它是两个下划线)代替表前缀:

    $query="SELECT * FROM #__viewlevels WHERE rules LIKE '%$group%'";
    

    【讨论】:

    • 效果很好,谢谢!现在,如何使用此选择的结果计算表 __content 中的文章数?我应该将选择的结果传递给一个变量,然后在另一个查询中使用它还是可以编写一个查询?
    • 这个怎么样,$query="SELECT count(*) FROM #__content WHERE access in (select id from #__viewlevels where rules LIKE '%$group%'";
    • 其实 count(*) 不好用。我建议: $query="SELECT count(id) FROM #__content WHERE access in (select id from #__viewlevels where rules LIKE '%$group%'";
    • 嗨,我试过了: $query="SELECT count(id) FROM #__content WHERE access in (SELECT id FROM #__viewlevels WHERE rules LIKE '%$group%')"; if ($stmt = mysqli_prepare($link, $query)) { /* 执行查询 / mysqli_stmt_execute($stmt); //i>存储结果/mysqli_stmt_store_result($stmt); / Conta o número de artigos por nível de acesso!" ; / $nartigos=mysqli_stmt_num_rows($stmt); / 关闭语句 */ mysqli_stmt_close($stmt); }; echo "Nº de artigos " .$nartigos; 我收到错误:注意:未定义变量:nartigos
    • 使用 api 比尝试使用查询要好得多。
    猜你喜欢
    • 2013-08-15
    • 2013-08-17
    • 1970-01-01
    • 1970-01-01
    • 2013-08-02
    • 2012-05-15
    • 1970-01-01
    • 2012-11-10
    • 2015-09-22
    相关资源
    最近更新 更多