Source of file Redirect.php
Size: 4,812 Bytes - Last Modified: 2021-12-24T06:46:38+00:00
/var/www/docs.ssmods.com/process/src/src/Model/Redirect.php
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171 | <?php namespace EdgarIndustries\RedirectMiddleware\Model; use Psr\SimpleCache\CacheInterface; use SilverStripe\Core\Flushable; use SilverStripe\Core\Injector\Injector; use SilverStripe\CMS\Model\SiteTree; use SilverStripe\Forms\LiteralField; use SilverStripe\Forms\OptionsetField; use SilverStripe\Forms\TextField; use SilverStripe\ORM\Connect\DatabaseException; use SilverStripe\ORM\DataObject; class Redirect extends DataObject implements Flushable { private static $table_name = 'EdgarIndustries_RedirectMiddleware_Redirect'; private static $singular_name = 'Redirect'; private static $plural_name = 'Redirects'; private static $default_sort = 'Active DESC, FromURL ASC'; private static $summary_fields = [ 'FromURL' => 'From', 'DestinationSummary' => 'To', 'ActiveNice' => 'Enabled', ]; private static $db = [ 'FromURL' => 'Varchar(255)', 'ToURL' => 'Text', 'Active' => 'Boolean', 'Code' => 'Enum("301,302", "302")', ]; private static $has_one = [ 'ToPage' => SiteTree::class, ]; private static $defaults = [ 'Active' => true, ]; public static function flush() { $reserved_chars = ['{', '}', '(', ')', '/', '\\', '@', ':']; $cache = Injector::inst()->get(CacheInterface::class . '.redirectMiddlewareCache'); $cache->clear(); try { $redirects = Redirect::get()->filter('Active', true); if ($redirects->exists()) { foreach ($redirects as $r) { $val = $r->getDestination(); if (!empty($r->Code)) { $val .= '^' . $r->Code; } $cache->set(str_replace( $reserved_chars, array_fill(0, count($reserved_chars), '^'), strtolower($r->FromURL) ), $val); } } } catch (DatabaseException $e) { return; } } public function getActiveNice() { return $this->Active ? '✓' : '✘'; } public function getCMSFields() { $fields = parent::getCMSFields(); $fields->changeFieldOrder(['Active', 'FromURL', 'Code', 'ToPageID', 'ToURL']); $fields->dataFieldByName('Active')->setTitle('Enabled'); $fields->replaceField('Code', OptionsetField::create( 'Code', 'Type', [ '302' => 'Temporary', '301' => 'Permanent', ], !empty($this->Code) ? $this->Code : 302 )); $fields->dataFieldByName('FromURL') ->setTitle('From (path)') ->setDescription('e.g. <code>oldsection/page-name</code> (case insensitive)'); $fields->dataFieldByName('ToPageID')->setTitle('To (internal page)'); $fields->replaceField( 'ToURL', TextField::create('ToURL', 'To (external URL)') ->setDescription('e.g. <code>https://www.silverstripe.org</code>') ); $fields->insertAfter('ToURL', LiteralField::create( 'RedirectNote', '<strong>Note:</strong> If both "internal page" and "external URL" are set, the internal page will be used.') ); return $fields; } public function validate() { $result = parent::validate(); if (strpos($this->FromURL, 'http:') !== false || strpos($this->FromURL, 'https:') !== false) { $result->addError('From should not be an absolute url.'); } return $result; } public function getDestination() { if ($this->ToPageID > 0) { return $this->ToPage()->AbsoluteLink(); } else { return $this->ToURL; } } public function getDestinationSummary() { if ($this->ToPageID > 0) { return $this->ToPage()->Breadcrumbs(); } else { return $this->ToURL; } } public function onAfterDelete() { parent::onAfterDelete(); self::flush(); } public function onAfterWrite() { parent::onAfterWrite(); self::flush(); } public function onBeforeWrite() { parent::onBeforeWrite(); // Strip extra slashes if (strpos($this->FromURL, '/') === 0) { $this->FromURL = substr($this->FromURL, 1); } if (strpos($this->FromURL, '/') === (strlen($this->FromURL) - 1)) { $this->FromURL = substr($this->FromURL, 0, strlen($this->FromURL) - 1); } // Rewrite blank (i.e. homepage) to 'home' if ($this->FromURL == '') { $this->FromURL = 'home'; } } } |