Mechanizm przypisywania do wielu kategorii
Standardowo w systemie poszczególne elementy treści można przypisywać do jednej wybranej kategorii, przez zdefiniowanie pola menu_id, jako numeru id wybranej kategorii. Ponad to istnieje mechanizm, który pozwala przypisywać element treści do kolejnych kategorii. Kategoria do której zostanie przypisany rekord jako do kategorii dodatkowej zostaje automatycznie oznaczona w bazie dodatkowym identyfikatorem zdefiniowanym w polu multicat w tabeli kategorii (act_menu), domyślnie wartość tego pola jest równa -1, oznacza to, że dana kategoria nie została nigdzie przypisana jako kategoria dodatkowa.
Identyfikator o wartości >= 0 określa numer bitu, którego włączenie będzie oznaczało przypisanie rekordu do tej kategorii.
Kolejne bity włączane są w 32 bitowych polach mcat0, mcat1, mcat2 .. itd
Przykład:
W strukturze menu istnieją kategorie:
id | nazwa kategorii | multicat |
---|---|---|
1 | owoce |
-1 |
2 | warzywa | -1 |
3 | cytrusy |
40 |
4 | rośliny |
-1 |
Jeśli rekord ma zostać przypisany do kategorii "owoce" i do kategorii dodatkowej "cytrusy" wówczas w polu menu_id będzie znajdować się wartość 1 a w polu mcat1 256 (bit o numerze 8 ustawiony na 1 = 2^8 = 256):
menu_id | mcat2 | mcat1 | mcat0 | ||
---|---|---|---|---|---|
1 | 000000000000000000000000 | 000000000000000100000000 | 000000000000000000000000 |
wynika to z tego, w polu mcat0 jest miejsce na kategorie o polu multicat o wartościach od 0 do 31 , natomiast kategorie o polu multicat równym od 32 do 63 są przydzielone do kolejnego pola - mcat1, itd.
Projektując własny moduł, który ma odczytać zawartość z bieżącej kategorii, z uwzględnieniem kategorii dodatkowych wystarczy skorzystać z funkcji genCatWhere($kategoria,$prefix) gdzie parametrem może być numer pojedynczej kategorii lub tablica wielu ID kategorii. Funkcja zwraca warunek SQL, przykład:
dla powyższego przykładu$warunek = genCatWhere(3, 'A.'); // "(A.menu_id = 3 OR A.mcat1 & 256)"