web-dev-qa-db-fra.com

Comment créer un nœud multilingue par programmation?

Au cours des derniers jours j'ai essayé de migrer un fichier CSV multilingue vers Drupal 8 sans succès, donc finalement j'ai décidé d'utiliser un Batch Process pour accomplir la tâche.

En ce moment, le processus par lots fonctionne, mais à ce stade, je dois créer mes nœuds et créer la traduction. Alors, comment créer un nœud multilingue par programmation?

7
Adrian Cid Almaguer

Heureusement, j'ai trouvé un article nommé Créer et traduire par programmation un nœud multilingue.

Et voici le code avec quelques commentaires:

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
Adrian Cid Almaguer

Je réfléchissais à ce problème dans Drupal 8. Voici comment je l'ai finalement fait, ce code copie le titre, le corps, tous les champs et le paramètre pathauto. Je suis sûr qu'il y a de la place à améliorer ici, car certains champs méta doivent probablement être traités également. Mais cela devrait vous aider à démarrer!

// 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

La dernière partie de la réponse d'Adrian n'a pas fonctionné pour moi.

Pour la partie traduction, utilisez:

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