1

在 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.%'";

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

感谢您的帮助!

4

2 回答 2

4

首先 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 为您完成工作,而不是与之抗争。

于 2013-08-24T02:58:18.423 回答
0

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

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

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

$query="SELECT * FROM #__viewlevels WHERE rules LIKE '%$group%'";
于 2013-08-23T18:15:01.590 回答