Dosya varlıklarını medya varlıklarına nasıl taşıyabilirim?


11

D7'den D8'e geçiş için Migrate modülünü kullanıyorum ve tüm geçişi manuel olarak kodda yazıyorum (geçişte daha ayrıntılı kontrol istedim, yerleşik D7 migrate modülünü kullanmak yerine).

Aşağıdaki yapıya sahibim: D7 sitesi, görüntülerin Dosya varlıkları olarak saklandığı bir görüntü alanına sahiptir. D8 sitesinde, görüntü alanı bir Medya varlığına referans varlıktır (ve Medya varlığının bir Görüntü alanı vardır.)

Başlangıçta Görüntüler taşıma işlemim için aşağıdakiler vardı:

id: image_files

source:
  plugin: legacy_images
  constants:
    source_base_path: http://example.com/

destination:
  plugin: 'entity:file'

process:
  fid: fid
  filename: filename
  source_full_path:
    -
      plugin: concat
      delimiter: /
      source:
    -     constants/source_base_path
    -     uri
    -
      plugin: urlencode
  uri:
    plugin: file_copy
    source:
      - '@source_full_path'
      - uri
  filemime: filemime
  status: status

Makale düğümü taşıma dosyamda şunları vardı:

'field_article_image/target_id':
plugin: migration
migration: image_files
source: field_article_image 

ama bunun işe yaramayacağını fark ettim. İmage_files geçişinden gelen target_id, medya varlık kimlikleri değil, gerçekten Dosya Varlığı Kimlikleriydi. İdeal dünyada, bu orta adımı oluşturacak üçüncü bir geçiş oluşturmanın ve dosya varlıklarını Medya Varlıkları'na geçirmenin ve ardından bu geçişi Makaleler geçişiyle eşlemenin bir yolunu bulmak istiyorum. Ancak bunu yapmanın iyi bir yolunu bulamıyorum.

Plan B, resim geçişi için manuel olarak dosya varlıkları oluşturacak, medya varlıklarına ekleyecek ve bu geçişi Makalelere aktaracak bir işlem eklentisi oluşturmak olacaktır (bu, orta adımı kaldırır). Ancak bu, Medya varlıkları geri alınabilirken Dosya Varlıkları'nın geri alınamayacağı anlamına gelir.

Yanıtlar:


4

Biraz farklı yapmayı seçtim - düzenli bir dosya içe aktarma oluşturdum, bu geçişi medya varlığı referans alanım için kaynak olarak ayarladım ve daha sonra FID'yi yeni medya target_id'e çevirmek için ikinci bir işlem eklentisi 'MediaGenerate' uyguladım

<?php

namespace Drupal\my_migration\Plugin\migrate\process;

use Drupal\media_entity\Entity\Media;
use Drupal\migrate\MigrateExecutableInterface;
use Drupal\migrate\MigrateException;
use Drupal\migrate\Row;
use Drupal\migrate_plus\Plugin\migrate\process\EntityGenerate;

/**
 * Generate a media entity with specified metadata.
 *
 * This plugin is to be used by migrations which have media entity reference
 * fields.
 *
 * Available configuration keys:
 * - destinationField: the name of the file field on the media entity.
 *
 * @code
 * process:
 *   'field_files/target_id':
 *     -
 *       plugin: migration
 *       source: files
 *     -
 *       plugin: media_generate
 *       destinationField: image
 *
 * @endcode
 *
 * @MigrateProcessPlugin(
 *   id = "media_generate"
 * )
 */
class MediaGenerate extends EntityGenerate {

/**
* {@inheritdoc}
*/
public function transform($value, MigrateExecutableInterface $migrateExecutable, Row $row, $destinationProperty) {
if (!isset($this->configuration['destinationField'])) {
  throw new MigrateException('Destination field must be set.');
}
// First load the target_id of the file referenced via the migration.
/* @var /Drupal/file/entity/File $file */
$file = $this->entityManager->getStorage('file')->load($value);

if (empty($file)) {
  throw new MigrateException('Referenced file does not exist');
}

// Creates a media entity if the lookup determines it doesn't exist.
$fileName = $file->label();
if (!($entityId = parent::transform($fileName, $migrateExecutable, $row, $destinationProperty))) {
  return NULL;
}
$entity = Media::load($entityId);

$fileId = $file->id();
$entity->{$this->configuration['destinationField']}->setValue($fileId);
$entity->save();

return $entityId;
}

}

1
DestinationField yapılandırması nedir?
dba

Tamam ben kendim anladım, medya türü varlık için alan, bu görüntü için field_media_image.
dba

Dosya alt / title özniteliklerini nasıl ele alırsınız?
mpp

Test edildi ve iyi çalışıyor, ancak "migration" eklentisi kullanımdan kaldırıldı ve en son sürümlerimde zaten çalışmadığı için "migration_lookup" eklentisini kullanmanız gerekecektir. Aşağıdakiler benim için kullanıcı resimlerini içe aktarmak için çalıştı: eklenti: migration_lookup migration: my_file_migration kaynak: picture Ayrıca, paketleri olmayan varlıkları (kullanıcı resimleri gibi) geçirirseniz, muhtemelen buradaki yamaya ihtiyacınız olacaktır: drupal.org/project/migrate_plus/issues / 2787219 , aksi takdirde "entity_lookup eklentisi bir value_key gerektiriyor, hiçbiri bulunamadı." Hatası alıyorsunuz. göç.
Mirsoft

Birisi bu konuda $ entityId'ın nasıl bulunduğunu açıklayabilir mi?
Benimdir

2

Kabul edilen cevabı çok takdir ettim, ancak zaten bazı tanımlanmamış tanımları vardı ve alt ve başlık resim özelliklerini göndermeyi desteklemedi. Böylece, bunu desteklemeyi ve en son Drupal 8.6.x ile sorunsuz çalışmayı biraz geliştirdim. MediaGenerate.php kodu (uygun Yaml sözdizimi doc yorumunun içindedir):

<?php

namespace Drupal\my_migration\Plugin\migrate\process;

use Drupal\media\Entity\Media;
use Drupal\migrate\MigrateExecutableInterface;
use Drupal\migrate\MigrateException;
use Drupal\migrate\Row;
use Drupal\migrate_plus\Plugin\migrate\process\EntityGenerate;

/**
 * Generate a media entity with specified metadata.
 *
 * This plugin is to be used by migrations which have media entity reference
 * fields.
 *
 * Available configuration keys:
 * - destinationField: the name of the file field on the media entity.
 *
 * @code
 * process:
 *   'field_files/target_id':
 *     -
 *       plugin: migration_lookup
 *       migration: my_file_migration
 *       source: field_image/0/fid
 *     -
 *       plugin: media_generate
 *       destinationField: image
 *       imageAltSource: field_image/0/alt
 *       imageTitleSource: field_image/0/title
 *
 * @endcode
 *
 * If image_alt_source and/or image_title_source configuration parameters
 * are provided, alt and/or title image properties will be fetched from provided
 * source fields (if available) and pushed into media entity
 *
 * @MigrateProcessPlugin(
 *   id = "media_generate"
 * )
 */
class MediaGenerate extends EntityGenerate {

  /**
   * {@inheritdoc}
   */
  public function transform($value, MigrateExecutableInterface $migrateExecutable, Row $row, $destinationProperty) {
    if (!isset($this->configuration['destinationField'])) {
      throw new MigrateException('Destination field must be set.');
    }

    // First load the target_id of the file referenced via the migration.
    /* @var /Drupal/file/entity/File $file */
    $file = $this->entityManager->getStorage('file')->load($value);

    if (empty($file)) {
      throw new MigrateException('Referenced file does not exist');
    }

    // Creates a media entity if the lookup determines it doesn't exist.
    $fileName = $file->label();
    if (!($entityId = parent::transform($fileName, $migrateExecutable, $row, $destinationProperty))) {
      return NULL;
    }

    $entity = Media::load($entityId);

    $fileId = $file->id();

    $destinationFieldValues = $entity->{$this->configuration['destinationField']}->getValue();
    $destinationFieldValues[0]['target_id'] = $fileId;

    $this->insertPropertyIntoDestinationField($destinationFieldValues, $row, 'alt', 'imageAltSource');
    $this->insertPropertyIntoDestinationField($destinationFieldValues, $row, 'title', 'imageTitleSource');

    $entity->{$this->configuration['destinationField']}->setValue($destinationFieldValues);
    $entity->save();

    return $entityId;
  }

  protected function insertPropertyIntoDestinationField(array &$destinationFieldValues, Row $row, $propertyKey, $configurationKey) {
    // Set alt and title into media entity if not empty
    if (isset($this->configuration[$configurationKey])) {
      $propertyValue = $row->getSourceProperty($this->configuration[$configurationKey]);
      if (!empty($propertyValue)) {
        $destinationFieldValues[0][$propertyKey] = $propertyValue;
      }
    }
  }
}

2

Medya bir varlık türü olduğundan, kendi taşıma işlemini oluşturmanız gerekir. Dosya tablosundan yeni bir kaynak oluşturabilirsiniz. İşte bir örnek

https://gist.github.com/jibran/8e7cd2319e873858dd49a272227a4fd2

Sonra migration_lookupbunun gibi alanları eşleştirebilirsiniz.

field_d8_media_image/0/target_id:
  plugin: migration_lookup
  migration: my_media_image
  source: field_d7_image/0/fid

0

Drupal 8'deki dosyaları medya varlıklarına taşımak istiyorsanız şu modülü kullanabilirsiniz: https://www.drupal.org/project/migrate_file_to_media

Otomatik olarak medya referans alanlarını yaratan bir komut dosyası vardır. Ayrıca, ikili bir karma kullanarak yinelenen görüntüleri algılar. Ve çevirileri destekler.


1
Bu modül varsayılan olarak yalnızca D8 sürümleri arasındaki geçişi çözer. Soru daha çok D7'den D8'e geçişle ilgilidir, bu nedenle modül kolayca kullanılamaz (D7'deki ekli dosyalardan veri okuyacak olan MediaEntityGenerator.php'ye ek bir kaynak eklentisinin oluşturulması gerekebilir). Ayrıca temel bir fark vardır: migrate_file_to_media modülü yalnızca belirli bir varlığa bağlı dosyaları dönüştürür (= adım1'de varlık_türü ve paket gereklidir), kabul edilen çözümde bu gereksinim yoktur ve öncelikle tüm dosya varlıklarını (D7) 'den taşır. kaynak.
Mirsoft
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.