การโอนย้ายด้วยโมดูลโอนย้าย


8

ฉันใช้ Drupal 7 และโมดูลโยกย้ายล่าสุด ฉันกำลังพยายามสร้างคลาสเพื่อโอนย้ายผลิตภัณฑ์จาก OpenCart DB ไปยังไซต์ D7 ใหม่ของฉัน ฉันหา SQL ทั้งหมดที่ฉันต้องการและได้โปรแกรมส่วนใหญ่แล้ว แต่ฉันมีปัญหาเล็กน้อยที่จะเข้าใจว่าฉันจะทำหมวดหมู่อย่างไร

เป้าหมายการย้ายถิ่นของฉันคือ Ubercart

สิ่งที่ฉันพยายามเข้าใจอยู่ในโมดูล migrate_example ซึ่งเป็น submodule of Migrate โดยเฉพาะฉันกำลังดูไฟล์ wine.inc ที่คลาส WineWineMigration ฉันพยายามที่จะเข้าใจคำว่าการโยกย้าย

ฉันมีสองรายการที่จะกลายเป็นข้อกำหนดด้านอนุกรมวิธานในผลิตภัณฑ์ Ubercart อันดับแรกคือหมวดหมู่ ฉันได้ตั้งค่าหมวดหมู่ด้วยตนเองดังนั้นเมื่อฉันนำรายการเหล่านั้นมา (โดยใช้ GROUP_CONCAT SQL func) ฉันจะมี ID จำนวนมากที่ฉันจะจับคู่โดยใช้อาร์เรย์ที่จะแปลง ID ทั้งหมด ไม่เป็นไร แต่เมื่อฉันดูข้อมูล BestWith ของพวกเขาว่าพวกเขากำลังโยกย้ายก็แสดงว่ากำลังใช้คลาส WineBestWith ด้านบนเพื่อนำเข้าคำศัพท์

ฉันสับสนเพราะสิ่งนี้ดูเหมือนว่าจะมีการย้ายคำบางคำที่สอง นั่นคือสิ่งที่เกิดขึ้น? นอกจากนี้ฉันจะใส่อาเรย์การแม็พไว้ในชั้นเรียนการย้ายถิ่นฐานระยะนี้หรือไม่

สิ่งต่อไปที่ฉันต้องทำคือจัดการกับแท็ก ใน OpenCart เรามีแท็กอิสระมากมาย และเมื่อฉันสร้างผลิตภัณฑ์ด้วยตนเองใน Ubercart ฉันมีฟิลด์เติมข้อความอัตโนมัติสำหรับแท็ก ในฟิลด์นั้นฉันสามารถใส่รายการคำที่คั่นด้วยเครื่องหมายจุลภาคและสร้างหลายคำ ฉันสามารถทำสิ่งเดียวกันในโมดูลโอนย้ายได้หรือไม่ ฉันสามารถแมปฟิลด์ไปยังรายการคำที่คั่นด้วยเครื่องหมายจุลภาคได้หรือไม่ จะเพิ่มแท็กในแต่ละผลิตภัณฑ์หรือไม่

คำตอบ:


14

ตอนนี้ฉันกำลังแก้ไขปัญหาเดียวกันอยู่ดังนั้นฉันจึงเข้าใจความสับสนของคุณ คุณมีคำถามมากมาย แต่ฉันคิดว่าพวกเขาสามารถสรุปเป็นคำถามเอกพจน์:

โมดูลโอนย้ายจัดการการโยกย้ายฐานข้อมูลปกติในการติดตั้ง Drupal อย่างไร

ไม่ตรงไปตรงมาแน่นอน แต่นี่เป็นความเข้าใจของฉันเกี่ยวกับวิธีการทำงาน เราจะเริ่มจากด้านบน (WineWineMigration) ลงไปและถามคำถามขณะที่เราไป

เราเริ่มต้นด้วยการดูรหัสที่ด้านบนของWineWineMigrationชั้นเรียน

...
$this->dependencies = array('WineVariety', 'WineRegion',
  'WineBestWith', 'WineUser', 'WineProducer');
...

สิ่งนี้บอกโมดูลการย้ายข้อมูลว่าในการโยกย้ายเนื้อหาไวน์ของคุณการโยกย้ายที่ขึ้นอยู่กับ - WineVariety, WineRegion, WineBestWith, WineUser, WineProduce - จะต้องเสร็จสิ้นก่อน

ดังนั้นสิ่งที่เราได้เรียนรู้ว่านี่คือการโยกย้ายอาจจะขึ้นอยู่กับการโยกย้ายอื่น

ต่อไปเรามีการทำแผนที่ระหว่างตารางที่เก็บข้อมูลไวน์ฐานและโหนด Drupal ในปัจจุบัน:

$this->map = new MigrateSQLMap($this->machineName,
  array(
    'wineid' => array(
      'type' => 'int',
      'unsigned' => TRUE,
      'not null' => TRUE,
      'description' => 'Wine ID',
      'alias' => 'w',
    )
  ),
  MigrateDestinationNode::getKeySchema()
);

นี่เป็นเรื่องที่ตรงไปตรงมาดังนั้นหากคุณต้องการคำชี้แจงฉันจะให้

ฉันจะข้ามสิ่งระหว่างกาลบางอย่างที่ไม่เกี่ยวข้องกับการจัดหมวดหมู่และวัตถุไวน์ต่าง ๆ

ตอนนี้เราไปที่การแมปฟิลด์ สังเกต:

// Mapped fields
$this->addFieldMapping('title', 'name')
     ->description(t('Mapping wine name in source to node title'));
$this->addFieldMapping('uid', 'accountid')
     ->sourceMigration('WineUser')
     ->defaultValue(1);
// TIP: By default, term relationship are assumed to be passed by name.
// In this case, the source values are IDs, so we specify the relevant
// migration (so the tid can be looked up in the map), and tell the term
// field handler that it is receiving tids instead of names
$this->addFieldMapping('migrate_example_wine_varieties', 'variety')
     ->sourceMigration('WineVariety')
     ->arguments(array('source_type' => 'tid'));
$this->addFieldMapping('migrate_example_wine_regions', 'region')
     ->sourceMigration('WineRegion')
     ->arguments(array('source_type' => 'tid'));
$this->addFieldMapping('migrate_example_wine_best_with', 'best_with')
     ->separator(',')
     ->sourceMigration('WineBestWith')
     ->arguments(array('source_type' => 'tid'));
$this->addFieldMapping('field_migrate_example_wine_ratin', 'rating');
$this->addFieldMapping('field_migrate_example_top_vintag', 'best_vintages');

ดูว่ามันพูดว่า:

->sourceMigration(...)

สิ่งนี้บ่งชี้ถึงการโยกย้ายที่เพื่อแมปฟิลด์นี้การโยกย้ายอื่นจะต้องได้รับความพึงพอใจก่อน ฉันเชื่อว่านี่เป็น "การโยกย้ายครั้งที่สอง" ที่คุณพูดถึง ลองใช้การregionแมปฟิลด์เป็นตัวอย่างที่นี่ ทำลายมันลง ...

$this->addFieldMapping('migrate_example_wine_regions', 'region')
     ->sourceMigration('WineRegion')
     ->arguments(array('source_type' => 'tid'));

สิ่งนี้บอกว่าขอบเขตหมวดหมู่ในฐานข้อมูลต้นทางถูกแมปกับคำศัพท์ของภูมิภาค เนื่องจากความคิดเห็น TIP ระบุในโค้ดการแมปฟิลด์ฟิลด์จะถือว่าการแมปนั้นทำโดยยึดตาม field_names แต่เนื่องจากเราขึ้นอยู่กับการย้ายข้อมูลรองตามที่คุณวางไว้เราจำเป็นต้องระบุการโยกย้ายที่ขึ้นอยู่กับและแนะนำให้ ใช้ tids แทนชื่อฟิลด์

สวยมากสำหรับทุกตารางปกติที่คุณมีในฐานข้อมูลต้นทางของคุณคุณจะต้องระบุการโยกย้ายสำหรับแต่ละคนและจากนั้นในการแมปฟิลด์ที่เกี่ยวข้องที่เกี่ยวข้องกับตารางเหล่านั้นคุณจะระบุการโยกย้ายที่ต้องพึ่งพาในการโทรแมปฟิลด์ของคุณ เช่นเดียวกับการประกาศการย้ายถิ่นที่ขึ้นอยู่กับจุดเริ่มต้นของการโยกย้ายแต่ละครั้ง

ฉันหวังว่านี่จะช่วยได้. ฉันไม่เข้าใจตัวเองอย่างเต็มที่ดังนั้นฉันจึงใช้คำถามนี้เป็นโอกาสในการเพิ่มความเข้าใจเกี่ยวกับวิธีการย้ายข้อมูลที่เกี่ยวข้องกับฐานข้อมูล เมื่อฉันเรียนรู้มากขึ้นฉันจะอัปเดตคำตอบของฉันตามนั้น


1
แจ้งให้เราทราบหากคุณต้องการสิ่งใดชี้แจง โพสต์เป็นบิตของการถ่ายโอนข้อมูลสมองฉันรู้ ...
Lester Peabody
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.