माइग्रेट मॉड्यूल के साथ माइग्रेट करना


8

मैं Drupal 7 और नवीनतम Migrate मॉड्यूल का उपयोग कर रहा हूं। मैं एक OpenCart DB से उत्पादों को अपने नए D7 साइट में स्थानांतरित करने के लिए एक वर्ग बनाने की कोशिश कर रहा हूं। मुझे अपनी ज़रूरत के हिसाब से सभी एसक्यूएल का पता चला और उनमें से अधिकांश में प्रोग्राम किया गया। लेकिन मुझे यह समझने में थोड़ी परेशानी हो रही है कि मैं कैटेगिरी कैसे करने जा रहा हूँ।

मेरा माइग्रेशन लक्ष्य उबरकार्ट है।

मैं माइग्रेट_एक्सप्लिमेंट मॉड्यूल में बैठने की कोशिश कर रहा हूं जो कि माइग्रेट का एक सबमॉड्यूल है। विशेष रूप से मैं दाख की बारियां देख रहा हूं। मैं माइग्रेशन शब्द को समझने की कोशिश कर रहा हूं।

मेरे पास दो सूचियां हैं जो उबेरकार्ट उत्पादों में वर्गीकरण की शर्तें बन जाएंगी। प्रथम श्रेणी है। मैंने श्रेणियों को मैन्युअल रूप से सेटअप किया है, इसलिए जब मैं उन लोगों की सूची लाता हूं (GROUP_CONCAT SQL func का उपयोग करके) तो मेरे पास आईडी का एक गुच्छा होगा जो मैं एक ऐसे सरणी का उपयोग करके मैप करूंगा जो सभी आईडी रूपांतरणों को धारण करेगा। यह ठीक है, लेकिन जब मैं उनकी बेस्टविथ जानकारी को देखता हूं कि वे माइग्रेट कर रहे हैं तो पता चलता है कि यह टर्म आयात करने के लिए ऊपर वाइनबेस्टविथ क्लास का उपयोग कर रहा है।

मैं इससे भ्रमित हूं क्योंकि यह कुछ प्रकार के द्वितीयक प्रवास की तरह दिखता है। यह क्या हो रहा है? इसके अलावा, यह वह जगह है जहाँ मैं अपनी मैपिंग सरणी रखूँगा, इस शब्द प्रवासन वर्ग में?

अगली चीज़ जो मुझे करने की ज़रूरत है, वह है टैग से निपटना। OpenCart में हमारे पास मुफ़्त फ़ॉर्म टैग का एक गुच्छा है। और जब मैं मैन्युअल रूप से Ubercart में एक उत्पाद बनाता हूं तो मेरे पास टैग के लिए एक स्वत: पूर्ण फ़ील्ड है। उस क्षेत्र में मैं बस एक अल्पविराम से अलग की गई सूची में रख सकता हूं और यह कई शब्द बनाता है। क्या मैं माइग्रेट मॉड्यूल में एक ही काम कर सकता हूं? क्या मैं केवल अल्पविराम से अलग किए गए शब्दों की सूची में फ़ील्ड को मैप कर सकता हूं? क्या प्रत्येक उत्पाद के लिए उसमें टैग जोड़े जाएंगे?

जवाबों:


14

मैं अभी उसी समस्या पर काम कर रहा हूं इसलिए मैं आपका भ्रम समझता हूं। आपके पास बहुत सारे प्रश्न हैं, लेकिन मुझे लगता है कि उन्हें एक विलक्षण प्रश्न के रूप में अभिव्यक्त किया जा सकता है:

माइग्रेट मॉड्यूल एक सामान्यीकृत डेटाबेस को एक ड्रूपल इंस्टॉलेशन में माइग्रेट करने से कैसे निपटता है?

यह निश्चित रूप से सीधा नहीं है, लेकिन यहां मेरी समझ है कि यह कैसे काम करता है। हम ऊपर (वाइनवैन माइग्रेशन) से शुरू करेंगे और नीचे जाते ही सवाल पूछेंगे।

हम WineWineMigrationकक्षा के शीर्ष पर कोड को देखकर शुरू करते हैं ।

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

यह माइग्रेट मॉड्यूल को बताता है कि आपकी वाइन सामग्री को माइग्रेट करने के लिए, आश्रित माइग्रेशन - वाइनवरायटी, वाइनरेजियन, वाइनबेस्टविथ, वाइनयूज़र, वाइनप्रोड्यूस - को पहले पूरा किया जाना चाहिए।

इसलिए हमने यहां जो सीखा है, वह यह है कि पलायन अन्य प्रवासियों पर निर्भर हो सकता है

आगे हमारे पास टेबल के बीच मैपिंग है जो वर्तमान में बेस वाइन की जानकारी और ड्रुपल नोड रखती है:

$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 टिप्पणी फ़ील्ड मैपिंग कोड चंक में बताती है, यह मानती है कि फ़ील्ड_नाम के आधार पर मैपिंग बनाई जाती है, लेकिन चूंकि हम एक द्वितीयक माइग्रेशन पर निर्भर हैं, जैसा कि आप इसे डालते हैं, हमें माइग्रेशन निर्दिष्ट करने की आवश्यकता होती है जो इस पर निर्भर है और इसे निर्देश दें फ़ील्ड नामों के बजाय tids का उपयोग करें।

आपके स्रोत डेटाबेस में आपके पास मौजूद प्रत्येक सामान्यीकृत तालिका के लिए बहुत अधिक, आप प्रत्येक के लिए एक माइग्रेशन निर्दिष्ट करने जा रहे हैं, और फिर संबंधित फ़ील्ड मैपिंग में उन तालिकाओं को शामिल करते हैं, जिन्हें आप अपने फ़ील्ड मैपिंग कॉल में निर्भर माइग्रेशन निर्दिष्ट कर रहे होंगे। , साथ ही साथ प्रत्येक प्रवास की शुरुआत में आश्रित माइग्रेशन घोषणा।

आशा है कि ये आपकी मदद करेगा। मैं इसे पूरी तरह से खुद नहीं समझता हूं इसलिए मैंने इस सवाल का इस्तेमाल अपनी समझ को बढ़ाने के लिए किया कि कैसे माइग्रेट डेटाबेस से संबंधित है। जैसा कि मैंने थोड़ा और सीखा है, मैं अपने उत्तर को तदनुसार अपडेट करूंगा।


1
अगर आपको कुछ भी स्पष्ट करना है तो मुझे बताएं। The post दिमाग का थोड़ा सा डंप है मुझे एहसास ...
लेस्टर पीबॉडी
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.