Source for file jCoordinator.class.php

Documentation is available at jCoordinator.class.php

  1. <?php
  2. /**
  3. @package      jelix
  4. @subpackage   core
  5. @author       Laurent Jouanneau
  6. @contributor  Thibault PIRONT < nuKs >, Julien Issler
  7. @copyright    2005-2008 laurent Jouanneau
  8. @copyright    2007 Thibault PIRONT
  9. @copyright    2008 Julien Issler
  10. @link         http://www.jelix.org
  11. @licence      GNU Lesser General Public Licence see LICENCE file or http://www.gnu.org/licenses/lgpl.html
  12. */
  13.  
  14. /**
  15.  * the main class of the jelix core
  16.  *
  17.  * this is the "chief orchestra" of the framework. Its goal is
  18.  * to load the configuration, to get the request parameters
  19.  * used to instancie the correspondant controllers and to run the right method.
  20.  * @package  jelix
  21.  * @subpackage core
  22.  */
  23. class jCoordinator {
  24.  
  25.     /**
  26.      * plugin list
  27.      * @var  array 
  28.      */
  29.     public $plugins=array();
  30.  
  31.     /**
  32.      * current response object
  33.      * @var jResponse 
  34.      */
  35.     public $response = null;
  36.  
  37.     /**
  38.      * current request object
  39.      * @var jRequest 
  40.      */
  41.     public $request = null;
  42.  
  43.     /**
  44.      * the selector of the current action
  45.      * @var jSelectorAct 
  46.      */
  47.     public $action = null;
  48.  
  49.     /**
  50.      * the current module name
  51.      * @var string 
  52.      */
  53.     public $moduleName;
  54.  
  55.     /**
  56.      * the current action name
  57.      * @var string 
  58.      */
  59.     public $actionName;
  60.  
  61.     /**
  62.      * List of all errors
  63.      * @var array 
  64.      */
  65.     public $errorMessages=array();
  66.  
  67.     /**
  68.      * List of all log messages
  69.      * @var array 
  70.      * @since 1.0
  71.      */
  72.     public $logMessages=array();
  73.  
  74.     /**
  75.      * @param  string $configFile name of the ini file to configure the framework
  76.      */
  77.     function __construct ($configFile{
  78.         global $gJCoord$gJConfig;
  79.  
  80.         $gJCoord =  $this;
  81.  
  82.         if(JELIX_APP_TEMP_PATH=='/')// le realpath dans application.ini.php a renvoyé false...
  83.             die('Jelix Error: Application temp directory doesn\'t exist !');
  84.         }
  85.         if(!is_writable(JELIX_APP_TEMP_PATH)){
  86.             die('Jelix Error: Application temp directory is not writable');
  87.         }
  88.         // load configuration data
  89.         $gJConfig jConfig::load($configFile);
  90.  
  91.         // set Error and exception handler
  92.         // ne devrait être désactivé que lors de certains tests de jelix
  93.         if($gJConfig->use_error_handler){
  94.             set_error_handler('jErrorHandler');
  95.             set_exception_handler('JExceptionHandler');
  96.         }
  97.         date_default_timezone_set($gJConfig->timeZone);
  98.         $this->_loadPlugins();
  99.     }
  100.  
  101.     /**
  102.      * load the plugins and their configuration file
  103.      */
  104.     private function _loadPlugins(){
  105.         global $gJConfig;
  106.  
  107.         foreach($gJConfig->plugins as $name=>$conf){
  108.             if($conf && isset($gJConfig->_pluginsPathList_coord[$name])){
  109.                 if($conf=='1'){
  110.                     $conf array();
  111.                 }else{
  112.                    $conff $conf;
  113.                    if(!file_exists(JELIX_APP_CONFIG_PATH.$conff))
  114.                         die("Jelix Error: Error in the main configuration. Configuration file '$conff' for plugin $name doesn't exist!");
  115.                    iffalse === ($conf parse_ini_file(JELIX_APP_CONFIG_PATH.$conff,true)))
  116.                         die("Jelix Error: Error in the configuration file of plugin $name ($conff)!");
  117.                 }
  118.                 include$gJConfig->_pluginsPathList_coord[$name].$name.'.coord.php');
  119.                 $class$name.'CoordPlugin';
  120.                 $this->plugins[strtolower($name)new $class($conf);
  121.             }
  122.         }
  123.     }
  124.  
  125.     /**
  126.      * Store an error/warning/notice message. Responses object should take care
  127.      * of the errorMessages properties to display them.
  128.      * @param  string $type  error type : 'error', 'warning', 'notice'
  129.      * @param  integer $code  error code
  130.      * @param  string $message error message
  131.      * @param  string $file    the file name where the error appear
  132.      * @param  integer $line  the line number where the error appear
  133.      * @return boolean    true= the process should stop now, false = the error manager do its job
  134.      */
  135.     public function addErrorMsg($type$code$message$file$line){
  136.         $this->errorMessages[array($type$code$message$file$line);
  137.         if(!$this->response){
  138.             return $this->initDefaultResponseOfRequest();
  139.         }
  140.         return !$this->response->acceptSeveralErrors();
  141.     }
  142.  
  143.     /**
  144.      * Store a log message. Responses object should take care
  145.      * of the logMessages properties to display them.
  146.      * @param  string $message error message
  147.      * @since 1.0
  148.      */
  149.     public function addLogMsg($message$type='default'){
  150.         $this->logMessages[$type][$message;
  151.     }
  152.  
  153.     /**
  154.     * main method : launch the execution of the action.
  155.     *
  156.     * This method should be called in a entry point.
  157.     * @param  jRequest  $request the request object
  158.     */
  159.     public function process ($request){
  160.         global $gJConfig;
  161.  
  162.         $this->request = $request;
  163.         $this->request->init();
  164.         jSession::start();
  165.  
  166.         $this->moduleName = $this->request->getParam('module');
  167.         $this->actionName = $this->request->getParam('action');
  168.  
  169.         if(empty($this->moduleName)){
  170.             $this->moduleName = $gJConfig->startModule;
  171.         }
  172.         if(empty($this->actionName)){
  173.             if($this->moduleName == $gJConfig->startModule)
  174.                 $this->actionName = $gJConfig->startAction;
  175.             else {
  176.                 $this->actionName = 'default:index';
  177.             }
  178.         }
  179.  
  180.         // verification du module
  181.         if(!in_array($this->moduleName,$gJConfig->_trustedModules)){
  182.             throw new jException('jelix~errors.module.untrusted',$this->moduleName);
  183.         }
  184.  
  185.         jContext::push ($this->moduleName);
  186.         try{
  187.             $this->action = new jSelectorActFast($this->request->type$this->moduleName$this->actionName);
  188.             $ctrl $this->getController($this->action);
  189.         }catch(jException $e){
  190.             if ($gJConfig->urlengine['notfoundAct'==''{
  191.                 throw $e;
  192.             }
  193.             try {
  194.                 $this->action = new jSelectorAct($gJConfig->urlengine['notfoundAct']);
  195.                 $ctrl $this->getController($this->action);
  196.             }catch(jException $e2){
  197.                 throw $e;
  198.             }
  199.         }
  200.  
  201.         $pluginparams array();
  202.         if(isset($ctrl->pluginParams['*'])){
  203.             $pluginparams $ctrl->pluginParams['*'];
  204.         }
  205.  
  206.         if(isset($ctrl->pluginParams[$this->action->method])){
  207.             $pluginparams array_merge($pluginparams$ctrl->pluginParams[$this->action->method]);
  208.         }
  209.  
  210.         foreach ($this->plugins as $name => $obj){
  211.             $result $this->plugins[$name]->beforeAction ($pluginparams);
  212.             if($result){
  213.                 $this->action = $result;
  214.                 jContext::pop();
  215.                 jContext::push($result->module);
  216.                 $this->moduleName = $result->module;
  217.                 $this->actionName = $result->resource;
  218.                 $ctrl $this->getController($this->action);
  219.                 break;
  220.             }
  221.         }
  222.  
  223.         $this->response = $ctrl->{$this->action->method}();
  224.  
  225.         if($this->response == null){
  226.             throw new jException('jelix~errors.response.missing',$this->action->toString());
  227.         }
  228.  
  229.         foreach ($this->plugins as $name => $obj){
  230.             $this->plugins[$name]->beforeOutput ();
  231.         }
  232.  
  233.         // envoi de la réponse
  234.         if(!$this->response->output()){
  235.             $this->response->outputErrors();
  236.         }
  237.  
  238.         foreach ($this->plugins as $name => $obj){
  239.             $this->plugins[$name]->afterProcess ();
  240.         }
  241.  
  242.         jContext::pop();
  243.         jSession::end();
  244.     }
  245.  
  246.     /**
  247.      * get the controller corresponding to the selector
  248.      * @param jSelectorAct $selector 
  249.      */
  250.     private function getController($selector){
  251.  
  252.         $ctrlpath $selector->getPath();
  253.  
  254.         if(!file_exists($ctrlpath)){
  255.             throw new jException('jelix~errors.ad.controller.file.unknow',array($this->actionName,$ctrlpath));
  256.         }
  257.         require_once($ctrlpath);
  258.         $class $selector->getClass();
  259.         if(!class_exists($class,false)){
  260.             throw new jException('jelix~errors.ad.controller.class.unknow',array($this->actionName,$class$ctrlpath));
  261.         }
  262.  
  263.         $ctrl new $class($this->request);
  264.         if($ctrl instanceof jIRestController){
  265.             $method $selector->method strtolower($_SERVER['REQUEST_METHOD']);
  266.         }elseif(!method_exists($ctrl,$selector->method)){
  267.             throw new jException('jelix~errors.ad.controller.method.unknow',array($this->actionName,$selector->method$class$ctrlpath));
  268.         }
  269.         return $ctrl;
  270.     }
  271.  
  272.  
  273.     /**
  274.      * instancy a response object corresponding to the default response type
  275.      * of the current resquest
  276.      * @param boolean $originalResponse TRUE to get the original, non overloaded response
  277.      * @return mixed  error string or false
  278.      */
  279.     public function initDefaultResponseOfRequest($originalResponse false){
  280.         if($originalResponse)
  281.              $responses &$GLOBALS['gJConfig']->_coreResponses;
  282.         else
  283.              $responses &$GLOBALS['gJConfig']->responses;
  284.  
  285.         $type$this->request->defaultResponseType;
  286.  
  287.         if(!isset($responses[$type]))
  288.             return jLocale::get('jelix~errors.default.response.type.unknow',array($this->moduleName.'~'.$this->actionName,$type));
  289.  
  290.         try{
  291.             $respclass $responses[$type];
  292.             if($originalResponse)
  293.                 $path JELIX_LIB_RESPONSE_PATH.$respclass.'.class.php';
  294.             else
  295.                 $path JELIX_APP_PATH.'responses/'.$respclass.'.class.php';
  296.  
  297.             if(!file_exists($path))
  298.                 throw new Exception();
  299.  
  300.             require_once($path);
  301.  
  302.             $this->response = new $respclass();
  303.             return false;
  304.         }
  305.         catch(Exception $e){
  306.             if($originalResponse)
  307.                 return jLocale::get('jelix~errors.default.response.not.loaded',array($this->moduleName.'~'.$this->actionName,$type));
  308.             return $this->initDefaultResponseOfRequest(true);
  309.         }
  310.     }
  311.  
  312.     /**
  313.     * gets a given plugin if registered
  314.     * @param string   $pluginName   the name of the plugin
  315.     * @param boolean  $required  says if the plugin is required or not. If true, will generate an exception if the plugin is not registered.
  316.     * @return jICoordPlugin 
  317.     */
  318.     public function getPlugin ($pluginName$required true){
  319.         $pluginName strtolower ($pluginName);
  320.         if (isset ($this->plugins[$pluginName])){
  321.             $plugin $this->plugins[$pluginName];
  322.         }else{
  323.             if ($required){
  324.                 throw new jException('jelix~errors.plugin.unregister'$pluginName);
  325.             }
  326.             $plugin null;
  327.         }
  328.         return $plugin;
  329.     }
  330.  
  331.     /**
  332.     * Says if the given plugin $name is enabled
  333.     * @param string $pluginName 
  334.     * @return boolean true : plugin is ok
  335.     */
  336.     public function isPluginEnabled ($pluginName){
  337.         return isset ($this->plugins[strtolower ($pluginName)]);
  338.     }
  339.  
  340.     /**
  341.     * Says if the given module $name is enabled
  342.     * @param string $moduleName 
  343.     * @return boolean true : module is ok
  344.     */
  345.     public function isModuleEnabled ($moduleName){
  346.         return in_array($moduleName$GLOBALS['gJConfig']->_trustedModules);
  347.     }
  348.  
  349.     /**
  350.      * return the real path of a module
  351.      * @param string $module a module name
  352.      * @return string the corresponding path
  353.      */
  354.  
  355.     public function getModulePath($module){
  356.         global $gJConfig;
  357.         if(!isset($gJConfig->_modulesPathList[$module])){
  358.             throw new Exception('getModulePath : invalid module name');
  359.         }
  360.         return $gJConfig->_modulesPathList[$module];
  361.     }
  362. }
  363. ?>

Documentation generated on Wed, 07 Sep 2011 13:46:50 +0200 by phpDocumentor 1.4.3