public function init()
 {
     //setting the uploads directory to make sure images uploaded through the content
     //editor are saved the right place
     $curr = LeftAndMain::curr();
     if ($curr) {
         //Debug::dump(get_class($curr));
         //Debug::dump(ClassInfo::ancestry($curr));
         $currClass = null;
         foreach (ClassInfo::ancestry($curr) as $class) {
             foreach (self::$supported_classes as $supported_class) {
                 if ($class == $supported_class) {
                     $currClass = $class;
                 }
             }
         }
         //Debug::dump($currClass);
         //switch (get_class($curr)) {
         switch ($currClass) {
             //Page administration
             case 'CMSPagesController':
             case 'CMSPageEditController':
                 $page = $curr->currentPage();
                 if ($page && $page->hasExtension('AssetsFolderExtension')) {
                     Upload::config()->uploads_folder = $page->getAssetsFolderDirName();
                 }
                 //Debug::dump($page->Title);
                 break;
             case 'ModelAdmin':
                 //For ModelAdmin we're falling back to cookies that we believe to have
                 //been set when setting the cms fields, see AssetFolderExtension::updateCMSFields()
                 //...as it seems to be almost impossible to figure out the current object elsewise
                 //see below for tries
                 //pull requests to fix this welcome!!!
                 //Debug::dump($this->owner->getURLParams());
                 //Debug::dump($this->owner->request->param('ModelClass'));
                 //Debug::dump($this->owner->request->remaining());
                 //Debug::dump($this->owner->request->getVars());
                 //Debug::dump($this->owner->request->params());
                 //Debug::dump($curr->currentPageID());
                 Upload::config()->uploads_folder = Cookie::get('cms-uploaddirrules-uploads-folder');
                 break;
                 //Settings
             //Settings
             case 'CMSSettingsController':
                 if (Object::has_extension('SiteConfig', 'AssetsFolderExtension')) {
                     $sc = SiteConfig::current_site_config();
                     Upload::config()->uploads_folder = $sc->getAssetsFolderDirName();
                 }
             default:
         }
     }
 }
 /**
  * Test that UploadField:overwriteWarning cannot overwrite Upload:replaceFile
  */
 public function testConfigOverwriteWarningCannotRelaceFiles()
 {
     Upload::config()->replaceFile = false;
     UploadField::config()->defaultConfig = array_merge(UploadField::config()->defaultConfig, array('overwriteWarning' => true));
     $tmpFileName = 'testUploadBasic.txt';
     $response = $this->mockFileUpload('NoRelationField', $tmpFileName);
     $this->assertFalse($response->isError());
     $responseData = Convert::json2array($response->getBody());
     $uploadedFile = DataObject::get_by_id('File', (int) $responseData[0]['id']);
     $this->assertTrue(is_object($uploadedFile), 'The file object is created');
     $this->assertFileExists(AssetStoreTest_SpyStore::getLocalPath($uploadedFile));
     $tmpFileName = 'testUploadBasic.txt';
     $response = $this->mockFileUpload('NoRelationField', $tmpFileName);
     $this->assertFalse($response->isError());
     $responseData = Convert::json2array($response->getBody());
     $uploadedFile2 = DataObject::get_by_id('File', (int) $responseData[0]['id']);
     $this->assertTrue(is_object($uploadedFile2), 'The file object is created');
     $this->assertFileExists(AssetStoreTest_SpyStore::getLocalPath($uploadedFile2));
     $this->assertTrue($uploadedFile->Filename !== $uploadedFile2->Filename, 'Filename is not the same');
     $this->assertTrue($uploadedFile->ID !== $uploadedFile2->ID, 'File database record is not the same');
 }
 /**
  * @param FieldList $fields
  * @return FieldList
  */
 public static function updateAssetsFolderCMSField($obj, FieldList $fields)
 {
     //prepopulating object with asset folder - if allowed
     if ($obj->AssetsFolderID == 0) {
         $url = $obj->assetsFolderUrlToBeWritten();
         if ($url) {
             //this creates the directory, and attaches it to the page,
             //as well as saving the object one more time - with the attached folder
             $obj->findOrMakeAssetsFolder($url, false);
         }
     }
     $dirName = $obj->getAssetsFolderDirName();
     $dirExists = false;
     if ($dirName) {
         $dirExists = true;
         //Setting and showing the uploads folder
         //This doesn't work for iframe uploads, there we need
         //the AssetsFolderAdmin extension to LeftAndMain
         Upload::config()->uploads_folder = $dirName;
         //Cookie fallback for moments where it's impossible to figure
         //out the uploads folder through the leftandmain controller.
         //e.g. ModelAdmin - {@see AssetsFolderAdmin}
         if (Cookie::get('cms-uploaddirrules-uploads-folder') != $dirName) {
             Cookie::set('cms-uploaddirrules-uploads-folder', $dirName);
         }
     }
     //The Upload Directory field
     //TODO make it configurable if field should be shown
     //TODO make field placement configurable
     $field = AssetsFolderCmsFieldsHelper::assetsFolderField($obj, $dirExists);
     $fields->removeByName('AssetsFolder');
     //Adding fields - to tab or just pushing
     $isPage = false;
     $ancestry = $obj->getClassAncestry();
     foreach ($ancestry as $c) {
         if ($c == 'SiteTree') {
             $isPage = true;
         }
     }
     if ($dirExists) {
         $field = ToggleCompositeField::create('UploadDirRulesNotes', 'Upload Rules (' . $dirName . ')', [$field]);
         //configurable tab
         $tab = $obj->config()->uploaddirrules_fieldtab;
         if (isset($tab)) {
             $fields->addFieldToTab($tab, $field);
         } else {
             if ($isPage) {
                 //$fields->addFieldToTab('Root.Main', $htmlField, 'Content');
                 $fields->addFieldToTab('Root.Main', $field);
             } else {
                 //TODO this should be configurable
                 switch ($obj->ClassName) {
                     case 'Subsite':
                         $fields->addFieldToTab('Root.Configuration', $field);
                         break;
                     case 'SiteConfig':
                     case 'GenericContentBlock':
                         $fields->addFieldToTab('Root.Main', $field);
                         break;
                     default:
                         if ($fields->fieldByName('Root.Main')) {
                             $fields->addFieldToTab('Root.Main', $field);
                         } else {
                             $fields->push($field);
                         }
                 }
             }
         }
     } else {
         $noteTab = new Tab('Note', 'Note', $field);
         $fields->insertBefore($noteTab, 'Main');
     }
     return $fields;
 }
Beispiel #4
0
 /**
  * Constructor
  * 
  * @access public 
  */
 public function __construct()
 {
     self::$config = config_load('upload');
     $this->error = new Error();
 }
    /**
     * Upload Dir Rules message and fields to display in the CMS
     * 
     * @param bool $dirExists
     * @return LiteralField|null
     */
    protected function getAssetsFolderField()
    {
        $field = null;
        $msg = null;
        $dirName = $this->owner->getAssetsFolderDirName();
        $dirExists = false;
        if ($dirName) {
            $dirExists = true;
        }
        if ($dirExists) {
            //Message
            $defaultMsg = '<em>Files uploaded via the content area will be uploaded to</em>' . '<br /> <strong>' . Upload::config()->uploads_folder . '</strong>';
            if ($this->owner instanceof UploadDirRulesInterface) {
                $msg = $this->owner->getMessageUploadDirectory();
            }
            if (!$msg) {
                $msg = $defaultMsg;
            }
            //TODO these could also be global settings
            $manageAble = true;
            $editable = true;
            //As this is happening from the subsites administration, when editing a subsite
            //you'd probably be on another site, and hence can't access the site's files anyway
            if ($this->owner->ClassName == 'Subsite') {
                $manageAble = false;
                $editable = false;
            }
            if ($editable) {
                //Asset folder is editable
                $field1 = new TreeDropdownField("AssetsFolderID", "Change Directory:", "Folder");
                $field1->setRightTitle('Directory changes take place after saving.');
                //Dropdown field style adjustments
                //TODO move this to an external stylesheet as these styles don't kick in on AJAX loads
                Requirements::customCSS("\n\t\t\t\t\t#TreeDropdownField_Form_EditForm_AssetsFolderID {\n\t\t\t\t\t\tmin-width: 260px;\n\t\t\t\t\t}\n\t\t\t\t\t.UploadDirectoryFields .fieldgroup label {\n\t\t\t\t\t\tpadding: 0 0 4px;\n\t\t\t\t\t}\n\t\t\t\t");
                $dir = $this->owner->AssetsFolder();
                $filescount = File::get()->filter(array("ParentID" => $dir->ID))->count();
                $manageButton = null;
                if ($manageAble) {
                    $manageButton = "<a href='/admin/assets/show/" . $dir->ID . "' class='ss-ui-button ss-ui-button-small ui-button'>\n\t\t\t\t\t\tManage Files (" . $filescount . ")</a>";
                }
                $field2 = new LiteralField("UploadDirRulesNote", "<div style='margin-bottom:10px;margin-right:16px;'>{$msg}</div>" . $manageButton);
                $field = new FieldGroup(array($field2, $field1));
                $field->setTitle('Upload Directory');
                $field->addExtraClass('UploadDirectoryFields');
                $field->setName('UploadDirectoryFields');
            } else {
                //Asset folder is not editable
                $field = new LiteralField('UploadDirRulesNote', '
					<div class="field text" id="UploadDirRulesNote">
						<label class="left">Upload Directory</label>
						<div class="middleColumn">
							<p style="margin-bottom: 0; padding-top: 0px;">
								' . $msg . '
								<br />
								<em>If you need to edit or change this folder, please contact your administrator.</em>
							</p>
						</div>
					</div>
					');
            }
        } else {
            //Message
            $defaultMsg = 'Please <strong>choose a name and save</strong> for adding content.';
            if ($this->owner instanceof UploadDirRulesInterface) {
                $msg = $this->owner->getMessageSaveFirst();
            }
            if (!$msg) {
                $msg = $defaultMsg;
            }
            $field = new LiteralField('UploadDirRulesNote', '
				<p class="message notice" >' . $msg . '</p>
			');
        }
        return $field;
    }