2008-01-22 02:27:41 +01:00
|
|
|
<?php
|
2016-09-22 16:38:29 +02:00
|
|
|
|
2017-05-24 12:32:05 +02:00
|
|
|
namespace SilverStripe\Subsites\Extensions;
|
|
|
|
|
2018-06-01 03:42:23 +02:00
|
|
|
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;
|
2017-08-30 01:06:07 +02:00
|
|
|
use SilverStripe\Subsites\State\SubsiteState;
|
2017-05-30 15:14:28 +02:00
|
|
|
|
2008-01-22 02:27:41 +01:00
|
|
|
/**
|
|
|
|
* Extension for the File object to add subsites support
|
2009-05-04 07:03:44 +02:00
|
|
|
*
|
2008-11-24 04:22:01 +01:00
|
|
|
* @package subsites
|
2008-01-22 02:27:41 +01:00
|
|
|
*/
|
2017-05-24 15:26:28 +02:00
|
|
|
class FileSubsites extends DataExtension
|
2017-05-30 15:14:28 +02:00
|
|
|
{
|
2018-01-18 05:16:13 +01:00
|
|
|
/**
|
|
|
|
* 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;
|
2017-05-30 15:14:28 +02:00
|
|
|
|
|
|
|
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) {
|
2017-06-01 14:49:55 +02:00
|
|
|
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;
|
|
|
|
}
|
2018-08-16 16:19:25 +02:00
|
|
|
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)
|
2018-01-18 04:03:58 +01:00
|
|
|
// @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;
|
|
|
|
}
|
|
|
|
|
2017-08-30 01:06:07 +02:00
|
|
|
$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) {
|
2017-06-01 14:49:55 +02:00
|
|
|
$query->addOrderBy('"SubsiteID"');
|
2017-05-24 15:26:28 +02:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2017-05-30 15:14:28 +02:00
|
|
|
public function onBeforeWrite()
|
2017-05-24 15:26:28 +02:00
|
|
|
{
|
2017-05-30 15:14:28 +02:00
|
|
|
if (!$this->owner->ID && !$this->owner->SubsiteID) {
|
2018-01-18 05:16:13 +01:00
|
|
|
if ($this->owner->config()->get('default_root_folders_global')) {
|
2017-05-30 15:14:28 +02:00
|
|
|
$this->owner->SubsiteID = 0;
|
|
|
|
} else {
|
2017-08-30 01:06:07 +02:00
|
|
|
$this->owner->SubsiteID = SubsiteState::singleton()->getSubsiteId();
|
2017-05-30 15:14:28 +02:00
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
public function onAfterUpload()
|
2017-05-24 15:26:28 +02:00
|
|
|
{
|
|
|
|
// If we have a parent, use it's subsite as our subsite
|
2017-05-30 15:14:28 +02:00
|
|
|
if ($this->owner->Parent()) {
|
|
|
|
$this->owner->SubsiteID = $this->owner->Parent()->SubsiteID;
|
|
|
|
} else {
|
2017-08-30 01:06:07 +02:00
|
|
|
$this->owner->SubsiteID = SubsiteState::singleton()->getSubsiteId();
|
2017-05-30 15:14:28 +02:00
|
|
|
}
|
|
|
|
$this->owner->write();
|
|
|
|
}
|
|
|
|
|
|
|
|
public function canEdit($member = null)
|
2017-05-24 15:26:28 +02:00
|
|
|
{
|
2018-06-01 03:42:23 +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
|
2017-08-30 01:06:07 +02:00
|
|
|
$subsiteID = SubsiteState::singleton()->getSubsiteId();
|
2017-05-30 15:14:28 +02:00
|
|
|
if ($subsiteID && $subsiteID == $this->owner->SubsiteID) {
|
|
|
|
return true;
|
|
|
|
}
|
2017-05-29 13:42:42 +02:00
|
|
|
|
2018-06-01 03:42:23 +02:00
|
|
|
return SubsiteState::singleton()->withState(function (SubsiteState $newState) use ($member) {
|
2017-08-30 01:06:07 +02:00
|
|
|
$newState->setSubsiteId($this->owner->SubsiteID);
|
2017-05-29 13:42:42 +02:00
|
|
|
|
2018-06-01 03:42:23 +02:00
|
|
|
return $this->owner->getPermissionChecker()->canEdit($this->owner->ID, $member);
|
2017-08-30 01:06:07 +02:00
|
|
|
});
|
2017-05-30 15:14:28 +02:00
|
|
|
}
|
2017-05-29 13:42:42 +02:00
|
|
|
|
2017-05-30 15:14:28 +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
|
|
|
{
|
2017-08-30 01:06:07 +02:00
|
|
|
return 'subsite-' . SubsiteState::singleton()->getSubsiteId();
|
2017-05-30 15:14:28 +02:00
|
|
|
}
|
2008-01-22 02:27:41 +01:00
|
|
|
}
|