Source of file ModelAsController.php
Size: 5,814 Bytes - Last Modified: 2021-12-23T10:28:18+00:00
/var/www/docs.ssmods.com/process/src/code/Controllers/ModelAsController.php
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168 | <?php namespace SilverStripe\CMS\Controllers; use Exception; use SilverStripe\CMS\Model\SiteTree; use SilverStripe\Control\Controller; use SilverStripe\Control\Director; use SilverStripe\Control\HTTPRequest; use SilverStripe\Control\HTTPResponse; use SilverStripe\Control\HTTPResponse_Exception; use SilverStripe\Control\NestedController; use SilverStripe\Control\RequestHandler; use SilverStripe\Core\ClassInfo; use SilverStripe\Core\Injector\Injector; use SilverStripe\Dev\Debug; use SilverStripe\ORM\DataObject; use SilverStripe\ORM\DB; use SilverStripe\View\Parsers\URLSegmentFilter; use Translatable; /** * ModelAsController deals with mapping the initial request to the first {@link SiteTree}/{@link ContentController} * pair, which are then used to handle the request. */ class ModelAsController extends Controller implements NestedController { private static $extensions = [ OldPageRedirector::class, ]; /** * Get the appropriate {@link ContentController} for handling a {@link SiteTree} object, link it to the object and * return it. * * @param SiteTree $sitetree * @param string $action * @return ContentController */ public static function controller_for(SiteTree $sitetree, $action = null) { $controller = $sitetree->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(); if (!$URLSegment = $request->param('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')); } } |