mirror of
https://github.com/silverstripe/silverstripe-subsites
synced 2024-10-22 11:05:55 +02:00
c9d3a1f854
Fixes for SS 3.0 beta 3 Fixed compatibility issues with ss3.0 rc1 fixed potential issue caused by the from array format changing in 3.0 Fixed strict standards warnings Fixed strict notice "Only variables should be passed by reference" Fixed strict notice "Only variables should be passed by reference" Fixed strict notice caused by SubsiteAdmin not declaring all of the properties for getCMSFields() Made Subsite::accessible_sites() static Fixed issue caused when trying to add a domain before saving for the first time Fixed undefined property ParentID
111 lines
3.5 KiB
PHP
111 lines
3.5 KiB
PHP
<?php
|
|
/**
|
|
* Extension for the File object to add subsites support
|
|
*
|
|
* @package subsites
|
|
*/
|
|
class FileSubsites extends DataExtension {
|
|
|
|
// If this is set to true, all folders created will be default be
|
|
// considered 'global', unless set otherwise
|
|
static $default_root_folders_global = false;
|
|
|
|
public static $has_one=array(
|
|
'Subsite' => 'Subsite',
|
|
);
|
|
|
|
|
|
/**
|
|
* Amends the CMS tree title for folders in the Files & Images section.
|
|
* Prefixes a '* ' to the folders that are accessible from all subsites.
|
|
*/
|
|
function alternateTreeTitle() {
|
|
if($this->owner->SubsiteID == 0) return " * " . $this->owner->Title;
|
|
else return $this->owner->Title;
|
|
}
|
|
|
|
/**
|
|
* Add subsites-specific fields to the folder editor.
|
|
*/
|
|
function updateCMSFields(FieldList $fields) {
|
|
if($this->owner instanceof Folder) {
|
|
$sites = Subsite::accessible_sites('CMS_ACCESS_AssetAdmin');
|
|
$dropdownValues = ($sites) ? $sites->map() : array();
|
|
$dropdownValues[0] = 'All sites';
|
|
ksort($dropdownValues);
|
|
if($sites)$fields->push(new DropdownField("SubsiteID", "Subsite", $dropdownValues));
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Update any requests to limit the results to the current site
|
|
*/
|
|
function augmentSQL(SQLQuery &$query) {
|
|
// 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
|
|
if(!array_search('SiteTree_ImageTracking', $query->getFrom())===false && (!$query->where || !preg_match('/\.(\'|"|`|)ID(\'|"|`|)/', $query->where[0]))) {
|
|
/*if($context = DataObject::context_obj()) $subsiteID = (int) $context->SubsiteID;
|
|
else */$subsiteID = (int) Subsite::currentSubsiteID();
|
|
|
|
// 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;
|
|
}
|
|
|
|
$sect=array_values($query->getSelect());
|
|
$isCounting = strpos($sect[0], 'COUNT') !== false;
|
|
|
|
// Ordering when deleting or counting doesn't apply
|
|
if(!$query->getDelete() && !$isCounting) {
|
|
$query->addOrderBy("\"SubsiteID\"");
|
|
}
|
|
}
|
|
}
|
|
|
|
function onBeforeWrite() {
|
|
if (!$this->owner->ID && !$this->owner->SubsiteID) {
|
|
if (self::$default_root_folders_global) {
|
|
$this->owner->SubsiteID = 0;
|
|
} else {
|
|
$this->owner->SubsiteID = Subsite::currentSubsiteID();
|
|
}
|
|
}
|
|
}
|
|
|
|
function onAfterUpload() {
|
|
// 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 = Subsite::currentSubsiteID();
|
|
}
|
|
$this->owner->write();
|
|
}
|
|
|
|
function canEdit($member = null) {
|
|
// Check the CMS_ACCESS_SecurityAdmin privileges on the subsite that owns this group
|
|
$subsiteID = Session::get('SubsiteID');
|
|
if($subsiteID&&$subsiteID == $this->owner->SubsiteID) {
|
|
return true;
|
|
} else {
|
|
Session::set('SubsiteID', $this->owner->SubsiteID);
|
|
$access = Permission::check('CMS_ACCESS_AssetAdmin');
|
|
Session::set('SubsiteID', $subsiteID);
|
|
|
|
return $access;
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Return a piece of text to keep DataObject cache keys appropriately specific
|
|
*/
|
|
function cacheKeyComponent() {
|
|
return 'subsite-'.Subsite::currentSubsiteID();
|
|
}
|
|
|
|
}
|
|
|
|
|