我需要使用Paragraphs将一些自定义字段数据从Drupal 6实例导入到Drupal 8实例中。由于D8将所有翻译存储在单个节点中而不是像D6这样的单独链接节点,因此我在尝试将已翻译的内容转换为段落并插入节点(页面)时遇到问题。默认语言(英语)工作正常。这是我的代码(我从一个JSON文件导入,它是D6实例的转储):
... 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对象中添加翻译,例如:
$paragraph->language = $data['language'];
任何指导将不胜感激!谢谢!
答案 0 :(得分:0)
回答你的评论:
根据主要负责人的说法,迁移不会像以前一样有效 弹性域数据转换为段落。
通过迁移,您可以完全自由地管理输入和输出数据,无论它们存储在旧网站中的格式如何。
您有很多选项可以公开您的D6数据,但更简单,更灵活的方法是使用迁移源插件,因为Drupal 8附带了一些有用的插件,用于从较旧的Drupal版本(如6和7)中提取和管理数据。 请查看该类的示例:Drupal \ node \ Plugin \ migrate \ source \ d6 \ Node
关于你的问题,我建议如下:
1)创建源插件,该插件运行SQL查询以收集D6数据(DEMO)
2)创建一个进程插件来操作传入数据以反映D8段落结构(https://www.drupal.org/docs/8/api/migrate-api/migrate-source)
3)使用核心目标插件实体:节点 您可以利用包含有用方法的类来提取D6节点。
您可能需要一些自定义查询和行预处理,所以这里是一个源插件的简单示例(yourmodule / src / Plugin / migrate / source / MyCustomMigration.php):
date = new SimpleDateFormat("EEE, dd. MM. yyyy", Locale.GERMAN).parse("Mittwoch, 28. 06. 2017")
即使这个问题是在几个月前发布的,我希望这个答案对其他人来说仍然有用,因为迁移对于解决几乎任何类型的数据迁移问题都非常有帮助。