web-dev-qa-db-ja.com

ノードコンテンツ内でトークンを置き換えるための最良の方法は何ですか?

私は初心者で、フォーラム(これを含む)、書籍、およびドキュメントを精査していますが、これに対する明確な答えは見つかりません。

ノードの本体内のトークンをカスタムユーザープロファイルフィールドの値で置き換えるための最良の方法(カスタムモジュール?PHP ???))は何ですか?

使用例:外部URL内のテキストを現在のユーザーに固有の文字列に置き換える必要があります。ノードコンテンツ内のURLにトークン文字列を挿入し、トークンを現在のユーザーのプロファイルの指定した値に置き換えることができることを願っています。

私はカスタムモジュールを作成していませんが、誰かが特定の道を進むことを勧めたら、喜んでそれに飛び込みます。

4
ctlarsen

トークンフィルター

トークンフィルターは、トークン値を入力フィルターとして使用できるようにする非常に単純なモジュールです。

5
Dave Reid

カスタムトークンを置き換えるシステムを実装するには、2つの可能性があります。動的な値で置き換える必要があるノード本体に存在するテキストを参照していると仮定します。

  • フィルターモジュールを使用して、どのテキストを何に置き換える必要があるかを定義できます。
  • ノードが表示される前にノード本体にあるテキストを置き換えるカスタムモジュールを使用する

最初のケースでは、フィルターモジュールはコメントに対しても呼び出され、フィルターはノード本文またはコメント本文のテキストの置換を区別できません。モジュールでPHPコードを定義できる場合、特定のテキストがノード/コメント本文で見つかったときに実行されるコードですが、パフォーマンスの問題もあります。PHPコードをeval()に追加するには、特定のフィルターを実装するカスタムモジュールを定義して、必要な特定のテキストを置き換えることをお勧めします。この場合も、モジュールは認識できません。ノードまたはコメントに対して呼び出された場合、これは、フィルターモジュールがフィルターコールバックに渡された引数以外の情報を取得できなかったことを意味します。つまり、フィルターコールバックが原因で、ノードの作成者に関する情報を取得できません。ノードまたはコメントオブジェクトを取得しません。
カスタムフィルター の場合、入力形式の説明は翻訳できません。つまり、サイト(または表示されているノード)の言語として英語からフランス語に渡ると、報告された説明はフランス語では表示されません。

後者の場合、 hook_nodeapi( 'view') を実装するモジュールは、Drupal 6で)$node->contentの内容を変更してノード本体を変更できます;同様に、 hook_node_view() を実装するモジュールは、Drupal 7以降のバージョンでも同じ結果を実現します。
どちらの場合でも、$node->content['body']には、フォームAPIで使用される、または drupal_render() で必要な形式に従う配列としてノード本体が含まれます。

開発/テストサイトとして使用されていないサイトでPHP入力形式を有効にすることは、良い考えとは見なされません。その入力形式を有効にするよりも、カスタムモジュールを実装する方が適切です。 PHP入力形式を使用してコンテンツタイプを通常のコンテンツタイプに置き換え、特定のノードのコンテンツを変更するカスタムモジュールを実装するDrupal.orgで行われました。

2
kiamlaluno

カスタムフィルター に興味があるかもしれません。

必要なすべてのフィルターに対して新しいフィルターモジュールを作成する代わりに、このモジュールを使用して、独自のタグの作成、トークン値の置換、テキストで必要なすべての変更などのタスクを実行できます。単純な置換を使用するか、PHPコードを使用して、より強力なものを書くことができます(Geshiでコードを上位に使用するなど)。

1
d3l3t3m3