mirror of
https://github.com/silverstripe/silverstripe-framework
synced 2024-10-22 14:05:37 +02:00
1e0c4ae8d1
Conflicts: cache/Cache.php cli/CliController.php core/Convert.php core/Core.php core/ManifestBuilder.php core/Object.php core/SSViewer.php core/control/ContentController.php core/control/ContentNegotiator.php core/control/FormResponse.php core/control/RequestHandler.php core/control/SilverStripeNavigatorItem.php core/i18n.php core/i18nTextCollector.php core/model/DataObjectSet.php core/model/Hierarchy.php core/model/Image.php core/model/MySQLDatabase.php core/model/SiteConfig.php core/model/SiteTree.php core/model/Translatable.php core/model/VirtualPage.php dev/Debug.php dev/SapphireTest.php dev/TestRunner.php dev/YamlFixture.php dev/install/MySQLDatabaseConfigurationHelper.php docs/en/installation/from-source.md docs/en/topics/themes.md docs/en/tutorials/4-site-search.md email/Mailer.php filesystem/File.php filesystem/Folder.php forms/ComplexTableField.php forms/CurrencyField.php forms/DateField.php forms/FieldSet.php forms/FileField.php forms/FileIFrameField.php forms/HtmlEditorConfig.php forms/HtmlEditorField.php forms/SelectionGroup.php forms/SimpleImageField.php forms/TabSet.php forms/TableField.php forms/TableListField.php forms/TreeDropdownField.php forms/TreeMultiselectField.php integration/Geoip.php javascript/SelectionGroup.js javascript/TreeSelectorField.js javascript/UpdateURL.js javascript/core/jquery.ondemand.js javascript/tiny_mce_improvements.js javascript/tree/tree.js lang/en_US.php search/ContentControllerSearchExtension.php security/Group.php security/Member.php security/PermissionCheckboxSetField.php security/PermissionRole.php security/Security.php static-main.php templates/RelationComplexTableField.ss templates/TableListField.ss tests/ConvertTest.php tests/DataObjectSetTest.php tests/DataObjectTest.php tests/DataObjectTest.yml tests/RequestHandlingTest.php tests/SSViewerTest.php tests/SiteTreePermissionsTest.php tests/SiteTreeTest.php tests/TransactionTest.php tests/api/RestfulServiceTest.php tests/control/DirectorTest.php tests/control/ModelAsControllerTest.php tests/fieldtypes/WidgetAreaEditorTest.php tests/forms/CurrencyFieldTest.php tests/forms/FormTest.php tests/model/DatabaseTest.php tests/model/ImageTest.php tests/search/ContentControllerSearchExtensionTest.php tests/security/MemberAuthenticatorTest.php thirdparty/.gitignore thirdparty/behaviour/behaviour.js thirdparty/firebug-lite/firebug.js thirdparty/firebug-lite/firebugx.js thirdparty/jquery-form/jquery.form.js thirdparty/jquery-livequery/jquery.livequery.js thirdparty/jquery-livequery/test/jquery.js thirdparty/jquery-livequery/test/test.html thirdparty/jquery-livequery/test/test2.html thirdparty/jquery-metadata/META.json thirdparty/jquery-metadata/README thirdparty/jquery-metadata/jquery.metadata.js thirdparty/jquery-metadata/test/index.html thirdparty/jquery-metadata/test/jquery.js thirdparty/jquery-metadata/test/test.js thirdparty/jquery-metadata/test/testrunner.js thirdparty/jquery-metadata/test/testsuite.css thirdparty/jquery-ui-themes/smoothness/images/ui-bg_flat_0_aaaaaa_40x100.png thirdparty/jquery-ui-themes/smoothness/images/ui-bg_flat_75_ffffff_40x100.png thirdparty/jquery-ui-themes/smoothness/images/ui-bg_glass_55_fbf9ee_1x400.png thirdparty/jquery-ui-themes/smoothness/images/ui-bg_glass_65_ffffff_1x400.png thirdparty/jquery-ui-themes/smoothness/images/ui-bg_glass_75_dadada_1x400.png thirdparty/jquery-ui-themes/smoothness/images/ui-bg_glass_75_e6e6e6_1x400.png thirdparty/jquery-ui-themes/smoothness/images/ui-bg_glass_95_fef1ec_1x400.png thirdparty/jquery-ui-themes/smoothness/images/ui-bg_highlight-soft_75_cccccc_1x100.png thirdparty/jquery-ui-themes/smoothness/images/ui-icons_222222_256x240.png thirdparty/jquery-ui-themes/smoothness/images/ui-icons_2e83ff_256x240.png thirdparty/jquery-ui-themes/smoothness/images/ui-icons_454545_256x240.png thirdparty/jquery-ui-themes/smoothness/images/ui-icons_888888_256x240.png thirdparty/jquery-ui-themes/smoothness/images/ui-icons_cd0a0a_256x240.png thirdparty/jquery-ui/i18n/jquery-ui-i18n.js thirdparty/jquery-ui/i18n/ui.datepicker-ar.js thirdparty/jquery-ui/i18n/ui.datepicker-bg.js thirdparty/jquery-ui/i18n/ui.datepicker-ca.js thirdparty/jquery-ui/i18n/ui.datepicker-cs.js thirdparty/jquery-ui/i18n/ui.datepicker-da.js thirdparty/jquery-ui/i18n/ui.datepicker-de.js thirdparty/jquery-ui/i18n/ui.datepicker-el.js thirdparty/jquery-ui/i18n/ui.datepicker-eo.js thirdparty/jquery-ui/i18n/ui.datepicker-es.js thirdparty/jquery-ui/i18n/ui.datepicker-fa.js thirdparty/jquery-ui/i18n/ui.datepicker-fi.js thirdparty/jquery-ui/i18n/ui.datepicker-fr.js thirdparty/jquery-ui/i18n/ui.datepicker-he.js thirdparty/jquery-ui/i18n/ui.datepicker-hr.js thirdparty/jquery-ui/i18n/ui.datepicker-hu.js thirdparty/jquery-ui/i18n/ui.datepicker-hy.js thirdparty/jquery-ui/i18n/ui.datepicker-id.js thirdparty/jquery-ui/i18n/ui.datepicker-is.js thirdparty/jquery-ui/i18n/ui.datepicker-it.js thirdparty/jquery-ui/i18n/ui.datepicker-ja.js thirdparty/jquery-ui/i18n/ui.datepicker-ko.js thirdparty/jquery-ui/i18n/ui.datepicker-lt.js thirdparty/jquery-ui/i18n/ui.datepicker-lv.js thirdparty/jquery-ui/i18n/ui.datepicker-ms.js thirdparty/jquery-ui/i18n/ui.datepicker-nl.js thirdparty/jquery-ui/i18n/ui.datepicker-no.js thirdparty/jquery-ui/i18n/ui.datepicker-pl.js thirdparty/jquery-ui/i18n/ui.datepicker-pt-BR.js thirdparty/jquery-ui/i18n/ui.datepicker-ro.js thirdparty/jquery-ui/i18n/ui.datepicker-ru.js thirdparty/jquery-ui/i18n/ui.datepicker-sk.js thirdparty/jquery-ui/i18n/ui.datepicker-sl.js thirdparty/jquery-ui/i18n/ui.datepicker-sq.js thirdparty/jquery-ui/i18n/ui.datepicker-sr-SR.js thirdparty/jquery-ui/i18n/ui.datepicker-sr.js thirdparty/jquery-ui/i18n/ui.datepicker-sv.js thirdparty/jquery-ui/i18n/ui.datepicker-th.js thirdparty/jquery-ui/i18n/ui.datepicker-tr.js thirdparty/jquery-ui/i18n/ui.datepicker-uk.js thirdparty/jquery-ui/i18n/ui.datepicker-zh-CN.js thirdparty/jquery-ui/i18n/ui.datepicker-zh-TW.js thirdparty/jquery/jquery.js thirdparty/jsmin/.piston.yml thirdparty/jsmin/jsmin.php thirdparty/prototype/prototype.js thirdparty/scriptaculous/dragdrop.js thirdparty/simplepie/.piston.yml thirdparty/spyc/.piston.yml thirdparty/spyc/README thirdparty/spyc/php4/spyc.php4 thirdparty/spyc/php4/test.php4 thirdparty/spyc/spyc.php thirdparty/spyc/spyc.yaml thirdparty/tinymce-advcode/dialog.html thirdparty/tinymce-advcode/editor_plugin_src.js thirdparty/tinymce-advcode/js/dialog.js thirdparty/tinymce/langs/en.js thirdparty/tinymce/plugins/advhr/langs/en_dlg.js thirdparty/tinymce/plugins/advhr/rule.htm thirdparty/tinymce/plugins/advimage/image.htm thirdparty/tinymce/plugins/advimage/langs/en_dlg.js thirdparty/tinymce/plugins/advlink/langs/en_dlg.js thirdparty/tinymce/plugins/advlink/link.htm thirdparty/tinymce/plugins/emotions/emotions.htm thirdparty/tinymce/plugins/emotions/langs/en_dlg.js thirdparty/tinymce/plugins/example/dialog.htm thirdparty/tinymce/plugins/fullpage/fullpage.htm thirdparty/tinymce/plugins/fullpage/langs/en_dlg.js thirdparty/tinymce/plugins/fullscreen/fullscreen.htm thirdparty/tinymce/plugins/inlinepopups/template.htm thirdparty/tinymce/plugins/media/langs/en_dlg.js thirdparty/tinymce/plugins/media/media.htm thirdparty/tinymce/plugins/paste/js/pasteword.js thirdparty/tinymce/plugins/paste/langs/en_dlg.js thirdparty/tinymce/plugins/paste/pastetext.htm thirdparty/tinymce/plugins/paste/pasteword.htm thirdparty/tinymce/plugins/searchreplace/langs/en_dlg.js thirdparty/tinymce/plugins/searchreplace/searchreplace.htm thirdparty/tinymce/plugins/spellchecker/editor_plugin.js thirdparty/tinymce/plugins/spellchecker/editor_plugin_src.js thirdparty/tinymce/plugins/style/langs/en_dlg.js thirdparty/tinymce/plugins/style/props.htm thirdparty/tinymce/plugins/table/cell.htm thirdparty/tinymce/plugins/table/langs/en_dlg.js thirdparty/tinymce/plugins/table/merge_cells.htm thirdparty/tinymce/plugins/table/row.htm thirdparty/tinymce/plugins/table/table.htm thirdparty/tinymce/plugins/template/langs/en_dlg.js thirdparty/tinymce/plugins/template/template.htm thirdparty/tinymce/plugins/xhtmlxtras/abbr.htm thirdparty/tinymce/plugins/xhtmlxtras/acronym.htm thirdparty/tinymce/plugins/xhtmlxtras/attributes.htm thirdparty/tinymce/plugins/xhtmlxtras/cite.htm thirdparty/tinymce/plugins/xhtmlxtras/del.htm thirdparty/tinymce/plugins/xhtmlxtras/ins.htm thirdparty/tinymce/plugins/xhtmlxtras/langs/en_dlg.js thirdparty/tinymce/themes/advanced/about.htm thirdparty/tinymce/themes/advanced/anchor.htm thirdparty/tinymce/themes/advanced/charmap.htm thirdparty/tinymce/themes/advanced/color_picker.htm thirdparty/tinymce/themes/advanced/image.htm thirdparty/tinymce/themes/advanced/langs/en.js thirdparty/tinymce/themes/advanced/langs/en_dlg.js thirdparty/tinymce/themes/advanced/link.htm thirdparty/tinymce/themes/advanced/source_editor.htm thirdparty/tinymce/themes/simple/langs/en.js thirdparty/tinymce/tiny_mce.js thirdparty/tinymce/tiny_mce_src.js widgets/Widget.php
262 lines
6.6 KiB
PHP
Executable File
262 lines
6.6 KiB
PHP
Executable File
<?php
|
|
/**
|
|
* Represents a file type which can be added to a form.
|
|
* Automatically tries to save has_one-relations on the saved
|
|
* record.
|
|
*
|
|
* Please set a validator on the form-object to get feedback
|
|
* about imposed filesize/extension restrictions.
|
|
*
|
|
* CAUTION: Doesn't work in the CMS due to ajax submission, please use {@link FileIFrameField} instead.
|
|
*
|
|
* <b>Usage</p>
|
|
*
|
|
* If you want to implement a FileField into a form element, you need to pass it an array of source data.
|
|
*
|
|
* <code>
|
|
* class ExampleForm_Controller extends Page_Controller {
|
|
*
|
|
* public function Form() {
|
|
* $fields = new FieldSet(
|
|
* new TextField('MyName'),
|
|
* new FileField('MyFile')
|
|
* );
|
|
* $actions = new FieldSet(
|
|
* new FormAction('doUpload', 'Upload file')
|
|
* );
|
|
* $validator = new RequiredFields(array('MyName', 'MyFile'));
|
|
*
|
|
* return new Form($this, 'Form', $fields, $actions, $validator);
|
|
* }
|
|
*
|
|
* function doUpload($data, $form) {
|
|
* $file = $data['MyFile'];
|
|
* $content = file_get_contents($file['tmp_name']);
|
|
* // ... process content
|
|
* }
|
|
* }
|
|
* </code>
|
|
*
|
|
* @package forms
|
|
* @subpackage fields-files
|
|
*/
|
|
class FileField extends FormField {
|
|
|
|
/**
|
|
* Restrict filesize for either all filetypes
|
|
* or a specific extension, with extension-name
|
|
* as array-key and the size-restriction in bytes as array-value.
|
|
*
|
|
* @deprecated 2.5
|
|
* @var array
|
|
*/
|
|
public $allowedMaxFileSize = array();
|
|
|
|
/**
|
|
* @var array Collection of extensions.
|
|
* Extension-names are treated case-insensitive.
|
|
*
|
|
* Example:
|
|
* <code>
|
|
* array("jpg","GIF")
|
|
* </code>
|
|
*
|
|
* @deprecated 2.5
|
|
* @var array
|
|
*/
|
|
public $allowedExtensions = array();
|
|
|
|
/**
|
|
* Flag to automatically determine and save a has_one-relationship
|
|
* on the saved record (e.g. a "Player" has_one "PlayerImage" would
|
|
* trigger saving the ID of newly created file into "PlayerImageID"
|
|
* on the record).
|
|
*
|
|
* @var boolean
|
|
*/
|
|
public $relationAutoSetting = true;
|
|
|
|
/**
|
|
* Upload object (needed for validation
|
|
* and actually moving the temporary file
|
|
* created by PHP).
|
|
*
|
|
* @var Upload
|
|
*/
|
|
protected $upload;
|
|
|
|
/**
|
|
* Partial filesystem path relative to /assets directory.
|
|
* Defaults to 'Uploads'.
|
|
*
|
|
* @var string
|
|
*/
|
|
protected $folderName = 'Uploads';
|
|
|
|
/**
|
|
* Create a new file field.
|
|
*
|
|
* @param string $name The internal field name, passed to forms.
|
|
* @param string $title The field label.
|
|
* @param int $value The value of the field.
|
|
* @param Form $form Reference to the container form
|
|
* @param string $rightTitle Used in SmallFieldHolder() to force a right-aligned label
|
|
* @param string $folderName Folder to upload files to
|
|
*/
|
|
function __construct($name, $title = null, $value = null, $form = null, $rightTitle = null, $folderName = null) {
|
|
if(isset($folderName)) $this->folderName = $folderName;
|
|
$this->upload = new Upload();
|
|
|
|
parent::__construct($name, $title, $value, $form, $rightTitle);
|
|
}
|
|
|
|
public function Field() {
|
|
return $this->createTag(
|
|
'input',
|
|
array(
|
|
"type" => "file",
|
|
"name" => $this->name,
|
|
"id" => $this->id(),
|
|
"tabindex" => $this->getTabIndex()
|
|
)
|
|
) .
|
|
$this->createTag(
|
|
'input',
|
|
array(
|
|
"type" => "hidden",
|
|
"name" => "MAX_FILE_SIZE",
|
|
"value" => $this->getValidator()->getAllowedMaxFileSize(),
|
|
"tabindex" => $this->getTabIndex()
|
|
)
|
|
);
|
|
}
|
|
|
|
public function saveInto(DataObject $record) {
|
|
if(!isset($_FILES[$this->name])) return false;
|
|
|
|
if($this->relationAutoSetting) {
|
|
// assume that the file is connected via a has-one
|
|
$hasOnes = $record->has_one($this->name);
|
|
// try to create a file matching the relation
|
|
$file = (is_string($hasOnes)) ? Object::create($hasOnes) : new File();
|
|
} else {
|
|
$file = new File();
|
|
}
|
|
|
|
$this->upload->loadIntoFile($_FILES[$this->name], $file, $this->folderName);
|
|
if($this->upload->isError()) return false;
|
|
|
|
$file = $this->upload->getFile();
|
|
|
|
if($this->relationAutoSetting) {
|
|
if(!$hasOnes) return false;
|
|
|
|
// save to record
|
|
$record->{$this->name . 'ID'} = $file->ID;
|
|
}
|
|
}
|
|
|
|
public function Value() {
|
|
return $_FILES[$this->Name()];
|
|
}
|
|
|
|
/**
|
|
* Get custom validator for this field
|
|
*
|
|
* @param object $validator
|
|
*/
|
|
public function getValidator() {
|
|
return $this->upload->getValidator();
|
|
}
|
|
|
|
/**
|
|
* Set custom validator for this field
|
|
*
|
|
* @param object $validator
|
|
*/
|
|
public function setValidator($validator) {
|
|
$this->upload->setValidator($validator);
|
|
}
|
|
|
|
/**
|
|
* Get maximum file size for all or specified file extension.
|
|
* Falls back to the default filesize restriction ('*')
|
|
* if the extension was not found.
|
|
*
|
|
* @deprecated 2.5
|
|
* @param string $ext
|
|
* @return int Filesize in bytes (0 means no filesize set)
|
|
*/
|
|
public function getAllowedMaxFileSize($ext = null) {
|
|
user_error('Upload::getAllowedMaxFileSize() is deprecated. Please use Upload_Validator::getAllowedMaxFileSize() instead', E_USER_NOTICE);
|
|
$this->getValidator()->getAllowedMaxFileSize($ext);
|
|
}
|
|
|
|
/**
|
|
* Set filesize maximums (in bytes).
|
|
* Automatically converts extensions to lowercase
|
|
* for easier matching.
|
|
*
|
|
* Example:
|
|
* <code>
|
|
* array('*' => 200, 'jpg' => 1000)
|
|
* </code>
|
|
*
|
|
* @deprecated 2.5
|
|
* @param unknown_type $rules
|
|
*/
|
|
public function setAllowedMaxFileSize($rules) {
|
|
user_error('Upload::setAllowedMaxFileSize() is deprecated. Please use Upload_Validator::setAllowedMaxFileSize() instead', E_USER_NOTICE);
|
|
$this->getValidator()->setAllowedMaxFileSize($rules);
|
|
}
|
|
|
|
/**
|
|
* @deprecated 2.5
|
|
* @return array
|
|
*/
|
|
public function getAllowedExtensions() {
|
|
user_error('Upload::getAllowedExtensions() is deprecated. Please use Upload_Validator::getAllowedExtensions() instead', E_USER_NOTICE);
|
|
return $this->getValidator()->getAllowedExtensions();
|
|
}
|
|
|
|
/**
|
|
* @deprecated 2.5
|
|
* @param array $rules
|
|
*/
|
|
public function setAllowedExtensions($rules) {
|
|
user_error('Upload::setAllowedExtensions() is deprecated. Please use Upload_Validator::setAllowedExtensions() instead', E_USER_NOTICE);
|
|
$this->getValidator()->setAllowedExtensions($rules);
|
|
}
|
|
|
|
/**
|
|
* @param string $folderName
|
|
*/
|
|
public function setFolderName($folderName) {
|
|
$this->folderName = $folderName;
|
|
}
|
|
|
|
/**
|
|
* @return string
|
|
*/
|
|
public function getFolderName() {
|
|
return $this->folderName;
|
|
}
|
|
|
|
public function validate($validator) {
|
|
if(!isset($_FILES[$this->name])) return true;
|
|
|
|
$tmpFile = $_FILES[$this->name];
|
|
|
|
$valid = $this->upload->validate($tmpFile);
|
|
if(!$valid) {
|
|
$errors = $this->upload->getErrors();
|
|
if($errors) foreach($errors as $error) {
|
|
$validator->validationError($this->name, $error, "validation", false);
|
|
}
|
|
return false;
|
|
}
|
|
|
|
return true;
|
|
}
|
|
}
|
|
?>
|