getControllerName(); if ($action && class_exists($controller . '_' . ucfirst($action ?? ''))) { $controller = $controller . '_' . ucfirst($action ?? ''); } return Injector::inst()->create($controller, $sitetree); } protected function init() { singleton(SiteTree::class)->extend('modelascontrollerInit', $this); parent::init(); } protected function beforeHandleRequest(HTTPRequest $request) { parent::beforeHandleRequest($request); // If the database has not yet been created, redirect to the build page. /** @skipUpgrade */ if (!DB::is_active() || !ClassInfo::hasTable('SiteTree')) { $this->getResponse()->redirect(Controller::join_links( Director::absoluteBaseURL(), 'dev/build', '?' . http_build_query([ 'returnURL' => isset($_GET['url']) ? $_GET['url'] : null, ]) )); } } /** * @uses ModelAsController::getNestedController() * @param HTTPRequest $request * @return HTTPResponse */ public function handleRequest(HTTPRequest $request) { $this->beforeHandleRequest($request); // If we had a redirection or something, halt processing. if ($this->getResponse()->isFinished()) { $this->popCurrent(); return $this->getResponse(); } // If the database has not yet been created, redirect to the build page. /** @skipUpgrade */ if (!DB::is_active() || !ClassInfo::hasTable('SiteTree')) { $this->getResponse()->redirect(Director::absoluteBaseURL() . 'dev/build?returnURL=' . (isset($_GET['url']) ? urlencode($_GET['url']) : null)); $this->popCurrent(); return $this->getResponse(); } try { $result = $this->getNestedController(); if ($result instanceof RequestHandler) { $result = $result->handleRequest($this->getRequest()); } elseif (!($result instanceof HTTPResponse)) { user_error("ModelAsController::getNestedController() returned bad object type '" . get_class($result)."'", E_USER_WARNING); } } catch (HTTPResponse_Exception $responseException) { $result = $responseException->getResponse(); } $this->popCurrent(); return $result; } /** * @return ContentController * @throws Exception If URLSegment not passed in as a request parameter. */ public function getNestedController() { $request = $this->getRequest(); $urlSegment = $request->param('URLSegment'); if ($urlSegment === false || $urlSegment === null || $urlSegment === '') { throw new Exception('ModelAsController->getNestedController(): was not passed a URLSegment value.'); } // Find page by link, regardless of current locale settings if (class_exists('Translatable')) { Translatable::disable_locale_filter(); } // url encode unless it's multibyte (already pre-encoded in the database) $filter = URLSegmentFilter::create(); if (!$filter->getAllowMultibyte()) { $urlSegment = rawurlencode($urlSegment ?? ''); } // Select child page $tableName = DataObject::singleton(SiteTree::class)->baseTable(); $conditions = [sprintf('"%s"."URLSegment"', $tableName) => $urlSegment]; if (SiteTree::config()->get('nested_urls')) { $conditions[] = [sprintf('"%s"."ParentID"', $tableName) => 0]; } /** @var SiteTree $sitetree */ $sitetree = DataObject::get_one(SiteTree::class, $conditions); // Check translation module // @todo Refactor out module specific code if (class_exists('Translatable')) { Translatable::enable_locale_filter(); } if (!$sitetree) { $this->httpError(404, 'The requested page could not be found.'); } // Enforce current locale setting to the loaded SiteTree object if (class_exists('Translatable') && $sitetree->Locale) { Translatable::set_current_locale($sitetree->Locale); } if (isset($_REQUEST['debug'])) { Debug::message("Using record #$sitetree->ID of type " . get_class($sitetree) . " with link {$sitetree->Link()}"); } return self::controller_for($sitetree, $this->getRequest()->param('Action')); } }