2013-10-31 1 views
0

현재 수십 개의 임의 헤더 이미지가있는 Silverstripe 3.1 웹 사이트에서 작업하고 있습니다.Silverstripe의 자산 하위 폴더에 dataobjectset을 자동으로 채우기

"HeaderImage"데이터 객체 세트를 쉽게 설정할 수 있지만 수동으로 CMS를 통해 모든 이미지를 추가하는 것은 지루한 두통입니다.

폴더의 내용으로 데이터 개체 집합을 자동으로 채우는 간단한 방법이 있습니까?

예를 들어/assets/header-images /의 모든 이미지 파일은 자동으로 "HeaderImage"개체가됩니다. 이미지를 쉽게 추가하거나 제거 할 수 있기를 원합니다.

모든 아이디어를 얻을 수 있습니다.

+0

잘 모르겠지만 GridFieldBulkEditingTools 모듈 (https://github.com/colymba/GridFieldBulkEditingTools)을 사용하여 여러 이미지를 한 번에 업로드 할 수 있습니다. 보세요. – 3dgoo

+0

@ 3dgoo 솔루션이 작동하면 GridFieldBulkEditingTools를 통해 업로드 한 모든 이미지가 DataObject를 만듭니다. 가장 좋은 방법은 ModelAdmin에 연결하는 것입니다. 그러나 SS가 실제로 폴더를 탐색하기를 원한다면, 빌드 작업이 그 일을 할 수도 있고, 자주 수행되어야한다면 CRON이 필요합니다. – colymba

+0

@colymba - 몇 가지 세부 사항으로 대답을 할 수 있다면 저는 이상입니다. 그것을 통해 투표 행복. – BaronGrivet

답변

1

제안 된 솔루션에 대한 몇 가지 세부 정보.

1) 추천 3dgoo @는 GridFieldBulkEditingTools 모듈을 사용하여 언급. 작곡가 "colymba/gridfield-bulk-editing-tools": "dev-master"을 통해 최신 베스트 마스터를 다운로드하십시오. 이렇게하면 많은 이미지를 업로드 할 수 있으며 각 이미지에 대한 DataObject가 만들어집니다. 일괄 업로드 버튼을 사용합니다. 여기가 ModelAdmin에서 설정해야하는 방법이다 :

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(); 
      } 
      } 

     } 
     } 
    } 
    } 

} 
:

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() 논리를 적용 했으므로 복사/붙여 넣기만으로 작동한다는 보장은 없습니다.