Adrian P.

Adrian P. pamiętaj o tym, kto
chce latać musi
skoczyć

Temat: Skrypt forum...

Cześć,

obecnie próbuję napisać sobie własne forum, ale mam już problemy, nie wiem jak rozwiązać pewne rzeczy...
Tabele:
forum_categories
category_id
category_name
category_desc
category_order
last_post_id
total_thread
total_posts

forum_posts
post_id
topic_id
post_subject
post_message
post_create_date
post_last_modify
post_count_modify
post_ip
user_id
guest_name
guest_mail

forum_thread
topic_id
category_id
thread_subject
thread_desc
thread_create_date
thread_view
thread_reply
thread_ip
last_post_id
user_id
guest_name
guest_mail

users
user_id
group_id
username
password
mail

users_group
group_id
group_name
pw_read
pw_send
forum_thread_add
forum_thread_delete
forum_thread_edit
forum_post_add
forum_post_delete
forum_post_edit


Zapytaniem:
SELECT cat.category_id, cat.category_name, cat.category_desc, post.post_id, post.post_subject, post.post_create_date, post.guest_name, user.user_id, user.username FROM forum_categories cat LEFT JOIN forum_posts post ON (cat.last_post_id = post.post_id) LEFT JOIN users user ON (post.user_id=user.user_id) ORDER BY cat.category_order ASC


pobieram informacje potrzebne do wyświetlenia podstawowych danych przy kategoriach (id, tytuł, opis, ilość tematów i wypowiedzi w kategorii, nazwę i id użytkownika lub nazwę i maila gościa)

Zapytaniem:
SELECT t.thread_id, t.thread_subject, t.thread_desc, t.thread_create_date, t.thread_view, t.thread_reply, t.guest_name, t.guest_mail, u1.user_id, u1.username, p.guest_name, p.guest_mail, u2.user_id, u2.username FROM forum_thread t LEFT JOIN forum_posts p ON (t.last_post_id=p.post_id) LEFT JOIN users u1 ON (t.user_id=u1.user_id) LEFT JOIN users u2 ON (p.user_id=u2.user_id) WHERE t.category_id=$category ORDER BY p.post_create_date DESC


I tu kończy się moja praca, bo mam problem.

Nie mogę dać na sztywno total_thread i total_posts bo przecież w zależności od uprawnień liczba ta może zmieniać się - jak to rozwiązać?

Chcę zrobić blokadę na wybrane wątki czy kategorie:
- chcę aby wybrane kategorie i wątki w niej były widoczne dla wybranej grupy
- chcę aby wybrane wątki były widoczne dla osób spełniających wymogi (np. x dni na forum (x to ilość ręcznie ustalonych dni), ilość napisanych postów, tylko dla zarejestrowanych)

Dajmy na to że mam takie kategorie:
Regulamin
Nowości ze świata
Nowości z Polski
Czarna lista
VIPy

Gość lub osoba zarejestrowana (group_id=1) widziałby:
Regulamin
Nowości ze Świata
Nowości z Polski
Czarna lista

Osoba zarejestrowana spełniająca wymogi (np. na forum x dni lub należąca do group_id=2) widziałby:
Regulamin
Nowości ze Świata
Nowości z Polski
Czarna lista
VIPy

Po wejściu w Nowości ze Świata osoba niezarejestrowana widziałaby tylko:
Panowie rano, panie po południu - płeć ma swoją porę
Rozpoczął się pogrzeb Vaclava Havla
Wygrał sportowy samochód, a już 6 godzin później...

Osoba zarejestrowana widziałby:
Panowie rano, panie po południu - płeć ma swoją porę
Rozpoczął się pogrzeb Vaclava Havla
Wygrał sportowy samochód, a już 6 godzin później...
Czy masowo usuną silikonowe piersi?
Co robi 60 "sekretarek" św. Mikołaja?

Po wejściu w wybrany temat np w "Wygrał sportowy samochód, a już 6 godzin później..." sprawdzane by było czy dana osoba ma uprawnienia do czytania, pisania i edytowania wpisów.

Jak zrobić coś takiego?
Myślałem żeby stworzyć tabelę
forum_settings
setting_type (1 - kategoria, 2 - wątek)
setting_id (id kategorii lub wątku)
setting_visible (1 - widoczny dla wszystkich, 2 - widoczny dla zarejestrowanych, 3 - widoczny dla wybranych)
Tylko kolejna sprawa co jak np. do danej kategorii będę chciał dać uprawnienia kilku grupom

I najważniejsze jak to połączyć z tamtymi zapytaniami do wyświetlenia?

Macie jakieś pomysły? ;)
Janusz Skudrzyk

Janusz Skudrzyk Członek zarządu,
weblabs.pl

Temat: Skrypt forum...

Osobna tabelka na liczniki z uwzględnieniem wymagań, a żeby za bardzo nie komplikować sprawy, to kasowanie postów robisz jako: user = 0, nick = '~', avatar = 'default', tekst = ''. Kasowanie wątków podobnie: temat = 'usunięty' (wszystkie posty oznaczone jako skasowane). Przy pobieraniu listy wątków, kategorii czy co tam jest INNER JOIN z tabelą forum_settings. Warunki do tego INNER JOINA określone na podstawie danych usera (domyślne ustawione na samym początku, będą od razu dla niezalogowanych).Janusz Skudrzyk edytował(a) ten post dnia 23.12.11 o godzinie 13:54
Adrian P.

Adrian P. pamiętaj o tym, kto
chce latać musi
skoczyć

Temat: Skrypt forum...

user = 0, nick = '~', avatar = 'default', tekst = '' - nie rozumiem tego...

Ale ja nie chcę w forum_settings dawać informacji do wszystkich wątków/kategorii tylko do tych, które wymagają jakiś specjalnych przywilejów..
Janusz Skudrzyk

Janusz Skudrzyk Członek zarządu,
weblabs.pl

Temat: Skrypt forum...

Post usunięty, więc albo pokazujemy normalnie element tylko z pustymi polami i bez linka do profilu, albo pokazujemy sam napis: "wiadomość usunięta przez moderatora". Zawsze można się pobawić w przeliczanie liczników przy każdym kasowaniu/ukrywaniu posta.

W takim razie w zapytaniu uwzględnienie danych usera i dorzucenie left join + where.Janusz Skudrzyk edytował(a) ten post dnia 23.12.11 o godzinie 16:33
Adrian P.

Adrian P. pamiętaj o tym, kto
chce latać musi
skoczyć

Temat: Skrypt forum...

Stworzyłem tabelę:
forum_auth
auth_type (1 - dla kategorii, 2 - dla wątków)
auth_id (id kategorii lub wątku)
auth_visible (0 - niewidoczne, 1 - widoczne)
auth_group_id (id grupy dla której są wprowadzane ograniczenia)

1. pobieramy ID grupy (1,2,3 dla zalogowanej osoby, 0 dla gościa)
2. Pobieramy informacje o kategoriach:
SELECT cat.category_id, cat.category_name, cat.category_desc, post.post_id, post.post_subject, post.post_create_date, post.guest_name, user.user_id, user.username FROM forum_auth auth, forum_categories cat LEFT JOIN forum_posts post ON (cat.last_post_id = post.post_id) LEFT JOIN users user ON (post.user_id=user.user_id) WHERE (cat.category_id=auth.auth_id and auth.auth_group_id={$id_grupy} and auth.auth_type=1 and auth_visible=1) ORDER BY cat.category_order ASC

Ale problem teraz taki, że nie zawsze ostatni post musi być widoczny dla danej grupy, wniosek z tego taki że na sztywno nie mogę wpisać ID, czy da się zrobić przy left join order by ID DESC limit 1?

Jak rozwiązać coś takiego?

Następna dyskusja:

Skrypt forum




Wyślij zaproszenie do