我目前正在开发一个拥有数十个随机标题图像的 Silverstripe 3.1 网站。
我可以轻松地设置一个“HeaderImage”数据对象集,但是通过 CMS 手动添加每个图像将是一件令人头疼的事情。
有没有一种简单的方法可以让文件夹的内容自动填充数据对象集。
例如,/assets/header-images/ 中的每个图像文件都会自动成为“HeaderImage”对象。我希望能够轻松添加或删除图像。
任何想法,将不胜感激。
我目前正在开发一个拥有数十个随机标题图像的 Silverstripe 3.1 网站。
我可以轻松地设置一个“HeaderImage”数据对象集,但是通过 CMS 手动添加每个图像将是一件令人头疼的事情。
有没有一种简单的方法可以让文件夹的内容自动填充数据对象集。
例如,/assets/header-images/ 中的每个图像文件都会自动成为“HeaderImage”对象。我希望能够轻松添加或删除图像。
任何想法,将不胜感激。
有关建议的解决方案的一些细节。
1)像@3dgoo提到的那样,使用 GridFieldBulkEditingTools 模块。通过 composer 下载最新的最佳大师"colymba/gridfield-bulk-editing-tools": "dev-master"
。这将让您上传一堆图像,并为每个图像创建一个 DataObject。使用批量上传按钮。以下是如何设置它ModelAdmin
:
class HeaderAdmin extends ModelAdmin
{
private static $managed_models = array('HeaderImage');
private static $url_segment = 'header-admin';
private static $menu_title = 'Header admin';
public function getEditForm($id = null, $fields = null)
{
$form = parent::getEditForm($id, $fields);
$gridField = $form->Fields()->fieldByName($this->sanitiseClassName('HeaderImage'));
if ( $gridField )
{
$gridField->getConfig()->addComponent(new GridFieldBulkImageUpload());
}
return $form;
}
}
2)另一个需要更多工作的解决方案是创建一个BuildTask
并整理以下逻辑run()
:
class ImportHeaderImagesTask extends BuildTask
{
protected $title = 'Import Header Images';
protected $description = 'Import Header Images......';
/**
* Check that the user has appropriate permissions to execute this task
*/
public function init()
{
if( !Director::is_cli() && !Director::isDev() && !Permission::check('ADMIN') )
{
return Security::permissionFailure();
}
parent::init();
}
/**
* Do some stuff
*/
public function run($request)
{
// this is where files are uploaded manually
$TempFTPFolder = ASSETS_PATH . '/FTP';
// This is the folder where files will be moved
$LiveFolderPath = 'assets/path/to/final/live/folder/';
$LiveFolder = DataObject::get_one('File', "Filename = '$LiveFolderPath'");
if ( file_exists( $TempFTPFolder ) && $LiveFolder->ID ) // if the FTP upload folder exist and the destination live folder exist
{
$FTPList = scandir( $TempFTPFolder ); // get the FTP folder content
foreach ($FTPList as $FileFolder)
{
$FTPFile = $TempFTPFolder . '/' . $FileFolder;
if ( is_file( $FTPFile ) ) // process files only
{
// Create File object for the live version
$NewFile = new File();
$NewFile->setParentID( $LiveFolder->ID );
$NewFile->setName( $FileFolder );
// get target name/path
$RenameTarget = $NewFile->getFullPath();
if ( $RenameTarget )
{
$moved = false;
try {
$moved = rename( $FTPFile, $RenameTarget ); // move the FTP file to the live folder
} catch (Exception $e) {}
if ( $moved )
{
$NewFile->write();
// create DataObject and add image relation
$HeaderImage = HeaderImage::create();
$HeaderImage->ImageID = $NewFile->ID;
$HeaderImage->write();
}
}
}
}
}
}
}
您可以通过dev/
url 或命令行或 CRON 作业运行此任务。请注意,我run()
从前一段时间所做的事情中调整了逻辑,因此不能保证它可以通过复制/粘贴来工作。