আমি কীভাবে ফাইল সত্ত্বাকে মিডিয়া সত্তায় স্থানান্তর করব?


10

আমি ডি 7 থেকে ডি 8 মাইগ্রেশনের জন্য মাইগ্রেট মডিউলটি ব্যবহার করছি এবং কোডটিতে পুরো মাইগ্রেশনটি ম্যানুয়ালি লিখছি (মাইগ্রেশনের উপর আরও গ্রানুয়াল নিয়ন্ত্রণ চেয়েছি বলে D7 মাইগ্রেট মডিউলটি অন্তর্নির্মিত ব্যবহার না করে))

আমার নিম্নলিখিত কাঠামো রয়েছে: ডি 7 সাইটের একটি চিত্র ক্ষেত্র রয়েছে যেখানে চিত্র সত্ত্বা হিসাবে ফাইল সঞ্চিত থাকে। ডি 8 সাইটে, চিত্র ক্ষেত্রটি কোনও মিডিয়া সত্তার সত্তার উল্লেখ and

মূলত, আমার চিত্রগুলি স্থানান্তরের জন্য আমার কাছে নিম্নলিখিতগুলি ছিল:

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

আমার নিবন্ধ নোড মাইগ্রেশন ফাইলের ভিতরে, আমার নিম্নলিখিতগুলি ছিল:

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

কিন্তু আমি বুঝতে পারি যে এটি কাজ করবে না। ইমেজ_ফাইলগুলি স্থানান্তর থেকে আসা টার্গেট_আইডিটি আসলে ফাইল সত্ত্বার আইডি ছিল, মিডিয়া সত্তা আইডির নয়। আদর্শ বিশ্বে, আমি একটি তৃতীয় স্থানান্তর তৈরির একটি উপায় খুঁজতে চাই, যা এই মধ্যম পদক্ষেপটি তৈরি করবে এবং ফাইল সত্ত্বাকে মিডিয়া সত্তায় স্থানান্তরিত করবে এবং তারপরে নিবন্ধ মাইগ্রেশনে মাইগ্রেশনটি ম্যাপ করবে। যাইহোক, আমি এটি করার একটি ভাল উপায় বের করতে পারি না।

প্ল্যান বিটি হ'ল চিত্রের মাইগ্রেশনের জন্য একটি প্রক্রিয়া প্লাগইন তৈরি করা হবে যা ম্যানুয়ালি ফাইল সত্ত্বা তৈরি করবে, মিডিয়া সত্তায় তাদের সংযুক্ত করবে এবং সেই মাইগ্রেশনকে নিবন্ধগুলিতে সরিয়ে দেবে (এটি মধ্যবর্তী পদক্ষেপটি সরিয়ে দেয়)। এর অর্থ হ'ল, যদিও মিডিয়া সত্তাগুলি আবার ফিরিয়ে আনা যায়, ফাইল সত্তা পারেনি।

উত্তর:


4

আমি এটিকে কিছুটা আলাদা করতে চাইছি - আমি একটি নিয়মিত ফাইল আমদানি তৈরি করি, আমার মিডিয়া সত্তা রেফারেন্স ফিল্ডের উত্স হিসাবে সেই স্থানান্তরকে সেট করি এবং তারপরে নতুন মিডিয়া টার্গেট_আইডিতে এফআইডি অনুবাদ করতে একটি দ্বিতীয় প্রক্রিয়া প্লাগইন 'মিডিয়াজেনেট' প্রয়োগ করি

<?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
গন্তব্যফিল্ড কনফিগারেশন কী?
ডিবিএ

ঠিক আছে আমি নিজেই এটি আবিষ্কার করেছি, এটি মিডিয়া টাইপের সম্পদের ক্ষেত্রে ক্ষেত্র, চিত্রটির জন্য এটি field_media_image
ডিবিএ

আপনি কীভাবে ফাইলটি Alt / শিরোনামের বৈশিষ্ট্যগুলি পরিচালনা করবেন?
এমপিপি

পরীক্ষিত এবং এটি দুর্দান্তভাবে কাজ করে, তবে আপনাকে সম্ভবত "মাইগ্রেশন_লুপআপ" প্লাগইন ব্যবহার করতে হবে কারণ "মাইগ্রেশন" প্লাগইনটি অবনতিযুক্ত এবং ইতিমধ্যে আমার সর্বশেষ সংস্করণগুলিতে কাজ করে নি। নিম্নলিখিত ব্যবহারকারীর ছবি আমদানি করার জন্য আমার পক্ষে কাজ করেছে: প্লাগইন: মাইগ্রেশন_লুপআপ মাইগ্রেশন: মাই_ফাইল_ইমিগ্রেশন উত্স: চিত্র এছাড়াও, আপনি যদি বান্ডিল ছাড়াই সত্ত্বা স্থানান্তর করেন (ব্যবহারকারীর ছবিগুলির মতো) তবে আপনার সম্ভবত এখান থেকে প্যাচ দরকার হবে: drupal.org/project/migrate_plus/issues / 2787219 , অন্যথায় আপনি একটি ত্রুটি পেয়েছেন "সত্তা_লুপআপ প্লাগইনটির একটি মান_কি দরকার, কোনওটিই উপস্থিত নেই।" অভিবাসন উপর
মিরসফ্ট

কেউ দয়া করে ব্যাখ্যা করতে পারেন যে এতে কীভাবে সত্ত্বা পাওয়া যায়?
টাকাপয়সা

2

আমি গৃহীত উত্তরের প্রচুর প্রশংসা করেছি, তবে এর ইতিমধ্যে কিছু অবমূল্যায়িত সংজ্ঞা ছিল এবং এটি Alt এবং শিরোনাম চিত্রের বৈশিষ্ট্যগুলি পোস্ট করা সমর্থন করে না। সুতরাং, আমি এটি সমর্থন এবং সাম্প্রতিক দ্রুপাল 8.6.x সঙ্গে সুচারুভাবে কাজ করতে কিছুটা বাড়িয়েছি এখানে মিডিয়াজেনারেট.এফপি কোড (উপযুক্ত ইয়ামল সিনট্যাক্স ডকের মন্তব্যে রয়েছে):

<?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

মিডিয়া কোনও সত্তার ধরণ হিসাবে আপনার নিজস্ব স্থানান্তর তৈরি করা উচিত। আপনি ফাইল টেবিল থেকে একটি নতুন উত্স তৈরি করতে পারেন। এখানে একটি উদাহরণ

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

তারপরে আপনার সাথে migration_lookupক্ষেত্রগুলি ম্যাপ করতে পারেন।

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

0

আপনি যদি মিডিয়া সত্তায় দ্রুপাল 8-এ ফাইলগুলি স্থানান্তর করতে চান তবে আপনি এই মডিউলটি ব্যবহার করতে পারেন: https://www.drupal.org/project/migrate_file_to_media

এটিতে একটি ড্রশ স্ক্রিপ্ট রয়েছে যা স্বয়ংক্রিয়ভাবে মিডিয়া রেফারেন্স ক্ষেত্র তৈরি করে। অতিরিক্তভাবে এটি বাইনারি হ্যাশ ব্যবহার করে সদৃশ চিত্রগুলি সনাক্ত করে। এবং এটি অনুবাদগুলি সমর্থন করে।


1
এই মডিউলটি ডিফল্টরূপে কেবল ডি 8 সংস্করণের মধ্যে স্থানান্তর সমাধান করে। প্রশ্নটি ডি 7 থেকে ডি 8-তে স্থানান্তরের মতো, যাতে মডিউলটি সহজেই ব্যবহার করা যায় না (মিডিয়াএন্টিটি জেনারেটর.এফপি-তে একটি অতিরিক্ত উত্স প্লাগইন যা ডি 7 এ সংযুক্ত ফাইলগুলি থেকে ডেটা পড়তে পারে সম্ভবত তৈরি করার প্রয়োজন হবে)। এর মধ্যে একটি মৌলিক পার্থক্য রয়েছে: মাইগ্রিট_ফাইল_ টু_মিডিয়া মডিউল কেবল নির্দিষ্ট সত্তার সাথে সংযুক্ত ফাইলগুলিকে রূপান্তর করে (= অস্তিত্ব_প্রকার এবং বান্ডেলটি ধাপ 1 এ প্রয়োজনীয়), তবে স্বীকৃত সমাধানটির এই প্রয়োজন নেই এবং এটি প্রথমে (ডি 7) থেকে সমস্ত ফাইল সত্তা স্থানান্তর করে rates সূত্র.
মিরসোফ্ট
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.