Problem z nadpisywaniem kont podczas współdzielenia użytkowników

Poniżej opisane zabiegi są konieczne tylko w wypadku starszych wersji Drupala. Drupal 6 nie korzysta już z tabeli sequences, a więc problem w nim nie występuje.

Wiele wody w Wiśle upłynęło, zanim doszedłem do tego, jak bezproblemowo współdzielić konta użytkowników między różnymi witrynami opartymi o tego samego Drupala. Podstawowe informacje dotyczące tego zagadnienia znajdują się w Podręczniku.

Wracając do współdzielenia kont, wielu administratorów Drupala, pragnących współdzielić zawartość tabeli users między różnymi witrynami, może spotkać się z problemem polegającym na nadpisywaniu jednych kont przez drugie. Dzieje się tak, ponieważ mimo współdzielenia tabeli sequences dla przechowania informacji o liczbie kont użytkowników tworzone są inne rekordy – dla każdej z witryn z osobna. Jak wyjaśnił Harry Slaughter, rekordy tworzone są tak, by ich nazwa zawierała prefiks lub nazwę bazy danych właściwe danej witrynie. Powoduje to niezgodność informacji o liczbie użytkowników i nadpisywanie danych ich kont.

Co robić? Odnaleźć w module user.module poniższy kod:

$array['uid'] = db_next_id('{users}_uid');

i usunąć z niego znaki otwarcia { i zamknięcia } nawiasu klamrowego. Teraz już utworzenie nowego konta zawsze będzie powodwać zapisanie odpowiedniej informacji do rekordu o nazwie users_uid, bez prefiksów.

Uwaga! Nie jest pewne, jak modyfikacja wpływa na witryny korzystające z jednej bazy. Testowana była ona tylko w sytuacji, w której każda z witryn miała osobną bazę danych, a w tabeli sequences znajdowały się rekordy o nazwach typu users_uid, strona1.users_uid oraz strona2.users_uid.

Sposób wyświetlania odpowiedzi

Wybierz preferowany sposób wyświetlania odpowiedzi i kliknij "Zachowaj ustawienia", by wprowadzić zmiany.

Działa

Działa poprawnie, super sprawa. Zrobiłem test z jedną bazą i dwoma stronami – nie działa. Ale fakt faktem zazwyczaj korzystam z kilku baz więc no problem.
filozofiareligia

Da się na jednej bazie

{users} zawiera nazwę tabeli prefix_users, po zapisaniu daje to wpis w bazie prefix_users_uid.

Jeżeli chcemy współdzielić sequences, to musimy ujednolicić wpisy w niej. Jeżeli podstawowa baza nie ma prefixu, to rozwiązanie zapodane wyżej jest prawidłowe, jeżeli ma prefix, to zamiast {users} wpisujemy po prostu prefix_users

$array['uid'] = db_next_id('rootusers_uid');

(mój prefix to root bez podkreślnika)

Potem jeszcze wypada dopisać domain w session.inc funkcja sess_regenerate w ten sposób:

setcookie(session_name(), '', time() - 42000, '/', ".domain.org" );

żeby mieć jedną sesję dla wszystkich subdomen i finito :)

jeszcze w bootstrap.inc

trzeba dodać

$cookie_domain =".domain.org";