2012-07-16 22:39:01 +02:00
< ? php
2012-07-18 14:23:51 +02:00
/**
2012-08-07 22:51:54 +02:00
* GridField component for uploading images in bulk
*
* @ author colymba
* @ package GridFieldBulkEditingTools
2014-05-04 16:12:05 +02:00
* @ subpackage BulkUpload
2012-07-18 14:23:51 +02:00
*/
2014-05-04 16:12:05 +02:00
class GridFieldBulkUpload implements GridField_HTMLProvider , GridField_URLHandler
{
2012-07-20 20:02:45 +02:00
/**
* component configuration
*
2013-06-26 18:46:46 +02:00
* 'fileRelationName' => field name of the $has_one File / Image relation
2012-07-20 20:02:45 +02:00
* @ var array
*/
protected $config = array (
2014-09-06 12:39:39 +02:00
'fileRelationName' => null
);
/**
* UploadField configuration .
* These options are passed on directly to the UploadField
* via { @ link UploadField :: setConfig ()} api
*
* Defaults are : *
* '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
*
* @ var array
*/
protected $ufConfig = array (
'sequentialUploads' => false ,
2014-06-17 11:48:47 +02:00
'canAttachExisting' => true ,
'canPreviewFolder' => true
2012-07-20 20:02:45 +02:00
);
2014-05-11 12:32:21 +02:00
2014-09-06 12:39:39 +02:00
/**
* UploadField setup function calls .
* List of setup functions to call on { @ link UploadField } with the value to pass
*
* e . g . array ( 'setFolderName' => 'bulkUpload' ) will result in :
* $uploadField -> setFolderName ( 'bulkUpload' )
*
* @ var array
*/
protected $ufSetup = array (
'setFolderName' => 'bulkUpload'
);
/**
* UploadField Validator setup function calls .
* List of setup functions to call on { @ link Upload :: validator } with the value to pass
*
* e . g . array ( 'setAllowedMaxFileSize' => 10 ) will result in :
* $uploadField -> getValidator () -> setAllowedMaxFileSize ( 10 )
*
* @ var array
*/
protected $ufValidatorSetup = array (
'setAllowedMaxFileSize' => null
);
2012-07-16 22:39:01 +02:00
/**
2014-05-11 12:32:21 +02:00
* Component constructor
2012-07-16 22:39:01 +02:00
*
2013-06-26 18:46:46 +02:00
* @ param string $fileRelationName
2012-07-16 22:39:01 +02:00
*/
2014-04-06 19:04:12 +02:00
public function __construct ( $fileRelationName = null )
2012-08-07 22:51:54 +02:00
{
2013-06-26 18:46:46 +02:00
if ( $fileRelationName != null ) $this -> setConfig ( 'fileRelationName' , $fileRelationName );
2012-07-16 22:39:01 +02:00
}
2014-05-04 16:12:05 +02:00
/* **********************************************************************
* Components settings and custom methodes
* */
2012-07-20 20:15:53 +02:00
/**
* Set a component configuration parameter
*
* @ param string $reference
* @ param mixed $value
*/
2012-07-20 20:02:45 +02:00
function setConfig ( $reference , $value )
{
2014-09-14 18:01:28 +02:00
if ( in_array ( $reference , array ( 'folderName' , 'maxFileSize' , 'sequentialUploads' , 'canAttachExisting' , 'canPreviewFolder' )) )
{
Deprecation :: notice ( '2.1.0' , " GridFieldBulkUpload 'setConfig()' doesn't support ' $reference ' anymore. Please use 'setUfConfig()', 'setUfSetup()' or 'setUfValidatorSetup()' instead. " );
if ( $reference === 'folderName' )
{
$this -> setUfSetup ( 'setFolderName' , $value );
}
else if ( $reference === 'maxFileSize' )
{
$this -> setUfValidatorSetup ( 'setAllowedMaxFileSize' , $value );
}
else {
$this -> setUfConfig ( $reference , $value );
}
}
else if ( ! key_exists ( $reference , $this -> config ) ) {
2012-11-23 03:09:11 +01:00
user_error ( " Unknown option reference: $reference " , E_USER_ERROR );
}
2013-03-26 09:48:12 +01:00
2014-09-06 12:39:39 +02:00
$this -> config [ $reference ] = $value ;
return $this ;
}
2014-06-17 11:48:47 +02:00
2014-09-06 12:39:39 +02:00
/**
* Set an UploadField configuration parameter
*
* @ param string $reference
* @ param mixed $value
*/
function setUfConfig ( $reference , $value )
{
$this -> ufConfig [ $reference ] = $value ;
return $this ;
}
2012-11-23 03:09:11 +01:00
2014-09-06 12:39:39 +02:00
/**
* Set an UploadField setup function call
*
* @ param string $function
* @ param mixed $param
*/
function setUfSetup ( $function , $param )
{
$this -> ufSetup [ $function ] = $param ;
return $this ;
}
/**
* Set an UploadField Validator setup function call
*
* @ param string $function
* @ param mixed $param
*/
function setUfValidatorSetup ( $function , $param )
{
$this -> ufValidatorSetup [ $function ] = $param ;
return $this ;
2012-07-20 20:02:45 +02:00
}
2014-05-11 12:32:21 +02:00
2012-07-20 20:02:45 +02:00
/**
2014-09-06 12:39:39 +02:00
* Returns one $config reference or the full $config
2012-07-20 20:02:45 +02:00
*
* @ param string $reference $congif parameter to return
* @ return mixed
*/
function getConfig ( $reference = false )
{
if ( $reference ) return $this -> config [ $reference ];
else return $this -> config ;
}
2014-09-06 12:39:39 +02:00
/**
* Returns one $ufConfig reference or the full config .
*
* @ param string $reference $ufConfig parameter to return
* @ return mixed
*/
function getUfConfig ( $reference = false )
{
if ( $reference ) return $this -> ufConfig [ $reference ];
else return $this -> ufConfig ;
}
/**
* Returns one $ufSetup reference or the full config .
*
* @ param string $reference $ufSetup parameter to return
* @ return mixed
*/
function getUfSetup ( $reference = false )
{
if ( $reference ) return $this -> ufSetup [ $reference ];
else return $this -> ufSetup ;
}
/**
* Returns one $ufValidatorSetup reference or the full config .
*
* @ param string $reference $ufValidatorSetup parameter to return
* @ return mixed
*/
function getUfValidatorSetup ( $reference = false )
{
if ( $reference ) return $this -> ufValidatorSetup [ $reference ];
else return $this -> ufValidatorSetup ;
}
2014-04-05 18:54:50 +02:00
/**
* Get the first has_one Image / File relation from the GridField managed DataObject
* i . e . 'MyImage' => 'Image' will return 'MyImage'
*
* @ return string Name of the $has_one relation
*/
public function getDefaultFileRelationName ( $gridField )
{
$recordClass = $gridField -> list -> dataClass ;
$hasOneFields = Config :: inst () -> get ( $recordClass , 'has_one' , Config :: INHERITED );
2012-07-20 20:15:53 +02:00
2014-04-05 18:54:50 +02:00
$imageField = null ;
foreach ( $hasOneFields as $field => $type )
{
if ( $type === 'Image' || $type === 'File' || is_subclass_of ( $type , 'File' ) )
{
$imageField = $field ;
break ;
}
}
return $imageField ;
}
2014-05-04 16:12:05 +02:00
2014-04-05 18:54:50 +02:00
/**
* Returns the name of the Image / File field name from the managed record
* Either as set in the component config or the default one
*
* @ return string
*/
public function getFileRelationName ( $gridField )
{
$configFileRelationName = $this -> getConfig ( 'fileRelationName' );
return $configFileRelationName ? $configFileRelationName : $this -> getDefaultFileRelationName ( $gridField );
}
2014-05-11 12:32:21 +02:00
2012-07-16 22:39:01 +02:00
/**
2014-04-05 18:54:50 +02:00
* Return the ClassName of the fileRelation
* i . e . 'MyImage' => 'Image' will return 'Image'
* i . e . 'MyImage' => 'File' will return 'File'
2012-07-16 22:39:01 +02:00
*
2014-04-05 18:54:50 +02:00
* @ return string file relation className
2012-07-16 22:39:01 +02:00
*/
2014-04-05 18:54:50 +02:00
public function getFileRelationClassName ( $gridField )
{
$recordClass = $gridField -> list -> dataClass ;
$hasOneFields = Config :: inst () -> get ( $recordClass , 'has_one' , Config :: INHERITED );
$fieldName = $this -> getFileRelationName ( $gridField );
if ( $fieldName )
{
return $hasOneFields [ $fieldName ];
}
else {
return 'File' ;
}
}
2014-05-04 16:12:05 +02:00
2014-04-05 18:54:50 +02:00
2014-04-13 18:38:08 +02:00
/**
* Returned a configured UploadField instance
* embedded in the gridfield heard
* @ param GridField $gridField Current GridField
* @ return UploadField Configured UploadField instance
*/
2014-04-05 18:54:50 +02:00
public function bulkUploadField ( $gridField )
{
$fileRelationName = $this -> getFileRelationName ( $gridField );
$uploadField = UploadField :: create ( $fileRelationName , '' )
-> setForm ( $gridField -> getForm ())
-> setConfig ( 'previewMaxWidth' , 20 )
-> setConfig ( 'previewMaxHeight' , 20 )
-> setConfig ( 'changeDetection' , false )
2014-06-17 11:48:47 +02:00
2014-05-27 10:53:45 +02:00
-> setRecord ( DataObject :: create ()) // avoid UploadField to get auto-config from the Page (e.g fix allowedMaxFileNumber)
2014-04-05 23:31:45 +02:00
-> setTemplate ( 'GridFieldBulkUploadField' )
2014-04-05 18:54:50 +02:00
-> setDownloadTemplateName ( 'colymba-bulkuploaddownloadtemplate' )
-> setConfig ( 'url' , $gridField -> Link ( 'bulkupload/upload' ))
-> setConfig ( 'urlSelectDialog' , $gridField -> Link ( 'bulkupload/select' ))
-> setConfig ( 'urlAttach' , $gridField -> Link ( 'bulkupload/attach' ))
-> setConfig ( 'urlFileExists' , $gridField -> Link ( 'bulkupload/fileexists' ))
;
2014-09-06 12:39:39 +02:00
//set UploadField config
foreach ( $this -> ufConfig as $key => $val )
{
$uploadField -> setConfig ( $key , $val );
}
2014-04-05 18:54:50 +02:00
2014-09-06 12:39:39 +02:00
//UploadField setup
foreach ( $this -> ufSetup as $fn => $param )
{
$uploadField -> { $fn }( $param );
}
2014-04-05 18:54:50 +02:00
2014-09-06 12:39:39 +02:00
//UploadField Validator setup
foreach ( $this -> ufValidatorSetup as $fn => $param )
{
$uploadField -> getValidator () -> { $fn }( $param );
}
2012-08-11 00:18:00 +02:00
2014-04-05 18:54:50 +02:00
return $uploadField ;
}
2014-04-13 18:38:08 +02:00
2014-05-04 16:12:05 +02:00
/* **********************************************************************
* GridField_HTMLProvider
* */
2014-04-05 18:54:50 +02:00
/**
2014-04-13 18:38:08 +02:00
* HTML to be embedded into the GridField
*
2014-04-05 18:54:50 +02:00
* @ param GridField $gridField
* @ return array
*/
public function getHTMLFragments ( $gridField )
{
// permission check
if ( ! singleton ( $gridField -> getModelClass ()) -> canEdit () )
2013-04-16 20:33:50 +02:00
{
2014-04-05 18:54:50 +02:00
return array ();
2013-04-16 20:33:50 +02:00
}
2014-04-06 18:55:25 +02:00
// check BulkManager exists
$bulkManager = $gridField -> getConfig () -> getComponentsByType ( 'GridFieldBulkManager' );
2014-04-05 23:31:45 +02:00
// upload management buttons
2014-04-13 18:56:12 +02:00
$finishButton = FormAction :: create ( 'Finish' , _t ( 'GRIDFIELD_BULK_UPLOAD.FINISH_BTN_LABEL' , 'Finish' ))
2014-04-05 23:31:45 +02:00
-> addExtraClass ( 'bulkUploadFinishButton' )
-> setAttribute ( 'data-icon' , 'accept' )
2014-04-06 14:51:15 +02:00
-> setUseButtonTag ( true );
2014-04-05 23:31:45 +02:00
2014-04-13 18:56:12 +02:00
$clearErrorButton = FormAction :: create ( 'ClearError' , _t ( 'GRIDFIELD_BULK_UPLOAD.CLEAR_ERROR_BTN_LABEL' , 'Clear errors' ))
2014-04-06 13:30:54 +02:00
-> addExtraClass ( 'bulkUploadClearErrorButton' )
-> setAttribute ( 'data-icon' , 'arrow-circle-double' )
2014-04-06 14:51:15 +02:00
-> setUseButtonTag ( true );
2014-04-06 13:30:54 +02:00
2014-05-14 14:46:45 +02:00
if ( count ( $bulkManager ) )
2014-04-05 23:31:45 +02:00
{
2014-04-13 18:56:12 +02:00
$cancelButton = FormAction :: create ( 'Cancel' , _t ( 'GRIDFIELD_BULK_UPLOAD.CANCEL_BTN_LABEL' , 'Cancel' ))
2014-04-06 18:55:25 +02:00
-> addExtraClass ( 'bulkUploadCancelButton ss-ui-action-destructive' )
-> setAttribute ( 'data-icon' , 'decline' )
-> setAttribute ( 'data-url' , $gridField -> Link ( 'bulkupload/cancel' ))
-> setUseButtonTag ( true );
2014-05-22 15:57:09 +02:00
$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' ))
-> addExtraClass ( 'bulkUploadEditButton' )
-> setAttribute ( 'data-icon' , 'pencil' )
-> setAttribute ( 'data-url' , $gridField -> Link ( 'bulkupload/edit' ))
-> setUseButtonTag ( true );
} else {
$editAllButton = '' ;
}
2014-04-06 18:55:25 +02:00
}
else {
$cancelButton = '' ;
2014-04-05 23:31:45 +02:00
$editAllButton = '' ;
}
// get uploadField + inject extra buttons
$uploadField = $this -> bulkUploadField ( $gridField );
2014-04-06 13:30:54 +02:00
$uploadField -> FinishButton = $finishButton ;
$uploadField -> CancelButton = $cancelButton ;
$uploadField -> EditAllButton = $editAllButton ;
$uploadField -> ClearErrorButton = $clearErrorButton ;
2014-04-05 23:31:45 +02:00
2014-04-05 18:54:50 +02:00
$data = ArrayData :: create ( array (
2014-04-05 23:31:45 +02:00
'Colspan' => count ( $gridField -> getColumns ()),
'UploadField' => $uploadField -> Field () // call ->Field() to get requirements in right order
2013-04-16 20:33:50 +02:00
));
2014-04-05 18:54:50 +02:00
Requirements :: css ( BULKEDITTOOLS_UPLOAD_PATH . '/css/GridFieldBulkUpload.css' );
Requirements :: javascript ( BULKEDITTOOLS_UPLOAD_PATH . '/javascript/GridFieldBulkUpload.js' );
Requirements :: javascript ( BULKEDITTOOLS_UPLOAD_PATH . '/javascript/GridFieldBulkUpload_downloadtemplate.js' );
2014-04-13 18:56:12 +02:00
Requirements :: add_i18n_javascript ( BULKEDITTOOLS_PATH . '/lang/js' );
2012-07-16 22:39:01 +02:00
return array (
2014-04-05 18:54:50 +02:00
'header' => $data -> renderWith ( 'GridFieldBulkUpload' )
2012-07-16 22:39:01 +02:00
);
}
2014-04-13 18:38:08 +02:00
2014-05-04 16:12:05 +02:00
/* **********************************************************************
* GridField_URLHandler
* */
2012-07-16 22:39:01 +02:00
/**
2014-04-13 18:38:08 +02:00
* Component URL handlers
*
2012-07-16 22:39:01 +02:00
* @ param GridField $gridField
2012-07-18 14:23:51 +02:00
* @ return array
2012-07-16 22:39:01 +02:00
*/
public function getURLHandlers ( $gridField ) {
2014-04-06 19:04:12 +02:00
return array (
'bulkupload' => 'handleBulkUpload'
);
2012-07-16 22:39:01 +02:00
}
2014-05-11 12:32:21 +02:00
2012-07-16 22:39:01 +02:00
/**
2012-07-18 14:23:51 +02:00
* Pass control over to the RequestHandler
*
* @ param GridField $gridField
* @ param SS_HTTPRequest $request
* @ return mixed
2012-07-16 22:39:01 +02:00
*/
public function handleBulkUpload ( $gridField , $request )
{
2014-04-06 19:04:12 +02:00
$controller = $gridField -> getForm () -> Controller ();
$handler = new GridFieldBulkUpload_Request ( $gridField , $this , $controller );
2012-07-16 22:39:01 +02:00
return $handler -> handleRequest ( $request , DataModel :: inst ());
}
2014-05-22 15:57:09 +02:00
}