/** * 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; } }