2012-07-16 22:39:01 +02:00
< ? php
2017-01-25 13:27:11 +01:00
namespace Colymba\BulkUpload ;
use Colymba\BulkUpload\BulkUploaderRequest ;
use SilverStripe\Core\Config\Config ;
use SilverStripe\Dev\Deprecation ;
use SilverStripe\Forms\FormAction ;
use SilverStripe\Forms\GridField\GridField_HTMLProvider ;
use SilverStripe\Forms\GridField\GridField_URLHandler ;
use SilverStripe\ORM\DataObject ;
use SilverStripe\View\ArrayData ;
use SilverStripe\View\Requirements ;
2012-07-18 14:23:51 +02:00
/**
2015-12-15 13:08:57 +01:00
* GridField component for uploading images in bulk .
2012-08-07 22:51:54 +02:00
*
* @ author colymba
2012-07-18 14:23:51 +02:00
*/
2017-01-25 13:27:11 +01:00
class BulkUploader implements GridField_HTMLProvider , GridField_URLHandler
2015-12-15 13:08:57 +01:00
{
/**
2016-01-18 15:49:00 +01:00
* Component configuration .
*
2015-12-15 13:08:57 +01:00
* 'fileRelationName' => field name of the $has_one File / Image relation
2016-01-18 16:38:01 +01:00
* 'recordClassName' => overrides the automatic DataObject class detection from gridfield -> dataClass with a custom class name
2015-12-15 13:08:57 +01:00
*
* @ var array
*/
protected $config = array (
2017-01-25 13:27:11 +01:00
'fileRelationName' => null ,
'recordClassName' => null
2015-12-15 13:08:57 +01:00
);
/**
* UploadField configuration .
* These options are passed on directly to the UploadField
* via { @ link UploadField :: setConfig ()} api .
*
2017-01-25 13:27:11 +01:00
* Defaults are :
2015-12-15 13:08:57 +01:00
* 'sequentialUploads' => false : process uploads 1 after the other rather than all at once
* 'canAttachExisting' => true : displays " From files " button in the UploadField
* 'canPreviewFolder' => true : displays the upload location in the UploadField
2016-01-18 15:49:00 +01:00
*
2015-12-15 13:08:57 +01:00
* @ var array
*/
protected $ufConfig = array (
'sequentialUploads' => false ,
2017-01-25 13:27:11 +01:00
'canAttachExisting' => true ,
'canPreviewFolder' => true ,
2015-12-15 13:08:57 +01:00
);
/**
* UploadField setup function calls .
* List of setup functions to call on { @ link UploadField } with the value to pass .
2016-01-18 15:49:00 +01:00
*
2015-12-15 13:08:57 +01:00
* e . g . array ( 'setFolderName' => 'bulkUpload' ) will result in :
* $uploadField -> setFolderName ( 'bulkUpload' )
2016-01-18 15:49:00 +01:00
*
2015-12-15 13:08:57 +01:00
* @ var array
*/
protected $ufSetup = array (
2017-01-25 13:27:11 +01:00
'setFolderName' => 'bulkUpload' ,
2015-12-15 13:08:57 +01:00
);
/**
* UploadField Validator setup function calls .
* List of setup functions to call on { @ link Upload :: validator } with the value to pass .
2016-01-18 15:49:00 +01:00
*
2015-12-15 13:08:57 +01:00
* e . g . array ( 'setAllowedMaxFileSize' => 10 ) will result in :
* $uploadField -> getValidator () -> setAllowedMaxFileSize ( 10 )
2016-01-18 15:49:00 +01:00
*
2015-12-15 13:08:57 +01:00
* @ var array
*/
protected $ufValidatorSetup = array (
2017-01-25 13:27:11 +01:00
'setAllowedMaxFileSize' => null ,
2015-12-15 13:08:57 +01:00
);
/**
* Component constructor .
2016-01-18 15:49:00 +01:00
*
2015-12-15 13:08:57 +01:00
* @ param string $fileRelationName
2017-01-25 13:27:11 +01:00
* @ param string $recordClassName
2015-12-15 13:08:57 +01:00
*/
2016-01-18 16:38:01 +01:00
public function __construct ( $fileRelationName = null , $recordClassName = null )
2015-12-15 13:08:57 +01:00
{
if ( $fileRelationName != null ) {
$this -> setConfig ( 'fileRelationName' , $fileRelationName );
}
2016-01-18 15:49:00 +01:00
2016-01-18 16:38:01 +01:00
if ( $recordClassName != null ) {
$this -> setConfig ( 'recordClassName' , $recordClassName );
2016-01-18 15:49:00 +01:00
}
2015-12-15 13:08:57 +01:00
}
2014-04-05 18:54:50 +02:00
2015-12-15 13:08:57 +01:00
/* **********************************************************************
* Components settings and custom methodes
* */
/**
* Set a component configuration parameter .
2016-01-18 15:49:00 +01:00
*
2015-12-15 13:08:57 +01:00
* @ param string $reference
* @ param mixed $value
*/
public function setConfig ( $reference , $value )
2014-09-06 12:39:39 +02:00
{
2015-12-15 13:08:57 +01:00
if ( in_array ( $reference , array ( 'folderName' , 'maxFileSize' , 'sequentialUploads' , 'canAttachExisting' , 'canPreviewFolder' ))) {
2017-01-25 13:27:11 +01:00
Deprecation :: notice ( '2.1.0' , " BulkUploader 'setConfig()' doesn't support ' $reference ' anymore. Please use 'setUfConfig()', 'setUfSetup()' or 'setUfValidatorSetup()' instead. " );
2015-12-15 13:08:57 +01:00
if ( $reference === 'folderName' ) {
$this -> setUfSetup ( 'setFolderName' , $value );
} elseif ( $reference === 'maxFileSize' ) {
$this -> setUfValidatorSetup ( 'setAllowedMaxFileSize' , $value );
} else {
$this -> setUfConfig ( $reference , $value );
}
} elseif ( ! array_key_exists ( $reference , $this -> config )) {
user_error ( " Unknown option reference: $reference " , E_USER_ERROR );
}
$this -> config [ $reference ] = $value ;
return $this ;
2014-09-06 12:39:39 +02:00
}
2014-04-05 18:54:50 +02:00
2015-12-15 13:08:57 +01:00
/**
* Set an UploadField configuration parameter .
2016-01-18 15:49:00 +01:00
*
2015-12-15 13:08:57 +01:00
* @ param string $reference
* @ param mixed $value
*/
public function setUfConfig ( $reference , $value )
2014-09-06 12:39:39 +02:00
{
2015-12-15 13:08:57 +01:00
$this -> ufConfig [ $reference ] = $value ;
return $this ;
2014-09-06 12:39:39 +02:00
}
2014-04-05 18:54:50 +02:00
2015-12-15 13:08:57 +01:00
/**
* Set an UploadField setup function call .
2016-01-18 15:49:00 +01:00
*
2015-12-15 13:08:57 +01:00
* @ param string $function
* @ param mixed $param
*/
public function setUfSetup ( $function , $param )
{
$this -> ufSetup [ $function ] = $param ;
return $this ;
}
/**
* Set an UploadField Validator setup function call .
2016-01-18 15:49:00 +01:00
*
2015-12-15 13:08:57 +01:00
* @ param string $function
* @ param mixed $param
*/
public function setUfValidatorSetup ( $function , $param )
{
$this -> ufValidatorSetup [ $function ] = $param ;
return $this ;
}
/**
* Returns one $config reference or the full $config .
2016-01-18 15:49:00 +01:00
*
2015-12-15 13:08:57 +01:00
* @ param string $reference $congif parameter to return
*
* @ return mixed
*/
public function getConfig ( $reference = false )
{
if ( $reference ) {
return $this -> config [ $reference ];
} else {
return $this -> config ;
}
}
/**
* Returns one $ufConfig reference or the full config .
2016-01-18 15:49:00 +01:00
*
2015-12-15 13:08:57 +01:00
* @ param string $reference $ufConfig parameter to return
*
* @ return mixed
*/
public function getUfConfig ( $reference = false )
{
if ( $reference ) {
return $this -> ufConfig [ $reference ];
} else {
return $this -> ufConfig ;
}
}
/**
* Returns one $ufSetup reference or the full config .
2016-01-18 15:49:00 +01:00
*
2015-12-15 13:08:57 +01:00
* @ param string $reference $ufSetup parameter to return
*
* @ return mixed
*/
public function getUfSetup ( $reference = false )
{
if ( $reference ) {
return $this -> ufSetup [ $reference ];
} else {
return $this -> ufSetup ;
}
}
/**
* Returns one $ufValidatorSetup reference or the full config .
2016-01-18 15:49:00 +01:00
*
2015-12-15 13:08:57 +01:00
* @ param string $reference $ufValidatorSetup parameter to return
*
* @ return mixed
*/
public function getUfValidatorSetup ( $reference = false )
{
if ( $reference ) {
return $this -> ufValidatorSetup [ $reference ];
} else {
return $this -> ufValidatorSetup ;
}
}
2016-01-18 16:38:01 +01:00
/**
* Returns the class name of container `DataObject` record .
2017-01-25 13:14:04 +01:00
* Either as set in the component config or from the `Gridfield` `dataClass` .
2016-01-18 16:38:01 +01:00
*
* @ return string
*/
public function getRecordClassName ( $gridField )
{
return $this -> getConfig ( 'recordClassName' ) ? $this -> getConfig ( 'recordClassName' ) : $gridField -> list -> dataClass ;
}
2015-12-15 13:08:57 +01:00
/**
* Get the first has_one Image / File relation from the GridField managed DataObject
* i . e . 'MyImage' => 'Image' will return 'MyImage' .
2016-01-18 15:49:00 +01:00
*
2017-01-25 13:27:11 +01:00
* @ param GridField $gridField
2015-12-15 13:08:57 +01:00
* @ return string Name of the $has_one relation
*/
public function getDefaultFileRelationName ( $gridField )
{
2016-01-18 16:38:01 +01:00
$recordClass = $this -> getRecordClassName ( $gridField );
2017-05-28 19:58:12 +02:00
$hasOneFields = Config :: inst () -> get ( $recordClass , 'has_one' );
2015-12-15 13:08:57 +01:00
$imageField = null ;
foreach ( $hasOneFields as $field => $type ) {
2017-01-25 13:27:11 +01:00
if ( $type === 'SilverStripe\\Assets\\Image'
|| $type === 'SilverStripe\\Assets\\File'
|| is_subclass_of ( $type , 'SilverStripe\\Assets\\File' )
) {
2015-12-15 13:08:57 +01:00
$imageField = $field ;
break ;
}
}
return $imageField ;
}
/**
* Returns the name of the Image / File field name from the managed record
* Either as set in the component config or the default one .
2016-01-18 15:49:00 +01:00
*
2017-01-25 13:27:11 +01:00
* @ param GridField $gridField
2015-12-15 13:08:57 +01:00
* @ return string
*/
public function getFileRelationName ( $gridField )
{
$configFileRelationName = $this -> getConfig ( 'fileRelationName' );
return $configFileRelationName ? $configFileRelationName : $this -> getDefaultFileRelationName ( $gridField );
}
/**
* Return the ClassName of the fileRelation
* i . e . 'MyImage' => 'Image' will return 'Image'
* i . e . 'MyImage' => 'File' will return 'File' .
*
2017-01-25 13:27:11 +01:00
* @ param GridField $gridField
2015-12-15 13:08:57 +01:00
* @ return string file relation className
*/
public function getFileRelationClassName ( $gridField )
{
2016-01-18 16:38:01 +01:00
$recordClass = $this -> getRecordClassName ( $gridField );
2017-05-28 19:58:12 +02:00
$hasOneFields = Config :: inst () -> get ( $recordClass , 'has_one' );
2015-12-15 13:08:57 +01:00
$fieldName = $this -> getFileRelationName ( $gridField );
if ( $fieldName ) {
return $hasOneFields [ $fieldName ];
} else {
2017-01-25 13:27:11 +01:00
return 'SilverStripe\\Assets\\File' ;
2015-12-15 13:08:57 +01:00
}
}
/**
* Returned a configured UploadField instance
* embedded in the gridfield heard .
*
* @ param GridField $gridField Current GridField
*
* @ return UploadField Configured UploadField instance
*/
public function bulkUploadField ( $gridField )
2014-09-06 12:39:39 +02:00
{
2015-12-15 13:08:57 +01:00
$fileRelationName = $this -> getFileRelationName ( $gridField );
2016-04-11 21:31:21 +02:00
$uploadField = BulkUploadField :: create ( $gridField , $fileRelationName , '' )
2015-12-15 13:08:57 +01:00
-> setForm ( $gridField -> getForm ())
2017-01-25 13:14:04 +01:00
/*-> setConfig ( 'previewMaxWidth' , 20 )
2015-12-15 13:08:57 +01:00
-> setConfig ( 'previewMaxHeight' , 20 )
2017-01-25 13:14:04 +01:00
-> setConfig ( 'changeDetection' , false ) */
2015-12-15 13:08:57 +01:00
-> setRecord ( DataObject :: create ()) // avoid UploadField to get auto-config from the Page (e.g fix allowedMaxFileNumber)
2017-01-25 13:14:04 +01:00
/*-> setTemplate ( 'BulkUploadField' )
2015-12-15 13:08:57 +01:00
-> setDownloadTemplateName ( 'colymba-bulkuploaddownloadtemplate' )
-> setConfig ( 'url' , $gridField -> Link ( 'bulkupload/upload' ))
-> setConfig ( 'urlSelectDialog' , $gridField -> Link ( 'bulkupload/select' ))
-> setConfig ( 'urlAttach' , $gridField -> Link ( 'bulkupload/attach' ))
2017-01-25 13:14:04 +01:00
-> setConfig ( 'urlFileExists' , $gridField -> Link ( 'bulkupload/fileexists' )) */
2015-12-15 13:08:57 +01:00
;
2017-01-25 13:14:04 +01:00
/*
2017-01-25 13:27:11 +01:00
//set UploadField config
foreach ( $this -> ufConfig as $key => $val ) {
$uploadField -> setConfig ( $key , $val );
}
2017-12-12 08:30:15 +01:00
*/
2015-12-15 13:08:57 +01:00
2017-01-25 13:27:11 +01:00
//UploadField setup
foreach ( $this -> ufSetup as $fn => $param ) {
$uploadField -> { $fn }( $param );
}
2015-12-15 13:08:57 +01:00
2017-12-12 08:30:15 +01:00
/*
2017-01-25 13:27:11 +01:00
//UploadField Validator setup
foreach ( $this -> ufValidatorSetup as $fn => $param ) {
$uploadField -> getValidator () -> { $fn }( $param );
}
2017-01-25 13:14:04 +01:00
*/
2017-12-12 08:30:15 +01:00
2017-01-25 13:14:04 +01:00
$uploadLink = $gridField -> Link ( 'bulkupload/upload' );
$schema [ 'data' ][ 'createFileEndpoint' ] = [
'url' => $uploadLink ,
'method' => 'post' ,
'payloadFormat' => 'urlencoded' ,
];
$uploadField -> setSchemaData ( $schema );
2015-12-15 13:08:57 +01:00
return $uploadField ;
}
/* **********************************************************************
* GridField_HTMLProvider
* */
/**
* HTML to be embedded into the GridField .
2016-01-18 15:49:00 +01:00
*
2015-12-15 13:08:57 +01:00
* @ param GridField $gridField
*
* @ return array
*/
public function getHTMLFragments ( $gridField )
{
// permission check
if ( ! singleton ( $gridField -> getModelClass ()) -> canEdit ()) {
return array ();
}
// check BulkManager exists
2017-01-25 13:27:11 +01:00
$bulkManager = $gridField -> getConfig () -> getComponentsByType ( 'Colymba\\BulkManager\\BulkManager' );
2015-12-15 13:08:57 +01:00
// upload management buttons
$finishButton = FormAction :: create ( 'Finish' , _t ( 'GRIDFIELD_BULK_UPLOAD.FINISH_BTN_LABEL' , 'Finish' ))
-> addExtraClass ( 'bulkUploadFinishButton' )
-> setAttribute ( 'data-icon' , 'accept' )
-> setUseButtonTag ( true );
$clearErrorButton = FormAction :: create ( 'ClearError' , _t ( 'GRIDFIELD_BULK_UPLOAD.CLEAR_ERROR_BTN_LABEL' , 'Clear errors' ))
-> addExtraClass ( 'bulkUploadClearErrorButton' )
-> setAttribute ( 'data-icon' , 'arrow-circle-double' )
-> setUseButtonTag ( true );
if ( count ( $bulkManager )) {
$cancelButton = FormAction :: create ( 'Cancel' , _t ( 'GRIDFIELD_BULK_UPLOAD.CANCEL_BTN_LABEL' , 'Cancel' ))
-> addExtraClass ( 'bulkUploadCancelButton ss-ui-action-destructive' )
-> setAttribute ( 'data-icon' , 'decline' )
-> setAttribute ( 'data-url' , $gridField -> Link ( 'bulkupload/cancel' ))
-> setUseButtonTag ( true );
$bulkManager_config = $bulkManager -> first () -> getConfig ();
$bulkManager_actions = $bulkManager_config [ 'actions' ];
if ( array_key_exists ( 'bulkedit' , $bulkManager_actions )) {
$editAllButton = FormAction :: create ( 'EditAll' , _t ( 'GRIDFIELD_BULK_UPLOAD.EDIT_ALL_BTN_LABEL' , 'Edit all' ))
2017-01-25 13:27:11 +01:00
-> addExtraClass ( 'bulkUploadEditButton' )
-> setAttribute ( 'data-icon' , 'pencil' )
-> setAttribute ( 'data-url' , $gridField -> Link ( 'bulkupload/edit' ))
-> setUseButtonTag ( true );
2015-12-15 13:08:57 +01:00
} else {
$editAllButton = '' ;
}
} else {
$cancelButton = '' ;
$editAllButton = '' ;
}
// get uploadField + inject extra buttons
$uploadField = $this -> bulkUploadField ( $gridField );
$uploadField -> FinishButton = $finishButton ;
$uploadField -> CancelButton = $cancelButton ;
$uploadField -> EditAllButton = $editAllButton ;
$uploadField -> ClearErrorButton = $clearErrorButton ;
$data = ArrayData :: create ( array (
2017-01-25 13:14:04 +01:00
'Colspan' => ( count ( $gridField -> getColumns ())),
'UploadField' => $uploadField -> Field () // call ->Field() to get requirements in right order
2015-12-15 13:08:57 +01:00
));
2017-01-25 13:27:11 +01:00
Requirements :: css ( BULKEDITTOOLS_UPLOAD_PATH . '/css/GridFieldBulkUpload.css' );
Requirements :: javascript ( BULKEDITTOOLS_UPLOAD_PATH . '/javascript/GridFieldBulkUpload.js' );
Requirements :: add_i18n_javascript ( BULKEDITTOOLS_PATH . '/lang/js' );
2015-12-15 13:08:57 +01:00
return array (
2017-01-25 13:27:11 +01:00
'header' => $data -> renderWith ( 'Colymba\\BulkUpload\\BulkUploader' ),
2015-12-15 13:08:57 +01:00
);
}
/* **********************************************************************
* GridField_URLHandler
* */
/**
* Component URL handlers .
2016-01-18 15:49:00 +01:00
*
2015-12-15 13:08:57 +01:00
* @ param GridField $gridField
*
* @ return array
*/
public function getURLHandlers ( $gridField )
{
return array (
2016-04-11 21:31:21 +02:00
'bulkupload' => 'handleBulkUpload'
2015-12-15 13:08:57 +01:00
);
}
/**
* Pass control over to the RequestHandler .
2016-01-18 15:49:00 +01:00
*
2015-12-15 13:08:57 +01:00
* @ param GridField $gridField
2017-01-25 13:27:11 +01:00
* @ param HTTPRequest $request
2015-12-15 13:08:57 +01:00
*
* @ return mixed
*/
public function handleBulkUpload ( $gridField , $request )
{
2017-01-25 13:27:11 +01:00
$controller = $gridField -> getForm () -> getController ();
2017-01-25 13:14:04 +01:00
$handler = new \Colymba\BulkUpload\BulkUploaderRequest ( $gridField , $this , $controller );
2015-12-15 13:08:57 +01:00
2017-08-03 11:12:21 +02:00
return $handler -> handleRequest ( $request );
2015-12-15 13:08:57 +01:00
}
2014-05-22 15:57:09 +02:00
}