/**
  * Get ID of target parent folder
  *
  * @return int
  */
 protected function getFolderID()
 {
     $folderName = $this->getFolderName();
     if (!$folderName) {
         return 0;
     }
     $folder = Folder::find_or_make($folderName);
     return $folder ? $folder->ID : 0;
 }
 /**
  * Build the file selection form.
  *
  * @skipUpgrade
  * @return Form
  */
 public function Form()
 {
     // Find out the requested folder ID.
     $folderID = $this->parent->getRequest()->requestVar('ParentID');
     if ($folderID === null && $this->parent->getDisplayFolderName()) {
         $folder = Folder::find_or_make($this->parent->getDisplayFolderName());
         $folderID = $folder ? $folder->ID : 0;
     }
     // Construct the form
     $action = new FormAction('doAttach', _t('UploadField.AttachFile', 'Attach file(s)'));
     $action->addExtraClass('ss-ui-action-constructive icon-accept');
     $form = new Form($this, 'Form', new FieldList($this->getListField($folderID)), new FieldList($action));
     // Add a class so we can reach the form from the frontend.
     $form->addExtraClass('uploadfield-form');
     return $form;
 }
 /**
  * Check if file exists, both checking filtered filename and exact filename
  *
  * @param string $originalFile Filename
  * @return bool
  */
 protected function checkFileExists($originalFile)
 {
     // Check both original and safely filtered filename
     $nameFilter = FileNameFilter::create();
     $filteredFile = $nameFilter->filter($originalFile);
     // Resolve expected folder name
     $folderName = $this->getFolderName();
     $folder = Folder::find_or_make($folderName);
     $parentPath = $folder ? $folder->getFilename() : '';
     // check if either file exists
     return File::find($parentPath . $originalFile) || File::find($parentPath . $filteredFile);
 }
 public function testIllegalFilenames()
 {
     // Test that generating a filename with invalid characters generates a correctly named folder.
     $folder = Folder::find_or_make('/FolderTest/EN_US Lang');
     $this->assertEquals('FolderTest/EN-US-Lang/', $folder->getFilename());
     // Test repeatitions of folder
     $folder2 = Folder::find_or_make('/FolderTest/EN_US Lang');
     $this->assertEquals($folder->ID, $folder2->ID);
     $folder3 = Folder::find_or_make('/FolderTest/EN--US_L!ang');
     $this->assertEquals($folder->ID, $folder3->ID);
     $folder4 = Folder::find_or_make('/FolderTest/EN-US-Lang');
     $this->assertEquals($folder->ID, $folder4->ID);
 }
 public function testCreateWithFilenameWithSubfolder()
 {
     // Note: We can't use fixtures/setUp() for this, as we want to create the db record manually.
     // Creating the folder is necessary to avoid having "Filename" overwritten by setName()/setRelativePath(),
     // because the parent folders don't exist in the database
     $folder = Folder::find_or_make('/FileTest/');
     $testfilePath = BASE_PATH . '/assets/FileTest/CreateWithFilenameHasCorrectPath.txt';
     // Important: No leading slash
     $fh = fopen($testfilePath, "w");
     fwrite($fh, str_repeat('x', 1000000));
     fclose($fh);
     $file = new File();
     $file->setFromLocalFile($testfilePath);
     $file->ParentID = $folder->ID;
     $file->write();
     $this->assertEquals('CreateWithFilenameHasCorrectPath.txt', $file->Name, '"Name" property is automatically set from "Filename"');
     $this->assertEquals('FileTest/CreateWithFilenameHasCorrectPath.txt', $file->Filename, '"Filename" property remains unchanged');
     // TODO This should be auto-detected, see File->updateFilesystem()
     // $this->assertInstanceOf('Folder', $file->Parent(), 'Parent folder is created in database');
     // $this->assertFileExists($file->Parent()->getURL(), 'Parent folder is created on filesystem');
     // $this->assertEquals('FileTest', $file->Parent()->Name);
     // $this->assertInstanceOf('Folder', $file->Parent()->Parent(), 'Grandparent folder is created in database');
     // $this->assertFileExists($file->Parent()->Parent()->getURL(),
     // 'Grandparent folder is created on filesystem');
     // $this->assertEquals('assets', $file->Parent()->Parent()->Name);
 }