public function getURLPrefix()
 {
     $url = parent::getURLPrefix();
     if (Director::isDev() || Director::isTest()) {
         $urlarray = parse_url($url);
         // define override
         if (defined('DEV_SUBSITE_' . Subsite::currentSubsiteID())) {
             $subsiteurl = 'DEV_SUBSITE_' . Subsite::currentSubsiteID();
             return constant($subsiteurl) . $urlarray['path'];
         }
         if (!Subsite::currentSubsite() instanceof Subsite) {
             return $url;
         }
         // if set in config settings
         $currentDomain = Subsite::currentSubsite()->getPrimarySubsiteDomain();
         if (Director::isTest()) {
             $currentDomain = Subsite::currentSubsite()->TestDomainID ? Subsite::currentSubsite()->TestDomain() : $currentDomain;
         }
         if (Director::isDev()) {
             $currentDomain = Subsite::currentSubsite()->DevDomainID ? Subsite::currentSubsite()->DevDomain() : $currentDomain;
         }
         if (!$currentDomain) {
             return $url;
         }
         return $currentDomain->getFullProtocol() . $currentDomain->Domain . $urlarray['path'];
     }
     return $url;
 }
 public function getEditForm($id = null, $fields = null)
 {
     $form = parent::getEditForm($id, $fields);
     if ($this->modelClass == 'Order') {
         $fields = $form->Fields();
         $gridField = $fields->fieldByName('Order');
         // Bulk manager
         $manager = new GridFieldBulkManager();
         $manager->removeBulkAction("bulkEdit");
         $manager->removeBulkAction("unLink");
         $manager->removeBulkAction("delete");
         $manager->addBulkAction('paid', 'Mark Paid', 'CommerceGridFieldBulkAction_Paid');
         $manager->addBulkAction('processing', 'Mark Processing', 'CommerceGridFieldBulkAction_Processing');
         $manager->addBulkAction('dispatched', 'Mark Dispatched', 'CommerceGridFieldBulkAction_Dispatched');
         // Add dispatch button
         $field_config = $gridField->getConfig();
         $field_config->addComponent($manager);
         // Update list of items for subsite (if used)
         if (class_exists('Subsite')) {
             $list = $gridField->getList()->filter(array('SubsiteID' => Subsite::currentSubsiteID()));
             $gridField->setList($list);
         }
     }
     $this->extend("updateEditForm", $form);
     return $form;
 }
 function onBeforeWrite()
 {
     if (!$this->owner->ID && !$this->owner->SubsiteID) {
         $this->owner->SubsiteID = Subsite::currentSubsiteID();
     }
     parent::onBeforeWrite();
 }
 public function updateCMSFields(FieldList $fields)
 {
     $fields->removeByName('SubsiteID');
     if (class_exists('Subsite')) {
         $fields->push(new HiddenField('SubsiteID', 'SubsiteID', Subsite::currentSubsiteID()));
     }
 }
 public function updateCMSFields(FieldList $fields)
 {
     $subsites = class_exists('Subsite');
     $onMainSite = TRUE;
     $currentSubsiteID = 0;
     $currentSiteConfig = SiteConfig::current_site_config();
     if ($subsites) {
         $currentSubsiteID = Subsite::currentSubsiteID();
         if ($currentSubsiteID) {
             $onMainSite = FALSE;
         }
         $mainSiteConfig = SiteConfig::get()->filter('SubsiteID', 0)->first();
     } else {
         $mainSiteConfig = $currentSiteConfig;
     }
     // Add mailblock CMS fields.
     if (Permission::check('MANAGE_MAILBLOCK') && ($mainSiteConfig->getField('MailblockApplyPerSubsite') || $onMainSite)) {
         $enabled = $currentSiteConfig->getField('MailblockEnabled');
         $tabSet = new TabSet('Mailblock', $settingsTab = $this->basicSettingsFields(), $advancedSettingsTab = $this->advancedSettingsFields($onMainSite, $currentSubsiteID), $testTab = $this->testEmailCMSFields($enabled));
         $fields->addFieldToTab('Root', $tabSet);
         $hiddenFields = array('MailblockEnabledOnLive', 'MailblockOverrideConfiguration', 'MailblockRecipients', 'MailblockWhitelist');
         if ($subsites && $currentSubsiteID == 0) {
             $hiddenFields[] = 'MailblockApplyPerSubsite';
         }
         foreach ($hiddenFields as $field) {
             $field = $fields->dataFieldByName($field);
             $field->displayIf('MailblockEnabled')->isChecked();
         }
     }
 }
 function updateCMSFields(FieldList $fields)
 {
     if (class_exists('Subsite')) {
         $fields->push(new HiddenField('SubsiteID', 'SubsiteID', Subsite::currentSubsiteID()));
     }
     return $fields;
 }
 public function updateEditForm($form)
 {
     $gridField = $form->Fields()->fieldByName($this->sanitiseClassNameExtension($this->owner->modelClass));
     if (class_exists('Subsite')) {
         $list = $gridField->getList()->filter(array('SubsiteID' => Subsite::currentSubsiteID()));
         $gridField->setList($list);
     }
 }
 /**
  * @param SQLQuery $query
  * @param DataQuery $dataQuery
  */
 function augmentSQL(SQLQuery &$query, DataQuery &$dataQuery = null)
 {
     $baseTable = ClassInfo::baseDataClass($dataQuery->dataClass());
     if (class_exists('Subsite')) {
         $currentSubsiteID = Subsite::currentSubsiteID();
         $query->addWhere("\"{$baseTable}\".\"SubsiteID\" = '{$currentSubsiteID}'");
     }
 }
 /**
  * make the form a bit more usable.
  *
  * @return FieldList
  */
 public function getCMSFields()
 {
     $fields = parent::getCMSFields();
     // remove it and, if needed re-add it as a hidden field
     $fields->removeByName('SubsiteID');
     if (class_exists('Subsite')) {
         $fields->push(new HiddenField('SubsiteID', 'SubsiteID', Subsite::currentSubsiteID()));
     }
     return $fields;
 }
 /**
  * List only newsitems from current subsite.
  *
  * @author Marcio Barrientos
  * @return ArrayList $list
  */
 public function getList()
 {
     /** @var DataList $list */
     $list = parent::getList();
     if ($this->modelClass === 'News' && class_exists('Subsite') && Subsite::currentSubsiteID() > 0) {
         $pages = NewsHolderPage::get()->filter(array('SubsiteID' => (int) Subsite::currentSubsiteID()));
         $filter = $pages->column('ID');
         /* Manual join needed because otherwise no items are found. Unknown why. */
         $list = $list->innerJoin('NewsHolderPage_Newsitems', 'NewsHolderPage_Newsitems.NewsID = News.ID')->filter(array('NewsHolderPage_Newsitems.NewsHolderPageID' => $filter));
     }
     return $list;
 }
 /**
  * Detect if you're trying to access the admin section from the non main site
  * @global string $_FILE_TO_URL_MAPPING 
  * @global string $_SERVER['REQUEST_URI'] this will be modified (bad practice warning)
  * @return redirect location
  */
 public function onBeforeInit()
 {
     if (!$this->owner->canAccess()) {
         global $_FILE_TO_URL_MAPPING;
         // redirect to domain.com/admin etc if there's the base path is set & you're in a subsite
         if (Subsite::currentSubsiteID() != 0 && isset($_FILE_TO_URL_MAPPING[BASE_PATH])) {
             $serverurl = filter_input(INPUT_SERVER, 'REQUEST_URI', FILTER_SANITIZE_STRING);
             $controller = Controller::curr();
             if (strpos($serverurl, '/admin') === 0 && !$controller->getRequest()->getVar('SubsiteID')) {
                 // redirect to the correct site admin location
                 $url = Controller::join_links($_FILE_TO_URL_MAPPING[BASE_PATH], $serverurl, "?SubsiteID=" . Subsite::currentSubsiteID());
                 return Controller::curr()->redirect($url);
             }
         }
     }
     return parent::onBeforeInit();
 }
 public function loadFixtures()
 {
     if (ClassInfo::exists('Subsite')) {
         $currentSubsite = Subsite::currentSubsiteID();
     }
     foreach (self::$preload_fixtures as $desc) {
         $fixtureFile = $desc['file'];
         if (file_exists(Director::baseFolder() . '/' . $fixtureFile)) {
             $siteID = null;
             if (isset($desc['subsite'])) {
                 $site = DataObject::get_one('Subsite', '"Title" = \'' . Convert::raw2sql($desc['subsite']) . '\'');
                 if ($site && $site->ID) {
                     $siteID = $site->ID;
                 }
                 if (!$siteID) {
                     // no site, so just skip this file load
                     continue;
                 }
             }
             // need to disable the filter when running dev/build so that it actually searches
             // within the relevant subsite, not the 'current' one.
             if (ClassInfo::exists('Subsite')) {
                 Subsite::$disable_subsite_filter = true;
             }
             $filter = $desc['filter'] . ($siteID ? ' AND "SubsiteID"=' . $siteID : '');
             $existing = DataObject::get_one($desc['type'], $filter);
             if (ClassInfo::exists('Subsite')) {
                 Subsite::$disable_subsite_filter = false;
             }
             if (!$existing) {
                 if ($siteID) {
                     Subsite::changeSubsite($siteID);
                 }
                 $fixture = new YamlFixture($fixtureFile);
                 $fixture->saveIntoDatabase();
                 DB::alteration_message('YAML bootstrap loaded from ' . $fixtureFile, 'created');
             }
         }
     }
     if (ClassInfo::exists('Subsite')) {
         Subsite::changeSubsite($currentSubsite);
     }
 }
 function testAlternateAccessCheck()
 {
     $admin = $this->objFromFixture("Member", "admin");
     $this->loginAs($admin);
     $ids = array();
     $subsite1 = $this->objFromFixture('Subsite', 'domaintest1');
     $subsite2 = $this->objFromFixture('Subsite', 'domaintest2');
     $subsite3 = $this->objFromFixture('Subsite', 'domaintest3');
     $ids[] = $subsite1->ID;
     $ids[] = $subsite2->ID;
     $ids[] = $subsite3->ID;
     $ids[] = 0;
     foreach ($ids as $id) {
         Subsite::changeSubsite($id);
         //switch to main site (subsite ID zero)
         $left = new LeftAndMain();
         $this->assertTrue($left->canView(), "Admin user can view subsites LeftAndMain with id = '{$id}'");
         $this->assertEquals($id, Subsite::currentSubsiteID(), "The current subsite has not been changed in the process of checking permissions for admin user.");
     }
 }
 public function getEditForm($id = null, $fields = null)
 {
     $form = parent::getEditForm($id, $fields);
     $fields = $form->Fields();
     $params = $this->request->requestVar('q');
     $gridField = $form->Fields()->fieldByName($this->modelClass);
     if ($this->modelClass == 'Product') {
         $gridField->setConfig(new GridFieldConfig_Catalogue($this->modelClass, $this->config()->product_page_length));
     }
     // Alterations for Hiarachy on product cataloge
     if ($this->modelClass == 'Category') {
         $gridField->setConfig(new GridFieldConfig_Catalogue($this->modelClass, $this->config()->category_page_length, "Sort"));
     }
     // Update list of items for subsite (if used)
     if (class_exists('Subsite')) {
         $list = $gridField->getList()->filter(array('SubsiteID' => Subsite::currentSubsiteID()));
         $gridField->setList($list);
     }
     $this->extend("updateEditForm", $form);
     return $form;
 }
 public function getEditForm($id = null, $fields = null)
 {
     $form = parent::getEditForm($id, $fields);
     $fields = $form->Fields();
     $config = null;
     // Bulk manager
     $manager = new GridFieldBulkManager();
     $manager->removeBulkAction("bulkEdit");
     $manager->removeBulkAction("unLink");
     // Manage orders
     if ($this->modelClass == 'Order') {
         $gridField = $fields->fieldByName('Order');
         $config = $gridField->getConfig();
         $manager->addBulkAction('cancelled', 'Mark Cancelled', 'OrdersFieldBulkActions');
         $manager->addBulkAction('paid', 'Mark Paid', 'OrdersFieldBulkActions');
         $manager->addBulkAction('processing', 'Mark Processing', 'OrdersFieldBulkActions');
         $manager->addBulkAction('dispatched', 'Mark Dispatched', 'OrdersFieldBulkActions');
         // Update list of items for subsite (if used)
         if (class_exists('Subsite')) {
             $list = $gridField->getList()->filter(array('SubsiteID' => Subsite::currentSubsiteID()));
             $gridField->setList($list);
         }
     }
     // Manage Estimates
     if ($this->modelClass == 'Estimate') {
         $gridField = $fields->fieldByName('Estimate');
         $config = $gridField->getConfig();
         // Update list of items for subsite (if used)
         if (class_exists('Subsite')) {
             $list = $gridField->getList()->filter(array('SubsiteID' => Subsite::currentSubsiteID()));
             $gridField->setList($list);
         }
     }
     // Set our default detailform and bulk manager
     if ($config) {
         $config->removeComponentsByType('GridFieldDetailForm')->addComponent($manager)->addComponent(new OrdersGridFieldDetailForm());
     }
     $this->extend("updateEditForm", $form);
     return $form;
 }
 function testAccessChecksDontChangeCurrentSubsite()
 {
     $admin = $this->objFromFixture("Member", "admin");
     $this->loginAs($admin);
     $ids = array();
     $subsite1 = $this->objFromFixture('Subsite', 'domaintest1');
     $subsite2 = $this->objFromFixture('Subsite', 'domaintest2');
     $subsite3 = $this->objFromFixture('Subsite', 'domaintest3');
     $ids[] = $subsite1->ID;
     $ids[] = $subsite2->ID;
     $ids[] = $subsite3->ID;
     $ids[] = 0;
     // Enable session-based subsite tracking.
     Subsite::$use_session_subsiteid = true;
     foreach ($ids as $id) {
         Subsite::changeSubsite($id);
         $this->assertEquals($id, Subsite::currentSubsiteID());
         $left = new LeftAndMain();
         $this->assertTrue($left->canView(), "Admin user can view subsites LeftAndMain with id = '{$id}'");
         $this->assertEquals($id, Subsite::currentSubsiteID(), "The current subsite has not been changed in the process of checking permissions for admin user.");
     }
 }
 public function getEditForm($id = null, $fields = null)
 {
     $form = parent::getEditForm($id, $fields);
     $fields = $form->Fields();
     if ($this->modelClass == 'CustomMenuHolder') {
         $gridField = $fields->fieldByName('CustomMenuHolder');
         // Tidy up category config and remove default add button
         $field_config = $gridField->getConfig();
         $field_config->removeComponentsByType('GridFieldExportButton')->removeComponentsByType('GridFieldPrintButton')->removeComponentsByType('GridFieldAddNewButton');
         // Add creation button if member has create permissions
         if (Permission::check('ADMIN') || Permission::check('MENU_CREATE')) {
             $add_button = new GridFieldAddNewButton('toolbar-header-left');
             $add_button->setButtonName(_t('CustomMenus.AddMenu', 'Add Menu'));
             $field_config->addComponent($add_button);
         }
         // Update list of items for subsite (if used)
         if (class_exists('Subsite')) {
             $list = $gridField->getList()->filter(array('SubsiteID' => Subsite::currentSubsiteID()));
             $gridField->setList($list);
         }
     }
     return $form;
 }
 function updatePageOptions(&$fields)
 {
     $fields->push(new HiddenField('SubsiteID', 'SubsiteID', Subsite::currentSubsiteID()));
 }
Exemple #19
0
 /**
  * Return an existing member with administrator privileges, or create one of necessary.
  *
  * Will create a default 'Administrators' group if no group is found
  * with an ADMIN permission. Will create a new 'Admin' member with administrative permissions
  * if no existing Member with these permissions is found.
  *
  * Important: Any newly created administrator accounts will NOT have valid
  * login credentials (Email/Password properties), which means they can't be used for login
  * purposes outside of any default credentials set through {@link Security::setDefaultAdmin()}.
  *
  * @return Member
  */
 public static function findAnAdministrator()
 {
     // coupling to subsites module
     $origSubsite = null;
     if (is_callable('Subsite::changeSubsite')) {
         $origSubsite = Subsite::currentSubsiteID();
         Subsite::changeSubsite(0);
     }
     $member = null;
     // find a group with ADMIN permission
     $adminGroup = Permission::get_groups_by_permission('ADMIN')->First();
     if (is_callable('Subsite::changeSubsite')) {
         Subsite::changeSubsite($origSubsite);
     }
     if ($adminGroup) {
         $member = $adminGroup->Members()->First();
     }
     if (!$adminGroup) {
         singleton('Group')->requireDefaultRecords();
         $adminGroup = Permission::get_groups_by_permission('ADMIN')->First();
     }
     if (!$member) {
         singleton('Member')->requireDefaultRecords();
         $member = Permission::get_members_by_permission('ADMIN')->First();
     }
     if (!$member) {
         $member = Member::default_admin();
     }
     if (!$member) {
         // Failover to a blank admin
         $member = Member::create();
         $member->FirstName = _t('Member.DefaultAdminFirstname', 'Default Admin');
         $member->write();
         // Add member to group instead of adding group to member
         // This bypasses the privilege escallation code in Member_GroupSet
         $adminGroup->DirectMembers()->add($member);
     }
     return $member;
 }
Exemple #20
0
 /**
  * Return an existing member with administrator privileges, or create one of necessary.
  * 
  * Will create a default 'Administrators' group if no group is found
  * with an ADMIN permission. Will create a new 'Admin' member with administrative permissions
  * if no existing Member with these permissions is found. 
  * 
  * Important: Any newly created administrator accounts will NOT have valid
  * login credentials (Email/Password properties), which means they can't be used for login
  * purposes outside of any default credentials set through {@link Security::setDefaultAdmin()}.
  * 
  * @return Member 
  */
 static function findAnAdministrator()
 {
     // coupling to subsites module
     $origSubsite = null;
     if (is_callable('Subsite::changeSubsite')) {
         $origSubsite = Subsite::currentSubsiteID();
         Subsite::changeSubsite(0);
     }
     $member = null;
     // find a group with ADMIN permission
     $adminGroup = DataObject::get('Group', "\"Permission\".\"Code\" = 'ADMIN'", "\"Group\".\"ID\"", "JOIN \"Permission\" ON \"Group\".\"ID\"=\"Permission\".\"GroupID\"", '1')->First();
     if (is_callable('Subsite::changeSubsite')) {
         Subsite::changeSubsite($origSubsite);
     }
     if ($adminGroup) {
         $member = $adminGroup->Members()->First();
     }
     if (!$adminGroup) {
         singleton('Group')->requireDefaultRecords();
     }
     if (!$member) {
         singleton('Member')->requireDefaultRecords();
         $member = Permission::get_members_by_permission('ADMIN')->First();
     }
     return $member;
 }
 /**
  * Return a piece of text to keep DataObject cache keys appropriately specific
  */
 public function cacheKeyComponent()
 {
     return 'subsite-' . Subsite::currentSubsiteID(true);
 }
 public function getEditForm($id = null, $fields = null)
 {
     $form = parent::getEditForm($id, $fields);
     $params = $this->request->requestVar('q');
     // Bulk manager
     $manager = new GridFieldBulkManager();
     $manager->removeBulkAction("unLink");
     $manager->addBulkAction('disable', 'Disable', 'CatalogueProductBulkAction');
     $manager->addBulkAction('enable', 'Enable', 'CatalogueProductBulkAction');
     if ($this->modelClass == 'Product') {
         $gridField = $form->Fields()->fieldByName('Product');
         $field_config = $gridField->getConfig();
         // Re add creation button and update grid field
         $add_button = new GridFieldAddNewButton('buttons-before-left');
         $add_button->setButtonName(_t("CatalogueAdmin.AddProduct", "Add Product"));
         $field_config->removeComponentsByType('GridFieldPrintButton')->removeComponentsByType('GridFieldAddNewButton')->removeComponentsByType('GridFieldDetailForm')->addComponents($add_button, $manager, new CatalogueEnableDisableDetailForm());
         // Set the page length
         $field_config->getComponentByType('GridFieldPaginator')->setItemsPerPage($this->config()->product_page_length);
         // Update list of items for subsite (if used)
         if (class_exists('Subsite')) {
             $list = $gridField->getList()->filter(array('SubsiteID' => Subsite::currentSubsiteID()));
             $gridField->setList($list);
         }
     }
     // Alterations for Hiarachy on product cataloge
     if ($this->modelClass == 'Category') {
         $gridField = $form->Fields()->fieldByName('Category');
         // Set custom record editor
         $record_editor = new CatalogueEnableDisableDetailForm();
         $record_editor->setItemRequestClass('CatalogueCategory_ItemRequest');
         // Create add button and update grid field
         $add_button = new GridFieldAddNewButton('toolbar-header-left');
         $add_button->setButtonName(_t("CatalogueAdmin.AddCategory", "Add Category"));
         // Tidy up category config
         $field_config = $gridField->getConfig();
         $field_config->removeComponentsByType('GridFieldExportButton')->removeComponentsByType('GridFieldPrintButton')->removeComponentsByType('GridFieldDetailForm')->removeComponentsByType('GridFieldAddNewButton')->addComponents($record_editor, $add_button, $manager, GridFieldOrderableRows::create('Sort'));
         // Set the page length
         $field_config->getComponentByType('GridFieldPaginator')->setItemsPerPage($this->config()->category_page_length);
         // Setup hierarchy view
         $parentID = $this->request->requestVar('ParentID');
         if ($parentID) {
             $field_config->addComponent(GridFieldLevelup::create($parentID)->setLinkSpec('?ParentID=%d')->setAttributes(array('data-pjax' => 'ListViewForm,Breadcrumbs')));
         }
         // Find data colums, so we can add link to view children
         $columns = $gridField->getConfig()->getComponentByType('GridFieldDataColumns');
         // Don't allow navigating into children nodes on filtered lists
         $fields = array('Title' => 'Title', 'URLSegment' => 'URLSegement');
         if (!$params) {
             $fields = array_merge(array('listChildrenLink' => ''), $fields);
         }
         $columns->setDisplayFields($fields);
         $columns->setFieldCasting(array('Title' => 'HTMLText', 'URLSegment' => 'Text'));
         $controller = $this;
         $columns->setFieldFormatting(array('listChildrenLink' => function ($value, &$item) use($controller) {
             return sprintf('<a class="list-children-link" data-pjax-target="ListViewForm" href="%s?ParentID=%d">&#9658;</a>', $controller->Link(), $item->ID);
         }));
         // Update list of items for subsite (if used)
         if (class_exists('Subsite')) {
             $list = $gridField->getList()->filter(array('SubsiteID' => Subsite::currentSubsiteID()));
             $gridField->setList($list);
         }
     }
     $this->extend("updateEditForm", $form);
     return $form;
 }
 /**
  * Get an email template by code
  *
  * @param string $code
  * @return EmailTemplate
  */
 public static function getByCode($code)
 {
     $template = EmailTemplate::get()->filter('Code', $code)->first();
     // If subsite, fallback to main site email if not defined
     if (!$template && class_exists('Subsite') && Subsite::currentSubsiteID()) {
         Subsite::$disable_subsite_filter = true;
         $template = EmailTemplate::get()->filter('Code', $code)->first();
         Subsite::$disable_subsite_filter = false;
     }
     // In dev mode, create a placeholder email
     if (!$template) {
         $template = new EmailTemplate();
         $template->Title = $code;
         $template->Code = $code;
         $template->Content = '';
         $template->write();
     }
     return $template;
 }
 function onAfterWrite()
 {
     // New record test approximated by checking whether the ID has changed.
     // Note also that the after write test is only used when we're on a subsite
     if ($this->owner->isChanged('ID') && ($currentSubsiteID = Subsite::currentSubsiteID())) {
         $subsites = $this->owner->Subsites();
         $subsites->add($currentSubsiteID);
     }
 }
 function updateCMSFields(FieldList $fields)
 {
     $fields->push(new HiddenField('SubsiteID', 'SubsiteID', Subsite::currentSubsiteID()));
 }
 function augmentNewSiteTreeItem(&$item)
 {
     $item->SubsiteID = isset($_POST['SubsiteID']) ? $_POST['SubsiteID'] : Subsite::currentSubsiteID();
 }
 /**
  * Return an existing member with administrator privileges, or create one of necessary.
  *
  * Will create a default 'Administrators' group if no group is found
  * with an ADMIN permission. Will create a new 'Admin' member with administrative permissions
  * if no existing Member with these permissions is found.
  *
  * Important: Any newly created administrator accounts will NOT have valid
  * login credentials (Email/Password properties), which means they can't be used for login
  * purposes outside of any default credentials set through {@link Security::setDefaultAdmin()}.
  *
  * @return Member
  */
 public static function findAnAdministrator()
 {
     // coupling to subsites module
     $origSubsite = null;
     if (is_callable('Subsite::changeSubsite')) {
         $origSubsite = Subsite::currentSubsiteID();
         Subsite::changeSubsite(0);
     }
     $member = null;
     // find a group with ADMIN permission
     $adminGroup = DataObject::get('Group')->where(array('"Permission"."Code"' => 'ADMIN'))->sort('"Group"."ID"')->innerJoin("Permission", '"Group"."ID" = "Permission"."GroupID"')->First();
     if (is_callable('Subsite::changeSubsite')) {
         Subsite::changeSubsite($origSubsite);
     }
     if ($adminGroup) {
         $member = $adminGroup->Members()->First();
     }
     if (!$adminGroup) {
         singleton('Group')->requireDefaultRecords();
     }
     if (!$member) {
         singleton('Member')->requireDefaultRecords();
         $member = Permission::get_members_by_permission('ADMIN')->First();
     }
     return $member;
 }
 /**
  * @return stdClass
  */
 public function getJobData()
 {
     // okay, we NEED to store the subsite ID if there's one available
     if (!$this->SubsiteID && class_exists('Subsite')) {
         $this->SubsiteID = Subsite::currentSubsiteID();
     }
     $data = new stdClass();
     $data->totalSteps = $this->totalSteps;
     $data->currentStep = $this->currentStep;
     $data->isComplete = $this->isComplete;
     $data->jobData = $this->jobData;
     $data->messages = $this->messages;
     return $data;
 }
 function alterQuery($query, $index)
 {
     $subsite = Subsite::currentSubsiteID();
     $query->filter('_subsite', array($subsite, SearchQuery::$missing));
 }
 /**
  * Link to this record. Expect the "Page" method or relation to be set
  *
  * Page can either return a page object (method Link will be used) or
  * a string (slug will be appended)
  * 
  * @return string
  */
 public function Link()
 {
     if (!$this->owner->Slug && $this->owner->ID) {
         if ($this->canWriteSlug()) {
             $this->owner->write();
         } else {
             return '';
         }
     }
     /* @var $page Page */
     $page = $this->owner->Page();
     if (is_string($page)) {
         return rtrim($page, '/') . '/' . $this->owner->Slug;
     }
     if (!$page) {
         if (Controller::has_curr()) {
             return Controller::curr()->Link('detail/' . $this->owner->Slug);
         }
         return '';
     }
     if (class_exists('Subsite') && Subsite::currentSubsiteID()) {
         $spage = $this->owner->SubsitePage();
         if ($spage) {
             $page = $spage;
         }
         // On frontend, we might display objects from other subsites
         if ($this->owner->SubsiteID != Subsite::currentSubsiteID()) {
             $link = $page->AbsoluteLink();
             return $link . 'detail/' . $this->owner->Slug;
         }
         // In the cms and with subsite, we might need to use absolute link
         if (Controller::has_curr() && Controller::curr() instanceof LeftAndMain) {
             return $page->AbsoluteLink() . 'detail/' . $this->owner->Slug;
         }
     }
     return $page->Link('detail/' . $this->owner->Slug);
 }