web-dev-qa-db-ja.com

プログラムで多言語ノードを作成する方法は?

最後の日 多言語のCSVファイルをDrupal 8 に移行しようとしましたが成功しなかったので、最終的に Batch Process を使用することにしましたタスクを完了するために。

この時点でバッチプロセスは機能していますが、この時点でノードを作成して翻訳を作成する必要があります。それでは、プログラムで多言語ノードを作成する方法は?

7

幸い、私は という名前の投稿を見つけましたプログラムで多言語ノードを作成して翻訳します

そしてここにいくつかのコメント付きのコードがあります:

use Drupal\node\Entity\Node;

$node = Node::create([
  // The node entity bundle in this case article.
  'type' => 'article',
  //The base language
  'langcode' => 'en',
  'created' => \Drupal::time()->getRequestTime(),
  'changed' => \Drupal::time()->getRequestTime(),
  // The user ID.
  'uid' => 1,
  'title' => 'My test!',
  //If you have another field lets says field_day you can do this:
  //'field_day' => 'value',
  'body' => [
    'summary' => '',
    'value' => '<p>The body of my node.</p>',
    'format' => 'full_html',
  ],
]);
//Saving the node
$node->save();
//This line is not necessary
\Drupal::service('path.alias_storage')->save("/node/" . $node->id(), "/my/path", "en");

//Creating the translation Spanish in this case
$node_es = $node->addTranslation('es');
$node_es->title = 'Mi prueba!';
$node_es->body->value = '<p>El cuerpo de mi nodo.</p>';
$node_es->body->format = 'full_html';
//Saving the node
$node_es->save();
//This line is not necessary
\Drupal::service('path.alias_storage')->save("/node/" . $node->id(), "/mi/ruta", "es");
16

私はDrupal 8.でこの問題について頭を悩ませていました。これが私が最終的にそれを達成した方法です、このコードはタイトル、本文、すべてのフィールド、およびpathauto設定をコピーします。余裕があると確信しています。いくつかのメタフィールドも処理する必要がある可能性があるため、ここでの改善のために。

// This assumes you have a $node variable that contains the node translation you're starting with
$node_trans = $node->addTranslation('en-au'); // sample using Australian English
$node_trans->setTitle($node->getTitle());
$node_trans_fields = $node->getTranslatableFields();
foreach ($node_trans_fields as $name => $field) {
  if (substr($name, 0, 6) == 'field_' || in_array($name, ['body', 'path', 'title'])) {
    $node_trans->set($name, $field->getValue());
  }
}
try {
  $node->save();
}
catch (\Exception $error) {
  $add_status .= 'ERROR saving ';
}
2
Tom Bisciglia

エイドリアンの答えの最後の部分は私にはうまくいきませんでした。

翻訳部分には、以下を使用します。

$node->addTranslation('es', ['title' => "Translate title"])->save();
1
Tib