web-dev-qa-db-ja.com

entity_referenceフィールドに基づいてトークンを取得するにはどうすればよいですか?

ノードタイプAがあり、ノードタイプBを指す「field_subnode」という名前のentity_reference fieldがあります。

A-> B

次のパターンを設定して、pathautoを使用しています。

タイプAのノードのURLパス:books/[node:title]

次のようなものが必要です:books/[node-type-A:title]/[node:title]タイプBのノードのパスとして、次のようなURLを取得します。

本/マイカーブック/ 1章

必要なものを取得するために使用する必要があるトークンはどれですか?

たとえば、次のような別のトークンを試しました:

books/[node:field-subnode:1:title]/[node:title]

しかし成功せず。

助けてくれてありがとう。

3
MXT

Entityプロジェクトの一部であるEntity Tokensモジュールが必要です: http://drupal.org/project/entity 。有効にすると、ツリーに使用可能な再帰トークンが表示されます。

3
Daniel Feder

私はサービスとサブサービスで同様の設定をしていて、次のパターンは美しく機能します。このパターンは、親サービスにリンクするfield_serviceという用語参照フィールドがあるサブサービスコンテンツタイプに設定しています。

services/[node:field-service:title]/[node:title]

あなたのケースでは、子ノードではなく親ノードに参照フィールドを設定しています。可能であれば、これを裏返します。そうでない場合、Aに設定されているフィールドを参照するBに配置できるトークンを認識していません(私の場合、Bのフィールドを参照するBのトークンです)。おそらくこれが勝つと思います技術的な問題のため、将来のリリースでも利用できない。

私は以下を使用しています:

  • Drupal 7.15
  • エンティティ7.x-1.0-rc3(エンティティトークンモジュールが有効)
  • entityreference 7.x-1.0-rc5
  • pathauto 7.x-1.2

お役に立てれば。

乾杯。

0
Mario Awad

これは、最近使用した回避策です。単一のentityrefereneフィールドに独自のトークンを定義する必要があります。 mymoduleというモジュールがあるとすると、ノードのエンティティ参照フィールドはfield_subnodeと呼ばれ、[node:subnode:title]のようなトークンチェーンを使用できます。 mymoduleの名前を独自のモジュール名に変更し、実装後にキャッシュをクリアします。

/**
 * Implements hook_token_info().
 */
function mymodule_token_info() {
  return array(
    'tokens' => array(
      'node' => array(
        'subnode' => array(
          'name' => t('Node reference'),
          'description' => t('Node referenced via field_subnode'),
          'type' => 'node',
        ),
      ),
    ),
  );
}

/**
 * Implements hook_tokens().
 */
function mymodule_tokens($type, $tokens, array $data = array(), array $options = array()) {
  $replacements = array();
  $sanitize = !empty($options['sanitize']);

  if ($type == 'node' && !empty($data['node'])) {
    $node = $data['node'];
    foreach ($tokens as $name => $original) {
      switch ($name) {
        case 'subnode' :
          $default = '';
          if (isset($node->field_subnode)) {
             $subnode = entity_metadata_wrapper('node', $node)->field_subnode->value();
            $default = $subnode->title;
          }
          $replacements[$original] = $sanitize ? filter_xss($default) : $default;
          break;
      }
    }

    if (isset($node->field_subnode) && $subnode_tokens = token_find_with_prefix($tokens, 'subnode')) {
      $subnode = entity_metadata_wrapper('node', $node)->field_subnode->value();
      $replacements += token_generate('node', $subnode_tokens, array('node' => $subnode), $options);
    }
  }
  return $replacements;
}
0
John