mirror of
https://github.com/silverstripe/silverstripe-framework
synced 2024-10-22 14:05:37 +02:00
Merge pull request #885 from Martimiz/3.0-DocUploadField
ENHANCEMENT - UploadField documentation
This commit is contained in:
commit
1b1f645157
189
docs/en/reference/uploadfield.md
Normal file
189
docs/en/reference/uploadfield.md
Normal file
@ -0,0 +1,189 @@
|
||||
# UploadField
|
||||
|
||||
## Introduction
|
||||
|
||||
The UploadField will let you upload one or multiple files of all types,
|
||||
including images. But that's not all it does - it will also link the
|
||||
uploaded file(s) to an existing relation and let you edit the linked files
|
||||
as well. That makes it flexible enough to sometimes even replace the Gridfield,
|
||||
like for instance in creating and managing a simple gallery.
|
||||
|
||||
## Usage
|
||||
The UploadField can be used in two ways:
|
||||
|
||||
### Single fileupload
|
||||
|
||||
The following example adds an UploadField to a page for single fileupload,
|
||||
based on a has_one relation:
|
||||
|
||||
:::php
|
||||
class GalleryPage extends Page {
|
||||
|
||||
static $has_one = array(
|
||||
'SingleImage' => 'Image'
|
||||
);
|
||||
|
||||
function getCMSFields() {
|
||||
|
||||
$fields = parent::getCMSFields();
|
||||
|
||||
$fields->addFieldToTab(
|
||||
'Root.Upload',
|
||||
$uploadField = new UploadField(
|
||||
$name = 'SingleImage',
|
||||
$title = 'Upload a single image'
|
||||
)
|
||||
);
|
||||
return $fields;
|
||||
}
|
||||
}
|
||||
|
||||
The UploadField will autodetect the relation based on it's `name` property, and
|
||||
save it into the GalleyPages' `SingleImageID` field. Setting the
|
||||
`allowedMaxFileNumber` to 1 will make sure that only one image can ever be
|
||||
uploaded and linked to the relation.
|
||||
|
||||
### Multiple fileupload
|
||||
|
||||
Enable multiple fileuploads by using a many_many relation. Again, the
|
||||
UploadField will detect the relation based on its $name property value:
|
||||
|
||||
:::php
|
||||
class GalleryPage extends Page {
|
||||
|
||||
static $many_many = array(
|
||||
'GalleryImages' => 'Image'
|
||||
);
|
||||
|
||||
function getCMSFields() {
|
||||
|
||||
$fields = parent::getCMSFields();
|
||||
|
||||
$fields->addFieldToTab(
|
||||
'Root.Upload',
|
||||
$uploadField = new UploadField(
|
||||
$name = 'GalleryImages',
|
||||
$title = 'Upload one or more images (max 10 in total)'
|
||||
)
|
||||
);
|
||||
$uploadField->setConfig('allowedMaxFileNumber', 10);
|
||||
|
||||
return $fields;
|
||||
}
|
||||
}
|
||||
class GalleryPage_Controller extends Page_Controller {
|
||||
}
|
||||
|
||||
WARNING: Currently the UploadField doesn't fully support has_many relations, so use a many_many relation instead!
|
||||
|
||||
## Set a custom folder
|
||||
|
||||
This example will save all uploads in the `/assets/customfolder/` folder. If
|
||||
the folder doesn't exist, it will be created.
|
||||
|
||||
:::php
|
||||
$fields->addFieldToTab(
|
||||
'Root.Upload',
|
||||
$uploadField = new UploadField(
|
||||
$name = 'GalleryImages',
|
||||
$title = 'Please upload one or more images' )
|
||||
);
|
||||
$uploadField->setFolderName('customfolder');
|
||||
|
||||
## Limit the allowed filetypes
|
||||
|
||||
`AllowedExtensions` is by default `File::$allowed_extensions` but can be overwritten for each UploadField:
|
||||
|
||||
:::php
|
||||
$uploadField->getValidator()->setAllowedExtensions(array('jpg', 'jpeg', 'png', 'gif'));
|
||||
|
||||
|
||||
## Limit the maximum file size
|
||||
|
||||
`AllowedMaxFileSize` is by default set to the lower value of the 2 php.ini configurations: `upload_max_filesize` and `post_max_size`
|
||||
The value is set as bytes.
|
||||
|
||||
NOTE: this only sets the configuration for your UploadField, this does NOT change your server upload settings, so if your server is set to only allow 1 MB and you set the UploadFIeld to 2 MB, uploads will not work.
|
||||
|
||||
:::php
|
||||
$sizeMB = 2; // 2 MB
|
||||
$size = $sizeMB * 1024 * 1024; // 2 MB in bytes
|
||||
$this->getValidator()->setAllowedMaxFileSize($size);
|
||||
|
||||
## Other configuration settings
|
||||
|
||||
### Preview dimensions
|
||||
|
||||
Set the dimensions of the image preview. By default the max width is set to 80
|
||||
and the max height is set to 60.
|
||||
|
||||
:::php
|
||||
$uploadField->setConfig('previewMaxWidth', 100);
|
||||
$uploadField->setConfig('previewMaxHeight', 100);
|
||||
|
||||
### Automatic or manual upload
|
||||
|
||||
By default, the UploadField will try to automatically upload all selected files.
|
||||
Setting the `autoUpload` property to false, will present you with a list of
|
||||
selected files that you can then upload manually one by one:
|
||||
|
||||
:::php
|
||||
$uploadField->setConfig('autoUpload', false);
|
||||
|
||||
### Build a simple gallery
|
||||
|
||||
A gallery most times needs more then simple images. You might want to add a
|
||||
description, or maybe some settings to define a transition effect for each slide.
|
||||
First create a
|
||||
[DataExtension](http://doc.silverstripe.org/framework/en/reference/dataextension)
|
||||
like this:
|
||||
|
||||
:::php
|
||||
class GalleryImage extends DataExtension {
|
||||
|
||||
static $db = array(
|
||||
'Description' => 'Text'
|
||||
);
|
||||
|
||||
public static $belongs_many_many = array(
|
||||
'GalleryPage' => 'GalleryPage'
|
||||
);
|
||||
}
|
||||
|
||||
Now register the DataExtension for the Image class in your _config.php:
|
||||
|
||||
:::php
|
||||
Object::add_extension('Image', 'GalleryImage');
|
||||
|
||||
NOTE: although you can subclass the Image class instead of using a DataExtension, this is not advisable. For instance: when using a subclass, the 'From files' button will only return files that were uploaded for that subclass, it won't recognize any other images!
|
||||
### Edit uploaded images
|
||||
|
||||
By default the UploadField will let you edit the following fields: *Title,
|
||||
Filename, Owner and Folder*. The `fileEditFields` configuration setting allows
|
||||
you you alter these settings. One way to go about this is create a
|
||||
`getCustomFields` function in your GalleryImage object like this:
|
||||
|
||||
:::php
|
||||
class GalleryImage extends DataExtension {
|
||||
...
|
||||
|
||||
function getCustomFields() {
|
||||
$fields = new FieldList();
|
||||
$fields->push(new TextField('Title', 'Title'));
|
||||
$fields->push(new TextareaField('Description', 'Description'));
|
||||
return $fields;
|
||||
}
|
||||
}
|
||||
|
||||
Then, in your GalleryPage, tell the UploadField to use this function:
|
||||
|
||||
:::php
|
||||
$uploadField->setConfig('fileEditFields', 'getCustomFields');
|
||||
|
||||
In a similar fashion you can use 'fileEditActions' to set the actions for the
|
||||
editform, or 'fileEditValidator' to determine the validator (eg RequiredFields).
|
||||
|
||||
## TODO: Using the UploadField in a frontend form
|
||||
|
||||
*At this moment the UploadField not yet fully supports being used on a frontend
|
||||
form.*
|
Loading…
Reference in New Issue
Block a user