2016-10-12 28 views
0

我需要使用段落將一些Drupal 6實例中的自定義字段數據導入到Drupal 8實例中。由於D8將所有翻譯存儲在單個節點而不是單獨的鏈接節點(如D6)中,因此嘗試將翻譯的內容轉換爲段落並插入節點(頁面)時出現問題。默認語言(英文)可正常工作。這裏是我的代碼(我從是從D6實例轉儲一個JSON文件導入):Drupal 8 Issue導入段落

... Code to read JSON file here and load into $data variable ... 

// create paragraph ($fields is an array of fields from the JSON file) 
$paragraph = Paragraph::create($fields); 

// load existing node 
$node = Node::load($nodeId); 

// Get the translated node...according to the docs, this should 
// return a node that behaves just like the original node 
$language = \Drupal::languageManager()->getLanguage($data['language'])->getId(); 
$node = $node->getTranslation($language); 

$paragraphs = $node->field_paragraph_group; 
$paragraphs[] = $paragraph; 

$node->field_paragraph_group = $paragraphs; 
$node->save(); 

這似乎保存好,但一旦這樣經營的網站時停止工作

The website encountered an unexpected error. Please try again later. 

所以它顯然打破了一些東西。

我不知道如果我需要嘗試從節點訪問翻譯或添加翻譯段落對象,像:

$paragraph->language = $data['language']; 

任何指導,將不勝感激!謝謝!

+0

在遷移中使用自定義代碼是否有原因? – VJamie

+0

根據主要開發人員的說法,遷移不會像彈性域數據轉換爲段落那樣工作。 – lerxstrulz

回答

0

回答您的評論:

據牽頭開發,因爲它是 彈性域數據轉換爲段落的遷移將無法正常工作。

通過遷移,您可以完全自由地管理您的輸入和輸出數據,而不管它們以何種格式存儲在您的舊網站中。

你有很多選擇來公開你的D6數據,但更容易和更靈活的方式是使用遷移源插件,因爲Drupal 8附帶了一些有用的插件,可以從6和7等舊Drupal版本中提取和管理數據。 看一看例如到類:Drupal的\節點\插件\遷移\源\ D6 \節點

關於您的問題,我建議做如下:

1)創建插件運行SQL查詢以收集您的D6數據(https://www.drupal.org/docs/8/api/migrate-api/migrate-source

2)創建過程插件來操縱所述輸入數據,以反映D8段結構(https://www.drupal.org/docs/8/api/migrate-api/migrate-process-plugins

3)使用芯目的地插件實體:節點 可以在類槓桿作用包含有用的方法來提取D6節點。

你可能會需要幾個自定義查詢和行預處理所以這裏是一個插件(yourmodule/src目錄/插件/遷移/源/ MyCustomMigration.php)的一個簡單的例子:

<?php 

/** 
* @file 
* Contains \Drupal\custom_d6_migration\Plugin\migrate\source\MyCustomMigration. 
*/ 

namespace Drupal\custom_d6_migration\Plugin\migrate\source; 

use Drupal\migrate\Row; 
use Drupal\node\Plugin\migrate\source\d6\Node; 

/** 
* Source plugin for D6 content. 
* 
* @MigrateSource(
* id = "my_custom_migration" 
*) 
*/ 
class MyCustomMigration extends Node { 

    /** 
    * {@inheritdoc} 
    */ 
    public function query() { 
    // .. your custom query $this->select('tablename'); ... 
    } 

    /** 
    * {@inheritdoc} 
    */ 
    public function prepareRow(Row $row) { 
    // If you need to alter the current row (running further queries to gather additional data..).. 

    return $row; 
    } 

} 

即使這個問題是在幾個月前發佈的,我希望這個答案對其他人仍然有幫助,因爲遷移對於解決幾乎任何類型的數據遷移問題都非常有幫助。