使用Silverstripe中资产子文件夹的内容自动填充dataobjectset

使用Silverstripe中资产子文件夹的内容自动填充dataobjectset,silverstripe,Silverstripe,我目前正在一个Silverstripe 3.1网站上工作,该网站有几十个随机标题图像 我可以很容易地设置一个“HeaderImage”数据库对象集,但是通过CMS手动添加每个图像将是一个乏味的难题 有没有一种简单的方法可以让dataobjectset由文件夹的内容自动填充 例如,/assets/header images/中的每个图像文件都会自动成为“HeaderImage”对象。我希望能够轻松地添加或删除图像 如果您有任何想法,我们将不胜感激。有关建议解决方案的详细信息 1)与前面提到的@3d

我目前正在一个Silverstripe 3.1网站上工作,该网站有几十个随机标题图像

我可以很容易地设置一个“HeaderImage”数据库对象集,但是通过CMS手动添加每个图像将是一个乏味的难题

有没有一种简单的方法可以让dataobjectset由文件夹的内容自动填充

例如,/assets/header images/中的每个图像文件都会自动成为“HeaderImage”对象。我希望能够轻松地添加或删除图像


如果您有任何想法,我们将不胜感激。

有关建议解决方案的详细信息

1)与前面提到的@3dgoo类似,使用GridFieldBulkEditingTools模块。通过composer
“colymba/gridfield批量编辑工具”:“dev master”
下载最新的best master。这将允许您上传一组图像,并为每个图像创建一个数据对象。使用批量上传按钮。以下是如何在
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()中整理逻辑。


您可以通过
dev/
url或通过命令行或CRON作业运行此任务。请注意,我修改了前一段时间所做的操作中的
run()
逻辑,因此不能保证仅通过复制/粘贴就可以正常工作。

据我所知,这并非如此,但您可以使用GridFieldBulkEditingTools模块一次上载多个图像:。值得一看。@3dgoo解决方案会起作用,通过GridFieldBulkEditingTools上传的每个图像都会创建一个数据对象。最好的方法是将它连接到ModelAdmin。但是如果你真的想让SS浏览文件夹,一个构建任务可以完成这项工作,如果必须经常完成,一个CRON…@colymba-如果你能用一些细节来回答,我非常乐意投票通过。
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();
            }
          }

        }
      }
    }
  }

}