From 495e15be9f44d1b2cbe25953156d3d5c0f930e1b Mon Sep 17 00:00:00 2001 From: Ingo Schommer Date: Tue, 15 Mar 2011 22:30:28 +1300 Subject: [PATCH] MINOR Fixed merge errors --- code/AssetAdmin.php | 320 +++++++++-------------------------------- code/CMSMain.php | 7 +- code/LeftAndMain.php | 7 +- code/SecurityAdmin.php | 117 +++------------ 4 files changed, 99 insertions(+), 352 deletions(-) diff --git a/code/AssetAdmin.php b/code/AssetAdmin.php index 22e20f67..2b8a0d43 100755 --- a/code/AssetAdmin.php +++ b/code/AssetAdmin.php @@ -24,8 +24,6 @@ class AssetAdmin extends LeftAndMain { static $allowed_actions = array( 'addfolder', - 'deletefolder', - 'deletemarked', 'DeleteItemsForm', 'doUpload', 'getsubtree', @@ -36,8 +34,7 @@ class AssetAdmin extends LeftAndMain { 'uploadiframe', 'UploadForm', 'deleteUnusedThumbnails' => 'ADMIN', - 'batchactions', - 'BatchActionsForm', + 'SyncForm', ); /** @@ -293,6 +290,71 @@ JS HTML; } + + /** + * Add a new group and return its details suitable for ajax. + * + * @todo Move logic into Folder class, and use LeftAndMain->doAdd() default implementation. + */ + public function doAdd($data, $form) { + $class = $this->stat('tree_class'); + + // check create permissions + if(!singleton($class)->canCreate()) return Security::permissionFailure($this); + + // check addchildren permissions + if( + singleton($class)->hasDatabaseField('Hierarchy') + && isset($data['ParentID']) + && is_numeric($data['ParentID']) + ) { + $parentRecord = DataObject::get_by_id($class, $data['ParentID']); + if( + $parentRecord->hasMethod('canAddChildren') + && !$parentRecord->canAddChildren() + ) return Security::permissionFailure($this); + } + + $parent = (isset($data['ParentID']) && is_numeric($data['ParentID'])) ? (int)$data['ParentID'] : 0; + $name = (isset($data['Name'])) ? basename($data['Name']) : _t('AssetAdmin.NEWFOLDER',"NewFolder"); + if(!isset($parentRecord) || !$parentRecord->ID) $parent = 0; + + // Get the folder to be created + if(isset($parentRecord->ID)) $filename = $parentRecord->FullPath . $name; + else $filename = ASSETS_PATH . '/' . $name; + + // Actually create + if(!file_exists(ASSETS_PATH)) { + mkdir(ASSETS_PATH); + } + + $record = new Folder(); + $record->ParentID = $parent; + + // Ensure uniqueness + $i = 2; + $baseFilename = substr($record->Filename, 0, -1) . '-'; + while(file_exists($record->FullPath)) { + $record->Filename = $baseFilename . $i . '/'; + $i++; + } + + $record->Name = $record->Title = basename($record->Filename); + $record->write(); + + mkdir($record->FullPath); + chmod($record->FullPath, Filesystem::$file_create_mask); + + // Used in TinyMCE inline folder creation + if(isset($data['returnID'])) { + return $record->ID; + } else if($this->isAjax()) { + $form = $this->getEditForm($record->ID); + return $form->formHtmlContent(); + } else { + return $this->redirect(Controller::join_links($this->Link('show'), $record->ID)); + } + } /** * Custom currentPage() method to handle opening the 'root' folder @@ -306,200 +368,22 @@ HTML; } } - /** - * Return the form that displays the details of a folder, including a file list and fields for editing the folder name. - */ - function getEditForm($id = null) { - if($id && $id != "root") { - $record = DataObject::get_by_id("File", $id); - } else { - $record = singleton("Folder"); - } - - if($record) { - $fields = $record->getCMSFields(); - $actions = new FieldSet(); - - // Only show save button if not 'assets' folder - if($record->canEdit() && $id != 'root') { - $actions = new FieldSet( - new FormAction('save',_t('AssetAdmin.SAVEFOLDERNAME','Save folder name')) - ); - } - - $form = new Form($this, "EditForm", $fields, $actions); - if($record->ID) { - $form->loadDataFrom($record); - } else { - $form->loadDataFrom(array( - "ID" => "root", - "URL" => Director::absoluteBaseURL() . 'assets/', - )); - } - - if(!$record->canEdit()) { - $form->makeReadonly(); - } - - $this->extend('updateEditForm', $form); - - return $form; - } - } - function getSiteTreeFor($className, $rootID = null, $childrenMethod = null, $numChildrenMethod = null, $filterFunction = null, $minNodeCount = 30) { if (!$childrenMethod) $childrenMethod = 'ChildFolders'; return parent::getSiteTreeFor($className, $rootID, $childrenMethod, $numChildrenMethod, $filterFunction, $minNodeCount); } - - /** - * Perform the "delete marked" action. - * Called and returns in same way as 'save' function - */ - public function deletemarked($urlParams, $form) { - $fileList = "'" . ereg_replace(' *, *',"','",trim(addslashes($_REQUEST['FileIDs']))) . "'"; - $numFiles = 0; - $folderID = 0; - $deleteList = ''; - $brokenPageList = ''; - - if($fileList != "''") { - $files = DataObject::get("File", "\"File\".\"ID\" IN ($fileList)"); - if($files) { - $brokenPages = array(); - foreach($files as $file) { - $brokenPages = array_merge($brokenPages, $file->BackLinkTracking()->toArray()); - if($file instanceof Image) { - $file->deleteFormattedImages(); - } - if(!$folderID) { - $folderID = $file->ParentID; - } - $file->delete(); - $numFiles++; - } - if($brokenPages) { - $brokenPageList = " ". _t('AssetAdmin.NOWBROKEN', 'These pages now have broken links:') . ''; - foreach($brokenPages as $brokenPage) { - $brokenPageList .= "
  • " . $brokenPage->Breadcrumbs(3, true) . '
  • '; - } - $brokenPageList .= ''; - } else { - $brokenPageList = ''; - } - - $deleteList = ''; - if($folderID) { - $remaining = DB::query("SELECT COUNT(*) FROM \"File\" WHERE \"ParentID\" = $folderID")->value(); - if(!$remaining) $deleteList .= "Element.removeClassName(\$('sitetree').getTreeNodeByIdx('$folderID').getElementsByTagName('a')[0],'contents');"; - } - } else { - user_error("No files in $fileList could be found!", E_USER_ERROR); - } - } - - $message = sprintf(_t('AssetAdmin.DELETEDX',"Deleted %s files.%s"),$numFiles,$brokenPageList) ; - - FormResponse::add($deleteList); - FormResponse::status_message($message, "good"); - FormResponse::add("$('Form_EditForm').getPageFromServer($('Form_EditForm_ID').value)"); - - return FormResponse::respond(); - } public function getCMSTreeTitle() { return Director::absoluteBaseURL() . "assets"; } - /** - * Action handler for the save button on the file subform. - * Saves the file - */ - public function savefile($data, $form) { - $record = DataObject::get_by_id("File", $data['ID']); - $form->saveInto($record); - $record->write(); - $title = Convert::raw2js($record->Title); - $name = Convert::raw2js($record->Name); - $saved = sprintf(_t('AssetAdmin.SAVEDFILE','Saved file %s'),"#$data[ID]"); - echo <<setMarkingFilter('ClassName', ClassInfo::subclassesFor('Folder')); - $obj->markPartialTree(30, null, "ChildFolders"); - - if($p = $this->currentPage()) $obj->markToExpose($p); - - // getChildrenAsUL is a flexible and complex way of traversing the tree - $siteTreeList = $obj->getChildrenAsUL( - '', - '"
  • ID\" class=\"$child->class" . $child->markingClasses() . ($extraArg->isCurrentPage($child) ? " current" : "") . "\">" . ' . - '"Link(),0,-1), "show", $child->ID) . "\" class=\"" . ($child->hasChildFolders() ? " contents" : "") . "\" >" . $child->TreeTitle() . "" ', - $this, - true, - "ChildFolders" - ); - - // Wrap the root if needs be - $rootLink = $this->Link() . 'show/root'; - $baseUrl = Director::absoluteBaseURL() . "assets"; - if(!isset($rootID)) { - $siteTree = ""; - } - - return $siteTree; + return $this->getSiteTreeFor($this->stat('tree_class'), null, 'ChildFolders'); } - /** - * Returns a subtree of items underneat the given folder. - */ - public function getsubtree() { - $obj = DataObject::get_by_id('Folder', $_REQUEST['ID']); - $obj->setMarkingFilter('ClassName', ClassInfo::subclassesFor('Folder')); - $obj->markPartialTree(); - - $results = $obj->getChildrenAsUL( - '', - '"
  • ID\" class=\"$child->class" . $child->markingClasses() . ($extraArg->isCurrentPage($child) ? " current" : "") . "\">" . ' . - '"Link(),0,-1), "show", $child->ID) . "\" >" . $child->TreeTitle() . "" ', - $this, - true - ); - - return substr(trim($results), 4, -5); - } - - //------------------------------------------------------------------------------------------// // Data saving handlers - - /** - * Add a new folder and return its details suitable for ajax. - */ - public function addfolder($request) { - // Protect against CSRF on destructive action - if(!SecurityToken::inst()->checkRequest($request)) return $this->httpError(400); - - $parent = ($_REQUEST['ParentID'] && is_numeric($_REQUEST['ParentID'])) ? (int)$_REQUEST['ParentID'] : 0; - $name = (isset($_REQUEST['Name'])) ? basename($_REQUEST['Name']) : _t('AssetAdmin.NEWFOLDER',"NewFolder"); - } - /** * @return Form */ @@ -521,76 +405,6 @@ JS; return $form; } - /** - * Delete a folder - */ - public function deletefolder($data, $form) { - $ids = split(' *, *', $_REQUEST['csvIDs']); - - if(!$ids) return false; - $script = ''; - - foreach($ids as $id) { - if(is_numeric($id)) { - $record = DataObject::get_by_id($this->stat('tree_class'), $id); - if($record) { - $script .= $this->deleteTreeNodeJS($record); - $record->delete(); - $record->destroy(); - } - } - } - - $size = sizeof($ids); - if($size > 1) { - $message = $size.' '._t('AssetAdmin.FOLDERSDELETED', 'folders deleted.'); - } else { - $message = $size.' '._t('AssetAdmin.FOLDERDELETED', 'folder deleted.'); - } - - $script .= "statusMessage('$message');"; - - return $script; - } - - public function removefile($request){ - // Protect against CSRF on destructive action - if(!SecurityToken::inst()->checkRequest($request)) return $this->httpError(400); - - if($fileID = $this->urlParams['ID']) { - $file = DataObject::get_by_id('File', $fileID); - // Delete the temp verions of this file in assets/_resampled - if($file instanceof Image) { - $file->deleteFormattedImages(); - } - $file->delete(); - $file->destroy(); - - if(Director::is_ajax()) { - echo <<dataFieldByName('Name')->Value = $form->dataFieldByName('Title')->Value(); - - return parent::save($urlParams, $form); - } - /** * ################################# * Garbage collection. diff --git a/code/CMSMain.php b/code/CMSMain.php index 428edb0a..18424ec1 100755 --- a/code/CMSMain.php +++ b/code/CMSMain.php @@ -45,6 +45,7 @@ class CMSMain extends LeftAndMain implements CurrentPageIdentifier, PermissionPr 'SideReportsForm', 'submit', 'versions', + 'VersionsForm', 'EditForm', 'AddForm', 'SearchTreeForm', @@ -875,8 +876,8 @@ JS; /** * @return Form */ - function doShowSideReport() { - $reportClass = $this->urlParams['ID']; + function doShowSideReport($data, $form) { + $reportClass = (isset($data['ReportClass'])) ? $data['ReportClass'] : $this->urlParams['ID']; $reports = $this->SideReports(); if(isset($reports[$reportClass])) { $report = $reports[$reportClass]; @@ -1091,7 +1092,7 @@ JS; SSViewer::setOption('rewriteHashlinks', false); if(Director::is_ajax()) { - $result = $templateData->renderWith($this->class . '_right'); + $result = $templateData->renderWith(array($this->class . '_right', 'LeftAndMain_right')); $parts = split(']*>', $result); $content = $parts[sizeof($parts)-2]; if($this->ShowSwitchView()) { diff --git a/code/LeftAndMain.php b/code/LeftAndMain.php index c8a55812..088a15b1 100644 --- a/code/LeftAndMain.php +++ b/code/LeftAndMain.php @@ -37,8 +37,6 @@ class LeftAndMain extends Controller { */ static $tree_class = null; - static $ForceReload; - /** * The url used for the link in the Help tab in the backend * Value can be overwritten if required in _config.php @@ -57,6 +55,11 @@ class LeftAndMain extends Controller { 'Member_ProfileForm', 'EditorToolbar', 'EditForm', + 'RootForm', + 'AddForm', + 'batchactions', + 'BatchActionsForm', + 'Member_ProfileForm', ); /** diff --git a/code/SecurityAdmin.php b/code/SecurityAdmin.php index e6d5396c..34a4b378 100644 --- a/code/SecurityAdmin.php +++ b/code/SecurityAdmin.php @@ -17,10 +17,8 @@ class SecurityAdmin extends LeftAndMain implements PermissionProvider { static $subitem_class = 'Member'; static $allowed_actions = array( - 'addgroup', 'autocomplete', 'removememberfromgroup', - 'savemember', 'AddRecordForm', 'EditForm', 'MemberImportForm', @@ -37,39 +35,22 @@ class SecurityAdmin extends LeftAndMain implements PermissionProvider { public function init() { parent::init(); - - Requirements::javascript(CMS_DIR . '/javascript/hover.js'); - Requirements::javascript(THIRDPARTY_DIR . "/scriptaculous/controls.js"); - Requirements::javascript(THIRDPARTY_DIR . '/jquery-livequery/jquery.livequery.js'); - - // needed for MemberTableField (Requirements not determined before Ajax-Call) - Requirements::add_i18n_javascript(SAPPHIRE_DIR . '/javascript/lang'); - Requirements::javascript(SAPPHIRE_DIR . "/javascript/TableListField.js"); - Requirements::javascript(SAPPHIRE_DIR . "/javascript/TableField.js"); - Requirements::javascript(SAPPHIRE_DIR . "/javascript/ComplexTableField.js"); - Requirements::javascript(CMS_DIR . "/javascript/MemberTableField.js"); - Requirements::css(THIRDPARTY_DIR . "/greybox/greybox.css"); - Requirements::css(SAPPHIRE_DIR . "/css/ComplexTableField.css"); - - Requirements::javascript(CMS_DIR . '/javascript/SecurityAdmin_left.js'); - Requirements::javascript(CMS_DIR . '/javascript/SecurityAdmin_right.js'); - Requirements::javascript(THIRDPARTY_DIR . "/greybox/AmiJS.js"); - Requirements::javascript(THIRDPARTY_DIR . "/greybox/greybox.js"); + Requirements::javascript(CMS_DIR . '/javascript/SecurityAdmin.js'); + + CMSBatchActionHandler::register('delete', 'SecurityAdmin_DeleteBatchAction', 'Group'); } function getEditForm($id = null) { if(!$id) $id = $this->currentPageID(); - - if($id && $id != 'root') { - $record = DataObject::get_by_id($this->stat('tree_class'), $id); - if(!$record) return false; - } - + $record = ($id && $id != "root") ? $this->getRecord($id) : null; + if($id && is_numeric($id)) { - $fields = $record->getCMSFields(); - - if($fields->hasTabSet()) { + $form = parent::getEditForm($id); + if(!$form) return false; + + $fields = $form->Fields(); + if($fields->hasTabSet() && $record->canEdit()) { $fields->findOrMakeTab('Root.Import',_t('Group.IMPORTTABTITLE', 'Import')); $fields->addFieldToTab('Root.Import', new LiteralField( @@ -95,30 +76,23 @@ class SecurityAdmin extends LeftAndMain implements PermissionProvider { ) ); } - } - $actions = new FieldSet( - new FormAction('addmember',_t('SecurityAdmin.ADDMEMBER','Add Member')), - new FormAction('save',_t('SecurityAdmin.SAVE','Save')) - ); + $form->Actions()->insertBefore( + $actionAddMember = new FormAction('addmember',_t('SecurityAdmin.ADDMEMBER','Add Member')), + 'action_save' + ); + $actionAddMember->setForm($form); - $form = new Form($this, "EditForm", $fields, $actions); - $form->loadDataFrom($record); - - if(!$record->canEdit()) { - $readonlyFields = $form->Fields()->makeReadonly(); - $form->setFields($readonlyFields); - } - - // Filter permissions - $permissionField = $form->Fields()->dataFieldByName('Permissions'); - if($permissionField) $permissionField->setHiddenPermissions(self::$hidden_permissions); + // Filter permissions + $permissionField = $form->Fields()->dataFieldByName('Permissions'); + if($permissionField) $permissionField->setHiddenPermissions(self::$hidden_permissions); + } $this->extend('updateEditForm', $form); } else { $form = $this->RootForm(); } - + return $form; } @@ -201,8 +175,6 @@ class SecurityAdmin extends LeftAndMain implements PermissionProvider { Requirements::css(CMS_DIR . '/css/typography.css'); Requirements::css(CMS_DIR . '/css/cms_right.css'); Requirements::javascript(THIRDPARTY_DIR . '/jquery/jquery.js'); - Requirements::javascript(THIRDPARTY_DIR . '/jquery-livequery/jquery.livequery.js'); - Requirements::javascript(SAPPHIRE_DIR . '/javascript/jquery_improvements.js'); Requirements::css(CMS_DIR . '/css/MemberImportForm.css'); Requirements::javascript(SAPPHIRE_DIR . '/thirdparty/jquery-entwine/dist/jquery.entwine-dist.js'); Requirements::javascript(CMS_DIR . '/javascript/MemberImportForm.js'); @@ -234,8 +206,6 @@ class SecurityAdmin extends LeftAndMain implements PermissionProvider { Requirements::css(CMS_DIR . '/css/typography.css'); Requirements::css(CMS_DIR . '/css/cms_right.css'); Requirements::javascript(THIRDPARTY_DIR . '/jquery/jquery.js'); - Requirements::javascript(THIRDPARTY_DIR . '/jquery-livequery/jquery.livequery.js'); - Requirements::javascript(SAPPHIRE_DIR . '/javascript/jquery_improvements.js'); Requirements::css(CMS_DIR . '/css/MemberImportForm.css'); Requirements::javascript(SAPPHIRE_DIR . '/thirdparty/jquery-entwine/dist/jquery.entwine-dist.js'); Requirements::javascript(CMS_DIR . '/javascript/MemberImportForm.js'); @@ -303,50 +273,9 @@ class SecurityAdmin extends LeftAndMain implements PermissionProvider { return $result; } } - - /** - * Return the entire site tree as a nested set of ULs. - * @return string Unordered list HTML - */ - public function SiteTreeAsUL() { - $obj = singleton($this->stat('tree_class')); - $obj->markPartialTree(); - - if($p = $this->currentPage()) $obj->markToExpose($p); - - // getChildrenAsUL is a flexible and complex way of traversing the tree - $siteTreeList = $obj->getChildrenAsUL( - '', - '"
  • ID\" class=\"$child->class " . $child->markingClasses() . ($extraArg->isCurrentPage($child) ? " current" : "") . "\">" . ' . - '"Link(),0,-1), "show", $child->ID) . "\" >" . $child->TreeTitle() . "" ', - $this, - true - ); - - // Wrap the root if needs be - $rootLink = $this->Link() . 'show/root'; - $rootTitle = _t('SecurityAdmin.SGROUPS', 'Security Groups'); - if(!isset($rootID)) { - $siteTree = ""; - } - - return $siteTree; - } - - public function addgroup($request) { - // Protect against CSRF on destructive action - if(!SecurityToken::inst()->checkRequest($request)) return $this->httpError(400); - - if(!singleton($this->stat('tree_class'))->canCreate()) return Security::permissionFailure($this); - - $newGroup = Object::create($this->stat('tree_class')); - $newGroup->Title = _t('SecurityAdmin.NEWGROUP',"New Group"); - $newGroup->Code = "new-group"; - $newGroup->ParentID = (is_numeric($_REQUEST['ParentID'])) ? (int)$_REQUEST['ParentID'] : 0; - $newGroup->write(); - - return $this->returnItemToUser($newGroup); + + function getCMSTreeTitle() { + return _t('SecurityAdmin.SGROUPS', 'Security Groups'); } public function EditedMember() {