web-dev-qa-db-ja.com

ノードパスでローカライズされた用語名を取得する方法

「newscategory」という名前の含まれる用語参照フィールドを持つノードタイプ「news」があります。 i18nモジュールを含むtaxonomy-i18nもインストールされ、語彙は翻訳可能で、すべての用語が翻訳されています。ただし、pathautoパターンの場合、トークン「[node:field_newscategory]」のみが使用可能であり、ノードの言語によってはローカライズされません。

これを達成するためのトリックはありますか?

2
Christian

エンティティトークンを試してみませんか? Entity モジュールの一部であり、i18nで使用する追加のトークンを提供します。これにより、用語refフィールドのトークンツリー項目が展開可能になり、node:field_newscategory:i18-nameのようなトークンが表示されます。これにより、UI側だけに進むことができます。

私は自分のコードをラップすることができるのは驚くべきことですが:)

1
Artur

さて、さらに2時間の研究開発の後、ようやく問題を解決することができました。結局、 hook_pathauto_alias_alter() を実装する小さなカスタムモジュールを作成しました。

モジュールにはいくつかの依存関係があります:

dependencies[] = taxonomy
dependencies[] = field_extract
dependencies[] = pathauto
dependencies[] = i18n
dependencies[] = i18n_string
dependencies[] = i18n_taxonomy

ここに私がそれをした方法があります(私の特別なニーズに合わせて調整されているので、コードを変更してください)

<?php

  /**
   * Implements hook_pathauto_alias_alter()
   */
  function mymodule_pathauto_alias_alter( &$alias, array &$context ) {
    if ( $context[ 'module' ] == 'node' ) {
      $node = $context[ 'data' ][ 'node' ];
      if ( $node->type == 'news' ) {
        // determine actual context variables
        $language = $context[ 'language' ];
        $pattern = $context[ 'pattern' ];
        $category = field_extract_value( 'node', $node, 'field_newscategory' );

        // translation & preparation
        $category_translated = i18n_string_object_translate( 'taxonomy_term', $category, array( 'langcode' => $language ) );
        $sanitized = pathauto_cleanstring( $category_translated->name, array( 'langcode' => $language ) );

        // re-build the alias
        $alias = explode( '/', $alias );
        $pattern = explode( '/', $pattern );
        foreach ( $pattern AS $index => $part ) {
          if ( $part == '[node:field_newscategory]' ) {
            $alias[ $index ] = $sanitized;
            break;
          }
        }
        $alias = implode( '/', $alias );
      }
    }
  }

?>
1
Christian