it-swarm.com.de

Wie erstelle ich einen mehrsprachigen Knoten programmgesteuert?

In den letzten Tagen Ich habe versucht, eine mehrsprachige CSV-Datei nach Drupal 8 ohne Erfolg zu migrieren, also habe ich mich schließlich für Batch Process entschieden um die Aufgabe zu erfüllen.

In diesem Moment funktioniert der Stapelverarbeitungsprozess, aber an diesem Punkt muss ich meine Knoten erstellen und die Übersetzung erstellen. Wie kann man also programmgesteuert einen mehrsprachigen Knoten erstellen?

7

Zum Glück habe ich einen Beitrag mit dem Namen gefunden. Erstellen und übersetzen Sie einen mehrsprachigen Knoten programmgesteuert.

Und hier ist der Code mit einigen Kommentaren:

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

Ich habe mir über dieses Problem in Drupal 8.) Gedanken gemacht. Hier ist, wie ich es endlich geschafft habe. Dieser Code kopiert Titel, Text, alle Felder und die Pathauto-Einstellung. Ich bin sicher, es gibt Platz Zur Verbesserung hier, da wahrscheinlich auch einige Metafelder verarbeitet werden müssen. Aber das sollte Ihnen den Einstieg erleichtern!

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

Der letzte Teil von Adrians Antwort hat bei mir nicht funktioniert.

Verwenden Sie für den Übersetzungsteil:

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