4

特定のコンテンツ タイプに対して、ノードのタイトルに基づいてエイリアスを生成するように Pathauto を構成しました。問題は、Pathauto がエイリアスを生成するために使用する前に、このタイトルに小さな変更を加えたいということです。

この投稿の最初のコメントは hook_token_values の使用を示唆していますが、 docsを読んでも使い方がよくわかりませんでした。私のテストでは、このフックを実装すると、生成されるエイリアスは常に「配列」になります。これは、何かが足りないことを意味します。

何か助けはありますか?ありがとう。

4

2 に答える 2

5

あなたも実装を逃した可能性がありますhook_token_list。新しいトークンの提供は、次の 2 段階のプロセスです。

  1. hook_token_list提供するトークンを宣言するために実装します。これは、トークンの名前と簡単な説明、およびトークンが適用されるオブジェクトのタイプ (ノード、ユーザー、タクソノミーなど) の情報になります。
  2. hook_token_valueトークンのコンテンツを実際に生成するように実装します。これは、トークンが表すコンテンツに置き換えられるときに呼び出されます。

トークン モジュールによって既に提供されているタイトル トークンの代替バージョンを提供したいだけなので、token_node.inc から関連する部分をコピーし、関連するケースに落として、別のモジュールで使用できるように調整するのがおそらく最善の方法です。

/**
 * Implementation of hook_token_list().
 */
function yourModule_token_list($type = 'all') {
  if ($type == 'node' || $type == 'all') {
    $tokens['node']['yourModule-title'] = t('Node title (customized version by yourModule)');

    return $tokens;
  }
}

これは、簡単な説明とともにyourModule、 という名前のノード オブジェクトのトークンを提供することを示しています。yourModule-title主な作業は他のフックで行われます。

/**
 * Implementation of hook_token_values().
 */
function yourModule_token_values($type, $object = NULL, $options = array()) {
  $values = array();
  switch ($type) {
    case 'node':
      $node = $object;
      // TODO: Replace the check_plain() call with your own token value creation logic!
      $values['yourModule-title'] = check_plain($node->title);  
      break;
  }

  return $values;
}

これは、ノード オブジェクトのトークンが必要なときはいつでも呼び出され、問題のノードが$objectパラメーターとして渡されます (ユーザー トークンの場合、これ$typeは「ユーザー」であり$object、ユーザー オブジェクトであり、他のタイプの場合も同様です)。 . それが行うことは、トークン名でキー付けされた値の配列を作成し、そのトークンの置換を値として作成することです。token_node.inc の元のコードは、 を通じてタイトルを実行するだけcheck_plain()なので、これは独自のロジックを挿入する場所になります。

于 2010-05-10T19:20:37.137 に答える
1

Drupal 7 では、トークン機能がコアに移動されました。トークンは、hook_tokensおよびhook_token_infoメソッドによって実装されます。使用例については、提供されているリンクをたどり、hook_tokens および hook_token_info を実装する関数へのリンクを探してください。statistics_tokensおよびstatistics_token_info関数は、このフックがどのように機能するかを理解するのに役立ちます。

このフックはモジュールによって実装する必要があることもおそらく注目に値します...私の最初の試みで、テスト関数をテーマのtemplate.phpに落としましたが、何も起こらなかっただけです:-p

于 2012-04-07T15:16:59.263 に答える