RkBlog

Hardware, programming and astronomy tutorials and reviews.

Multisites - zintegrowane instalacje

Opis modułu NS-Multisite do tworzenia częściowo zintegrowanych lub oddzielnych instalacji skryptu.

Moduł NS-Multisite służy do tworzenia wielu serwisów korzystających z jednego zestawu CMSa. Jest to oszczędne (te CMSy trochę zajmują) oraz bardzo łatwo powiązać je przez bazę danych (np. wspólni użytkownicy).

Co będziemy potrzebować

- Zainstalowany na komputerze serwer z php/mysql (XAMPP, easyphp) Jak zainstalować itp.? Zobacz dział "PHP i CGI"
- Envolution lub Postnuke
- By multisite działał później na serwerze potrzebne będą domeny/subdomeny

Startujemy

- Wrzucamy CMSa do głównego katalogu z którego nasz komputerowy serwer czyta pliki. Wrzucamy bez żadnych zbiorczych katalogów, tak by http://localhost/index.php i co równoznaczne http://127.0.0.1/index.php uruchamiały cmsa :)
- Instalujemy... normalnie
- Podajemy prefix, zalecam prefix np. "main" ze względów porządkowych, gdyż to będzie nasz główny portal.
- Po instalacji czyścimy CMSa - wyrzucamy wszystko, co nie będzie nam potrzebne w żadnym z CMSów. Instalujemy moduły, które wykorzystamy we wszystkich cmsach.
- W panelu admina, w "modułach" instalujemy/aktywujemy moduł NS-Multisites
- Robimy kopię bazy danych (dane i struktura)
- Za pomocą np. wordpada otwieramy zrzut bazy i zmieniamy prefix main na inny, np na "gry" i zapisujemy jako nowy plik sql. Powtarzać do woli
- Wrzucamy plik gry.sql przez phpmyadmina do bazy

Katalog parameters

- W "katalogu" cmsa tworzymy katalog "parameters"
- Do tego katalogu wrzucamy plik whoisit.inc.php, który jest w modules/NS-Multisite/instalation
- W katalogu tym (parameters) tworzymy katalogi o nazwie odpowiadającej naszym domenom/subdomenom
- W przypadku robienia tego na komputerze tworzymy katalog o nazwie "localhost" oraz inne o dowolnej na razie nazwie, np "gry" dla tego serwisu o grach :)
- W przypadku normalnego serwera katalogi nazywają się tak jak subdomeny, np: dla www.cms.riklaunim.noi.pl - cms.riklaunim.noi.pl. Wszystkie domeny/subdomeny kierujemy na ten sam index.php naszego CMSa. W zależności od nazwy domeny uruchomi się odpowiedni serwis.
- Teraz do obu katalogów kopiujemy pliki config.php i pntables.php (te z "głównego katalogu")
- W obu katalogach tworzymy katalog images i wrzucamy do niego logo.gif/jpg (z katalogu images Envo)
- Teraz zastępujemy config.php w głównym katalogu CMSa configiem z modules/NS-Multisite/instalation/
- Wywalamy pntables.php z głównego katalogu cmsa
- Testujemy: uruchamiamy nasz cms tym samym adresem (http://localhost/) Jeżeli strona się uruchomi to wszystko działa, jeżeli nie to coś mamy źle :/
37
Przykładowa struktura katalogu parameter (o kat. themes niżej)


Edycja pntables.php poszczególnych serwisów

- Teraz idziemy do katalogu parameters. Mamy tam 2 katalogi: gry i localhost
- Dla celów porządkowych zalecam wrzucenie pliku txt do każdego z nich o nazwe odpowiadającej serwisowi. Do localhosta wrzucam main.txt (gdyż będzie to katalog serwisu głównego) a do gry wrzucam gry.txt
- Idę do katalogu gry i otwieram pntables.php

Zaraz na początku mamy $prefix podany, zmieniamy to na:
$prefix = "gry";
$prefix2 = "main";
Gdzie wartość w $prefix to prefiks tabeli danego serwisu, a w $prefix2 podajemy prefix głównego serwisu. Następnie zaczynają się tabele bazy danych. Po zmianie $prefix serwis o grach jest całkowicie niezależny od głównego serwisu. Jeżeli chcemy go czymś połączyć, np. wspólnymi użytkownikami to przy tabelach odpowiedzialnych za użytkowników dajemy $prefix2 zamiast $prefix , oto przykłady:
<?php

$banner = $prefix . '_banner';
$pntable['banner'] = $banner;
$pntable['banner_column'] = array ('bid'      => $banner . '.pn_bid',
                                   'cid'      => $banner . '.pn_cid',
                                   'type'     => $banner . '.pn_type',
                                   'imptotal' => $banner . '.pn_imptotal',
                                   'impmade'  => $banner . '.pn_impmade',
                                   'clicks'   => $banner . '.pn_clicks',
                                   'imageurl' => $banner . '.pn_imageurl',
                                   'clickurl' => $banner . '.pn_clickurl',
                                   'date'     => $banner . '.pn_date',
                                   'module'   => $banner . '.pn_module',
                                   'moduleid' => $banner . '.pn_moduleid',
								   'width'    => $banner . '.pn_width',
								   'height'   => $banner . '.pn_height',
                                   'lang'     => $banner . '.pn_lang');

$bannerclient = $prefix . '_bannerclient';
$pntable['bannerclient'] = $bannerclient;
$pntable['bannerclient_column'] = array ('cid'       => $bannerclient . '.pn_cid',
                                         'name'      => $bannerclient . '.pn_name',
                                         'contact'   => $bannerclient . '.pn_contact',
                                         'email'     => $bannerclient . '.pn_email',
                                         'login'     => $bannerclient . '.pn_login',
                                         'passwd'    => $bannerclient . '.pn_passwd',
                                         'extrainfo' => $bannerclient . '.pn_extrainfo');

$bannerfinish = $prefix . '_bannerfinish';
$pntable['bannerfinish'] = $bannerfinish;
$pntable['bannerfinish_column'] = array ('bid'         => $bannerfinish . '.pn_bid',
                                         'cid'         => $bannerfinish . '.pn_cid',
                                         'impressions' => $bannerfinish . '.pn_impressions',
                                         'clicks'      => $bannerfinish . '.pn_clicks',
                                         'datestart'   => $bannerfinish . '.pn_datestart',
                                         'dateend'     => $bannerfinish . '.pn_dateend');
Podany fragment odpowiada za banery, jeżeli chcemy połączyć serwisy to musimy zmienić to tak:
<?php

$banner = $prefix2 . '_banner';
$pntable['banner'] = $banner;
$pntable['banner_column'] = array ('bid'      => $banner . '.pn_bid',
                                   'cid'      => $banner . '.pn_cid',
                                   'type'     => $banner . '.pn_type',
                                   'imptotal' => $banner . '.pn_imptotal',
                                   'impmade'  => $banner . '.pn_impmade',
                                   'clicks'   => $banner . '.pn_clicks',
                                   'imageurl' => $banner . '.pn_imageurl',
                                   'clickurl' => $banner . '.pn_clickurl',
                                   'date'     => $banner . '.pn_date',
                                   'module'   => $banner . '.pn_module',
                                   'moduleid' => $banner . '.pn_moduleid',
								   'width'    => $banner . '.pn_width',
								   'height'   => $banner . '.pn_height',
                                   'lang'     => $banner . '.pn_lang');

$bannerclient = $prefix2 . '_bannerclient';
$pntable['bannerclient'] = $bannerclient;
$pntable['bannerclient_column'] = array ('cid'       => $bannerclient . '.pn_cid',
                                         'name'      => $bannerclient . '.pn_name',
                                         'contact'   => $bannerclient . '.pn_contact',
                                         'email'     => $bannerclient . '.pn_email',
                                         'login'     => $bannerclient . '.pn_login',
                                         'passwd'    => $bannerclient . '.pn_passwd',
                                         'extrainfo' => $bannerclient . '.pn_extrainfo');

$bannerfinish = $prefix2 . '_bannerfinish';
$pntable['bannerfinish'] = $bannerfinish;
$pntable['bannerfinish_column'] = array ('bid'         => $bannerfinish . '.pn_bid',
                                         'cid'         => $bannerfinish . '.pn_cid',
                                         'impressions' => $bannerfinish . '.pn_impressions',
                                         'clicks'      => $bannerfinish . '.pn_clicks',
                                         'datestart'   => $bannerfinish . '.pn_datestart',
                                         'dateend'     => $bannerfinish . '.pn_dateend');
Gdy już połączymy serwisy należy usunąć nieużywane tabele w bazie danych, w tym przypadku gry_banner, gry__bannerclient i gry__bannerfinish! Czystkość bazy to podstawa :) Co można standardowo połączyć? - Cóż... ja mam wspólne: użytkownicy/admini/grupy, banery, PW i języki. Nie licząc banerów i ew. adminów jest to w miarę standardowy zestaw zależności serwisów od swojego macierzystego "maina" :) Własne skórki? - Utwórz w katalogach serwisów (localhost i gry) katalog themes i wrzuć tam skórki. Zrobione :) Działy - moduł subjects nie jest oddzielny!
- Do pntables każdego z serwisów wrzuć tabele z pntables.php znajdującego się w modules/subjects:
<?php

$pntable['subjects'] = $prefix.'_subjects';
$pntable['subjects_column'] = array ('subid'        => "$pntable[subjects].subid",
                                     'catid'        => "$pntable[subjects].catid",
                                     'subname'      => "$pntable[subjects].subname",
                                     'sub</b>'      => "$pntable[subjects].sub</b>",
                                     'subimage'     => "$pntable[subjects].subimage",
                                     'subactive'    => "$pntable[subjects].subactive",
                                     'suborder'     => "$pntable[subjects].suborder",
                                     'subcounter'   => "$pntable[subjects].subcounter",
                                     'keywords'                => "$pntable[subjects].keywords",
                                     'sublanguage'  => "$pntable[subjects].sublanguage");

$pntable['subpages'] = $prefix.'_subpages';
$pntable['subpages_column'] = array ('pageid'          => "$pntable[subpages].pageid",
                                     'subid'           => "$pntable[subpages].subid",
                                     'parentpageid'    => "$pntable[subpages].parentpageid",
                                     'pagetitle'       => "$pntable[subpages].pagetitle",
                                     'page</b>'        => "$pntable[subpages].page</b>",
                                     'pagecontent'     => "$pntable[subpages].pagecontent",
                                     'pagefile'        => "$pntable[subpages].pagefile",
                                     'pageimage'       => "$pntable[subpages].pageimage",
                                     'pageauthor'      => "$pntable[subpages].pageauthor",
                                     'pageauthoremail' => "$pntable[subpages].pageauthoremail",
                                     'pageauthorurl'   => "$pntable[subpages].pageauthorurl",
                                     'pageactive'      => "$pntable[subpages].pageactive",
                                     'pageorder'       => "$pntable[subpages].pageorder",
                                     'pagedatetime'    => "$pntable[subpages].pagedatetime",
                                     'pagecounter'     => "$pntable[subpages].pagecounter",
                                     'reviewactive'    => "$pntable[subpages].reviewactive",
                                     'reviewscount'    => "$pntable[subpages].reviewscount",
                                     'reviewsscore'    => "$pntable[subpages].reviewsscore",
                                     'keywords'                   => "$pntable[subpages].keywords",
                                                                         'username'        => "$pntable[subpages].username");

$pntable['subreviews'] = $prefix.'_subreviews';
$pntable['subreviews_column'] = array ('reviewid'      => "$pntable[subreviews].reviewid",
                                     'pageid'          => "$pntable[subreviews].pageid",
                                     'reviewtitle'     => "$pntable[subreviews].reviewtitle",
                                     'reviewcomments'  => "$pntable[subreviews].reviewcomments",
                                     'reviewscore'     => "$pntable[subreviews].reviewscore",
                                     'reviewuser'      => "$pntable[subreviews].reviewuser",
                                     'reviewhostip'    => "$pntable[subreviews].reviewhostip",
                                     'reviewdatetime'  => "$pntable[subreviews].reviewdatetime");

$pntable['subcategories'] = $prefix.'_subcategories';
$pntable['subcategories_column'] = array ('catid'      => "$pntable[subcategories].catid",
                                     'catname'         => "$pntable[subcategories].catname",
                                     'cat</b>'         => "$pntable[subcategories].cat</b>",
                                     'keywords'                   => "$pntable[subcategories].keywords",
                                     'catorder'        => "$pntable[subcategories].catorder");
Następnie zmień zawartość modules/pntables.php na:
<?php

//wcześniej lecą pierdoły, zmień od function...

function subjects_pntables()
{
   $ModName = basename( dirname( __FILE__ ) );

modules_get_language();
//ak_comment adding language condition ... works
$currentlang = pnUserGetLang();

list($dbconn) = pnDBGetConn();
$pntable = pnDBGetTables();
}
?>
Teraz subjects działa na multisite, podobnie należy postępować z innymi opornymi modułami. Jak dostać się do innych serwisów gdy jesteśmy na localhost?
- Bardzo łatwo. Mamy katalog localhost, który odpowiada za główny serwis i katalog gry odpowiedzialny za podserwis o grach. - Zmień nazwę katalogu localhost na np. "glowny" a katalogu gry zmień na "localhost" :) uruchom cmsa - uruchomi ci się serwis o grach :)
RkBlog

11 July 2008;

Comment article