2016-10-12 29 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; 
    } 

} 

即使这个问题是在几个月前发布的,我希望这个答案对其他人仍然有帮助,因为迁移对于解决几乎任何类型的数据迁移问题都非常有帮助。