У меня давно была идея сделать разграничение для доступа пользователей к некоторым темам, используя дополнительное поле в профиле пользователя. (Возможность создавать небольшие закрытые тусовки, кружки, гильдии на форуме )
Это удобнее пароля тем что не нужно запоминать еще и пароль к теме, но взамен жертвуется одно из дополнительных полей профиля (в частности поле номер 5)
Итак:
Нам потребуется поставить два скрипта...
В HTML-верх ставится следующий скрипт:
<script type="text/javascript">
var tpc_locks = new Array('1','2','3'); // Список закрытых тем
var forum="http://адрес форума/"
var tpc_tec='';
if (tpc_locks.length!=0){
if (location.href.indexOf(forum+"viewtopic.php?id=")==0){
i=parseInt(tpc_tec=location.href.substring(forum.length+17));
for (j=0; j<tpc_locks.length; j++) { if (i+''==tpc_locks[j])
{ if (GroupID==3) {tpc_notdisp() ; alert("Гостям запрещен просмотр этой темы"); location.href=forum }
else if (GroupID!=1 && GroupID!=2 && document.referrer.indexOf(forum+"viewtopic.php?id="+i)==-1 && document.referrer.indexOf(forum+"profile.php?section=fields&id="+UserID+"???jst"+i)==-1){
tpc_notdisp(); location.href=forum+"profile.php?section=fields&id="+UserID+"???jst"+tpc_tec };
break}}}
else if (location.href.indexOf(forum+"profile.php?section=fields&id="+UserID+"???jst")==0){
tpc_tec=location.href.substring(location.href.indexOf("???jst")+6); tpc_notdisp() }
else if (location.href.indexOf(forum+"post.php?tid=")==0) {
i=parseInt(location.href.substring(forum.length+13));
for (j=0; j<tpc_locks.length; j++) {if (i+''==tpc_locks[j])
{ if (document.referrer.indexOf(forum+"viewtopic.php?id="+i)==-1 && document.referrer.indexOf(forum+"post.php?")==-1){
tpc_notdisp(); tpc_notlook()}; break }}}
}
function tpc_notdisp()
{document.write('<style type="text/css"> HTML, BODY { display: none } </style>') }
function tpc_notlook()
{alert ("У вас нет допуска к этой теме"); location.href=forum}
</script>Во второй строчке нужно выставить свои номера закрытых тем, а в третьей свой адрес форума.
Номер темы посмотреть можно по адресу темы
например: "http://Форум.0pk.ru/viewtopic.php?id=534"
здесь номер темы 534 записать его надо будет '534'
В HTML-низ ставим следующий скрипт:
<script type="text/javascript">
var forum="http://адрес форума/"
if (tpc_tec!='' && location.href==forum+"profile.php?section=fields&id="+UserID+"???jst"+tpc_tec)
{ if (document.getElementById('fld5').value.indexOf(','+parseInt(tpc_tec)+',')!=-1){
location.href=forum+"viewtopic.php?id="+tpc_tec }
else tpc_notlook() }
</script>Во второй строчке нужно вставить адрес вашего форума (на всякий случай для защиты от конфликтов с другими скриптами
)
Теперь в настройках форума Администрирование/Поля нужно выставить в поле номер 5 следующее:
Название - любое,
Длина - побольше, из рассчета чтоб все номера тем поместились (я ставил 256)
все остальные пункты - в позицию 'нет' (главное запретить пользователю самому заполнять поле)
Теперь о заполнении поля...
Когда вы хотите дать пользователю доступ в некоторую закрытую тему, вы должны добавить ее номер в профиль пользователя в дополнительное поле 5, причем номерация ведется через запятую, но для облегчения поиска в скрипте начинаться запись в поле должна с запятой и ей же заканчиваться. Пробелы запрещены !
Пример записи в поле 5:
,4,6,123,46,
Если не будет крайних запятых, то номера крайних тем проигнорируются...
Ну вот наверно и все... Да, администратор и модераторы имеют доступ ко всем темам (можно убрать удалив кусок условия в ... else if (GroupID!=1 && GroupID!=2 && ... ) ... в верхнем скрипте. 'GroupID!=1 &&' - администратор, 'GroupID!=2 &&' - модератор )
Защитить от "взлома" через отключение поддержки яваскриптов в браузере, можно попробовать, использовав 'Запрет входа на форум с отключенной поддержкой javascript'
Удачи !!!
Отредактировано Aleksandr (2010-09-19 12:59:08)

Для общих целей форума баг не существенный, но в нашем случае фатальный... (минута молчания) )))

) - скрипт оказался не расчитан на многостраничные темы, это можно исправить, но с учетом основной проблемы не вижу смысла