silverstripe-subsites/src/Extensions/FileSubsites.php

141 lines
4.3 KiB
PHP
Raw Normal View History

<?php
2016-09-22 16:38:29 +02:00
2017-05-24 12:32:05 +02:00
namespace SilverStripe\Subsites\Extensions;
use SilverStripe\Assets\File;
2017-05-24 15:26:28 +02:00
use SilverStripe\ORM\DataExtension;
2016-09-22 16:38:29 +02:00
use SilverStripe\ORM\DataQuery;
2017-05-24 15:26:28 +02:00
use SilverStripe\ORM\Queries\SQLSelect;
2016-09-22 16:38:29 +02:00
use SilverStripe\Security\Permission;
2017-05-24 12:32:05 +02:00
use SilverStripe\Subsites\Model\Subsite;
use SilverStripe\Subsites\State\SubsiteState;
/**
* Extension for the File object to add subsites support
2009-05-04 07:03:44 +02:00
*
* @package subsites
*/
2017-05-24 15:26:28 +02:00
class FileSubsites extends DataExtension
{
/**
* If this is set to true, all folders created will be default be considered 'global', unless set otherwise
*
* @config
* @var bool
*/
private static $default_root_folders_global = false;
private static $has_one = [
'Subsite' => Subsite::class,
];
/**
* Amends the CMS tree title for folders in the Files & Images section.
* Prefixes a '* ' to the folders that are accessible from all subsites.
*/
public function alternateTreeTitle()
2017-05-24 15:26:28 +02:00
{
if ($this->owner->SubsiteID == 0) {
return ' * ' . $this->owner->Title;
2017-05-24 15:26:28 +02:00
}
2017-05-29 13:42:42 +02:00
return $this->owner->Title;
2017-05-24 15:26:28 +02:00
}
/**
* Update any requests to limit the results to the current site
2017-06-01 15:10:07 +02:00
* @param SQLSelect $query
* @param DataQuery|null $dataQuery
2017-05-24 15:26:28 +02:00
*/
public function augmentSQL(SQLSelect $query, DataQuery $dataQuery = null)
{
if (Subsite::$disable_subsite_filter) {
return;
}
if ($dataQuery && $dataQuery->getQueryParam('Subsite.filter') === false) {
return;
}
2017-05-24 15:26:28 +02:00
// If you're querying by ID, ignore the sub-site - this is a bit ugly... (but it was WAYYYYYYYYY worse)
// @TODO I don't think excluding if SiteTree_ImageTracking is a good idea however because of the SS 3.0 api and
// ManyManyList::removeAll() changing the from table after this function is called there isn't much of a choice
2017-05-24 15:26:28 +02:00
$from = $query->getFrom();
if (isset($from['SiteTree_ImageTracking']) || $query->filtersOnID()) {
return;
}
$subsiteID = SubsiteState::singleton()->getSubsiteId();
if ($subsiteID === null) {
return;
}
2017-05-24 15:26:28 +02:00
// The foreach is an ugly way of getting the first key :-)
foreach ($query->getFrom() as $tableName => $info) {
$where = "\"$tableName\".\"SubsiteID\" IN (0, $subsiteID)";
$query->addWhere($where);
break;
}
2022-04-13 03:49:48 +02:00
$sect = array_values($query->getSelect() ?? []);
$isCounting = strpos($sect[0] ?? '', 'COUNT') !== false;
2017-05-24 15:26:28 +02:00
// Ordering when deleting or counting doesn't apply
if (!$isCounting) {
$query->addOrderBy('"SubsiteID"');
2017-05-24 15:26:28 +02:00
}
}
public function onBeforeWrite()
2017-05-24 15:26:28 +02:00
{
if (!$this->owner->ID && !$this->owner->SubsiteID) {
if ($this->owner->config()->get('default_root_folders_global')) {
$this->owner->SubsiteID = 0;
} else {
$this->owner->SubsiteID = SubsiteState::singleton()->getSubsiteId();
}
}
}
public function onAfterUpload()
2017-05-24 15:26:28 +02:00
{
// If we have a parent, use it's subsite as our subsite
if ($this->owner->Parent()) {
$this->owner->SubsiteID = $this->owner->Parent()->SubsiteID;
} else {
$this->owner->SubsiteID = SubsiteState::singleton()->getSubsiteId();
}
$this->owner->write();
}
public function canEdit($member = null)
2017-05-24 15:26:28 +02:00
{
// Opt out of making opinions if no subsite ID is set yet
if (!$this->owner->SubsiteID) {
return null;
}
2017-05-24 15:26:28 +02:00
// Check the CMS_ACCESS_SecurityAdmin privileges on the subsite that owns this group
$currentSubsiteID = SubsiteState::singleton()->getSubsiteId();
if ($currentSubsiteID && $currentSubsiteID !== $this->owner->SubsiteID) {
return false;
}
2017-05-29 13:42:42 +02:00
return SubsiteState::singleton()->withState(function (SubsiteState $newState) use ($member) {
$newState->setSubsiteId($this->owner->SubsiteID);
2017-05-29 13:42:42 +02:00
return $this->owner->getPermissionChecker()->canEdit($this->owner->ID, $member);
});
}
2017-05-29 13:42:42 +02:00
/**
* Return a piece of text to keep DataObject cache keys appropriately specific
*
* @return string
*/
public function cacheKeyComponent()
2017-05-24 15:26:28 +02:00
{
return 'subsite-' . SubsiteState::singleton()->getSubsiteId();
}
}