root/trunk/lib/SGL/FrontController.php

Revision 3184, 12.0 kB (checked in by demian, 2 weeks ago)

removing pear -1

Line 
1 <?php
2 /* Reminder: always indent with 4 spaces (no tabs). */
3 // +---------------------------------------------------------------------------+
4 // | Copyright (c) 2006, Demian Turner                                         |
5 // | All rights reserved.                                                      |
6 // |                                                                           |
7 // | Redistribution and use in source and binary forms, with or without        |
8 // | modification, are permitted provided that the following conditions        |
9 // | are met:                                                                  |
10 // |                                                                           |
11 // | o Redistributions of source code must retain the above copyright          |
12 // |   notice, this list of conditions and the following disclaimer.           |
13 // | o Redistributions in binary form must reproduce the above copyright       |
14 // |   notice, this list of conditions and the following disclaimer in the     |
15 // |   documentation and/or other materials provided with the distribution.    |
16 // | o The names of the authors may not be used to endorse or promote          |
17 // |   products derived from this software without specific prior written      |
18 // |   permission.                                                             |
19 // |                                                                           |
20 // | THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS       |
21 // | "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT         |
22 // | LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR     |
23 // | A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT      |
24 // | OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,     |
25 // | SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT          |
26 // | LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,     |
27 // | DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY     |
28 // | THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT       |
29 // | (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE     |
30 // | OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.      |
31 // |                                                                           |
32 // +---------------------------------------------------------------------------+
33 // | Seagull 0.6                                                               |
34 // +---------------------------------------------------------------------------+
35 // | FrontController.php                                                       |
36 // +---------------------------------------------------------------------------+
37 // | Author:   Demian Turner <demian@phpkitchen.com>                           |
38 // +---------------------------------------------------------------------------+
39 // $Id: FrontController.php,v 1.49 2005/06/23 19:15:25 demian Exp $
40
41 require_once dirname(__FILE__)  . '/../SGL.php';
42 require_once dirname(__FILE__)  . '/Task/Init.php';
43
44 /**
45  * Application controller.
46  *
47  * @package SGL
48  * @author  Demian Turner <demian@phpkitchen.com>
49  * @version $Revision: 1.49 $
50  */
51 class SGL_FrontController
52 {
53     /**
54      * Allow SGL_Output with its template methods to be extended.
55      *
56      * Remember to add your custom include path to the global config, ie a class
57      * called FOO_Output will be discovered if it exists in seagull/lib/FOO/Output.php.
58      * This means '/path/to/seagull/lib' must be added to
59      * $conf['path']['additionalIncludePath'].  The class definition would be:
60      *
61      *  class FOO_Output extends SGL_Output {}
62      *
63      * @param  array $conf
64      */
65     function getOutputClass($conf)
66     {
67         if (!empty($conf['site']['customOutputClassName'])) {
68             $className = $conf['site']['customOutputClassName'];
69             $path = trim(preg_replace('/_/', '/', $className)) . '.php';
70             require_once $path;
71         } else {
72             $className = 'SGL_Output';
73         }
74         return $className;
75     }
76
77     /**
78      * Main invocation, init tasks plus main process.
79      *
80      */
81     function run()
82     {
83         if (!defined('SGL_INITIALISED')) {
84             SGL_FrontController::init();
85         }
86         //  assign request to registry
87         $input = &SGL_Registry::singleton();
88         $req   = &SGL_Request::singleton();
89
90         if (PEAR::isError($req)) {
91             //  stop with error page
92             SGL::displayStaticPage($req->getMessage());
93         }
94         $input->setRequest($req);
95         $outputClass = SGL_FrontController::getOutputClass($input->getConfig());
96         $output = &new $outputClass();
97
98         // see http://trac.seagullproject.org/wiki/Howto/PragmaticPatterns/InterceptingFilter
99         if (!SGL_FrontController::customFilterChain($input)) {
100             $process =
101                 //  pre-process (order: top down)
102                 new SGL_Task_Init(
103                 new SGL_Task_StripMagicQuotes(
104                 new SGL_Task_DiscoverClientOs(
105                 new SGL_Task_ResolveManager(
106                 new SGL_Task_SetupLangSupport(
107
108                 //  post-process (order: bottom up)
109                 new SGL_Task_BuildHeaders(
110                 new SGL_Task_SetSystemAlert(
111                 new SGL_Task_BuildView(
112                 new SGL_Task_BuildDebugBlock(
113                 new SGL_Task_SetupGui(
114                 new SGL_Task_BuildOutputData(
115
116                 //  target
117                 new SGL_MainProcess()
118                 )))))))))));
119             $process->process($input, $output);
120
121         } else {
122             require_once dirname(__FILE__)  . '/FilterChain.php';
123             $chain = new SGL_FilterChain($input->getFilters());
124             $chain->doFilter($input, $output);
125         }
126         if ($output->conf['site']['outputBuffering']) {
127             ob_end_flush();
128         }
129
130         echo $output->data;
131     }
132
133     function customFilterChain(&$input)
134     {
135         $conf = $input->getConfig();
136         $req = $input->getRequest();
137
138         switch ($req->getType()) {
139
140         case SGL_REQUEST_BROWSER:
141         case SGL_REQUEST_CLI:
142             $mgr = SGL_Inflector::getManagerNameFromSimplifiedName(
143                 $req->getManagerName());
144             //  load filters defined by specific manager
145             if (!empty($conf[$mgr]['filterChain'])) {
146                 $aFilters = explode(',', $conf[$mgr]['filterChain']);
147                 $input->setFilters($aFilters);
148                 $ret = true;
149
150             //  load sitewide custom filters
151             } elseif (!empty($conf['site']['filterChain'])) {
152                 $aFilters = explode(',', $conf['site']['filterChain']);
153                 $input->setFilters($aFilters);
154                 $ret = true;
155             } else {
156                 $ret = false;
157             }
158             break;
159
160         case SGL_REQUEST_AJAX:
161             $moduleName     = ucfirst($req->getModuleName());
162             $providerName   = $moduleName . 'AjaxProvider';
163             if (!empty($conf[$providerName]['filterChain'])) {
164                 $aFilters = explode(',', $conf[$providerName]['filterChain']);
165             } else {
166                 $aFilters = array(
167                     'SGL_Task_Init',
168                     'SGL_Task_SetupORM',
169                     'SGL_Task_CreateSession',
170                     'SGL_Task_CustomBuildOutputData',
171                     'SGL_Task_ExecuteAjaxAction',
172                     );
173             }
174             $input->setFilters($aFilters);
175             $ret = true;
176             break;
177
178
179         case SGL_REQUEST_AMF:
180             $aFilters = array(
181                 'SGL_Task_Init',
182                 'SGL_Task_SetupORM',
183                 'SGL_Task_CreateSession',
184                 'SGL_Task_ExecuteAmfAction',
185                 );
186             $input->setFilters($aFilters);
187             $ret = true;
188             break;
189
190
191         }
192
193         return $ret;
194     }
195
196
197     function init()
198     {
199         SGL_FrontController::setupMinimumEnv();
200         SGL_FrontController::loadRequiredFiles();
201
202         $autoLoad = (is_file(SGL_VAR_DIR  . '/INSTALL_COMPLETE.php'))
203             ? true
204             : false;
205         $c = &SGL_Config::singleton($autoLoad);
206
207         $init = new SGL_TaskRunner();
208         $init->addData($c->getAll());
209         $init->addTask(new SGL_Task_SetupConstantsFinish());
210         //$init->addTask(new SGL_Task_EnsurePlaceholderDbPrefixIsNull());
211         $init->addTask(new SGL_Task_SetGlobals());
212         $init->addTask(new SGL_Task_ModifyIniSettings());
213         $init->addTask(new SGL_Task_SetupPearErrorCallback());
214         $init->addTask(new SGL_Task_SetupCustomErrorHandler());
215         $init->addTask(new SGL_Task_SetBaseUrl());
216         $init->addTask(new SGL_Task_RegisterTrustedIPs());
217         $init->addTask(new SGL_Task_LoadCustomConfig());
218         //$init->addTask(new SGL_Task_InitialiseModules());
219         $init->main();
220         define('SGL_INITIALISED', true);
221     }
222
223     function loadRequiredFiles()
224     {
225         $cachedLibs = SGL_VAR_DIR . '/cachedLibs.php';
226         $cachedLibsEnabled = (defined('SGL_CACHE_LIBS') && SGL_CACHE_LIBS === true)
227             ? true
228             : false;
229         if (is_file($cachedLibs) && $cachedLibsEnabled) {
230             require_once $cachedLibs;
231         } else {
232             $coreLibs = dirname(__FILE__);
233             $aRequiredFiles = array(
234                 $coreLibs  . '/Url.php',
235                 $coreLibs  . '/UrlParser/SefStrategy.php',
236                 $coreLibs  . '/HTTP.php',
237                 $coreLibs  . '/Manager.php',
238                 $coreLibs  . '/Output.php',
239                 $coreLibs  . '/String.php',
240                 $coreLibs  . '/Task/Process.php',
241                 $coreLibs  . '/Session.php',
242                 $coreLibs  . '/Util.php',
243                 $coreLibs  . '/Config.php',
244                 $coreLibs  . '/ParamHandler.php',
245                 $coreLibs  . '/Registry.php',
246                 $coreLibs  . '/Request.php',
247                 $coreLibs  . '/Inflector.php',
248                 $coreLibs  . '/Date.php',
249                 $coreLibs  . '/Array.php',
250                 $coreLibs  . '/Error.php',
251                 $coreLibs  . '/Cache.php',
252 //                $coreLibs  . '/DB.php',
253                 $coreLibs  . '/BlockLoader.php',
254                 $coreLibs  . '/Translation.php',
255                 $coreLibs  . '/../data/ary.languages.php',
256             );
257             $fileCache = '';
258             foreach ($aRequiredFiles as $file) {
259                 require_once $file;
260                 if ($cachedLibsEnabled) {
261                     // 270kb vs 104kb
262                     if ($ok = version_compare(phpversion(), '5.1.2', '>=')) {
263                         $fileCache .= php_strip_whitespace($file);
264                     } else {
265                         $fileCache .= file_get_contents($file);
266                     }
267                 }
268             }
269             if ($cachedLibsEnabled) {
270                 $ok = file_put_contents($cachedLibs, $fileCache);
271             }
272         }
273 //        require_once 'DB.php';
274     }
275
276     function setupMinimumEnv()
277     {
278         $init = new SGL_TaskRunner();
279         $init->addTask(new SGL_Task_SetupPaths());
280         $init->addTask(new SGL_Task_SetupConstantsStart());
281         $init->addTask(new SGL_Task_EnsureBC());
282         $init->main();
283     }
284 }
285
286 /**
287  * Core data processing routine.
288  *
289  * @package SGL
290  * @author  Demian Turner <demian@phpkitchen.com>
291  */
292 class SGL_MainProcess extends SGL_ProcessRequest
293 {
294     function process(&$input, &$output)
295     {
296         SGL::logMessage(null, PEAR_LOG_DEBUG);
297
298         $req  = $input->getRequest();
299         $mgr  = $input->get('manager');
300
301         $mgr->validate($req, $input);
302         $input->aggregate($output);
303
304         //  process data if valid
305         if ($mgr->isValid()) {
306             $ok = $mgr->process($input, $output);
307             if (SGL_Error::count() && SGL_Session::getRoleId() != SGL_ADMIN
308                     && $mgr->conf['debug']['production']) {
309                 $mgr->handleError(SGL_Error::getLast(), $output);
310             }
311         }
312         SGL_Manager::display($output);
313         $mgr->display($output);
314     }
315 }
316 ?>
Note: See TracBrowser for help on using the browser.