RkBlog

Hardware, programming and astronomy tutorials and reviews.

jPortal multisites

Opis modyfikacji umożliwiającej uruchomienie kilka instancji jPortala częściowo zintegrowanych niektórymi tabelami, np. systemem użytkowników i uprawnień.

Gdy mamy porządne konto z możliwością tworzenia subdomen i zamierzamy stworzyć zbiór portali opartych o jPortal nie musimy wcale wrzucać kilkunastu zestawów CMSa. Możemy wykorzystać zmienną $SERVER_NAME przechowującą nazwę subdomeny. Na początek zróbmy test. Stwórz plik test.php z taką zawartością:
<?php

< ? php
echo "$SERVER_NAME";
? >

Aliasy typu prv.pl to nie domeny/subdomeny! Wrzuć go na serwer i otwórz go za pomocą każdej z subdomen. Za każdym razem powinna pojawić się inna nazwa. Np. dla www.cms.riklaunim.ekonto.net pojawi się cms.riklaunim.ekonto.net. Gdy już wszystko działa zainstaluj na koncie 1 jPortal. Dla celów porządkowych zainstaluj z prefixem "main". Następnie dokonaj drobnych zmian typu skórka, moduły używane we wszystkich (lub większości) portalach itp. Następnie wykonaj kopię bazy danych. Następnie zmieniaj prefix (zamień wszystko w WordPadzie) na inny w zależności od nazwy konkretnego portala. Każdą kopie bazy wrzucamy za pomocą phpMyAdmina. Np. mamy zrobić portale o chlebie, cukierkach i ciastach. Wrzucamy do bazy 3 kopie o prefixach powiedzmy "chleb", "cukier" i "ciacho". Teraz edytujemy config.php jPortala. Około linii 82 mamy nazwy tabel i prefix do nich.
<?php

$prefix = 'main';

$user_tbl = $prefix.'admins';
$menu_tbl = $prefix.'menu';
$info_tbl = $prefix.'infopages';
$news_tbl = $prefix.'news';
$art_tbl = $prefix.'articles';
$php_tbl = $prefix.'scripts';
$file_a_tbl = $prefix.'file_categories';
$file_b_tbl = $prefix.'file_data';
$comm_tbl = $prefix.'comments';
$forum_a = $prefix.'forum_a';
$forum_b = $prefix.'forum_b';
$forum_c = $prefix.'forum_c';
$links_a_tbl = $prefix.'links_categories';
$links_b_tbl = $prefix.'links_data';
$poll_a_tbl = $prefix.'poll_desc';
$poll_b_tbl = $prefix.'poll_data';
$bann_a_tbl = $prefix.'banners';
$bann_b_tbl = $prefix.'banners_info';
$topic_tbl = $prefix.'topic';
$mail_tbl = $prefix.'mails';
$gbook_tbl = $prefix.'gbook';
$guest_tbl = $prefix.'users';
$pw_tbl = $prefix.'pw';
$ban_tbl = $prefix.'ban';
$sources_tbl = $prefix.'sources';
Teraz edytujemy to w następujący sposób:
- kopiujemy ten zestaw X razy, gdzie X to liczba portali, które mamy stworzyć.
- cały ten powyższy kod będę na razie oznaczał jako [Dane bazy]
- piszemy taki kod:
<?php

If ($SERVER_NAME=="domena.glowna.pl")
{
$prefix = 'main';
[Dane bazy]
}
elseif ($SERVER_NAME=="subdomena1.pl")
{
$prefix = 'prefix1';
[Dane bazy]
}
elseif ($SERVER_NAME=="subdomena2.pl")
{
$prefix = 'prefix2';
[Dane bazy]
}
elseif ($SERVER_NAME=="subdomena3.pl")
{
$prefix = 'prefix3';
[Dane bazy]
}
.... itd.
else
{
$prefix = 'prefixX';
[Dane bazy]
}
Wystarczą tutaj podstawy PHP :) Zastosowałem tutaj warunek "If" (jeżeli) oraz jego odmianę "elseif" - "w przeciwnym wypadku jeżeli". Działa to na zasadzie takiej - jeżeli $SERVER_NAME ma taką samą wartość jak podana np. subdomena1.pl to dodany zostanie kod spomiędzy nawiasów klamrowych znajdujących się poniżej tego warunku - skrypt otrzyma takie dane do bazy z takim prefixem że uruchomi się odpowiedni portal. Ostatni portal podany jest za pomocą "warunku" "else" - gdy nie spełniona zostanie żaden z wcześniejszych warunków, zabezpiecza to przed ewentualnymi błędami. Oto przykład pełnego kodu:
<?php

If ($SERVER_NAME=="domena.glowna.pl")
{
$prefix = 'main';

$user_tbl = $prefix.'admins';
$menu_tbl = $prefix.'menu';
$info_tbl = $prefix.'infopages';
$news_tbl = $prefix.'news';
$art_tbl = $prefix.'articles';
$php_tbl = $prefix.'scripts';
$file_a_tbl = $prefix.'file_categories';
$file_b_tbl = $prefix.'file_data';
$comm_tbl = $prefix.'comments';
$forum_a = $prefix.'forum_a';
$forum_b = $prefix.'forum_b';
$forum_c = $prefix.'forum_c';
$links_a_tbl = $prefix.'links_categories';
$links_b_tbl = $prefix.'links_data';
$poll_a_tbl = $prefix.'poll_desc';
$poll_b_tbl = $prefix.'poll_data';
$bann_a_tbl = $prefix.'banners';
$bann_b_tbl = $prefix.'banners_info';
$topic_tbl = $prefix.'topic';
$mail_tbl = $prefix.'mails';
$gbook_tbl = $prefix.'gbook';
$guest_tbl = $prefix.'users';
$pw_tbl = $prefix.'pw';
$ban_tbl = $prefix.'ban';
$sources_tbl = $prefix.'sources';
}
elseif ($SERVER_NAME=="subdomena1")
{
$prefix = 'sub1';

$user_tbl = $prefix.'admins';
$menu_tbl = $prefix.'menu';
$info_tbl = $prefix.'infopages';
$news_tbl = $prefix.'news';
$art_tbl = $prefix.'articles';
$php_tbl = $prefix.'scripts';
$file_a_tbl = $prefix.'file_categories';
$file_b_tbl = $prefix.'file_data';
$comm_tbl = $prefix.'comments';
$forum_a = $prefix.'forum_a';
$forum_b = $prefix.'forum_b';
$forum_c = $prefix.'forum_c';
$links_a_tbl = $prefix.'links_categories';
$links_b_tbl = $prefix.'links_data';
$poll_a_tbl = $prefix.'poll_desc';
$poll_b_tbl = $prefix.'poll_data';
$bann_a_tbl = $prefix.'banners';
$bann_b_tbl = $prefix.'banners_info';
$topic_tbl = $prefix.'topic';
$mail_tbl = $prefix.'mails';
$gbook_tbl = $prefix.'gbook';
$guest_tbl = $prefix.'users';
$pw_tbl = $prefix.'pw';
$ban_tbl = $prefix.'ban';
$sources_tbl = $prefix.'sources';
}
else
{
$prefix = 'subX';

$user_tbl = $prefix.'admins';
$menu_tbl = $prefix.'menu';
$info_tbl = $prefix.'infopages';
$news_tbl = $prefix.'news';
$art_tbl = $prefix.'articles';
$php_tbl = $prefix.'scripts';
$file_a_tbl = $prefix.'file_categories';
$file_b_tbl = $prefix.'file_data';
$comm_tbl = $prefix.'comments';
$forum_a = $prefix.'forum_a';
$forum_b = $prefix.'forum_b';
$forum_c = $prefix.'forum_c';
$links_a_tbl = $prefix.'links_categories';
$links_b_tbl = $prefix.'links_data';
$poll_a_tbl = $prefix.'poll_desc';
$poll_b_tbl = $prefix.'poll_data';
$bann_a_tbl = $prefix.'banners';
$bann_b_tbl = $prefix.'banners_info';
$topic_tbl = $prefix.'topic';
$mail_tbl = $prefix.'mails';
$gbook_tbl = $prefix.'gbook';
$guest_tbl = $prefix.'users';
$pw_tbl = $prefix.'pw';
$ban_tbl = $prefix.'ban';
$sources_tbl = $prefix.'sources';
}
Dzięki temu mamy X niezależnych portali. A gdybyśmy chcieli je trochę "połączyć", np. zrobić wspólnych użytkowników? Wystarczy wyciągnąć przed wyrażenia warunkowe odpowiednie tabele. Przed pierwszym ifem dajemy:
$prefix2 = 'main';
$guest_tbl = $prefix2.'users';
$pw_tbl = $prefix2.'pw';
Gdzie wartością $prefix2 jest prefix głównego portalu, który będzie "rdzeniem" portali :) Tutaj zgodnie z zaproponowanym przykładem uwspólniamy użytkowników. Dodatkowo dorzuciłem jeszcze tabelę Prywatnych Wiadomości. Następnie z wyrażeń warunkowych (ifów) kasujemy te tabele. Zrobione. Możesz również zajżeć do artykułu "kilka jP na 1 bazie danych". Tam omówione zostały znaczenia poszczególnych tabel itp.

Optymalizacja

Czy jPortal nadaje się na taki multisite? Tak i nie. Jeżeli planujesz stworzyć ogromny portal z prawie tysiącem użytkowników (albo i więcej) z kilkudziesięcioma portalami itp. to jPortal może nie wytrzymać. CMS ten nie jest zoptymalizowany pod takie obciążenie! W takich sytuacjach zalecam MD-Pro i jego moduł multisite - rozbudowaną wersję tego co zrobiliśmy przed chwilą z jPortalem.
RkBlog

11 July 2008;

Comment article