Я пишу аддон для отображения последних тем / сообщений форума vBulletin 4 в приложении extern. Обе системы работают в одном домене, поэтому я могу получить сеанс vB пользователя во внешнем приложении. Поскольку на форуме vB есть некоторые форумы со специальным разрешением (например, внутренние для персонала), я хочу показывать только темы, которые пользователь, по крайней мере, может читать.
Я узнал, что это можно сделать следующим образом:
$notAccessableForums = array();
foreach($vbulletin->forumcache as $forumId => $forumInfo) {
// User need at least view-access
$userCanViewForum = $vbulletin->userinfo['forumpermissions'][$forumId] & $vbulletin->bf_ugp_forumpermissions['canview'];
if(!$userCanViewForum) {
$notAccessableForums[] = $forumInfo['forumid'];
}
}
$notAccessableForums
будет массивом всех идентификаторов форума, к которым текущий пользователь не сможет получить доступ. Это можно использовать easilly, чтобы исключить их в операторе SELECT для таких потоков, как
$query = 'SELECT title [...]
FROM thread
WHERE forumid NOT IN(' . implode(',', $notAccessableForums) . ');';
Проблема с этими решениями заключается в том, что ядро vB необходимо для списка форумов и для пользователей с правами доступа. Я не хочу включать ядро по следующим причинам:
Я взглянул на исходный код vB и выяснил, что права доступа хранятся в datastore
table (который также является очень большим массивом, потому что там также хранится много другой информации, которая мне не нужна, например, статистика, отношения и т. д.). Но я не мог понять, как я могу получить пользовательские разрешения на форуме.
Другими словами: мне нужно битовое поле, которое хранится в VB Var $vbulletin->userinfo['forumpermissions'][$forumId]
так что я могу определить $vbulletin->bf_ugp_forumpermissions['canview']
как постоянный в моем классе и получить список всех форумов из базы данных, чтобы проверить, какой из них не виден текущему пользователю.
вот полная статья для последней статьи vbulletin4 и VB5 и комментарии для сайтов html и php
http://thearfan.com/vbulletin-latest-post-for-htmlphp-sites/
Других решений пока нет …