web-dev-qa-db-ja.com

ノード呼び出しのコンテキスト/ nidをフィルターに提供するにはどうすればよいですか?

現在、出力にノードオブジェクトを必要とするフィルターを含むカスタムモジュールに取り組んでいます。

元々、フィルターはarg(1)からNIDをプルし、それを使用してノードオブジェクトにロードしていましたが、残念ながらフィルターキャッシュがフラッシュされ、ノードがノードページ自体arg(1)以外の場所から出力を再構築した場合NIDが含まれないため、フィルターが機能しなくなります。

フィルターが変換するトークンにNIDを入れることを検討していますが、ノードの作成中は明らかにNIDがわかりません。 NIDを挿入するためにhook_nodeapi()を介してトークンを変更することはそれほど難しくありませんが、非常に手間がかかるようです。

フィルターに何らかのコンテキストを提供して、どのノードがそれを呼び出したかを認識できるようにする簡単な方法はありますか?

2
Decipher

フィルターはコンテキストに対応しておらず、AFAIKでもないため、現時点では希望どおりの操作を行う方法はありません。これは2008年以来 機能リクエスト でしたが、提案された patch はDrupal 7。

構築しているサイトにとってこれが非常に重要な場合は、Drupalコアにパッチを適用することを検討できます。ただし、Drupalコアにパッチが適用されると、サイトを更新するときは、特に注意(および時間)をかけてください。

3
marcvangend

フィルターモジュールはコメントに対しても呼び出されますが、フィルターに渡される引数のいずれも、ノードのコンテンツまたはコメントを変更するために呼び出されるタイミングを理解できません。

hook_nodeapi()を実装して、レンダリング前にノードを組み立てているときにノードのコンテンツを変更できます。 $opの値が"view"であることを確認してください。
これは、一部のノードフィールドのコンテンツに基づいてノードのコンテンツを変更するサードパーティのモジュールが実際に行うことです。

モジュールを置き換える文字列をノードを編集するユーザーが入力できる場合(ユーザーはこの可能性を知っている必要がある場合)、たとえば、編集フォームのノード本体フィールドに指定された説明を次のように変更する必要があります。モジュールが置き換える「トークン」の説明を含めます。

0
kiamlaluno