male zmiany w konfiguracji, bazie danych, pare nowych funkcji w helpers, refaktoryzac...
[watermeloncms.git] / cms / wtrmln / system.php
blob0a8a3ab57edf253ba66e4c0b77ac8d26ac45801c
1 <?php if(!defined('WTRMLN_IS')) die;
2 /********************************************************************
4 Watermelon CMS
6 Copyright 2008 Radosław Pietruszewski
8 This program is free software; you can redistribute it and/or
9 modify it under the terms of the GNU General Public License
10 version 2 as published by the Free Software Foundation.
12 This program is distributed in the hope that it will be useful,
13 but WITHOUT ANY WARRANTY; without even the implied warranty of
14 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 GNU General Public License for more details.
17 You should have received a copy of the GNU General Public License
18 along with this program; if not, write to the Free Software
19 Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
21 ********************************************************************/
23 header("Content-Type: text/html; charset=UTF-8");
25 ########################################
26 # Biblioteki #
27 ########################################
29 include(WTRMLN_LIBS . 'url.php');
30 include(WTRMLN_LIBS . 'db.php');
31 include(WTRMLN_LIBS . 'loader.php');
32 include(WTRMLN_LIBS . 'plugins_handle.php');
33 include(WTRMLN_LIBS . 'controller.php');
34 include(WTRMLN_LIBS . 'model.php');
35 include(WTRMLN_LIBS . 'plugin.php');
37 include(WTRMLN_HELPERS . 'helpers.php');
39 ////////////////////////////////////////
41 /* panika cms'a.
42 /* zamiast die i exit w przypadku poważnego błędu.
43 ************************/
45 function panic($text = 'noname error')
47 die('<div style="position: absolute;
48 z-index: 999;
49 top: 0;
50 left: 0;
51 background: #fff;
52 width: 100%;
53 height: 100%;">
54 <big>Błąd krytyczny uniemożliwiający kontynuowanie.</big><br>Debug: ' . $text . '</div>');
57 class Watermelon
60 * public static string[] $metaSrc
62 * dane meta (tagi z sekcji <head>)
64 * $metaSrc = array(string $head_element[, $head_element[, ... ]])
65 * $head_element - pojedynczy element do umieszczenia w sekcji <head>
67 public static $metaSrc = array();
70 * public void Watermelon(string $dbHost, string $dbUser, string $dbPass, string $dbName,
71 * string $dbPrefix, array $autoload, string[] $metaSrc)
73 * Konstuktor. Odpala najważniejsze biblioteki, odpowiedni kontroler
74 * i generuje stronę.
76 * string $dbHost - host bazy danych
77 * string $dbUser - użytkownik bazy danych
78 * string $dbPass - hasło do bazy danych
79 * string $dbName - nazwa bazy danych
80 * string $dbPrefix - prefiks do tabel
81 * array $autoload - pluginy i kod związany z nimi do automatycznego załadowania
82 * string[] $metaSrc - dane do wstawienia w sekcji <head>
84 * $autoload = array(array(string $plugin_name, string $eval)[, array(string $plugin_name, string $eval)[, ... ]]
85 * $plugin_name - nazwa plugina
86 * $eval - związany z tym pluginem kod do wykonania
88 * $metaSrc = array(string $head_element[, $head_element[, ... ]])
89 * $head_element - pojedynczy element do umieszczenia w sekcji <head>
92 public function Watermelon($dbHost, $dbUser, $dbPass, $dbName, $dbPrefix, array $autoload, array $metaSrc)
94 $url = new URL(Config::$defaultController);
95 $db = new DB();
96 $db->connect($dbHost, $dbUser, $dbPass, $dbName, $dbPrefix);
98 $this->LoadPlugins($autoload);
100 self::$metaSrc = $metaSrc;
102 $content = $this->loadController();
104 $this->generatePage($content);
108 * private void loadController()
110 * ładuje odpowiedni kontroler (wykonuje pracę Front Controllera)
113 private function loadController()
115 // zamieniamy _ na /, tak aby można było robić kontrolery w podfolderach
116 // (przydatne, kiedy mamy moduł składający się z kilku kontrolerów, np.
117 // duży skrypt forum)
119 $controllerPath = str_replace('_', '/', URL::$class);
121 $controllerPath = WTRMLN_CONTROLLERS . $controllerPath . '.php';
123 // sprawdzanie, czy istnieje plik controllera
125 if(file_exists($controllerPath))
127 include $controllerPath;
129 // wywalamy dwa pierwsze segmenty URL-a (kontroler i jego funkcja składowa/metoda)
131 array_shift(URL::$segments);
132 array_shift(URL::$segments);
134 else
136 //jeśli nie można znaleźć kontrolera, niech Pages przejmie stery
137 include WTRMLN_CONTROLLERS . 'pages.php';
139 $controller = new pages();
141 URL::$method = 'index';
142 URL::$class = 'pages';
145 // sprawdzanie, czy istnieje klasa controllera
147 if(class_exists(URL::$class))
149 $controller = new URL::$class();
151 else
153 panic('Nie moge znalesc klasy podanego controllera (' . URL::$class . ')');
156 // sprawdzanie czy istnieje dana funkcja składowa controllera.
158 if(!method_exists($controller, URL::$method))
160 panic('Nie moge znalesc podanej funkcji składowej controllera (' . URL::$method . ')');
163 // przystepujemy do roboty
165 $controller->{URL::$method}();
167 $content = ob_get_contents(); //wyciagamy dane z bufora wyjścia
168 @ob_end_clean();
170 return $content;
174 * private void LoadPlugins(array $plugins)
176 * Ładuje pluginy i wykonuje kod związany z tymi pluginami
178 * $plugins = array(array(string $plugin_name, string $eval)[, array(string $plugin_name, string $eval)[, ... ]]
179 * $plugin_name - nazwa plugina
180 * $eval - związany z tym pluginem kod do wykonania
183 private function LoadPlugins(array $plugins)
185 foreach($plugins as $plugin)
187 list($plugin_name, $eval) = $plugin;
189 if(file_exists(WTRMLN_PLUGINS . $plugin_name . '.php'))
191 include(WTRMLN_PLUGINS . $plugin_name . '.php');
193 eval($eval);
199 * private void generatePage(string $content)
201 * ostatecznie generuje stronę (dodaje znaczniki do head, oczyszcza treść itd.)
203 * string $content - treść wygenerowana przez kontroler
206 private function generatePage($content)
208 // umożliwiamy w prosty sposób tworzenie ścieżek do podstron
210 $content = str_replace('href="$/', 'href="' . WTRMLN_SITEURL, $content);
211 $content = str_replace('action="$/', 'action="' . WTRMLN_SITEURL, $content);
213 // preparujemy zawartość <title> :)
215 $siteTitle = (defined('WTRMLN_H1') ? WTRMLN_H1 . ' &raquo; ' : '') . WTRMLN_SITENAME;
217 // wyciągamy metaSrc
219 $metaSrc = self::$metaSrc;
221 // żeby array_unshift się nie czepiał,
222 // gdyby wcześniej nie było żadnych elementów
224 if(!$metaSrc)
226 $metaSrc = array();
229 // wsadzamy na początek tablicy <title>
231 array_unshift($metaSrc, '<title>' . $siteTitle . '</title>');
233 // zmieniamy nazwy, żeby skin.php wiedział odzochodzi
235 $_w_metaSrc = $metaSrc;
236 $_w_content = $content;
238 // odpalamy skina
240 include WTRMLN_THEMEPATH . 'skin.php';
244 new Watermelon($_w_dbHost, $_w_dbUser, $_w_dbPass, $_w_dbName, $_w_dbPrefix, $_w_autoload, $_w_metaSrc);
246 // dla bezpieczeństwa usuwamy dane konfiguracji bazy danych
248 unset($_w_dbHost);
249 unset($_w_dbUser);
250 unset($_w_dbPass);
251 unset($_w_dbName);
252 unset($_w_dbPrefix);