[ Index ]
 

Code source de CakePHP 1.1.13.4450

Accédez au Source d'autres logiciels libresSoutenez Angelica Josefina !

title

Body

[fermer]

/cake/ -> dispatcher.php (source)

   1  <?php
   2  /* SVN FILE: $Id: dispatcher.php 4409 2007-02-02 13:20:59Z phpnut $ */
   3  /**
   4   * Dispatcher takes the URL information, parses it for paramters and
   5   * tells the involved controllers what to do.
   6   *
   7   * This is the heart of Cake's operation.
   8   *
   9   * PHP versions 4 and 5
  10   *
  11   * CakePHP(tm) : Rapid Development Framework <http://www.cakephp.org/>
  12   * Copyright 2005-2007, Cake Software Foundation, Inc.
  13   *                                1785 E. Sahara Avenue, Suite 490-204
  14   *                                Las Vegas, Nevada 89104
  15   *
  16   * Licensed under The MIT License
  17   * Redistributions of files must retain the above copyright notice.
  18   *
  19   * @filesource
  20   * @copyright        Copyright 2005-2007, Cake Software Foundation, Inc.
  21   * @link                http://www.cakefoundation.org/projects/info/cakephp CakePHP(tm) Project
  22   * @package            cake
  23   * @subpackage        cake.cake
  24   * @since            CakePHP(tm) v 0.2.9
  25   * @version            $Revision: 4409 $
  26   * @modifiedby        $LastChangedBy: phpnut $
  27   * @lastmodified    $Date: 2007-02-02 07:20:59 -0600 (Fri, 02 Feb 2007) $
  28   * @license            http://www.opensource.org/licenses/mit-license.php The MIT License
  29   */
  30  /**
  31   * List of helpers to include
  32   */
  33      uses('router', DS.'controller'.DS.'controller');
  34  /**
  35   * Dispatcher translates URLs to controller-action-paramter triads.
  36   *
  37   * Dispatches the request, creating appropriate models and controllers.
  38   *
  39   * @package        cake
  40   * @subpackage    cake.cake
  41   */
  42  class Dispatcher extends Object {
  43  /**
  44   * Base URL
  45   * @var string
  46   */
  47      var $base = false;
  48  /**
  49   * @var string
  50   */
  51      var $admin = false;
  52  /**
  53   * @var string
  54   */
  55      var $webservices = null;
  56  /**
  57   * @var string
  58   */
  59      var $plugin = null;
  60  /**
  61   * Constructor.
  62   */
  63  	function __construct() {
  64          parent::__construct();
  65      }
  66  /**
  67   * Dispatches and invokes given URL, handing over control to the involved controllers, and then renders the results (if autoRender is set).
  68   *
  69   * If no controller of given name can be found, invoke() shows error messages in
  70   * the form of Missing Controllers information. It does the same with Actions (methods of Controllers are called
  71   * Actions).
  72   *
  73   * @param string $url    URL information to work on.
  74   * @param array $additionalParams    Settings array ("bare", "return"),
  75   * which is melded with the GET and POST params.
  76   * @return boolean        Success
  77   */
  78  	function dispatch($url, $additionalParams=array()) {
  79          $params = array_merge($this->parseParams($url), $additionalParams);
  80          $missingController = false;
  81          $missingAction = false;
  82          $missingView = false;
  83          $privateAction = false;
  84          $this->base = $this->baseUrl();
  85  
  86          if (empty($params['controller'])) {
  87              $missingController = true;
  88          } else {
  89              $ctrlName = Inflector::camelize($params['controller']);
  90              $ctrlClass = $ctrlName.'Controller';
  91  
  92              if (!loadController($ctrlName)) {
  93                  $pluginName = Inflector::camelize($params['action']);
  94                  if (!loadPluginController(Inflector::underscore($ctrlName), $pluginName)) {
  95                      if(preg_match('/([\\.]+)/', $ctrlName)) {
  96                          return $this->cakeError('error404', array(
  97                                                          array('url' => strtolower($ctrlName),
  98                                                                  'message' => 'Was not found on this server',
  99                                                                  'base' => $this->base)));
 100                      } elseif(!class_exists($ctrlClass)) {
 101                          $missingController = true;
 102                      } else {
 103                          $params['plugin'] = null;
 104                          $this->plugin = null;
 105                      }
 106                  } else {
 107                      $params['plugin'] = Inflector::underscore($ctrlName);
 108                  }
 109              } else {
 110                  $params['plugin'] = null;
 111                  $this->plugin = null;
 112              }
 113          }
 114  
 115          if(isset($params['plugin'])){
 116              $plugin = $params['plugin'];
 117              $pluginName = Inflector::camelize($params['action']);
 118              $pluginClass = $pluginName.'Controller';
 119              $ctrlClass = $pluginClass;
 120              $oldAction = $params['action'];
 121              $params = $this->_restructureParams($params);
 122              $this->plugin = $plugin;
 123              loadPluginModels($plugin);
 124              $this->base = $this->base.'/'.Inflector::underscore($ctrlName);
 125  
 126              if(empty($params['controller']) || !class_exists($pluginClass)) {
 127                  $params['controller'] = Inflector::underscore($ctrlName);
 128                  $ctrlClass = $ctrlName.'Controller';
 129                  if (!is_null($params['action'])) {
 130                      array_unshift($params['pass'], $params['action']);
 131                  }
 132                  $params['action'] = $oldAction;
 133              }
 134          }
 135  
 136          if(defined('CAKE_ADMIN')) {
 137              if(isset($params[CAKE_ADMIN])) {
 138                  $this->admin = '/'.CAKE_ADMIN ;
 139                  $url = preg_replace('/'.CAKE_ADMIN.'\//', '', $url);
 140  
 141                  if (empty($params['action'])) {
 142                      $params['action'] = CAKE_ADMIN.'_'.'index';
 143                  } else {
 144                      $params['action'] = CAKE_ADMIN.'_'.$params['action'];
 145                  }
 146              } elseif (strpos($params['action'], CAKE_ADMIN) === 0) {
 147                      $privateAction = true;
 148              }
 149          }
 150  
 151          if ($missingController) {
 152              return $this->cakeError('missingController', array(
 153                                              array('className' => Inflector::camelize($params['controller']."Controller"),
 154                                                      'webroot' => $this->webroot,
 155                                                      'url' => $url,
 156                                                      'base' => $this->base)));
 157          } else {
 158              $controller =& new $ctrlClass();
 159          }
 160  
 161          $classMethods = get_class_methods($controller);
 162          $classVars = get_object_vars($controller);
 163  
 164          if (empty($params['action'])) {
 165              $params['action'] = 'index';
 166          }
 167  
 168          if((in_array($params['action'], $classMethods) || in_array(strtolower($params['action']), $classMethods)) && strpos($params['action'], '_', 0) === 0) {
 169              $privateAction = true;
 170          }
 171  
 172          if(!in_array($params['action'], $classMethods) && !in_array(strtolower($params['action']), $classMethods)) {
 173              $missingAction = true;
 174          }
 175  
 176          if (in_array(strtolower($params['action']), array('tostring', 'requestaction', 'log',
 177                                                                              'cakeerror', 'constructclasses', 'redirect',
 178                                                                              'set', 'setaction', 'validate', 'validateerrors',
 179                                                                              'render', 'referer', 'flash', 'flashout',
 180                                                                              'generatefieldnames', 'postconditions', 'cleanupfields',
 181                                                                              'beforefilter', 'beforerender', 'afterfilter'))) {
 182              $missingAction = true;
 183          }
 184  
 185          if(in_array('return', array_keys($params)) && $params['return'] == 1) {
 186              $controller->autoRender = false;
 187          }
 188  
 189          $controller->base = $this->base;
 190          $base = strip_plugin($this->base, $this->plugin);
 191          if(defined("BASE_URL")){
 192              $controller->here = $base . $this->admin . $url;
 193          } else {
 194              $controller->here = $base . $this->admin . '/' . $url;
 195          }
 196          $controller->webroot = $this->webroot;
 197          $controller->params = $params;
 198          $controller->action = $params['action'];
 199  
 200          if (!empty($controller->params['data'])) {
 201              $controller->data =& $controller->params['data'];
 202          } else {
 203              $controller->data = null;
 204          }
 205  
 206          if (!empty($controller->params['pass'])) {
 207              $controller->passed_args =& $controller->params['pass'];
 208              $controller->passedArgs =&  $controller->params['pass'];
 209          } else {
 210              $controller->passed_args = null;
 211              $controller->passedArgs = null;
 212          }
 213  
 214          if (!empty($params['bare'])) {
 215              $controller->autoLayout = !$params['bare'];
 216          } else {
 217              $controller->autoLayout = $controller->autoLayout;
 218          }
 219  
 220          $controller->webservices = $params['webservices'];
 221          $controller->plugin = $this->plugin;
 222  
 223          if(!is_null($controller->webservices)) {
 224              array_push($controller->components, $controller->webservices);
 225              array_push($controller->helpers, $controller->webservices);
 226              $component =& new Component($controller);
 227          }
 228          $controller->_initComponents();
 229          $controller->constructClasses();
 230  
 231          if ($missingAction && !in_array('scaffold', array_keys($classVars))) {
 232              $this->start($controller);
 233              return $this->cakeError('missingAction', array(
 234                                              array('className' => Inflector::camelize($params['controller']."Controller"),
 235                                                      'action' => $params['action'],
 236                                                      'webroot' => $this->webroot,
 237                                                      'url' => $url,
 238                                                      'base' => $this->base)));
 239          }
 240  
 241          if ($privateAction) {
 242              $this->start($controller);
 243              return $this->cakeError('privateAction', array(
 244                                              array('className' => Inflector::camelize($params['controller']."Controller"),
 245                                                      'action' => $params['action'],
 246                                                      'webroot' => $this->webroot,
 247                                                      'url' => $url,
 248                                                      'base' => $this->base)));
 249          }
 250          return $this->_invoke($controller, $params, $missingAction);
 251      }
 252  /**
 253   * Invokes given controller's render action if autoRender option is set. Otherwise the contents of the operation are returned as a string.
 254   *
 255   * @param object $controller
 256   * @param array $params
 257   * @param boolean $missingAction
 258   * @return string
 259   */
 260  	function _invoke (&$controller, $params, $missingAction = false) {
 261          $this->start($controller);
 262          $classVars = get_object_vars($controller);
 263  
 264          if ($missingAction && in_array('scaffold', array_keys($classVars))) {
 265              uses(DS.'controller'.DS.'scaffold');
 266              return new Scaffold($controller, $params);
 267          } else {
 268              $output = call_user_func_array(array(&$controller, $params['action']), empty($params['pass'])? null: $params['pass']);
 269          }
 270          if ($controller->autoRender) {
 271              $output = $controller->render();
 272          }
 273          $controller->output =& $output;
 274          $controller->afterFilter();
 275          return $controller->output;
 276      }
 277  /**
 278   * Starts up a controller
 279   *
 280   * @param object $controller
 281   */
 282  	function start(&$controller) {
 283          if (!empty($controller->beforeFilter)) {
 284              if(is_array($controller->beforeFilter)) {
 285  
 286                  foreach($controller->beforeFilter as $filter) {
 287                      if(is_callable(array($controller,$filter)) && $filter != 'beforeFilter') {
 288                          $controller->$filter();
 289                      }
 290                  }
 291              } else {
 292                  if(is_callable(array($controller, $controller->beforeFilter)) && $controller->beforeFilter != 'beforeFilter') {
 293                      $controller->{$controller->beforeFilter}();
 294                  }
 295              }
 296          }
 297          $controller->beforeFilter();
 298  
 299          foreach($controller->components as $c) {
 300              if (isset($controller->{$c}) && is_object($controller->{$c}) && is_callable(array($controller->{$c}, 'startup'))) {
 301                  $controller->{$c}->startup($controller);
 302              }
 303          }
 304      }
 305  
 306  /**
 307   * Returns array of GET and POST parameters. GET parameters are taken from given URL.
 308   *
 309   * @param string $from_url    URL to mine for parameter information.
 310   * @return array Parameters found in POST and GET.
 311   */
 312  	function parseParams($from_url) {
 313          $Route = new Router();
 314          include CONFIGS.'routes.php';
 315          $params = $Route->parse ($from_url);
 316  
 317          if (ini_get('magic_quotes_gpc') == 1) {
 318              if(!empty($_POST)) {
 319                  $params['form'] = stripslashes_deep($_POST);
 320              }
 321          } else {
 322              $params['form'] = $_POST;
 323          }
 324  
 325          if (isset($params['form']['data'])) {
 326              $params['data'] = $params['form']['data'];
 327          }
 328  
 329          if (isset($_GET)) {
 330              if (ini_get('magic_quotes_gpc') == 1) {
 331                  $params['url'] = stripslashes_deep($_GET);
 332              } else {
 333                  $params['url'] = $_GET;
 334              }
 335          }
 336  
 337          foreach ($_FILES as $name => $data) {
 338              if ($name != 'data') {
 339                  $params['form'][$name] = $data;
 340              }
 341          }
 342  
 343          if (isset($_FILES['data'])) {
 344              foreach ($_FILES['data'] as $key => $data) {
 345  
 346                  foreach ($data as $model => $fields) {
 347  
 348                      foreach ($fields as $field => $value) {
 349                          $params['data'][$model][$field][$key] = $value;
 350                      }
 351                  }
 352              }
 353          }
 354          $params['bare'] = empty($params['ajax'])? (empty($params['bare'])? 0: 1): 1;
 355          $params['webservices'] = empty($params['webservices']) ? null : $params['webservices'];
 356          return $params;
 357      }
 358  /**
 359   * Returns a base URL.
 360   *
 361   * @return string    Base URL
 362   */
 363  	function baseUrl() {
 364          $htaccess = null;
 365          $base = $this->admin;
 366          $this->webroot = '';
 367  
 368          if (defined('BASE_URL')) {
 369              $base = BASE_URL.$this->admin;
 370          }
 371  
 372          $docRoot = env('DOCUMENT_ROOT');
 373          $scriptName = env('PHP_SELF');
 374          $r = null;
 375          $appDirName = str_replace('/', '\/', preg_quote(APP_DIR));
 376          $webrootDirName = str_replace('/', '\/', preg_quote(WEBROOT_DIR));
 377  
 378          if (preg_match('/'.$appDirName.'\\'.DS.$webrootDirName.'/', $docRoot)) {
 379              $this->webroot = '/';
 380  
 381              if (preg_match('/^(.*)\/index\.php$/', $scriptName, $r)) {
 382  
 383                  if(!empty($r[1])) {
 384                      return  $base.$r[1];
 385                  }
 386              }
 387          } else {
 388              if (defined('BASE_URL')) {
 389                  $webroot = setUri();
 390                  $htaccess = preg_replace('/(?:'.APP_DIR.'(.*)|index\\.php(.*))/i', '', $webroot).APP_DIR.'/'.$webrootDirName.'/';
 391              }
 392  
 393              if (preg_match('/^(.*)\\/'.$appDirName.'\\/'.$webrootDirName.'\\/index\\.php$/', $scriptName, $regs)) {
 394  
 395                  if(APP_DIR === 'app') {
 396                      $appDir = null;
 397                  } else {
 398                      $appDir = '/'.APP_DIR;
 399                  }
 400                  !empty($htaccess)? $this->webroot = $htaccess : $this->webroot = $regs[1].$appDir.'/';
 401                  return  $base.$regs[1].$appDir;
 402  
 403              } elseif (preg_match('/^(.*)\\/'.$webrootDirName.'([^\/i]*)|index\\\.php$/', $scriptName, $regs)) {
 404                  !empty($htaccess)? $this->webroot = $htaccess : $this->webroot = $regs[0].'/';
 405                  return  $base.$regs[0];
 406  
 407              } else {
 408                  !empty($htaccess)? $this->webroot = $htaccess : $this->webroot = '/';
 409                  return $base;
 410              }
 411          }
 412          return $base;
 413      }
 414  /**
 415   * Enter description here...
 416   *
 417   * @param unknown_type $params
 418   * @return unknown
 419   */
 420  	function _restructureParams($params) {
 421          $params['controller'] = $params['action'];
 422  
 423          if(isset($params['pass'][0])) {
 424              $params['action'] = $params['pass'][0];
 425              array_shift($params['pass']);
 426          } else {
 427              $params['action'] = null;
 428          }
 429          return $params;
 430      }
 431  }
 432  ?>


Généré le : Sun Feb 25 19:27:47 2007 par Balluche grâce à PHPXref 0.7