Source of file SubsiteHelper.php
Size: 5,792 Bytes - Last Modified: 2021-12-23T10:00:29+00:00
/var/www/docs.ssmods.com/process/src/src/Helpers/SubsiteHelper.php
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236 | <?php namespace LeKoala\EmailTemplates\Helpers; use SilverStripe\ORM\DataObject; use SilverStripe\Control\Controller; use SilverStripe\Control\HTTPRequest; use SilverStripe\Subsites\Model\Subsite; use SilverStripe\Subsites\State\SubsiteState; /** * Helps providing base functionnalities where including * subsite module is optional and yet provide a consistent api * * TODO: externalize this to a specific module */ class SubsiteHelper { /** * @var boolean */ protected static $previousState; /** * @var int */ protected static $previousSubsite; /** * Return current subsite id (even if module is not installed, which returns 0) * * @return int */ public static function currentSubsiteID() { if (self::usesSubsite()) { return SubsiteState::singleton()->getSubsiteId(); } return 0; } /** * @return Subsite */ public static function currentSubsite() { $id = self::currentSubsiteID(); if (self::usesSubsite()) { return DataObject::get_by_id(Subsite::class, $id); } return false; } /** * Do we have the subsite module installed * TODO: check if it might be better to use module manifest instead? * * @return bool */ public static function usesSubsite() { return class_exists(SubsiteState::class); } /** * @return bool */ public static function subsiteFilterDisabled() { if (!self::usesSubsite()) { return true; } return Subsite::$disable_subsite_filter; } /** * Enable subsite filter and store previous state * * @return void */ public static function enableFilter() { if (!self::usesSubsite()) { return; } self::$previousState = Subsite::$disable_subsite_filter; Subsite::$disable_subsite_filter = false; } /** * Disable subsite filter and store previous state * * @return void */ public static function disableFilter() { if (!self::usesSubsite()) { return; } self::$previousState = Subsite::$disable_subsite_filter; Subsite::$disable_subsite_filter = true; } /** * Restore subsite filter based on previous set (set when called enableFilter or disableFilter) */ public static function restoreFilter() { if (!self::usesSubsite()) { return; } Subsite::$disable_subsite_filter = self::$previousState; } /** * @return int */ public static function SubsiteIDFromSession() { $session = Controller::curr()->getRequest()->getSession(); if ($session) { return $session->get('SubsiteID'); } return 0; } /** * Typically call this on PageController::init * This is due to InitStateMiddleware not using session in front end and not persisting get var parameters * * @param HTTPRequest $request * @return int */ public static function forceSubsiteFromRequest(HTTPRequest $request) { $subsiteID = $request->getVar('SubsiteID'); if ($subsiteID) { $request->getSession()->set('ForcedSubsiteID', $subsiteID); } else { $subsiteID = $request->getSession()->get('ForcedSubsiteID'); } if ($subsiteID) { self::changeSubsite($subsiteID, true); } return $subsiteID; } /** * @param string $ID * @param bool $flush * @return void */ public static function changeSubsite($ID, $flush = null) { if (!self::usesSubsite()) { return; } self::$previousSubsite = self::currentSubsiteID(); // Do this otherwise changeSubsite has no effect if false SubsiteState::singleton()->setUseSessions(true); Subsite::changeSubsite($ID); // This can help avoiding getting static objects like SiteConfig if ($flush !== null && $flush) { DataObject::reset(); } } /** * @return void */ public static function restoreSubsite() { if (!self::usesSubsite()) { return; } Subsite::changeSubsite(self::$previousSubsite); } /** * @return array */ public static function listSubsites() { if (!self::usesSubsite()) { return []; } return Subsite::get()->map(); } /** * Execute the callback in given subsite * * @param int $ID Subsite ID or 0 for main site * @param callable $cb * @return void */ public static function withSubsite($ID, $cb) { $currentID = self::currentSubsiteID(); SubsiteState::singleton()->setSubsiteId($ID); $cb(); SubsiteState::singleton()->setSubsiteId($currentID); } /** * Execute the callback in all subsites * * @param callable $cb * @param bool $încludeMainSite * @return void */ public static function withSubsites($cb, $includeMainSite = true) { if (!self::usesSubsite()) { $cb(); return; } if ($includeMainSite) { SubsiteState::singleton()->setSubsiteId(0); $cb(0); } $currentID = self::currentSubsiteID(); $subsites = Subsite::get(); foreach ($subsites as $subsite) { // TODO: maybe use changeSubsite instead? SubsiteState::singleton()->setSubsiteId($subsite->ID); $cb($subsite->ID); } SubsiteState::singleton()->setSubsiteId($currentID); } } |