Source of file RedirectedURL.php
Size: 10,436 Bytes - Last Modified: 2021-12-23T10:33:52+00:00
/var/www/docs.ssmods.com/process/src/src/Model/RedirectedURL.php
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384 | <?php namespace SilverStripe\RedirectedURLs\Model; use SilverStripe\ORM\DataObject; use SilverStripe\Security\Member; use SilverStripe\Security\Permission; use SilverStripe\Security\PermissionProvider; use SilverStripe\Forms\TextField; use SilverStripe\CMS\Model\SiteTree; use SilverStripe\Forms\OptionsetField; use SilverStripe\Forms\TreeDropdownField; use SilverStripe\CMS\Model\RedirectorPage; use UncleCheese\DisplayLogic\Forms\Wrapper; use SilverStripe\Core\Config\Config; use SilverStripe\Forms\DropdownField; /** * Specifies one URL redirection * * @package redirectedurls * @author sam@silverstripe.com * @property string $FromBase * @property string $FromQuerystring * @property string $To */ class RedirectedURL extends DataObject implements PermissionProvider { /** * @var string * @config */ private static $singular_name = 'Redirected URL'; /** * @var string * @config */ private static $table_name = 'RedirectedURL'; /** * @var array * @config */ private static $db = array( 'FromBase' => 'Varchar(255)', 'FromQuerystring' => 'Varchar(255)', 'To' => 'Varchar(255)', 'RedirectionType' => 'Enum("Internal,External", "Internal")', 'RedirectCode' => 'Int', ); /** * @var array * @config */ private static $has_one = array( 'LinkTo' => SiteTree::class, ); /** * @var array * @config */ private static $indexes = array( 'From' => array( 'type' => 'unique', 'columns' => array( 'FromBase', 'FromQuerystring', ), ), ); /** * @var array * @config */ private static $summary_fields = array( 'FromBase' => 'From URL base', 'FromQuerystring' => 'From URL query parameters', 'To' => 'To URL', 'LinkTo.Title' => 'Link To', 'RedirectionType' => 'Redirection type', 'RedirectCode' => 'Redirect code', ); /** * @var array * @config */ private static $searchable_fields = array( 'FromBase', 'FromQuerystring', 'To', ); public function getCMSFields() { $this->beforeUpdateCMSFields(function ($fields) { $fields->removeByName([ 'FromBase', 'FromQuerystring', 'RedirectCode', 'To', 'RedirectionType', 'LinkToID', ]); $fields->addFieldsToTab( 'Root.Main', [ $fromBaseField = TextField::create( 'FromBase', _t(__CLASS__.'.FIELD_TITLE_FROMBASE', 'From base') ), $fromQueryStringField = TextField::create( 'FromQuerystring', _t(__CLASS__.'.FIELD_TITLE_FROMQUERYSTRING', 'From querystring') ), $redirectCodeField = DropdownField::create( 'RedirectCode', _t(__CLASS__.'.FIELD_TITLE_REDIRECTCODE', 'Redirect code'), $this->getCodes() ), $redirectionTypeField = OptionsetField::create( 'RedirectionType', _t(__CLASS__.'.FIELD_TITLE_REDIRECTIONTYPE', 'Redirect to'), [ 'Internal' => _t(__CLASS__.'.FIELD_REDIRECTIONTYPE_OPTION_INTERNAL', 'A page on your website'), 'External' => _t(__CLASS__.'.FIELD_REDIRECTIONTYPE_OPTION_EXTERNAL', 'Another website'), ], 'Internal' ), $toField = TextField::create( 'To', _t(__CLASS__.'.FIELD_TITLE_TO', 'To') ), $linkToWrapperField = Wrapper::create(TreeDropdownField::create( 'LinkToID', _t(__CLASS__.'.FIELD_TITLE_LINKTOID', 'Page on your website'), SiteTree::class )), ] ); $fromBaseField->setDescription(_t(__CLASS__.'.FIELD_DESCRIPTION_FROMBASE', 'e.g. /about-us.html')); $fromQueryStringField->setDescription( _t(__CLASS__.'.FIELD_DESCRIPTION_FROMQUERYSTRING', 'e.g. page=1&num=5') ); $toField->setDescription(_t(__CLASS__.'.FIELD_DESCRIPTION_TO', 'e.g. /about?something=5')); $toField->displayIf('RedirectionType')->isEqualTo('External'); $linkToWrapperField->displayIf('RedirectionType')->isEqualTo('Internal'); }); return parent::getCMSFields(); } /** * @return int */ public function populateDefaults() { $this->RedirectCode = $this->getRedirectCodeDefault(); } /** * @return int */ private function getRedirectCodeDefault() { $redirectCodeValue = 301; $defaultRedirectCode = intval(Config::inst()->get(RedirectedURL::class, 'default_redirect_code')); if ($defaultRedirectCode > 0) { $redirectCodeValue = $defaultRedirectCode; } return $redirectCodeValue; } /** * @return array */ protected function getCodes() { return [ 301 => _t(__CLASS__.'.CODE_301', '301 - Permanent'), 302 => _t(__CLASS__.'.CODE_302', '302 - Temporary'), ]; } /** * @param string $val * @return $this */ public function setFrom($val) { if (strpos($val, '?') !== false) { list($base, $querystring) = explode('?', $val, 2); } else { $base = $val; $querystring = null; } $this->setFromBase($base); $this->setFromQuerystring($querystring); return $this; } /** * @return string */ public function getFrom() { $url = $this->FromBase; if ($this->FromQuerystring) { $url .= "?" . $this->FromQuerystring; } return $url; } /** * @param string $val * @return $this */ public function setFromBase($val) { if ($val[0] != '/') { $val = "/$val"; } if ($val != '/') { $val = rtrim($val, '/'); } $val = rtrim($val, '?'); $this->setField('FromBase', strtolower($val)); return $this; } /** * @param string $val * @return $this */ public function setFromQuerystring($val) { $val = rtrim($val, '?'); $this->setField('FromQuerystring', strtolower($val)); return $this; } /** * Helper for bulkloader {@link: RedirectedURLAdmin.getModelImporters} * * @param string $from The From URL to search * @return self {@link: RedirectedURL} */ public function findByFrom($from) { if ($from[0] != '/') { $from = "/$from"; } $from = rtrim($from, '?'); if (strpos($from, '?') !== false) { list($base, $querystring) = explode('?', strtolower($from), 2); } else { $base = $from; $querystring = null; } $filter = array( 'FromBase' => $base, ); if ($querystring) { $filter['FromQuerystring'] = $querystring; } return RedirectedURL::get()->filter($filter)->first(); } /** * @return array */ public function providePermissions() { return array( 'REDIRECTEDURLS_CREATE' => array( 'name' => 'Create a redirect', 'category' => 'Redirects' ), 'REDIRECTEDURLS_EDIT' => array( 'name' => 'Edit a redirect', 'category' => 'Redirects', ), 'REDIRECTEDURLS_DELETE' => array( 'name' => 'Delete a redirect', 'category' => 'Redirects', ) ); } /** * @param Member|null $member * @return bool */ public function canView($member = null) { return true; } /** * @param Member|null $member * @param array $context * @return bool */ public function canCreate($member = null, $context = array()) { return Permission::checkMember($member, 'REDIRECTEDURLS_CREATE'); } /** * @param Member|null $member * @return bool */ public function canEdit($member = null) { return Permission::checkMember($member, 'REDIRECTEDURLS_EDIT'); } /** * @param Member|null $member * @return bool */ public function canDelete($member = null) { return Permission::checkMember($member, 'REDIRECTEDURLS_DELETE'); } /** * @return string */ public function Link() { // Check external redirect if ($this->RedirectionType === 'External') { return $this->To; } elseif (!$this->LinkToID) { // internal but not linked anywhere (e.g static local URL) return $this->To; } // Check internal redirect /** @var SiteTree $linkTo */ $linkTo = SiteTree::get()->byID($this->LinkToID); if (empty($linkTo)) { return null; } // We shouldn't point to ourselves - that would create an infinite loop! Return null since we have a // bad configuration if (intval($this->ID) === intval($linkTo->ID)) { return null; } // If we're linking to another redirectorpage then just return the URLSegment, to prevent a cycle of redirector // pages from causing an infinite loop. Instead, they will cause a 30x redirection loop in the browser, but // this can be handled sufficiently gracefully by the browser. if ($linkTo instanceof RedirectorPage) { return $linkTo->regularLink(); } // For all other pages, just return the link of the page. return $linkTo->RelativeLink(); } } |