エンティティ参照とのノード変換同期の問題


7

多言語サポート(ノード翻訳)を備えたコンテンツタイプがあります。このコンテンツタイプには、エンティティ参照(モジュール:)entityreferenceフィールドもあります。

私のコンテンツは:

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

同期するように参照を構成しました。問題は、ノードを翻訳または編集するときはいつでも、参照を他の翻訳に同期しようとすることです。

だから私はいつも次のようになります:

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

または:

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

参照フィールドで同期を無効にすることでこれを解決できますが、すべての翻訳の参照を手動で維持する必要があります。これは、多くの翻訳があるWebサイトでは問題です。

回答:


3

i18n_entityreferenceプロジェクトの国際化への貢献i18n_contrib)からモジュール「エンティティ参照の同期」()を試す必要があります。これまでのところ、私にとっては完璧に見えます。インラインエンティティフォームウィジェットでも機能します。

インストールして使用するには:

  1. モジュールをインストールして有効にします。使用する場合drush

    drush dl i18n_contrib && drush en i18n_entityreference

    (これにはコアモジュールが必要であり、i18n_syncまだ行っていない場合は自動的に有効になります。変換全体でフィールド値を同期するために必要です。)

  2. 「翻訳の同期」を設定します。基本的には、管理メニューの「構造→コンテンツタイプ→[コンテンツタイプ]」に移動し、「翻訳の同期」タブに切り替え、ノード参照フィールドを選択して保存します。詳細はこちらをご覧ください

  3. 使用する。既存のコンテンツがある場合は、翻訳セットのノードを次回保存するときに、ノード参照フィールドが言語に対応した方法で同期されます。


ありがとう。できるだけ早くこれを試して、ご返答します。drupal.org/project/cerと
cherouvim 14

3

同じ問題があったので、この小さな回避策を書きました:

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;
        }
      }
    }
  }

ソースノードを変更するときにうまく機能することに注意してください。
cherouvim 2014年

2

そのためのモジュールがあります:https : //drupal.org/project/i18n_node_reference

node_referenceフィールドのi18nフィールド同期を提供します。

参照されたノードは正しい言語に翻訳されます。そのような言語が存在しない場合、それは無視されます。これは、i18n_taxonomyの分類基準参照翻訳でサポートされている機能と同じです。


1
entityreferencereferencesモジュールではなくモジュールを使用しています。したがって、これは私の場合には当てはまりません。
cherouvim 2014年

2

翻訳の参照を編集するときに、2番目の回答のコードスニペットが機能しません。これtranslation_node_get_translations()は、nidではなくtnidを引数として受け入れるためです。api docsを確認してください。

上記のコードの呼び出しを次のように変更すると、機能します(この場合はノードのみ)。

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

注:他の回答にはコメントできなかったので、これを投稿します。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.