0

私は現在、多数のランダムなヘッダー画像を持つ Silverstripe 3.1 Web サイトに取り組んでいます。

「HeaderImage」databobjectset は簡単にセットアップできますが、CMS を介してすべての画像を手動で追加するのは面倒です。

フォルダの内容によって自動的にデータ オブジェクト セットを設定する簡単な方法はありますか。

たとえば、/assets/header-images/ 内のすべての画像ファイルは自動的に「HeaderImage」オブジェクトになります。画像を簡単に追加または削除できるようにしたい。

どんなアイデアでも大歓迎です。

4

1 に答える 1

1

提案されたソリューションに関するいくつかの詳細。

1) @3dgooのように、GridFieldBulkEditingTools モジュールを使用します。composer 経由で best の最新マスターをダウンロードし"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()少し前に行ったことからロジックを採用したため、コピー/貼り付けだけで機能することは保証されていないことに注意してください。

于 2013-11-01T08:17:23.597 に答える