Example #1
0
 /**
  * Creates a controller instance based on a route.
  * Modified to check in /custom for controller files.
  * See {@link CWebApplication::createController()} for details.
  *
  * @param string $route the route of the request.
  * @param CWebModule $owner the module that the new controller will belong to. Defaults to null, meaning the application
  * instance is the owner.
  * @return array the controller instance and the action ID. Null if the controller class does not exist or the route is invalid.
  */
 public function createController($route, $owner = null)
 {
     if ($owner === null) {
         $owner = $this;
     }
     if (($route = trim($route, '/')) === '') {
         $route = $owner->defaultController;
     }
     $caseSensitive = $this->getUrlManager()->caseSensitive;
     $route .= '/';
     while (($pos = strpos($route, '/')) !== false) {
         $id = substr($route, 0, $pos);
         if (!preg_match('/^\\w+$/', $id)) {
             return null;
         }
         if (!$caseSensitive) {
             $id = strtolower($id);
         }
         $route = (string) substr($route, $pos + 1);
         if (!isset($basePath)) {
             if (isset($owner->controllerMap[$id])) {
                 return array(Yii::createComponent($owner->controllerMap[$id], $id, $owner === $this ? null : $owner), $this->parseActionParams($route));
             }
             if (($module = $owner->getModule($id)) !== null) {
                 // fix module's base paths in case module was loaded from /custom
                 $module->basePath = Yii::resetCustomPath($module->basePath);
                 $module->viewPath = Yii::resetCustomPath($module->viewPath);
                 Yii::setPathOfAlias($module->getId(), $module->basePath);
                 return $this->createController($route, $module);
             }
             $basePath = $owner->getControllerPath();
             $controllerID = '';
         } else {
             $controllerID .= '/';
         }
         $className = ucfirst($id) . 'Controller';
         $classFile = $basePath . DIRECTORY_SEPARATOR . $className . '.php';
         $extendedClassFile = Yii::getCustomPath($basePath . DIRECTORY_SEPARATOR . 'My' . $className . '.php');
         if (is_file($extendedClassFile)) {
             // see if there's an extended controller in /custom
             if (!class_exists($className, false)) {
                 require Yii::getCustomPath($classFile);
             }
             // import the 'real' controller
             $className = 'My' . $className;
             // add "My" to the class name
             $classFile = $extendedClassFile;
         } else {
             $classFile = Yii::getCustomPath($classFile);
             // look in /custom for controller file
         }
         if (is_file($classFile)) {
             if (!class_exists($className, false)) {
                 require $classFile;
             }
             if (class_exists($className, false) && is_subclass_of($className, 'CController')) {
                 $id[0] = strtolower($id[0]);
                 return array(new $className($controllerID . $id, $owner === $this ? null : $owner), $this->parseActionParams($route));
             }
             return null;
         }
         $controllerID .= $id;
         $basePath .= DIRECTORY_SEPARATOR . $id;
     }
 }