currentPageID(); } /** * Return fake-ID "root" if no ID is found (needed to upload files into the root-folder) */ public function currentPageID() { if(isset($_REQUEST['ID']) && is_numeric($_REQUEST['ID'])) { return $_REQUEST['ID']; } elseif (is_numeric($this->urlParams['ID'])) { return $this->urlParams['ID']; } elseif(is_numeric(Session::get("{$this->class}.currentPage"))) { return Session::get("{$this->class}.currentPage"); } else { return "root"; } } /** * Set up the controller, in particular, re-sync the File database with the assets folder./ */ function init() { parent::init(); // needed for MemberTableField (Requirements not determined before Ajax-Call) Requirements::javascript("sapphire/javascript/ComplexTableField.js"); Requirements::css("jsparty/greybox/greybox.css"); Requirements::css("sapphire/css/ComplexTableField.css"); Requirements::javascript("cms/javascript/AssetAdmin.js"); Requirements::javascript("cms/javascript/AssetAdmin_left.js"); Requirements::javascript("cms/javascript/AssetAdmin_right.js"); Requirements::javascript("cms/javascript/CMSMain_upload.js"); Requirements::javascript("cms/javascript/Upload.js"); Requirements::javascript("sapphire/javascript/Security_login.js"); Requirements::javascript("jsparty/SWFUpload/SWFUpload.js"); // Requirements::javascript('sapphire/javascript/TableListField.js'); // Include the right JS] // Hayden: This didn't appear to be used at all /*$fileList = new FileList("Form_EditForm_Files", null); $fileList->setClick_AjaxLoad('admin/assets/getfile/', 'Form_SubForm'); $fileList->FieldHolder();*/ Requirements::javascript("jsparty/greybox/AmiJS.js"); Requirements::javascript("jsparty/greybox/greybox.js"); Requirements::css("jsparty/greybox/greybox.css"); } /** * Display the upload form. Returns an iframe tag that will show admin/assets/uploadiframe. */ function getUploadIframe() { return << HTML; } function index() { File::sync(); return array(); } /** * Show the content of the upload iframe. The form is specified by a template. */ function uploadiframe() { Requirements::clear(); Requirements::javascript("jsparty/prototype.js"); Requirements::javascript("jsparty/loader.js"); Requirements::javascript("jsparty/behaviour.js"); Requirements::javascript("jsparty/prototype_improvements.js"); Requirements::javascript("jsparty/layout_helpers.js"); Requirements::javascript("cms/javascript/LeftAndMain.js"); Requirements::javascript("jsparty/multifile/multifile.js"); Requirements::css("jsparty/multifile/multifile.css"); Requirements::css("cms/css/typography.css"); Requirements::css("cms/css/layout.css"); Requirements::css("cms/css/cms_left.css"); Requirements::css("cms/css/cms_right.css"); if(isset($data['ID']) && $data['ID'] != 'root') $folder = DataObject::get_by_id("Folder", $data['ID']); else $folder = singleton('Folder'); $canUpload = $folder->userCanEdit(); return array( 'CanUpload' => $canUpload ); } /** * Return the form object shown in the uploadiframe. */ function UploadForm() { return new Form($this,'UploadForm', new FieldSet( new HiddenField("ID", "", $this->currentPageID()), // needed because the button-action is triggered outside the iframe new HiddenField("action_doUpload", "", "1"), new FileField("Files[0]" , "Choose file "), new LiteralField('UploadButton'," "), new LiteralField('MultifileCode',"
Files ready to upload:
") ), new FieldSet( )); } /** * This method processes the results of the UploadForm. * It will save the uploaded files to /assets/ and create new File objects as required. */ function doUpload($data, $form) { foreach($data['Files'] as $param => $files) { if(!is_array($files)) $files = array($files); foreach($files as $key => $value) { $processedFiles[$key][$param] = $value; } } if($data['ID'] && $data['ID'] != 'root') $folder = DataObject::get_by_id("Folder", $data['ID']); else $folder = singleton('Folder'); $newFiles = array(); $fileSizeWarnings = ''; $uploadErrors = ''; foreach($processedFiles as $file) { if($file['error'] == UPLOAD_ERR_NO_TMP_DIR) { $status = 'bad'; $statusMessage = 'There is no temporary folder for uploads. Please set upload_tmp_dir in php.ini.'; break; } if($file['tmp_name']) { // Workaround open_basedir problems if(ini_get("open_basedir")) { $newtmp = TEMP_FOLDER . '/' . $file['name']; move_uploaded_file($file['tmp_name'], $newtmp); $file['tmp_name'] = $newtmp; } // check that the file can be uploaded and isn't too large $extensionIndex = strripos( $file['name'], '.' ); $extension = strtolower( substr( $file['name'], $extensionIndex + 1 ) ); if( $extensionIndex !== FALSE ) list( $maxSize, $warnSize ) = File::getMaxFileSize( $extension ); else list( $maxSize, $warnSize ) = File::getMaxFileSize(); // check that the file is not too large or that the current user is an administrator if( $this->can('AdminCMS') || ( File::allowedFileType( $extension ) && (!isset($maxsize) || $file['size'] < $maxSize))) $newFiles[] = $folder->addUploadToFolder($file); elseif( !File::allowedFileType( $extension ) ) { $fileSizeWarnings .= "alert( 'Only administrators can upload $extension files.' );"; } else { if( $file['size'] > 1048576 ) $fileSize = "" . ceil( $file['size'] / 1048576 ) . "MB"; elseif( $file['size'] > 1024 ) $fileSize = "" . ceil( $file['size'] / 1024 ) . "KB"; else $fileSize = "" . ceil( $file['size'] ) . "B"; $fileSizeWarnings .= "alert( '\\'" . $file['name'] . "\\' is too large ($fileSize). Files of this type cannot be larger than $warnSize ' );"; } } } if($newFiles) { $numFiles = sizeof($newFiles); $statusMessage = "Uploaded $numFiles files"; $status = "good"; } else if($status != 'bad') { $statusMessage = "There was nothing to upload"; $status = ""; } echo << var form = parent.document.getElementById('Form_EditForm'); form.getPageFromServer(form.elements.ID.value); parent.statusMessage("{$statusMessage}","{$status}"); $fileSizeWarnings parent.document.getElementById('sitetree').getTreeNodeByIdx( "{$folder->ID}" ).getElementsByTagName('a')[0].className += ' contents'; HTML; } /** * Needs to be overridden to make sure an ID with value "0" is still valid (rootfolder) */ /** * Return the form that displays the details of a folder, including a file list and fields for editing the folder name. */ function getEditForm($id) { if($id && $id != "root") { $record = DataObject::get_by_id("File", $id); } else { $record = singleton("Folder"); } $fileList = new AssetTableField( $this, "Files", "File", array("Title" => "Title", "LinkedURL" => "Filename"), "" ); $fileList->setFolder($record); $fileList->setPopupCaption("View/Edit Asset"); if($record) { $nameField = ($id != "root") ? new TextField("Name", "Folder Name") : new HiddenField("Name"); if( $record->userCanEdit() ) { $deleteButton = new InlineFormAction('deletemarked',"Delete selected files", 'delete'); $deleteButton->includeDefaultJS(false); } else { $deleteButton = new HiddenField('deletemarked'); } $fields = new FieldSet( new HiddenField("Title"), new TabSet("Root", new Tab("Files", $nameField, $fileList, $deleteButton, new HiddenField("FileIDs"), new HiddenField("DestFolderID") ), new Tab("Details", new ReadonlyField("URL"), new ReadonlyField("ClassName", "Type"), new ReadonlyField("Created", "First Uploaded"), new ReadonlyField("LastEdited", "Last Updated") ), new Tab("Upload", new LiteralField("UploadIframe", $this->getUploadIframe() ) ) ), new HiddenField("ID") ); $actions = new FieldSet(); // Only show save button if not 'assets' folder if( $record->userCanEdit() && $id != "root") { $actions = new FieldSet( new FormAction('save',"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/', )); } // @todo: These workflow features aren't really appropriate for all projects if( Member::currentUser()->_isAdmin() && project() == 'mot' ) { $fields->addFieldsToTab( 'Root.Workflow', new DropdownField("Owner", "Owner", Member::map() ) ); $fields->addFieldsToTab( 'Root.Workflow', new TreeMultiselectField("CanUse", "Content usable by") ); $fields->addFieldsToTab( 'Root.Workflow', new TreeMultiselectField("CanEdit", "Content modifiable by") ); } if( !$record->userCanEdit() ) $form->makeReadonly(); return $form; } } /** * Perform the "move marked" action. * Called and returns in same way as 'save' function */ public function movemarked($urlParams, $form) { if($_REQUEST['DestFolderID'] && is_numeric($_REQUEST['DestFolderID'])) { $destFolderID = $_REQUEST['DestFolderID']; $fileList = "'" . ereg_replace(' *, *',"','",trim(addslashes($_REQUEST['FileIDs']))) . "'"; $numFiles = 0; if($fileList != "''") { $files = DataObject::get("File", "`File`.ID IN ($fileList)"); if($files) { foreach($files as $file) { if($file instanceof Image) { $file->deleteFormattedImages(); } $file->ParentID = $destFolderID; $file->write(); $numFiles++; } } else { user_error("No files in $fileList could be found!", E_USER_ERROR); } } $message = 'Moved '.$numFiles.' files'; FormResponse::status_message($message, "good"); FormResponse::add("$('Form_EditForm').getPageFromServer($('Form_EditForm_ID').value)"); return FormResponse::respond(); } else { user_error("Bad data: $_REQUEST[DestFolderID]", E_USER_ERROR); } } /** * 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) { foreach($files as $file) { if($file instanceof Image) { $file->deleteFormattedImages(); } if( !$folderID ) $folderID = $file->ParentID; // $deleteList .= "\$('Form_EditForm_Files').removeById($file->ID);\n"; $file->delete(); $numFiles++; } if($brokenPages = Notifications::getItems("BrokenLink")) { $brokenPageList = " These pages now have broken links:"; foreach($brokenPages as $brokenPage) { $brokenPageList .= "