Problem bei der Synchronisierung der Knotenübersetzung mit Entitätsreferenzen


7

Ich habe einen Inhaltstyp mit mehrsprachiger Unterstützung (Knotenübersetzung). Dieser Inhaltstyp verfügt auch über ein Entitätsreferenzfeld (Modul entityreference:).

Mein Inhalt ist:

/node/1 English story 1
/node/2 French  story 1 (translation of #1)
/node/3 English story 2 with reference to #1
/node/4 French  story 2 (translation of #3) **entityreference problem here**

Ich habe die Referenz für die Synchronisierung konfiguriert. Das Problem ist, dass bei jeder Übersetzung oder Bearbeitung eines Knotens versucht wird, den Verweis auf andere Übersetzungen zu synchronisieren.

Also werde ich immer enden mit:

#3 -> #1 (correct)
#4 -> #1 (wrong)

oder:

#3 -> #2 (wrong)
#4 -> #2 (correct)

Ich kann dies lösen, indem ich die Synchronisierung für das Referenzfeld deaktiviere, aber dann muss ich die Referenzen für alle Übersetzungen manuell pflegen, was auf einer Website mit vielen Übersetzungen ein Problem darstellt.

Antworten:


3

Sie sollten das Modul "Entitätsreferenzen synchronisieren" ( i18n_entityreference) aus den Projekt- Internationalisierungsbeiträgen ( i18n_contrib) ausprobieren . Bisher sieht es für mich perfekt aus. Es funktioniert sogar mit Inline-Entitätsformular-Widgets.

So installieren und verwenden Sie es:

  1. Installieren und aktivieren Sie das Modul. Wenn Sie verwenden drush:

    drush dl i18n_contrib && drush en i18n_entityreference

    (Dies erfordert das Kernmodul i18n_syncund aktiviert es automatisch, falls dies noch nicht geschehen ist. Es wird zum Synchronisieren von Feldwerten über Übersetzungen hinweg benötigt.)

  2. Konfigurieren Sie "Übersetzungen synchronisieren" . Gehen Sie im Admin-Menü grundsätzlich zu "Struktur → Inhaltstypen → [Ihr Inhaltstyp]", wechseln Sie zur Registerkarte "Übersetzungen synchronisieren", wählen Sie Ihr Knotenreferenzfeld aus und speichern Sie. Siehe hier für Details .

  3. Verwenden. Wenn Sie über vorhandenen Inhalt verfügen, wird das Knotenreferenzfeld sprachbewusst synchronisiert, wenn Sie einen Knoten eines Übersetzungssatzes für das nächste Mal speichern.


Vielen Dank. Ich werde es so schnell wie möglich ausprobieren und mich bei Ihnen melden. Ich frage
mich,

3

Hatte das gleiche Problem, schrieb diese kleine Problemumgehung:

function YOURMODULE_i18n_sync_translation($entity_type, $translation, $translation_language, $source, $source_language, $field_names) {
  foreach ($field_names as $field_name) {
    $info = field_info_field($field_name);
    if ($info['type'] == 'entityreference') {
      $items = field_get_items($entity_type, $source, $field_name);
      foreach ($items as $delta => $item) {
        $translations = translation_node_get_translations($item['target_id']);
        if (isset($translations[$translation_language])) {
          list($id, $vid, $bundle) = entity_extract_ids($entity_type, (object) $translations[$translation_language]);
          $translation->{$field_name}['und'][$delta]['target_id'] = $id;
        }
      }
    }
  }

Beachten Sie, dass es beim Ändern des Quellknotens gut funktioniert.
Cherouvim

2

Dafür gibt es ein Modul: https://drupal.org/project/i18n_node_reference

Bietet eine i18n-Feldsynchronisation für ein node_reference-Feld.

Die referenzierten Knoten werden in die richtige Sprache übersetzt. Wenn keine solche Sprache vorhanden ist, wird sie ignoriert. Dies ist dieselbe Funktionalität, die von der Taxonomie-Referenzübersetzung in i18n_taxonomy unterstützt wird.


1
Ich benutze das entityreferenceund nicht referencesModul. Das trifft also in meinem Fall nicht zu.
Cherouvim

2

Das Code-Snippet in der zweiten Antwort funktioniert nicht, wenn die Referenz in einer Übersetzung bearbeitet wird. Das liegt daran, dass translation_node_get_translations()ein tnid als Argument akzeptiert wird, kein nid. Überprüfen Sie die API-Dokumente .

Ändern Sie den Aufruf im obigen Code in etwa so und er sollte funktionieren (in diesem Fall nur für Knoten):

$referenced_node = node_load($item['target_id']);
$translations = translation_node_get_translations($referenced_node->tnid);

HINWEIS: Ich konnte die andere Antwort nicht kommentieren, daher poste ich diese.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.